[
  {
    "path": ".gitignore",
    "content": "﻿################################################################################\n# This .gitignore file was automatically created by Microsoft(R) Visual Studio.\n################################################################################\n\n*.suo\n/twaincs/source/bin/x86/Debug/TWAIN.dll\n*.pdb\n/twaincs/source/obj\n/twaincs/source/twaincsscan/source/bin/x86/Debug\n/twaincs/source/twaincsscan/source/obj\n/twaincs/source/twaincstool/source/bin/x86/Debug\n/twaincs/source/twaincstool/source/obj\n/twaincs/source/twaincstst/source/bin/x86/Debug\n/twaincs/source/twaincstst/source/obj\n/twaincs/source/.vs/\n/twaincs/source/bin/\n/releases/twain-cs_02041100/twaincsscan/x64/Release/TWAINCSScan.log\n/releases/twain-cs_02041100/twaincsscan/x64/Release/twaindsm.log\n/releases/twain-cs_02041100/twaincstst/x86/Release/TWAINCSTst.log\n/twaincs/source/twaincscert/source/Properties/data.zip\n/twaincs/source/twaincscert/source/TWAIN-2.4-Specification.pdf\n/twaincs/source/twaincscert/source/bin/\n/twaincs/source/twaincscert/source/data/version.txt\n/twaincs/source/twaincscert/source/obj/\n/twaincs/source/twaincscert/source/twaincscert.csproj.user\n/twaincs/source/twaincsscan/source/bin/\n/twaincs/source/twaincstool/source/bin/\n/twaincs/source/twaincstst/source/bin/\n"
  },
  {
    "path": "README.md",
    "content": "# TWAIN CS\n\nA C# interface for the TWAIN image capture API, that also includes a toolkit layer, \na diagnostic application and a sample application.\n\n## Features\n\n - Runs on Windows (.NET or Mono)\n - Runs on Linux and Mac OS X (Mono)\n - 32bit and 64bit support\n - Follows TWAIN \"best practices\"\n"
  },
  {
    "path": "releases/makerelease.bat",
    "content": "@echo off\n:: \n:: makerelease v1.1 08-Nov-2021\n:: Ask some questions, and copy the built files into this folder\n:: to make releasing stuff easier and less error prone.\n::\n\n::\n:: Show the version info, and get an okay on it...\n::\necho.\necho | set /p dummyName=\"TWAIN CS.........................\"\nfindstr /C:\"AssemblyFileVersion\" \"%~dp0%..\\twaincs\\source\\Properties\\AssemblyInfo.cs\"\n::\necho | set /p dummyName=\"TWAIN CS Certification...........\"\nfindstr /C:\"AssemblyFileVersion\" \"%~dp0%..\\twaincs\\source\\twaincscert\\source\\Properties\\AssemblyInfo.cs\"\n::\necho | set /p dummyName=\"TWAIN CS Scan....................\"\nfindstr /C:\"AssemblyFileVersion\" \"%~dp0%..\\twaincs\\source\\twaincsscan\\source\\Properties\\AssemblyInfo.cs\"\n::\necho | set /p dummyName=\"TWAIN CS Test....................\"\nfindstr /C:\"AssemblyFileVersion\" \"%~dp0%..\\twaincs\\source\\twaincstst\\source\\Properties\\AssemblyInfo.cs\"\n::\necho.\nset answer=\nset /p answer=\"Are you happy with the version info (Y/n)? \"\nif \"%answer%\" == \"\" goto VERSIONDONE\nif \"%answer%\" == \"y\" goto VERSIONDONE\ngoto:EOF\n::\n:VERSIONDONE\n\n\n::\n:: Delete the current folder, and recreate it with subfolders...\n::\necho.\necho *** Cleaning the twain-cs_00000000 folder...\nrmdir /s /q \"%~dp0%twain-cs_00000000\" > NUL 2>&1\nmkdir \"%~dp0%twain-cs_00000000\"\n::\nmkdir \"%~dp0%twain-cs_00000000\\twaincscert\\AnyCPU\\Debug\"\nmkdir \"%~dp0%twain-cs_00000000\\twaincscert\\AnyCPU\\Release\"\nmkdir \"%~dp0%twain-cs_00000000\\twaincscert\\x64\\Debug\"\nmkdir \"%~dp0%twain-cs_00000000\\twaincscert\\x64\\Release\"\nmkdir \"%~dp0%twain-cs_00000000\\twaincscert\\x86\\Debug\"\nmkdir \"%~dp0%twain-cs_00000000\\twaincscert\\x86\\Release\"\n::\nmkdir \"%~dp0%twain-cs_00000000\\twaincsscan\\AnyCPU\\Debug\"\nmkdir \"%~dp0%twain-cs_00000000\\twaincsscan\\AnyCPU\\Release\"\nmkdir \"%~dp0%twain-cs_00000000\\twaincsscan\\x64\\Debug\"\nmkdir \"%~dp0%twain-cs_00000000\\twaincsscan\\x64\\Release\"\nmkdir \"%~dp0%twain-cs_00000000\\twaincsscan\\x86\\Debug\"\nmkdir \"%~dp0%twain-cs_00000000\\twaincsscan\\x86\\Release\"\n::\nmkdir \"%~dp0%twain-cs_00000000\\twaincstst\\AnyCPU\\Debug\"\nmkdir \"%~dp0%twain-cs_00000000\\twaincstst\\AnyCPU\\Release\"\nmkdir \"%~dp0%twain-cs_00000000\\twaincstst\\x64\\Debug\"\nmkdir \"%~dp0%twain-cs_00000000\\twaincstst\\x64\\Release\"\nmkdir \"%~dp0%twain-cs_00000000\\twaincstst\\x86\\Debug\"\nmkdir \"%~dp0%twain-cs_00000000\\twaincstst\\x86\\Release\"\n\n\n::\n:: Copy the files...\n::\necho.\necho *** Copying TWAIN CS.rtf to the twain-cs_00000000 folder...\nxcopy \"%~dp0%..\\twaincs\\source\\TWAIN CS.rtf\" \"twain-cs_00000000\\\" | find /V \"File(s)\"\n::\necho.\necho *** Copying TWAIN CS Certification files to the twain-cs_00000000 folder...\nxcopy \"%~dp0%..\\twaincs\\source\\twaincscert\\source\\bin\\AnyCPU\\Debug\\TWAIN.dll\"                 \"twain-cs_00000000\\twaincscert\\AnyCPU\\Debug\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincscert\\source\\bin\\AnyCPU\\Debug\\TWAIN.pdb\"                 \"twain-cs_00000000\\twaincscert\\AnyCPU\\Debug\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincscert\\source\\bin\\AnyCPU\\Debug\\twaincscert.exe\"           \"twain-cs_00000000\\twaincscert\\AnyCPU\\Debug\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincscert\\source\\bin\\AnyCPU\\Debug\\twaincscert.pdb\"           \"twain-cs_00000000\\twaincscert\\AnyCPU\\Debug\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincscert\\source\\bin\\AnyCPU\\Debug\\twaincscert.exe.config\"    \"twain-cs_00000000\\twaincscert\\AnyCPU\\Debug\\\" | find /V \"File(s)\"\n::\nxcopy \"%~dp0%..\\twaincs\\source\\twaincscert\\source\\bin\\AnyCPU\\Release\\TWAIN.dll\"               \"twain-cs_00000000\\twaincscert\\AnyCPU\\Release\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincscert\\source\\bin\\AnyCPU\\Release\\TWAIN.pdb\"               \"twain-cs_00000000\\twaincscert\\AnyCPU\\Release\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincscert\\source\\bin\\AnyCPU\\Release\\twaincscert.exe\"         \"twain-cs_00000000\\twaincscert\\AnyCPU\\Release\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincscert\\source\\bin\\AnyCPU\\Release\\twaincscert.pdb\"         \"twain-cs_00000000\\twaincscert\\AnyCPU\\Release\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincscert\\source\\bin\\AnyCPU\\Release\\twaincscert.exe.config\"  \"twain-cs_00000000\\twaincscert\\AnyCPU\\Release\\\" | find /V \"File(s)\"\n::\nxcopy \"%~dp0%..\\twaincs\\source\\twaincscert\\source\\bin\\x64\\Debug\\TWAIN.dll\"                    \"twain-cs_00000000\\twaincscert\\x64\\Debug\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincscert\\source\\bin\\x64\\Debug\\TWAIN.pdb\"                    \"twain-cs_00000000\\twaincscert\\x64\\Debug\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincscert\\source\\bin\\x64\\Debug\\twaincscert.exe\"              \"twain-cs_00000000\\twaincscert\\x64\\Debug\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincscert\\source\\bin\\x64\\Debug\\twaincscert.pdb\"              \"twain-cs_00000000\\twaincscert\\x64\\Debug\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincscert\\source\\bin\\x64\\Debug\\twaincscert.exe.config\"       \"twain-cs_00000000\\twaincscert\\x64\\Debug\\\" | find /V \"File(s)\"\n::\nxcopy \"%~dp0%..\\twaincs\\source\\twaincscert\\source\\bin\\x64\\Release\\TWAIN.dll\"                  \"twain-cs_00000000\\twaincscert\\x64\\Release\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincscert\\source\\bin\\x64\\Release\\TWAIN.pdb\"                  \"twain-cs_00000000\\twaincscert\\x64\\Release\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincscert\\source\\bin\\x64\\Release\\twaincscert.exe\"            \"twain-cs_00000000\\twaincscert\\x64\\Release\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincscert\\source\\bin\\x64\\Release\\twaincscert.pdb\"            \"twain-cs_00000000\\twaincscert\\x64\\Release\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincscert\\source\\bin\\x64\\Release\\twaincscert.exe.config\"     \"twain-cs_00000000\\twaincscert\\x64\\Release\\\" | find /V \"File(s)\"\n::\nxcopy \"%~dp0%..\\twaincs\\source\\twaincscert\\source\\bin\\x86\\Debug\\TWAIN.dll\"                    \"twain-cs_00000000\\twaincscert\\x86\\Debug\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincscert\\source\\bin\\x86\\Debug\\TWAIN.pdb\"                    \"twain-cs_00000000\\twaincscert\\x86\\Debug\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincscert\\source\\bin\\x86\\Debug\\twaincscert.exe\"              \"twain-cs_00000000\\twaincscert\\x86\\Debug\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincscert\\source\\bin\\x86\\Debug\\twaincscert.pdb\"              \"twain-cs_00000000\\twaincscert\\x86\\Debug\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincscert\\source\\bin\\x86\\Debug\\twaincscert.exe.config\"       \"twain-cs_00000000\\twaincscert\\x86\\Debug\\\" | find /V \"File(s)\"\n::\nxcopy \"%~dp0%..\\twaincs\\source\\twaincscert\\source\\bin\\x86\\Release\\TWAIN.dll\"                  \"twain-cs_00000000\\twaincscert\\x86\\Release\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincscert\\source\\bin\\x86\\Release\\TWAIN.pdb\"                  \"twain-cs_00000000\\twaincscert\\x86\\Release\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincscert\\source\\bin\\x86\\Release\\twaincscert.exe\"            \"twain-cs_00000000\\twaincscert\\x86\\Release\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincscert\\source\\bin\\x86\\Release\\twaincscert.pdb\"            \"twain-cs_00000000\\twaincscert\\x86\\Release\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincscert\\source\\bin\\x86\\Release\\twaincscert.exe.config\"     \"twain-cs_00000000\\twaincscert\\x86\\Release\\\" | find /V \"File(s)\"\n::\necho.\necho *** Copying TWAIN CS Scan files to the twain-cs_00000000 folder...\nxcopy \"%~dp0%..\\twaincs\\source\\twaincsscan\\source\\bin\\AnyCPU\\Debug\\TWAIN.dll\"                 \"twain-cs_00000000\\twaincsscan\\AnyCPU\\Debug\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincsscan\\source\\bin\\AnyCPU\\Debug\\TWAIN.pdb\"                 \"twain-cs_00000000\\twaincsscan\\AnyCPU\\Debug\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincsscan\\source\\bin\\AnyCPU\\Debug\\twaincsscan.exe\"           \"twain-cs_00000000\\twaincsscan\\AnyCPU\\Debug\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincsscan\\source\\bin\\AnyCPU\\Debug\\twaincsscan.pdb\"           \"twain-cs_00000000\\twaincsscan\\AnyCPU\\Debug\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincsscan\\source\\bin\\AnyCPU\\Debug\\twaincsscan.exe.config\"    \"twain-cs_00000000\\twaincsscan\\AnyCPU\\Debug\\\" | find /V \"File(s)\"\n::\nxcopy \"%~dp0%..\\twaincs\\source\\twaincsscan\\source\\bin\\AnyCPU\\Release\\TWAIN.dll\"               \"twain-cs_00000000\\twaincsscan\\AnyCPU\\Release\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincsscan\\source\\bin\\AnyCPU\\Release\\TWAIN.pdb\"               \"twain-cs_00000000\\twaincsscan\\AnyCPU\\Release\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincsscan\\source\\bin\\AnyCPU\\Release\\twaincsscan.exe\"         \"twain-cs_00000000\\twaincsscan\\AnyCPU\\Release\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincsscan\\source\\bin\\AnyCPU\\Release\\twaincsscan.pdb\"         \"twain-cs_00000000\\twaincsscan\\AnyCPU\\Release\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincsscan\\source\\bin\\AnyCPU\\Release\\twaincsscan.exe.config\"  \"twain-cs_00000000\\twaincsscan\\AnyCPU\\Release\\\" | find /V \"File(s)\"\n::\nxcopy \"%~dp0%..\\twaincs\\source\\twaincsscan\\source\\bin\\x64\\Debug\\TWAIN.dll\"                    \"twain-cs_00000000\\twaincsscan\\x64\\Debug\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincsscan\\source\\bin\\x64\\Debug\\TWAIN.pdb\"                    \"twain-cs_00000000\\twaincsscan\\x64\\Debug\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincsscan\\source\\bin\\x64\\Debug\\twaincsscan.exe\"              \"twain-cs_00000000\\twaincsscan\\x64\\Debug\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincsscan\\source\\bin\\x64\\Debug\\twaincsscan.pdb\"              \"twain-cs_00000000\\twaincsscan\\x64\\Debug\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincsscan\\source\\bin\\x64\\Debug\\twaincsscan.exe.config\"       \"twain-cs_00000000\\twaincsscan\\x64\\Debug\\\" | find /V \"File(s)\"\n::\nxcopy \"%~dp0%..\\twaincs\\source\\twaincsscan\\source\\bin\\x64\\Release\\TWAIN.dll\"                  \"twain-cs_00000000\\twaincsscan\\x64\\Release\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincsscan\\source\\bin\\x64\\Release\\TWAIN.pdb\"                  \"twain-cs_00000000\\twaincsscan\\x64\\Release\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincsscan\\source\\bin\\x64\\Release\\twaincsscan.exe\"            \"twain-cs_00000000\\twaincsscan\\x64\\Release\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincsscan\\source\\bin\\x64\\Release\\twaincsscan.pdb\"            \"twain-cs_00000000\\twaincsscan\\x64\\Release\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincsscan\\source\\bin\\x64\\Release\\twaincsscan.exe.config\"     \"twain-cs_00000000\\twaincsscan\\x64\\Release\\\" | find /V \"File(s)\"\n::\nxcopy \"%~dp0%..\\twaincs\\source\\twaincsscan\\source\\bin\\x86\\Debug\\TWAIN.dll\"                    \"twain-cs_00000000\\twaincsscan\\x86\\Debug\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincsscan\\source\\bin\\x86\\Debug\\TWAIN.pdb\"                    \"twain-cs_00000000\\twaincsscan\\x86\\Debug\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincsscan\\source\\bin\\x86\\Debug\\twaincsscan.exe\"              \"twain-cs_00000000\\twaincsscan\\x86\\Debug\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincsscan\\source\\bin\\x86\\Debug\\twaincsscan.pdb\"              \"twain-cs_00000000\\twaincsscan\\x86\\Debug\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincsscan\\source\\bin\\x86\\Debug\\twaincsscan.exe.config\"       \"twain-cs_00000000\\twaincsscan\\x86\\Debug\\\" | find /V \"File(s)\"\n::\nxcopy \"%~dp0%..\\twaincs\\source\\twaincsscan\\source\\bin\\x86\\Release\\TWAIN.dll\"                  \"twain-cs_00000000\\twaincsscan\\x86\\Release\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincsscan\\source\\bin\\x86\\Release\\TWAIN.pdb\"                  \"twain-cs_00000000\\twaincsscan\\x86\\Release\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincsscan\\source\\bin\\x86\\Release\\twaincsscan.exe\"            \"twain-cs_00000000\\twaincsscan\\x86\\Release\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincsscan\\source\\bin\\x86\\Release\\twaincsscan.pdb\"            \"twain-cs_00000000\\twaincsscan\\x86\\Release\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincsscan\\source\\bin\\x86\\Release\\twaincsscan.exe.config\"     \"twain-cs_00000000\\twaincsscan\\x86\\Release\\\" | find /V \"File(s)\"\n::\necho.\necho *** Copying TWAIN CS Test files to the twain-cs_00000000 folder...\nxcopy \"%~dp0%..\\twaincs\\source\\twaincstst\\source\\bin\\AnyCPU\\Debug\\TWAIN.dll\"                  \"twain-cs_00000000\\twaincstst\\AnyCPU\\Debug\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincstst\\source\\bin\\AnyCPU\\Debug\\TWAIN.pdb\"                  \"twain-cs_00000000\\twaincstst\\AnyCPU\\Debug\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincstst\\source\\bin\\AnyCPU\\Debug\\twaincstst.exe\"             \"twain-cs_00000000\\twaincstst\\AnyCPU\\Debug\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincstst\\source\\bin\\AnyCPU\\Debug\\twaincstst.pdb\"             \"twain-cs_00000000\\twaincstst\\AnyCPU\\Debug\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincstst\\source\\bin\\AnyCPU\\Debug\\twaincstst.exe.config\"      \"twain-cs_00000000\\twaincstst\\AnyCPU\\Debug\\\" | find /V \"File(s)\"\n::\nxcopy \"%~dp0%..\\twaincs\\source\\twaincstst\\source\\bin\\AnyCPU\\Release\\TWAIN.dll\"                \"twain-cs_00000000\\twaincstst\\AnyCPU\\Release\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincstst\\source\\bin\\AnyCPU\\Release\\TWAIN.pdb\"                \"twain-cs_00000000\\twaincstst\\AnyCPU\\Release\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincstst\\source\\bin\\AnyCPU\\Release\\twaincstst.exe\"           \"twain-cs_00000000\\twaincstst\\AnyCPU\\Release\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincstst\\source\\bin\\AnyCPU\\Release\\twaincstst.pdb\"           \"twain-cs_00000000\\twaincstst\\AnyCPU\\Release\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincstst\\source\\bin\\AnyCPU\\Release\\twaincstst.exe.config\"    \"twain-cs_00000000\\twaincstst\\AnyCPU\\Release\\\" | find /V \"File(s)\"\n::\nxcopy \"%~dp0%..\\twaincs\\source\\twaincstst\\source\\bin\\x64\\Debug\\TWAIN.dll\"                     \"twain-cs_00000000\\twaincstst\\x64\\Debug\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincstst\\source\\bin\\x64\\Debug\\TWAIN.pdb\"                     \"twain-cs_00000000\\twaincstst\\x64\\Debug\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincstst\\source\\bin\\x64\\Debug\\twaincstst.exe\"                \"twain-cs_00000000\\twaincstst\\x64\\Debug\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincstst\\source\\bin\\x64\\Debug\\twaincstst.pdb\"                \"twain-cs_00000000\\twaincstst\\x64\\Debug\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincstst\\source\\bin\\x64\\Debug\\twaincstst.exe.config\"         \"twain-cs_00000000\\twaincstst\\x64\\Debug\\\" | find /V \"File(s)\"\n::\nxcopy \"%~dp0%..\\twaincs\\source\\twaincstst\\source\\bin\\x64\\Release\\TWAIN.dll\"                   \"twain-cs_00000000\\twaincstst\\x64\\Release\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincstst\\source\\bin\\x64\\Release\\TWAIN.pdb\"                   \"twain-cs_00000000\\twaincstst\\x64\\Release\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincstst\\source\\bin\\x64\\Release\\twaincstst.exe\"              \"twain-cs_00000000\\twaincstst\\x64\\Release\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincstst\\source\\bin\\x64\\Release\\twaincstst.pdb\"              \"twain-cs_00000000\\twaincstst\\x64\\Release\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincstst\\source\\bin\\x64\\Release\\twaincstst.exe.config\"       \"twain-cs_00000000\\twaincstst\\x64\\Release\\\" | find /V \"File(s)\"\n::\nxcopy \"%~dp0%..\\twaincs\\source\\twaincstst\\source\\bin\\x86\\Debug\\TWAIN.dll\"                     \"twain-cs_00000000\\twaincstst\\x86\\Debug\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincstst\\source\\bin\\x86\\Debug\\TWAIN.pdb\"                     \"twain-cs_00000000\\twaincstst\\x86\\Debug\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincstst\\source\\bin\\x86\\Debug\\twaincstst.exe\"                \"twain-cs_00000000\\twaincstst\\x86\\Debug\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincstst\\source\\bin\\x86\\Debug\\twaincstst.pdb\"                \"twain-cs_00000000\\twaincstst\\x86\\Debug\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincstst\\source\\bin\\x86\\Debug\\twaincstst.exe.config\"         \"twain-cs_00000000\\twaincstst\\x86\\Debug\\\" | find /V \"File(s)\"\n::\nxcopy \"%~dp0%..\\twaincs\\source\\twaincstst\\source\\bin\\x86\\Release\\TWAIN.dll\"                   \"twain-cs_00000000\\twaincstst\\x86\\Release\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincstst\\source\\bin\\x86\\Release\\TWAIN.pdb\"                   \"twain-cs_00000000\\twaincstst\\x86\\Release\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincstst\\source\\bin\\x86\\Release\\twaincstst.exe\"              \"twain-cs_00000000\\twaincstst\\x86\\Release\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincstst\\source\\bin\\x86\\Release\\twaincstst.pdb\"              \"twain-cs_00000000\\twaincstst\\x86\\Release\\\" | find /V \"File(s)\"\nxcopy \"%~dp0%..\\twaincs\\source\\twaincstst\\source\\bin\\x86\\Release\\twaincstst.exe.config\"       \"twain-cs_00000000\\twaincstst\\x86\\Release\\\" | find /V \"File(s)\"\n\n\n::\n:: All done...\n::\necho.\necho *** All done, be sure to rename the twain-cs_00000000 folder before committing...\ngoto:EOF\n"
  },
  {
    "path": "releases/twain-cs_02041000/TWAIN CS.rtf",
    "content": "{\\rtf1\\adeflang1025\\ansi\\ansicpg1252\\uc1\\adeff44\\deff0\\stshfdbch0\\stshfloch0\\stshfhich0\\stshfbi0\\deflang1033\\deflangfe1033\\themelang1033\\themelangfe0\\themelangcs0{\\fonttbl{\\f0\\fbidi \\froman\\fcharset0\\fprq2{\\*\\panose 02020603050405020304}Times New Roman{\\*\\falt Times New Roman};}\n{\\f1\\fbidi \\fswiss\\fcharset0\\fprq2{\\*\\panose 020b0604020202020204}Arial{\\*\\falt Arial};}{\\f2\\fbidi \\fmodern\\fcharset0\\fprq1{\\*\\panose 02070309020205020404}Courier New{\\*\\falt Courier New};}\n{\\f3\\fbidi \\froman\\fcharset2\\fprq2{\\*\\panose 05050102010706020507}Symbol;}{\\f4\\fbidi \\fswiss\\fcharset0\\fprq2{\\*\\panose 020b0604020202020204}Helvetica;}{\\f5\\fbidi \\fmodern\\fcharset0\\fprq1{\\*\\panose 02070409020205020404}Courier{\\*\\falt Courier New};}\n{\\f10\\fbidi \\fnil\\fcharset2\\fprq2{\\*\\panose 05000000000000000000}Wingdings;}{\\f34\\fbidi \\froman\\fcharset0\\fprq2{\\*\\panose 02040503050406030204}Cambria Math;}\n{\\f37\\fbidi \\fswiss\\fcharset0\\fprq2{\\*\\panose 020f0502020204030204}Calibri{\\*\\falt Century Gothic};}{\\f42\\fbidi \\froman\\fcharset0\\fprq2{\\*\\panose 02040503050406030204}Cambria{\\*\\falt Palatino Linotype};}\n{\\f43\\fbidi \\fswiss\\fcharset0\\fprq2{\\*\\panose 020b0604030504040204}Tahoma;}{\\f44\\fbidi \\froman\\fcharset0\\fprq2{\\*\\panose 02040602050305030304}Book Antiqua{\\*\\falt Book Antiqua};}\n{\\f45\\fbidi \\froman\\fcharset0\\fprq0{\\*\\panose 00000000000000000000}BookAntiqua{\\*\\falt Book Antiqua};}{\\f46\\fbidi \\froman\\fcharset0\\fprq2{\\*\\panose 00000000000000000000}MS Serif;}\n{\\f47\\fbidi \\fswiss\\fcharset0\\fprq2{\\*\\panose 00000000000000000000}Geneva{\\*\\falt Arial};}{\\f48\\fbidi \\fnil\\fcharset0\\fprq0{\\*\\panose 00000000000000000000}Courier Std;}{\\f49\\fbidi \\fmodern\\fcharset0\\fprq1{\\*\\panose 00000000000000000000}Consolas;}\n{\\f50\\fbidi \\froman\\fcharset0\\fprq0{\\*\\panose 00000000000000000000}CourierNewPSMT;}{\\flomajor\\f31500\\fbidi \\froman\\fcharset0\\fprq2{\\*\\panose 02020603050405020304}Times New Roman{\\*\\falt Times New Roman};}\n{\\fdbmajor\\f31501\\fbidi \\froman\\fcharset0\\fprq2{\\*\\panose 02020603050405020304}Times New Roman{\\*\\falt Times New Roman};}{\\fhimajor\\f31502\\fbidi \\froman\\fcharset0\\fprq2{\\*\\panose 02040503050406030204}Cambria{\\*\\falt Palatino Linotype};}\n{\\fbimajor\\f31503\\fbidi \\froman\\fcharset0\\fprq2{\\*\\panose 02020603050405020304}Times New Roman{\\*\\falt Times New Roman};}{\\flominor\\f31504\\fbidi \\froman\\fcharset0\\fprq2{\\*\\panose 02020603050405020304}Times New Roman{\\*\\falt Times New Roman};}\n{\\fdbminor\\f31505\\fbidi \\froman\\fcharset0\\fprq2{\\*\\panose 02020603050405020304}Times New Roman{\\*\\falt Times New Roman};}{\\fhiminor\\f31506\\fbidi \\fswiss\\fcharset0\\fprq2{\\*\\panose 020f0502020204030204}Calibri{\\*\\falt Century Gothic};}\n{\\fbiminor\\f31507\\fbidi \\froman\\fcharset0\\fprq2{\\*\\panose 02020603050405020304}Times New Roman{\\*\\falt Times New Roman};}{\\f52\\fbidi \\froman\\fcharset238\\fprq2 Times New Roman CE{\\*\\falt Times New Roman};}\n{\\f53\\fbidi \\froman\\fcharset204\\fprq2 Times New Roman Cyr{\\*\\falt Times New Roman};}{\\f55\\fbidi \\froman\\fcharset161\\fprq2 Times New Roman Greek{\\*\\falt Times New Roman};}{\\f56\\fbidi \\froman\\fcharset162\\fprq2 Times New Roman Tur{\\*\\falt Times New Roman};}\n{\\f57\\fbidi \\froman\\fcharset177\\fprq2 Times New Roman (Hebrew){\\*\\falt Times New Roman};}{\\f58\\fbidi \\froman\\fcharset178\\fprq2 Times New Roman (Arabic){\\*\\falt Times New Roman};}\n{\\f59\\fbidi \\froman\\fcharset186\\fprq2 Times New Roman Baltic{\\*\\falt Times New Roman};}{\\f60\\fbidi \\froman\\fcharset163\\fprq2 Times New Roman (Vietnamese){\\*\\falt Times New Roman};}{\\f62\\fbidi \\fswiss\\fcharset238\\fprq2 Arial CE{\\*\\falt Arial};}\n{\\f63\\fbidi \\fswiss\\fcharset204\\fprq2 Arial Cyr{\\*\\falt Arial};}{\\f65\\fbidi \\fswiss\\fcharset161\\fprq2 Arial Greek{\\*\\falt Arial};}{\\f66\\fbidi \\fswiss\\fcharset162\\fprq2 Arial Tur{\\*\\falt Arial};}\n{\\f67\\fbidi \\fswiss\\fcharset177\\fprq2 Arial (Hebrew){\\*\\falt Arial};}{\\f68\\fbidi \\fswiss\\fcharset178\\fprq2 Arial (Arabic){\\*\\falt Arial};}{\\f69\\fbidi \\fswiss\\fcharset186\\fprq2 Arial Baltic{\\*\\falt Arial};}\n{\\f70\\fbidi \\fswiss\\fcharset163\\fprq2 Arial (Vietnamese){\\*\\falt Arial};}{\\f72\\fbidi \\fmodern\\fcharset238\\fprq1 Courier New CE{\\*\\falt Courier New};}{\\f73\\fbidi \\fmodern\\fcharset204\\fprq1 Courier New Cyr{\\*\\falt Courier New};}\n{\\f75\\fbidi \\fmodern\\fcharset161\\fprq1 Courier New Greek{\\*\\falt Courier New};}{\\f76\\fbidi \\fmodern\\fcharset162\\fprq1 Courier New Tur{\\*\\falt Courier New};}{\\f77\\fbidi \\fmodern\\fcharset177\\fprq1 Courier New (Hebrew){\\*\\falt Courier New};}\n{\\f78\\fbidi \\fmodern\\fcharset178\\fprq1 Courier New (Arabic){\\*\\falt Courier New};}{\\f79\\fbidi \\fmodern\\fcharset186\\fprq1 Courier New Baltic{\\*\\falt Courier New};}{\\f80\\fbidi \\fmodern\\fcharset163\\fprq1 Courier New (Vietnamese){\\*\\falt Courier New};}\n{\\f92\\fbidi \\fswiss\\fcharset238\\fprq2 Helvetica CE;}{\\f93\\fbidi \\fswiss\\fcharset204\\fprq2 Helvetica Cyr;}{\\f95\\fbidi \\fswiss\\fcharset161\\fprq2 Helvetica Greek;}{\\f96\\fbidi \\fswiss\\fcharset162\\fprq2 Helvetica Tur;}\n{\\f97\\fbidi \\fswiss\\fcharset177\\fprq2 Helvetica (Hebrew);}{\\f98\\fbidi \\fswiss\\fcharset178\\fprq2 Helvetica (Arabic);}{\\f99\\fbidi \\fswiss\\fcharset186\\fprq2 Helvetica Baltic;}{\\f100\\fbidi \\fswiss\\fcharset163\\fprq2 Helvetica (Vietnamese);}\n{\\f392\\fbidi \\froman\\fcharset238\\fprq2 Cambria Math CE;}{\\f393\\fbidi \\froman\\fcharset204\\fprq2 Cambria Math Cyr;}{\\f395\\fbidi \\froman\\fcharset161\\fprq2 Cambria Math Greek;}{\\f396\\fbidi \\froman\\fcharset162\\fprq2 Cambria Math Tur;}\n{\\f399\\fbidi \\froman\\fcharset186\\fprq2 Cambria Math Baltic;}{\\f400\\fbidi \\froman\\fcharset163\\fprq2 Cambria Math (Vietnamese);}{\\f422\\fbidi \\fswiss\\fcharset238\\fprq2 Calibri CE{\\*\\falt Century Gothic};}\n{\\f423\\fbidi \\fswiss\\fcharset204\\fprq2 Calibri Cyr{\\*\\falt Century Gothic};}{\\f425\\fbidi \\fswiss\\fcharset161\\fprq2 Calibri Greek{\\*\\falt Century Gothic};}{\\f426\\fbidi \\fswiss\\fcharset162\\fprq2 Calibri Tur{\\*\\falt Century Gothic};}\n{\\f427\\fbidi \\fswiss\\fcharset177\\fprq2 Calibri (Hebrew){\\*\\falt Century Gothic};}{\\f428\\fbidi \\fswiss\\fcharset178\\fprq2 Calibri (Arabic){\\*\\falt Century Gothic};}{\\f429\\fbidi \\fswiss\\fcharset186\\fprq2 Calibri Baltic{\\*\\falt Century Gothic};}\n{\\f430\\fbidi \\fswiss\\fcharset163\\fprq2 Calibri (Vietnamese){\\*\\falt Century Gothic};}{\\f472\\fbidi \\froman\\fcharset238\\fprq2 Cambria CE{\\*\\falt Palatino Linotype};}{\\f473\\fbidi \\froman\\fcharset204\\fprq2 Cambria Cyr{\\*\\falt Palatino Linotype};}\n{\\f475\\fbidi \\froman\\fcharset161\\fprq2 Cambria Greek{\\*\\falt Palatino Linotype};}{\\f476\\fbidi \\froman\\fcharset162\\fprq2 Cambria Tur{\\*\\falt Palatino Linotype};}{\\f479\\fbidi \\froman\\fcharset186\\fprq2 Cambria Baltic{\\*\\falt Palatino Linotype};}\n{\\f480\\fbidi \\froman\\fcharset163\\fprq2 Cambria (Vietnamese){\\*\\falt Palatino Linotype};}{\\f482\\fbidi \\fswiss\\fcharset238\\fprq2 Tahoma CE;}{\\f483\\fbidi \\fswiss\\fcharset204\\fprq2 Tahoma Cyr;}{\\f485\\fbidi \\fswiss\\fcharset161\\fprq2 Tahoma Greek;}\n{\\f486\\fbidi \\fswiss\\fcharset162\\fprq2 Tahoma Tur;}{\\f487\\fbidi \\fswiss\\fcharset177\\fprq2 Tahoma (Hebrew);}{\\f488\\fbidi \\fswiss\\fcharset178\\fprq2 Tahoma (Arabic);}{\\f489\\fbidi \\fswiss\\fcharset186\\fprq2 Tahoma Baltic;}\n{\\f490\\fbidi \\fswiss\\fcharset163\\fprq2 Tahoma (Vietnamese);}{\\f491\\fbidi \\fswiss\\fcharset222\\fprq2 Tahoma (Thai);}{\\f492\\fbidi \\froman\\fcharset238\\fprq2 Book Antiqua CE{\\*\\falt Book Antiqua};}\n{\\f493\\fbidi \\froman\\fcharset204\\fprq2 Book Antiqua Cyr{\\*\\falt Book Antiqua};}{\\f495\\fbidi \\froman\\fcharset161\\fprq2 Book Antiqua Greek{\\*\\falt Book Antiqua};}{\\f496\\fbidi \\froman\\fcharset162\\fprq2 Book Antiqua Tur{\\*\\falt Book Antiqua};}\n{\\f499\\fbidi \\froman\\fcharset186\\fprq2 Book Antiqua Baltic{\\*\\falt Book Antiqua};}{\\f542\\fbidi \\fmodern\\fcharset238\\fprq1 Consolas CE;}{\\f543\\fbidi \\fmodern\\fcharset204\\fprq1 Consolas Cyr;}{\\f545\\fbidi \\fmodern\\fcharset161\\fprq1 Consolas Greek;}\n{\\f546\\fbidi \\fmodern\\fcharset162\\fprq1 Consolas Tur;}{\\f549\\fbidi \\fmodern\\fcharset186\\fprq1 Consolas Baltic;}{\\f550\\fbidi \\fmodern\\fcharset163\\fprq1 Consolas (Vietnamese);}\n{\\flomajor\\f31508\\fbidi \\froman\\fcharset238\\fprq2 Times New Roman CE{\\*\\falt Times New Roman};}{\\flomajor\\f31509\\fbidi \\froman\\fcharset204\\fprq2 Times New Roman Cyr{\\*\\falt Times New Roman};}\n{\\flomajor\\f31511\\fbidi \\froman\\fcharset161\\fprq2 Times New Roman Greek{\\*\\falt Times New Roman};}{\\flomajor\\f31512\\fbidi \\froman\\fcharset162\\fprq2 Times New Roman Tur{\\*\\falt Times New Roman};}\n{\\flomajor\\f31513\\fbidi \\froman\\fcharset177\\fprq2 Times New Roman (Hebrew){\\*\\falt Times New Roman};}{\\flomajor\\f31514\\fbidi \\froman\\fcharset178\\fprq2 Times New Roman (Arabic){\\*\\falt Times New Roman};}\n{\\flomajor\\f31515\\fbidi \\froman\\fcharset186\\fprq2 Times New Roman Baltic{\\*\\falt Times New Roman};}{\\flomajor\\f31516\\fbidi \\froman\\fcharset163\\fprq2 Times New Roman (Vietnamese){\\*\\falt Times New Roman};}\n{\\fdbmajor\\f31518\\fbidi \\froman\\fcharset238\\fprq2 Times New Roman CE{\\*\\falt Times New Roman};}{\\fdbmajor\\f31519\\fbidi \\froman\\fcharset204\\fprq2 Times New Roman Cyr{\\*\\falt Times New Roman};}\n{\\fdbmajor\\f31521\\fbidi \\froman\\fcharset161\\fprq2 Times New Roman Greek{\\*\\falt Times New Roman};}{\\fdbmajor\\f31522\\fbidi \\froman\\fcharset162\\fprq2 Times New Roman Tur{\\*\\falt Times New Roman};}\n{\\fdbmajor\\f31523\\fbidi \\froman\\fcharset177\\fprq2 Times New Roman (Hebrew){\\*\\falt Times New Roman};}{\\fdbmajor\\f31524\\fbidi \\froman\\fcharset178\\fprq2 Times New Roman (Arabic){\\*\\falt Times New Roman};}\n{\\fdbmajor\\f31525\\fbidi \\froman\\fcharset186\\fprq2 Times New Roman Baltic{\\*\\falt Times New Roman};}{\\fdbmajor\\f31526\\fbidi \\froman\\fcharset163\\fprq2 Times New Roman (Vietnamese){\\*\\falt Times New Roman};}\n{\\fhimajor\\f31528\\fbidi \\froman\\fcharset238\\fprq2 Cambria CE{\\*\\falt Palatino Linotype};}{\\fhimajor\\f31529\\fbidi \\froman\\fcharset204\\fprq2 Cambria Cyr{\\*\\falt Palatino Linotype};}\n{\\fhimajor\\f31531\\fbidi \\froman\\fcharset161\\fprq2 Cambria Greek{\\*\\falt Palatino Linotype};}{\\fhimajor\\f31532\\fbidi \\froman\\fcharset162\\fprq2 Cambria Tur{\\*\\falt Palatino Linotype};}\n{\\fhimajor\\f31535\\fbidi \\froman\\fcharset186\\fprq2 Cambria Baltic{\\*\\falt Palatino Linotype};}{\\fhimajor\\f31536\\fbidi \\froman\\fcharset163\\fprq2 Cambria (Vietnamese){\\*\\falt Palatino Linotype};}\n{\\fbimajor\\f31538\\fbidi \\froman\\fcharset238\\fprq2 Times New Roman CE{\\*\\falt Times New Roman};}{\\fbimajor\\f31539\\fbidi \\froman\\fcharset204\\fprq2 Times New Roman Cyr{\\*\\falt Times New Roman};}\n{\\fbimajor\\f31541\\fbidi \\froman\\fcharset161\\fprq2 Times New Roman Greek{\\*\\falt Times New Roman};}{\\fbimajor\\f31542\\fbidi \\froman\\fcharset162\\fprq2 Times New Roman Tur{\\*\\falt Times New Roman};}\n{\\fbimajor\\f31543\\fbidi \\froman\\fcharset177\\fprq2 Times New Roman (Hebrew){\\*\\falt Times New Roman};}{\\fbimajor\\f31544\\fbidi \\froman\\fcharset178\\fprq2 Times New Roman (Arabic){\\*\\falt Times New Roman};}\n{\\fbimajor\\f31545\\fbidi \\froman\\fcharset186\\fprq2 Times New Roman Baltic{\\*\\falt Times New Roman};}{\\fbimajor\\f31546\\fbidi \\froman\\fcharset163\\fprq2 Times New Roman (Vietnamese){\\*\\falt Times New Roman};}\n{\\flominor\\f31548\\fbidi \\froman\\fcharset238\\fprq2 Times New Roman CE{\\*\\falt Times New Roman};}{\\flominor\\f31549\\fbidi \\froman\\fcharset204\\fprq2 Times New Roman Cyr{\\*\\falt Times New Roman};}\n{\\flominor\\f31551\\fbidi \\froman\\fcharset161\\fprq2 Times New Roman Greek{\\*\\falt Times New Roman};}{\\flominor\\f31552\\fbidi \\froman\\fcharset162\\fprq2 Times New Roman Tur{\\*\\falt Times New Roman};}\n{\\flominor\\f31553\\fbidi \\froman\\fcharset177\\fprq2 Times New Roman (Hebrew){\\*\\falt Times New Roman};}{\\flominor\\f31554\\fbidi \\froman\\fcharset178\\fprq2 Times New Roman (Arabic){\\*\\falt Times New Roman};}\n{\\flominor\\f31555\\fbidi \\froman\\fcharset186\\fprq2 Times New Roman Baltic{\\*\\falt Times New Roman};}{\\flominor\\f31556\\fbidi \\froman\\fcharset163\\fprq2 Times New Roman (Vietnamese){\\*\\falt Times New Roman};}\n{\\fdbminor\\f31558\\fbidi \\froman\\fcharset238\\fprq2 Times New Roman CE{\\*\\falt Times New Roman};}{\\fdbminor\\f31559\\fbidi \\froman\\fcharset204\\fprq2 Times New Roman Cyr{\\*\\falt Times New Roman};}\n{\\fdbminor\\f31561\\fbidi \\froman\\fcharset161\\fprq2 Times New Roman Greek{\\*\\falt Times New Roman};}{\\fdbminor\\f31562\\fbidi \\froman\\fcharset162\\fprq2 Times New Roman Tur{\\*\\falt Times New Roman};}\n{\\fdbminor\\f31563\\fbidi \\froman\\fcharset177\\fprq2 Times New Roman (Hebrew){\\*\\falt Times New Roman};}{\\fdbminor\\f31564\\fbidi \\froman\\fcharset178\\fprq2 Times New Roman (Arabic){\\*\\falt Times New Roman};}\n{\\fdbminor\\f31565\\fbidi \\froman\\fcharset186\\fprq2 Times New Roman Baltic{\\*\\falt Times New Roman};}{\\fdbminor\\f31566\\fbidi \\froman\\fcharset163\\fprq2 Times New Roman (Vietnamese){\\*\\falt Times New Roman};}\n{\\fhiminor\\f31568\\fbidi \\fswiss\\fcharset238\\fprq2 Calibri CE{\\*\\falt Century Gothic};}{\\fhiminor\\f31569\\fbidi \\fswiss\\fcharset204\\fprq2 Calibri Cyr{\\*\\falt Century Gothic};}\n{\\fhiminor\\f31571\\fbidi \\fswiss\\fcharset161\\fprq2 Calibri Greek{\\*\\falt Century Gothic};}{\\fhiminor\\f31572\\fbidi \\fswiss\\fcharset162\\fprq2 Calibri Tur{\\*\\falt Century Gothic};}\n{\\fhiminor\\f31573\\fbidi \\fswiss\\fcharset177\\fprq2 Calibri (Hebrew){\\*\\falt Century Gothic};}{\\fhiminor\\f31574\\fbidi \\fswiss\\fcharset178\\fprq2 Calibri (Arabic){\\*\\falt Century Gothic};}\n{\\fhiminor\\f31575\\fbidi \\fswiss\\fcharset186\\fprq2 Calibri Baltic{\\*\\falt Century Gothic};}{\\fhiminor\\f31576\\fbidi \\fswiss\\fcharset163\\fprq2 Calibri (Vietnamese){\\*\\falt Century Gothic};}\n{\\fbiminor\\f31578\\fbidi \\froman\\fcharset238\\fprq2 Times New Roman CE{\\*\\falt Times New Roman};}{\\fbiminor\\f31579\\fbidi \\froman\\fcharset204\\fprq2 Times New Roman Cyr{\\*\\falt Times New Roman};}\n{\\fbiminor\\f31581\\fbidi \\froman\\fcharset161\\fprq2 Times New Roman Greek{\\*\\falt Times New Roman};}{\\fbiminor\\f31582\\fbidi \\froman\\fcharset162\\fprq2 Times New Roman Tur{\\*\\falt Times New Roman};}\n{\\fbiminor\\f31583\\fbidi \\froman\\fcharset177\\fprq2 Times New Roman (Hebrew){\\*\\falt Times New Roman};}{\\fbiminor\\f31584\\fbidi \\froman\\fcharset178\\fprq2 Times New Roman (Arabic){\\*\\falt Times New Roman};}\n{\\fbiminor\\f31585\\fbidi \\froman\\fcharset186\\fprq2 Times New Roman Baltic{\\*\\falt Times New Roman};}{\\fbiminor\\f31586\\fbidi \\froman\\fcharset163\\fprq2 Times New Roman (Vietnamese){\\*\\falt Times New Roman};}}{\\colortbl;\\red0\\green0\\blue0;\n\\red0\\green0\\blue255;\\red0\\green255\\blue255;\\red0\\green255\\blue0;\\red255\\green0\\blue255;\\red255\\green0\\blue0;\\red255\\green255\\blue0;\\red255\\green255\\blue255;\\red0\\green0\\blue128;\\red0\\green128\\blue128;\\red0\\green128\\blue0;\\red128\\green0\\blue128;\n\\red128\\green0\\blue0;\\red128\\green128\\blue0;\\red128\\green128\\blue128;\\red192\\green192\\blue192;\\red0\\green0\\blue0;\\red0\\green0\\blue0;\\cfollowedhyperlink\\ctint255\\cshade255\\red128\\green0\\blue128;\\red96\\green94\\blue92;\\red225\\green223\\blue221;\n\\red31\\green73\\blue125;\\red0\\green176\\blue80;}{\\*\\defchp \\fs22 }{\\*\\defpap \\ql \\li0\\ri0\\sa200\\sl276\\slmult1\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 }\\noqfpromote {\\stylesheet{\n\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\snext0 \\sqformat \\spriority0 Normal;}{\n\\s1\\ql \\li0\\ri0\\sb720\\keepn\\widctlpar\\brdrt\\brdrs\\brdrw30\\brsp120 \\wrapdefault\\nooverflow\\faroman\\outlinelevel0\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs36\\alang1025 \\ltrch\\fcs0 \\b\\f1\\fs36\\cf9\\lang1024\\langfe1024\\cgrid\\noproof\\langnp1033\\langfenp1033 \n\\sbasedon0 \\snext0 \\slink15 \\sqformat heading 1;}{\\s2\\ql \\li720\\ri0\\sb360\\keepn\\widctlpar\\wrapdefault\\nooverflow\\faroman\\outlinelevel1\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs20\\alang1025 \\ltrch\\fcs0 \n\\b\\f1\\fs20\\cf13\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\slink16 \\sqformat heading 2;}{\\s3\\ql \\li1440\\ri0\\sb180\\keepn\\widctlpar\\wrapdefault\\nooverflow\\faroman\\outlinelevel2\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \n\\ab\\af1\\afs20\\alang1025 \\ltrch\\fcs0 \\b\\f1\\fs20\\cf10\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext24 \\slink17 \\sqformat heading 3;}{\\s4\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\outlinelevel3\\rin0\\lin1440\\itap0 \n\\rtlch\\fcs1 \\af46\\afs24\\alang1025 \\ltrch\\fcs0 \\f46\\fs24\\ul\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext24 \\slink18 \\sqformat heading 4;}{\n\\s5\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\outlinelevel4\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\ab\\af46\\afs20\\alang1025 \\ltrch\\fcs0 \\b\\f46\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext24 \\slink19 \\sqformat \nheading 5;}{\\s6\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\outlinelevel5\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af46\\afs20\\alang1025 \\ltrch\\fcs0 \\f46\\fs20\\ul\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \n\\sbasedon0 \\snext24 \\slink20 \\sqformat heading 6;}{\\s7\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\outlinelevel6\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\ai\\af46\\afs20\\alang1025 \\ltrch\\fcs0 \n\\i\\f46\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext24 \\slink21 \\sqformat heading 7;}{\\s8\\ql \\li1440\\ri0\\sb240\\sa60\\widctlpar\\wrapdefault\\nooverflow\\faroman\\outlinelevel7\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\ai\\af44\\afs20\\alang1025 \n\\ltrch\\fcs0 \\i\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\slink22 \\sqformat heading 8;}{\\s9\\ql \\li1440\\ri0\\sb240\\sa60\\widctlpar\\wrapdefault\\nooverflow\\faroman\\outlinelevel8\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \n\\ab\\ai\\af44\\afs18\\alang1025 \\ltrch\\fcs0 \\b\\i\\f44\\fs18\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\slink23 \\sqformat heading 9;}{\\*\\cs10 \\additive \\ssemihidden Default Paragraph Font;}{\\*\n\\ts11\\tsrowd\\trftsWidthB3\\trpaddl108\\trpaddr108\\trpaddfl3\\trpaddft3\\trpaddfb3\\trpaddfr3\\trcbpat1\\trcfpat1\\tblind0\\tblindtype3\\tsvertalt\\tsbrdrt\\tsbrdrl\\tsbrdrb\\tsbrdrr\\tsbrdrdgl\\tsbrdrdgr\\tsbrdrh\\tsbrdrv \\ql \\li0\\ri0\\sa200\\sl276\\slmult1\n\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af0\\afs22\\alang1025 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\snext11 \\ssemihidden \\sunhideused Normal Table;}{\\*\\cs15 \\additive \\rtlch\\fcs1 \n\\ab\\af0\\afs32 \\ltrch\\fcs0 \\b\\f42\\fs32\\kerning32 \\sbasedon10 \\slink1 \\slocked Heading 1 Char;}{\\*\\cs16 \\additive \\rtlch\\fcs1 \\ab\\ai\\af0\\afs28 \\ltrch\\fcs0 \\b\\i\\f42\\fs28 \\sbasedon10 \\slink2 \\slocked \\ssemihidden Heading 2 Char;}{\\*\\cs17 \\additive \n\\rtlch\\fcs1 \\ab\\af0\\afs26 \\ltrch\\fcs0 \\b\\f42\\fs26 \\sbasedon10 \\slink3 \\slocked \\ssemihidden Heading 3 Char;}{\\*\\cs18 \\additive \\rtlch\\fcs1 \\ab\\af0\\afs28 \\ltrch\\fcs0 \\b\\f37\\fs28 \\sbasedon10 \\slink4 \\slocked \\ssemihidden Heading 4 Char;}{\\*\\cs19 \\additive \n\\rtlch\\fcs1 \\ab\\ai\\af0\\afs26 \\ltrch\\fcs0 \\b\\i\\f37\\fs26 \\sbasedon10 \\slink5 \\slocked \\ssemihidden Heading 5 Char;}{\\*\\cs20 \\additive \\rtlch\\fcs1 \\ab\\af0 \\ltrch\\fcs0 \\b\\f37 \\sbasedon10 \\slink6 \\slocked \\ssemihidden Heading 6 Char;}{\\*\\cs21 \\additive \n\\rtlch\\fcs1 \\af0\\afs24 \\ltrch\\fcs0 \\f37\\fs24 \\sbasedon10 \\slink7 \\slocked \\ssemihidden Heading 7 Char;}{\\*\\cs22 \\additive \\rtlch\\fcs1 \\ai\\af0\\afs24 \\ltrch\\fcs0 \\i\\f37\\fs24 \\sbasedon10 \\slink8 \\slocked \\ssemihidden Heading 8 Char;}{\\*\\cs23 \\additive \n\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\f42 \\sbasedon10 \\slink9 \\slocked \\ssemihidden Heading 9 Char;}{\\s24\\ql \\li1800\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1800\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext24 Normal Indent;}{\\s25\\ql \\li0\\ri0\\widctlpar\\tqr\\tx9360\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\ai\\af1\\afs16\\alang1025 \\ltrch\\fcs0 \n\\i\\f1\\fs16\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext25 \\slink26 footer;}{\\*\\cs26 \\additive \\rtlch\\fcs1 \\af44\\afs20 \\ltrch\\fcs0 \\f44\\fs20 \\sbasedon10 \\slink25 \\slocked \\ssemihidden Footer Char;}{\\s27\\ql \\li0\\ri0\\widctlpar\n\\tqr\\tx9900\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\ab\\ai\\af1\\afs20\\alang1025 \\ltrch\\fcs0 \\b\\i\\f1\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext27 \\slink28 header;}{\\*\\cs28 \\additive \\rtlch\\fcs1 \\af44\\afs20 \n\\ltrch\\fcs0 \\f44\\fs20 \\sbasedon10 \\slink27 \\slocked \\ssemihidden Header Char;}{\\s29\\ql \\li2160\\ri0\\sb40\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin2160\\itap0 \\rtlch\\fcs1 \\af2\\afs18\\alang1025 \\ltrch\\fcs0 \n\\f2\\fs18\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon30 \\snext29 prog indent;}{\\s30\\ql \\li1800\\ri0\\sb40\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1800\\itap0 \\rtlch\\fcs1 \\af2\\afs18\\alang1025 \\ltrch\\fcs0 \n\\f2\\fs18\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon31 \\snext30 prog;}{\\s31\\ql \\fi-360\\li360\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin360\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext31 List;}{\\*\\cs32 \\additive \\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\sbasedon10 page number;}{\\s33\\ql \\fi-216\\li2016\\ri0\\sb40\\widctlpar\\wrapdefault{\\*\\pn \\pnlvlblt\\ilvl10\\ls2047\\pnrnot0\n\\pnf5\\pnstart1\\pnindent216\\pnhang {\\pntxtb ?}}\\nooverflow\\faroman\\ls2047\\ilvl10\\rin0\\lin2016\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext33 bullet;}{\n\\s34\\ql \\li0\\ri0\\sb720\\keepn\\widctlpar\\brdrt\\brdrs\\brdrw30\\brsp120 \\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs36\\alang1025 \\ltrch\\fcs0 \\b\\f1\\fs36\\cf9\\lang1024\\langfe1024\\cgrid\\noproof\\langnp1033\\langfenp1033 \n\\sbasedon1 \\snext34 Style1;}{\\s35\\ql \\fi-216\\li2016\\ri0\\sb120\\widctlpar\\wrapdefault{\\*\\pn \\pnlvlblt\\ilvl10\\ls2047\\pnrnot0\\pnf5\\pnstart1\\pnindent216\\pnhang {\\pntxtb ?}}\\nooverflow\\faroman\\ls2047\\ilvl10\\rin0\\lin2016\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \n\\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon33 \\snext33 bullet first;}{\\s36\\ql \\li1440\\ri0\\sb180\\widctlpar\\tx5220\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs20\\alang1025 \\ltrch\\fcs0 \n\\b\\f1\\fs20\\cf13\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext38 chapter contents;}{\\s37\\ql \\li1440\\ri0\\sb40\\widctlpar\\tx5400\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext37 chapter contents list;}{\\s38\\ql \\li1440\\ri0\\sb80\\widctlpar\\tx5400\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext37 chapter contents list first;}{\\s39\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs200\\alang1025 \\ltrch\\fcs0 \n\\b\\f1\\fs200\\lang1024\\langfe1024\\cgrid\\noproof\\langnp1033\\langfenp1033 \\snext0 chapter num;}{\\s40\\qr \\li0\\ri0\\sa720\\widctlpar\\brdrt\\brdrs\\brdrw60\\brsp20 \\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs54\\alang1025 \\ltrch\\fcs0 \n\\b\\f1\\fs54\\cf9\\lang1024\\langfe1024\\cgrid\\noproof\\langnp1033\\langfenp1033 \\snext36 chapter title;}{\\s41\\ql \\li1800\\ri0\\sb120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1800\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon31 \\snext31 list first;}{\\s42\\ql \\fi-216\\li2376\\ri0\\sb40\\widctlpar\\wrapdefault{\\*\\pn \\pnlvlblt\\ilvl10\\ls2047\\pnrnot0\\pnf47\\pnstart1\\pnindent216\\pnhang {\\pntxtb ?}}\n\\nooverflow\\faroman\\ls2047\\ilvl10\\rin0\\lin2376\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext42 bullet indent;}{\n\\s43\\ql \\li1440\\ri0\\sb120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 normal after heading 3;}{\n\\s44\\ql \\fi-216\\li2376\\ri0\\sb80\\widctlpar\\wrapdefault{\\*\\pn \\pnlvlblt\\ilvl10\\ls2047\\pnrnot0\\pnf47\\pnstart1\\pnindent216\\pnhang {\\pntxtb ?}}\\nooverflow\\faroman\\ls2047\\ilvl10\\rin0\\lin2376\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon33 \\snext42 bullet indent first;}{\\s45\\qr \\li720\\ri0\\sa360\\sl-1060\\slmult0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \\ab\\ai\\af1\\afs48\\alang1025 \\ltrch\\fcs0 \n\\b\\i\\f1\\fs48\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 contents title;}{\\s46\\ql \\li2160\\ri0\\sb40\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin2160\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon31 \\snext46 def;}{\\s47\\ql \\li2160\\ri0\\sb80\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin2160\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon46 \\snext47 def 2;}{\\s48\\ql \\li1080\\ri0\\sb120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1080\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon41 \\snext46 def first;}{\\s49\\ql \\li2160\\ri0\\sb40\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin2160\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon46 \\snext0 def last;}{\\s50\\ql \\li2160\\ri0\\sb80\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin2160\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon49 \\snext0 def last 2;}{\\s51\\ql \\li1800\\ri0\\sb120\\keepn\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1800\\itap0 \\rtlch\\fcs1 \\ab\\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\b\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon41 \\snext46 def term;}{\\s52\\ql \\li1800\\ri0\\sb120\\keepn\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1800\\itap0 \\rtlch\\fcs1 \\ab\\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\b\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon41 \\snext52 def term first;}{\\s53\\qc \\li1440\\ri0\\sb240\\keepn\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext54 figure;}{\\s54\\qc \\li1440\\ri0\\sb180\\sa240\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs20\\alang1025 \\ltrch\\fcs0 \n\\b\\f1\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 figure title;}{\\s55\\qc \\li1440\\ri0\\sb240\\keepn\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon53 \\snext0 figure after step;}{\\s56\\qc \\li1440\\ri0\\sb180\\sa240\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs20\\alang1025 \\ltrch\\fcs0 \n\\b\\f1\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon54 \\snext56 figure title after step;}{\\s57\\qc \\li1440\\ri0\\sb180\\sa360\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs20\\alang1025 \\ltrch\\fcs0 \n\\b\\f1\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon54 \\snext0 figure title continued;}{\\*\\cs58 \\additive \\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\sbasedon10 line number;}{\n\\s59\\ql \\li2160\\ri0\\sb40\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin2160\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon31 \\snext59 list indent;}{\n\\s60\\ql \\li2160\\ri0\\sb80\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin2160\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon31 \\snext59 list indent first;}{\n\\s61\\ql \\fi-360\\li2160\\ri0\\sb120\\widctlpar\\wrapdefault{\\*\\pn \\pnlvlbody\\ilvl11\\ls2047\\pnrnot0\\pndec\\pnstart1\\pnindent360\\pnhang {\\pntxta .}}\\nooverflow\\faroman\\ls2047\\ilvl11\\rin0\\lin2160\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext61 List Number;}{\\s62\\ql \\li2160\\ri0\\sb80\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin2160\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon60 \\snext62 list number no number;}{\\s63\\ql \\li720\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext63 normal before table;}{\\s64\\ql \\fi-806\\li2246\\ri0\\sb240\\sa120\\widctlpar\\brdrt\\brdrs\\brdrw15\\brsp100 \\brdrb\\brdrs\\brdrw15\\brsp100 \n\\tx2250\\wrapdefault\\nooverflow\\faroman\\rin0\\lin2246\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 note;}{\n\\s65\\qr \\li0\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\ai\\af1\\afs20\\alang1025 \\ltrch\\fcs0 \\i\\f1\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext65 part number;}{\n\\s66\\ql \\li1800\\ri0\\sb120\\widctlpar\\tx4770\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1800\\itap0 \\rtlch\\fcs1 \\af2\\afs18\\alang1025 \\ltrch\\fcs0 \\f2\\fs18\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon41 \\snext30 prog first;}{\n\\s67\\ql \\li1800\\ri0\\sb40\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1800\\itap0 \\rtlch\\fcs1 \\af2\\afs18\\alang1025 \\ltrch\\fcs0 \\f2\\fs18\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon31 \\snext67 prog last;}{\n\\s68\\ql \\li1800\\ri0\\sb120\\widctlpar\\tx4770\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1800\\itap0 \\rtlch\\fcs1 \\af2\\afs18\\alang1025 \\ltrch\\fcs0 \\f2\\fs18\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon66 \\snext68 prog single;}{\n\\s69\\ql \\li878\\ri144\\sl-180\\slmult0\\widctlpar\\brdrt\\brdrs\\brdrw15\\brsp100 \\brdrl\\brdrs\\brdrw15\\brsp100 \\brdrb\\brdrs\\brdrw15\\brsp100 \\brdrr\\brdrs\\brdrw15\\brsp100 \n\\tx1152\\tx1440\\tx1728\\tx2016\\tx2304\\tx2592\\tx2880\\wrapdefault\\nooverflow\\faroman\\rin144\\lin878\\itap0 \\rtlch\\fcs1 \\af2\\afs15\\alang1025 \\ltrch\\fcs0 \\f2\\fs15\\lang1024\\langfe1024\\cgrid\\noproof\\langnp1033\\langfenp1033 \\snext69 program text;}{\n\\s70\\ql \\fi-360\\li2520\\ri0\\sb80\\widctlpar\\wrapdefault{\\*\\pn \\pnlvlbody\\ilvl11\\ls2047\\pnrnot0\\pnlcltr\\pnb0\\pni0\\pnf4\\pnfs20\\pnstart1\\pnindent360\\pnhang {\\pntxta . }}\\nooverflow\\faroman\\ls2047\\ilvl11\\rin0\\lin2520\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \n\\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext70 substep;}{\\s71\\ql \\li72\\ri72\\sb80\\sa80\\keepn\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin72\\lin72\\itap0 \\rtlch\\fcs1 \\ab\\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\b\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 table head;}{\\s72\\ql \\li72\\ri72\\sb80\\sa80\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin72\\lin72\\itap0 \\rtlch\\fcs1 \\af44\\afs18\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs18\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\snext72 table text;}{\\s73\\qc \\li1440\\ri0\\sb300\\sa120\\keepn\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs20\\alang1025 \\ltrch\\fcs0 \n\\b\\f1\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext71 table title;}{\\s74\\qc \\li1440\\ri0\\sb300\\sa120\\keepn\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs20\\alang1025 \\ltrch\\fcs0 \n\\b\\f1\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon73 \\snext71 table title continued;}{\\s75\\ql \\li1800\\ri0\\sb120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1800\\itap0 \\rtlch\\fcs1 \\af1\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f1\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 triplet single;}{\\s76\\ql \\li720\\ri0\\sb360\\keepn\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs20\\alang1025 \\ltrch\\fcs0 \n\\b\\f1\\fs20\\cf13\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon2 \\snext0 triplet heading 2;}{\\s77\\ql \\li0\\ri0\\sb180\\keepn\\pagebb\\widctlpar\\brdrt\\brdrs\\brdrw30\\brsp120 \\tqr\\tx9893\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \n\\ab\\af1\\afs24\\alang1025 \\ltrch\\fcs0 \\b\\f1\\fs24\\cf9\\lang1024\\langfe1024\\cgrid\\noproof\\langnp1033\\langfenp1033 \\sbasedon1 \\snext77 triplet heading;}{\\s78\\ql \\li1080\\ri0\\sb120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1080\\itap0 \\rtlch\\fcs1 \n\\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext79 glossary def;}{\\s79\\ql \\li720\\ri0\\sb180\\keepn\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \n\\ab\\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\b\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon80 \\snext78 glossary word;}{\\s80\\ql \\li720\\ri0\\sb180\\keepn\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \n\\ab\\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\b\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext78 glossary word first;}{\\s81\\ql \\li1080\\ri0\\sb120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1080\\itap0 \\rtlch\\fcs1 \n\\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon78 \\snext0 glossary def last;}{\\s82\\ql \\fi-216\\li2736\\ri0\\sb80\\widctlpar\\wrapdefault{\\*\\pn \\pnlvlblt\\ilvl10\\ls2047\\pnrnot0\n\\pnf5\\pnstart1\\pnindent216\\pnhang {\\pntxtb ?}}\\nooverflow\\faroman\\ls2047\\ilvl10\\rin0\\lin2736\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext82 ref bullet 1;}{\n\\s83\\ql \\fi-216\\li2736\\ri0\\sb40\\widctlpar\\wrapdefault{\\*\\pn \\pnlvlblt\\ilvl10\\ls2047\\pnrnot0\\pnf5\\pnstart1\\pnindent216\\pnhang {\\pntxtb ?}}\\nooverflow\\faroman\\ls2047\\ilvl10\\rin0\\lin2736\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon82 \\snext83 ref bullet 2;}{\\s84\\ql \\fi-1440\\li2160\\ri0\\sb180\\widctlpar\\tx2160\\wrapdefault\\nooverflow\\faroman\\rin0\\lin2160\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext84 ref para 1;}{\\s85\\ql \\li2160\\ri0\\sb80\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin2160\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon84 \\snext84 ref para 2;}{\\s86\\ql \\li2520\\ri0\\sb80\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin2520\\itap0 \\rtlch\\fcs1 \\af2\\afs18\\alang1025 \\ltrch\\fcs0 \n\\f2\\fs18\\lang1024\\langfe1024\\cgrid\\noproof\\langnp1033\\langfenp1033 \\snext86 ref prog 1;}{\\s87\\ql \\li2520\\ri0\\sb40\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin2520\\itap0 \\rtlch\\fcs1 \\af2\\afs18\\alang1025 \\ltrch\\fcs0 \n\\f2\\fs18\\lang1024\\langfe1024\\cgrid\\noproof\\langnp1033\\langfenp1033 \\sbasedon86 \\snext87 ref prog 2;}{\\s88\\ql \\li2160\\ri0\\sb120\\widctlpar\\tx4770\\wrapdefault\\nooverflow\\faroman\\rin0\\lin2160\\itap0 \\rtlch\\fcs1 \\af2\\afs18\\alang1025 \\ltrch\\fcs0 \n\\f2\\fs18\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon66 \\snext88 prog indent first;}{\\s89\\ql \\li2160\\ri0\\sb40\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin2160\\itap0 \\rtlch\\fcs1 \\af2\\afs18\\alang1025 \\ltrch\\fcs0 \n\\f2\\fs18\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon67 \\snext89 prog indent last;}{\\s90\\ql \\li0\\ri0\\sb180\\keepn\\pagebb\\widctlpar\\brdrt\\brdrs\\brdrw30\\brsp120 \\tqr\\tx9893\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \n\\ab\\af1\\afs24\\alang1025 \\ltrch\\fcs0 \\b\\f1\\fs24\\cf9\\lang1024\\langfe1024\\cgrid\\noproof\\langnp1033\\langfenp1033 \\sbasedon77 \\snext0 ref heading;}{\\s91\\ql \\li720\\ri0\\sb360\\keepn\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \n\\ab\\af1\\afs20\\alang1025 \\ltrch\\fcs0 \\b\\f1\\fs20\\cf13\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon76 \\snext0 ref heading 2;}{\\s92\\ql \\li1440\\ri0\\sb120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \n\\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon41 \\snext93 ref list first;}{\\s93\\ql \\li1440\\ri0\\sb40\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \n\\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon31 \\snext93 ref list;}{\\s94\\ql \\fi-2160\\li3240\\ri0\\sb120\\widctlpar\\tx3240\\wrapdefault\\nooverflow\\faroman\\rin0\\lin3240\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon43 \\snext94 ref subhead first;}{\\s95\\ql \\fi-2160\\li3240\\ri0\\sb40\\widctlpar\\tx3240\\wrapdefault\\nooverflow\\faroman\\rin0\\lin3240\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext94 ref subhead last;}{\\s96\\ql \\li1440\\ri0\\sb180\\sa120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext96 \\slink97 Body Text;}{\\*\\cs97 \\additive \\rtlch\\fcs1 \\af44\\afs20 \\ltrch\\fcs0 \\f44\\fs20 \\sbasedon10 \\slink96 \\slocked \\ssemihidden Body Text Char;}{\n\\s98\\ql \\li1080\\ri0\\sb120\\keepn\\widctlpar\\tqr\\tldot\\tx9893\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1080\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs20\\alang1025 \\ltrch\\fcs0 \\b\\f1\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \n\\sbasedon0 \\snext0 \\sautoupd \\spriority39 toc 1;}{\\s99\\ql \\li1440\\ri1440\\sb180\\sa120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin1440\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \n\\sbasedon0 \\snext99 Block Text;}{\\s100\\ql \\li360\\ri0\\sb180\\sa120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin360\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \n\\sbasedon0 \\snext100 \\slink101 Body Text 2;}{\\*\\cs101 \\additive \\rtlch\\fcs1 \\af44\\afs20 \\ltrch\\fcs0 \\f44\\fs20 \\sbasedon10 \\slink100 \\slocked \\ssemihidden Body Text 2 Char;}{\n\\s102\\ql \\li1440\\ri0\\sb180\\sa120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs16\\alang1025 \\ltrch\\fcs0 \\f44\\fs16\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext102 \\slink103 Body Text 3;}{\\*\\cs103 \n\\additive \\rtlch\\fcs1 \\af44\\afs16 \\ltrch\\fcs0 \\f44\\fs16 \\sbasedon10 \\slink102 \\slocked \\ssemihidden Body Text 3 Char;}{\\s104\\ql \\fi210\\li1440\\ri0\\sb180\\sa120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \n\\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon96 \\snext104 \\slink105 Body Text First Indent;}{\\*\\cs105 \\additive \\rtlch\\fcs1 \\af44\\afs20 \\ltrch\\fcs0 \\f44\\fs20 \\sbasedon97 \\slink104 \\slocked \\ssemihidden \nBody Text First Indent Char;}{\\s106\\ql \\li283\\ri0\\sb180\\sa120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin283\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \n\\sbasedon0 \\snext106 \\slink107 Body Text Indent;}{\\*\\cs107 \\additive \\rtlch\\fcs1 \\af44\\afs20 \\ltrch\\fcs0 \\f44\\fs20 \\sbasedon10 \\slink106 \\slocked \\ssemihidden Body Text Indent Char;}{\n\\s108\\ql \\fi210\\li360\\ri0\\sb180\\sa120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin360\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon100 \\snext108 \\slink109 \nBody Text First Indent 2;}{\\*\\cs109 \\additive \\rtlch\\fcs1 \\af44\\afs20 \\ltrch\\fcs0 \\f44\\fs20 \\sbasedon107 \\slink108 \\slocked \\ssemihidden Body Text First Indent 2 Char;}{\\s110\\ql \\li360\\ri0\\sb180\\sa120\\sl480\\slmult1\n\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin360\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext110 \\slink111 Body Text Indent 2;}{\\*\\cs111 \\additive \\rtlch\\fcs1 \n\\af44\\afs20 \\ltrch\\fcs0 \\f44\\fs20 \\sbasedon10 \\slink110 \\slocked \\ssemihidden Body Text Indent 2 Char;}{\\s112\\ql \\li360\\ri0\\sb180\\sa120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin360\\itap0 \\rtlch\\fcs1 \\af44\\afs16\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs16\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext112 \\slink113 Body Text Indent 3;}{\\*\\cs113 \\additive \\rtlch\\fcs1 \\af44\\afs16 \\ltrch\\fcs0 \\f44\\fs16 \\sbasedon10 \\slink112 \\slocked \\ssemihidden Body Text Indent 3 Char;}{\n\\s114\\ql \\li1440\\ri0\\sb120\\sa120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\ab\\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\b\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\sqformat caption;}{\n\\s115\\ql \\li4320\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin4320\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext115 \\slink116 Closing;}{\\*\\cs116 \\additive \n\\rtlch\\fcs1 \\af44\\afs20 \\ltrch\\fcs0 \\f44\\fs20 \\sbasedon10 \\slink115 \\slocked \\ssemihidden Closing Char;}{\\s117\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext117 \\slink118 \\ssemihidden annotation text;}{\\*\\cs118 \\additive \\rtlch\\fcs1 \\af44\\afs20 \\ltrch\\fcs0 \\f44\\fs20 \\sbasedon10 \\slink117 \\slocked \\ssemihidden Comment Text Char;}{\n\\s119\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\slink120 Date;}{\\*\\cs120 \\additive \n\\rtlch\\fcs1 \\af44\\afs20 \\ltrch\\fcs0 \\f44\\fs20 \\sbasedon10 \\slink119 \\slocked \\ssemihidden Date Char;}{\\s121\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\cbpat9 \\rtlch\\fcs1 \\af43\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f43\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext121 \\slink122 \\ssemihidden Document Map;}{\\*\\cs122 \\additive \\rtlch\\fcs1 \\af43\\afs16 \\ltrch\\fcs0 \\f43\\fs16 \\sbasedon10 \\slink121 \\slocked \\ssemihidden Document Map Char;}{\n\\s123\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext123 \\slink124 \\ssemihidden endnote text;}{\\*\n\\cs124 \\additive \\rtlch\\fcs1 \\af44\\afs20 \\ltrch\\fcs0 \\f44\\fs20 \\sbasedon10 \\slink123 \\slocked \\ssemihidden Endnote Text Char;}{\n\\s125\\ql \\li2880\\ri0\\sb180\\widctlpar\\phpg\\posxc\\posyb\\absh-1980\\absw7920\\dxfrtext180\\dfrmtxtx180\\dfrmtxty0\\wrapdefault\\nooverflow\\faroman\\rin0\\lin2880\\itap0 \\rtlch\\fcs1 \\af1\\afs24\\alang1025 \\ltrch\\fcs0 \n\\f1\\fs24\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext125 envelope address;}{\\s126\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af1\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f1\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext126 envelope return;}{\\s127\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext127 \\slink128 \\ssemihidden footnote text;}{\\*\\cs128 \\additive \\rtlch\\fcs1 \\af44\\afs20 \\ltrch\\fcs0 \\f44\\fs20 \\sbasedon10 \\slink127 \\slocked \\ssemihidden Footnote Text Char;}{\n\\s129\\ql \\fi-200\\li200\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin200\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\sautoupd \\ssemihidden index 1;}{\n\\s130\\ql \\fi-200\\li400\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin400\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\sautoupd \\ssemihidden index 2;}{\n\\s131\\ql \\fi-200\\li600\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin600\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\sautoupd \\ssemihidden index 3;}{\n\\s132\\ql \\fi-200\\li800\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin800\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\sautoupd \\ssemihidden index 4;}{\n\\s133\\ql \\fi-200\\li1000\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1000\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\sautoupd \\ssemihidden index 5;}{\n\\s134\\ql \\fi-200\\li1200\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1200\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\sautoupd \\ssemihidden index 6;}{\n\\s135\\ql \\fi-200\\li1400\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1400\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\sautoupd \\ssemihidden index 7;}{\n\\s136\\ql \\fi-200\\li1600\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1600\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\sautoupd \\ssemihidden index 8;}{\n\\s137\\ql \\fi-200\\li1800\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1800\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\sautoupd \\ssemihidden index 9;}{\n\\s138\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs20\\alang1025 \\ltrch\\fcs0 \\b\\f1\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext129 \\ssemihidden index heading;}{\n\\s139\\ql \\fi-360\\li720\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext139 List 2;}{\n\\s140\\ql \\fi-360\\li1080\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1080\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext140 List 3;}{\n\\s141\\ql \\fi-360\\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext141 List 4;}{\n\\s142\\ql \\fi-360\\li1800\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1800\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext142 List 5;}{\n\\s143\\ql \\fi-360\\li360\\ri0\\sb180\\widctlpar\\jclisttab\\tx360\\wrapdefault{\\*\\pn \\pnlvlbody\\ilvl0\\ls1\\pnrnot0\\pndec }\\nooverflow\\faroman\\ls1\\rin0\\lin360\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext143 \\sautoupd List Bullet;}{\\s144\\ql \\fi-360\\li720\\ri0\\sb180\\widctlpar\\jclisttab\\tx720\\wrapdefault{\\*\\pn \\pnlvlbody\\ilvl0\\ls2\\pnrnot0\\pndec }\n\\nooverflow\\faroman\\ls2\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext144 \\sautoupd List Bullet 2;}{\\s145\\ql \\fi-360\\li1080\\ri0\\sb180\\widctlpar\n\\jclisttab\\tx1080\\wrapdefault{\\*\\pn \\pnlvlbody\\ilvl0\\ls3\\pnrnot0\\pndec }\\nooverflow\\faroman\\ls3\\rin0\\lin1080\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext145 \\sautoupd \nList Bullet 3;}{\\s146\\ql \\fi-360\\li1440\\ri0\\sb180\\widctlpar\\jclisttab\\tx1440\\wrapdefault{\\*\\pn \\pnlvlbody\\ilvl0\\ls4\\pnrnot0\\pndec }\\nooverflow\\faroman\\ls4\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext146 \\sautoupd List Bullet 4;}{\\s147\\ql \\fi-360\\li1800\\ri0\\sb180\\widctlpar\\jclisttab\\tx1800\\wrapdefault{\\*\\pn \\pnlvlbody\\ilvl0\\ls5\\pnrnot0\\pndec }\n\\nooverflow\\faroman\\ls5\\rin0\\lin1800\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext147 \\sautoupd List Bullet 5;}{\n\\s148\\ql \\li360\\ri0\\sb180\\sa120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin360\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext148 List Continue;}{\n\\s149\\ql \\li720\\ri0\\sb180\\sa120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext149 List Continue 2;}{\n\\s150\\ql \\li1080\\ri0\\sb180\\sa120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1080\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext150 List Continue 3;}{\n\\s151\\ql \\li1440\\ri0\\sb180\\sa120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext151 List Continue 4;}{\n\\s152\\ql \\li1800\\ri0\\sb180\\sa120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1800\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext152 List Continue 5;}{\n\\s153\\ql \\fi-360\\li720\\ri0\\sb180\\widctlpar\\jclisttab\\tx720\\wrapdefault{\\*\\pn \\pnlvlbody\\ilvl0\\ls6\\pnrnot0\\pndec }\\nooverflow\\faroman\\ls6\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext153 List Number 2;}{\\s154\\ql \\fi-360\\li1080\\ri0\\sb180\\widctlpar\\jclisttab\\tx1080\\wrapdefault{\\*\\pn \\pnlvlbody\\ilvl0\\ls7\\pnrnot0\\pndec }\\nooverflow\\faroman\\ls7\\rin0\\lin1080\\itap0 \n\\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext154 List Number 3;}{\\s155\\ql \\fi-360\\li1440\\ri0\\sb180\\widctlpar\\jclisttab\\tx1440\\wrapdefault{\\*\\pn \\pnlvlbody\\ilvl0\\ls8\\pnrnot0\n\\pndec }\\nooverflow\\faroman\\ls8\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext155 List Number 4;}{\\s156\\ql \\fi-360\\li1800\\ri0\\sb180\\widctlpar\n\\jclisttab\\tx1800\\wrapdefault{\\*\\pn \\pnlvlbody\\ilvl0\\ls9\\pnrnot0\\pndec }\\nooverflow\\faroman\\ls9\\rin0\\lin1800\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext156 \nList Number 5;}{\\s157\\ql \\li1440\\ri0\\sb180\\widctlpar\\tx480\\tx960\\tx1440\\tx1920\\tx2400\\tx2880\\tx3360\\tx3840\\tx4320\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af2\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f2\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\snext157 \\slink158 \\ssemihidden macro;}{\\*\\cs158 \\additive \\rtlch\\fcs1 \\af2\\afs20 \\ltrch\\fcs0 \\f2\\fs20 \\sbasedon10 \\slink157 \\slocked \\ssemihidden Macro Text Char;}{\n\\s159\\ql \\fi-1080\\li1080\\ri0\\sb180\\widctlpar\\brdrt\\brdrs\\brdrw15\\brsp20 \\brdrl\\brdrs\\brdrw15\\brsp20 \\brdrb\\brdrs\\brdrw15\\brsp20 \\brdrr\\brdrs\\brdrw15\\brsp20 \\wrapdefault\\nooverflow\\faroman\\rin0\\lin1080\\itap0 \\shading2000 \\rtlch\\fcs1 \\af1\\afs24\\alang1025 \n\\ltrch\\fcs0 \\f1\\fs24\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext159 \\slink160 Message Header;}{\\*\\cs160 \\additive \\rtlch\\fcs1 \\af0\\afs24 \\ltrch\\fcs0 \\f42\\fs24\\chshdng2000\\chcfpat0\\chcbpat0 \n\\sbasedon10 \\slink159 \\slocked \\ssemihidden Message Header Char;}{\\s161\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\slink162 Note Heading;}{\\*\\cs162 \\additive \\rtlch\\fcs1 \\af44\\afs20 \\ltrch\\fcs0 \\f44\\fs20 \\sbasedon10 \\slink161 \\slocked \\ssemihidden Note Heading Char;}{\n\\s163\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af2\\afs20\\alang1025 \\ltrch\\fcs0 \\f2\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext163 \\slink164 Plain Text;}{\\*\\cs164 \\additive \n\\rtlch\\fcs1 \\af2\\afs20 \\ltrch\\fcs0 \\f2\\fs20 \\sbasedon10 \\slink163 \\slocked \\ssemihidden Plain Text Char;}{\\s165\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\slink166 Salutation;}{\\*\\cs166 \\additive \\rtlch\\fcs1 \\af44\\afs20 \\ltrch\\fcs0 \\f44\\fs20 \\sbasedon10 \\slink165 \\slocked \\ssemihidden Salutation Char;}{\n\\s167\\ql \\li4320\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin4320\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext167 \\slink168 Signature;}{\\*\\cs168 \\additive \n\\rtlch\\fcs1 \\af44\\afs20 \\ltrch\\fcs0 \\f44\\fs20 \\sbasedon10 \\slink167 \\slocked \\ssemihidden Signature Char;}{\\s169\\qc \\li1440\\ri0\\sb180\\sa60\\widctlpar\\wrapdefault\\nooverflow\\faroman\\outlinelevel1\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af1\\afs24\\alang1025 \n\\ltrch\\fcs0 \\f1\\fs24\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext169 \\slink170 \\sqformat Subtitle;}{\\*\\cs170 \\additive \\rtlch\\fcs1 \\af0\\afs24 \\ltrch\\fcs0 \\f42\\fs24 \\sbasedon10 \\slink169 \\slocked Subtitle Char;}{\n\\s171\\ql \\fi-200\\li200\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin200\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\ssemihidden table of authorities;}{\n\\s172\\ql \\fi-400\\li400\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin400\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\ssemihidden table of figures;}{\n\\s173\\qc \\li1440\\ri0\\sb240\\sa60\\widctlpar\\wrapdefault\\nooverflow\\faroman\\outlinelevel0\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs32\\alang1025 \\ltrch\\fcs0 \\b\\f1\\fs32\\lang1033\\langfe1033\\kerning28\\cgrid\\langnp1033\\langfenp1033 \n\\sbasedon0 \\snext173 \\slink174 \\sqformat Title;}{\\*\\cs174 \\additive \\rtlch\\fcs1 \\ab\\af0\\afs32 \\ltrch\\fcs0 \\b\\f42\\fs32\\kerning28 \\sbasedon10 \\slink173 \\slocked Title Char;}{\n\\s175\\ql \\li1440\\ri0\\sb120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs24\\alang1025 \\ltrch\\fcs0 \\b\\f1\\fs24\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\ssemihidden toa heading;}{\n\\s176\\ql \\li1440\\ri0\\sb180\\widctlpar\\tqr\\tldot\\tx9883\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\sautoupd \\spriority39 \ntoc 2;}{\\s177\\ql \\li400\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin400\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\sautoupd \\ssemihidden toc 3;}{\n\\s178\\ql \\li600\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin600\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\sautoupd \\ssemihidden toc 4;}{\n\\s179\\ql \\li800\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin800\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\sautoupd \\ssemihidden toc 5;}{\n\\s180\\ql \\li1000\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1000\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\sautoupd \\ssemihidden toc 6;}{\n\\s181\\ql \\li1200\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1200\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\sautoupd \\ssemihidden toc 7;}{\n\\s182\\ql \\li1400\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1400\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\sautoupd \\ssemihidden toc 8;}{\n\\s183\\ql \\li1600\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1600\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\sautoupd \\ssemihidden toc 9;}{\n\\s184\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af43\\afs16\\alang1025 \\ltrch\\fcs0 \\f43\\fs16\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext184 \\slink185 \\ssemihidden Balloon Text;}{\\*\n\\cs185 \\additive \\rtlch\\fcs1 \\af43\\afs16 \\ltrch\\fcs0 \\f43\\fs16 \\sbasedon10 \\slink184 \\slocked \\ssemihidden Balloon Text Char;}{\\*\\ts186\\tsrowd\\trbrdrt\\brdrs\\brdrw10 \\trbrdrl\\brdrs\\brdrw10 \\trbrdrb\\brdrs\\brdrw10 \\trbrdrr\\brdrs\\brdrw10 \\trbrdrh\n\\brdrs\\brdrw10 \\trbrdrv\\brdrs\\brdrw10 \\trftsWidthB3\\trpaddl108\\trpaddr108\\trpaddfl3\\trpaddft3\\trpaddfb3\\trpaddfr3\\trcbpat1\\trcfpat1\\tblind0\\tblindtype3\\tsvertalt\\tsbrdrt\\tsbrdrl\\tsbrdrb\\tsbrdrr\\tsbrdrdgl\\tsbrdrdgr\\tsbrdrh\\tsbrdrv \n\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af0\\afs20\\alang1025 \\ltrch\\fcs0 \\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon11 \\snext186 Table Grid;}{\\*\\cs187 \\additive \\rtlch\\fcs1 \\af0 \n\\ltrch\\fcs0 \\ul\\cf2 \\sbasedon10 Hyperlink;}{\\*\\cs188 \\additive \\rtlch\\fcs1 \\af0\\afs19 \\ltrch\\fcs0 \\fs19 \\sbasedon10 postbody1;}{\\s189\\ql \\li0\\ri0\\keepn\\pagebb\\widctlpar\\brdrt\\brdrs\\brdrw30\\brsp120 \n\\wrapdefault\\nooverflow\\faroman\\outlinelevel0\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs24\\alang1025 \\ltrch\\fcs0 \\b\\f1\\fs24\\cf9\\lang1024\\langfe1024\\cgrid\\noproof\\langnp1033\\langfenp1033 \\sbasedon1 \\snext189 \\slink190 TWAIN Header;}{\\*\\cs190 \\additive \n\\rtlch\\fcs1 \\ab\\af1\\afs24 \\ltrch\\fcs0 \\b\\f1\\fs24\\cf9\\lang1024\\langfe1024\\kerning32\\noproof \\sbasedon15 \\slink189 \\slocked TWAIN Header Char;}{\\s191\\ql \\li720\\ri0\\sb360\\sl240\\slmult0\\widctlpar\\tx720\\wrapdefault\\hyphpar0\\faauto\\rin0\\lin720\\itap0 \n\\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\cf1\\lang1033\\langfe1033\\charscalex0\\cgrid\\langnp1033\\langfenp1033 \\snext191 body;}{\\s192\\ql \\li1440\\ri0\\sb120\\sl240\\slmult0\\widctlpar\n\\tx720\\tx1080\\tx1440\\tx1800\\tx2160\\tx2520\\tx2880\\tx3240\\tx3600\\tx3960\\tx4320\\tx4680\\tx5040\\tx5400\\tx5760\\tx6120\\tx6480\\tx6840\\tx7200\\tx7560\\tx7920\\tx8280\\tx8640\\tx9000\\wrapdefault\\hyphpar0\\faauto\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af48\\afs20\\alang1025 \n\\ltrch\\fcs0 \\f48\\fs20\\cf1\\lang1033\\langfe1033\\charscalex0\\cgrid\\langnp1033\\langfenp1033 \\snext0 Code;}{\\s193\\ql \\fi-3240\\li4680\\ri0\\sb120\\sl240\\slmult0\\widctlpar\\tx4680\\tx7400\\wrapdefault\\hyphpar0\\faauto\\rin0\\lin4680\\itap0 \\rtlch\\fcs1 \n\\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\cf1\\lang1033\\langfe1033\\charscalex0\\cgrid\\langnp1033\\langfenp1033 \\snext31 twocol;}{\\*\\cs194 \\additive \\f2 Code2;}{\\s195\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\faauto\\adjustright\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \n\\af0\\afs24\\alang1025 \\ltrch\\fcs0 \\fs24\\cf1\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext195 Default;}{\\*\\cs196 \\additive \\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\sbasedon10 \\spriority0 postbody;}{\\*\\cs197 \\additive \\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\ul\\cf19 \\sbasedon10 \\slocked \\ssemihidden \\sunhideused FollowedHyperlink;}{\\s198\\ql \\li60\\ri60\\sb80\\sa80\\sl240\\slmult0\\widctlpar\\tx720\\tx2520\\wrapdefault\\hyphpar0\\faauto\\rin60\\lin60\\itap0 \\rtlch\\fcs1 \\af2\\afs20\\alang1025 \\ltrch\\fcs0 \n\\fs20\\cf1\\lang1033\\langfe2052\\loch\\f2\\hich\\af2\\dbch\\af31505\\charscalex0\\cgrid\\langnp1033\\langfenp2052 \\snext198 table_code;}{\\s199\\ql \\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \\af37\\afs22\\alang1025 \n\\ltrch\\fcs0 \\f37\\fs22\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext199 \\sqformat \\spriority34 List Paragraph;}{\\*\\cs200 \\additive \\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cf20\\chshdng0\\chcfpat0\\chcbpat21 \\sbasedon10 \\ssemihidden \\sunhideused \nUnresolved Mention;}}{\\*\\listtable{\\list\\listtemplateid-1403649448\\listsimple{\\listlevel\\levelnfc0\\levelnfcn0\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace0\\levelindent0{\\leveltext\\'02\\'00.;}{\\levelnumbers\\'01;}\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\s156\\fi-360\\li1800\\jclisttab\\tx1800\\lin1800 }{\\listname ;}\\listid-132}{\\list\\listtemplateid-537102814\\listsimple{\\listlevel\\levelnfc0\\levelnfcn0\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace0\\levelindent0{\\leveltext\\'02\\'00.;}{\\levelnumbers\n\\'01;}\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\fi-360\\li1440\\jclisttab\\tx1440\\lin1440 }{\\listname ;}\\listid-131}{\\list\\listtemplateid-241933882\\listsimple{\\listlevel\\levelnfc0\\levelnfcn0\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace0\\levelindent0\n{\\leveltext\\'02\\'00.;}{\\levelnumbers\\'01;}\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\fi-360\\li1080\\jclisttab\\tx1080\\lin1080 }{\\listname ;}\\listid-130}{\\list\\listtemplateid894471834\\listsimple{\\listlevel\\levelnfc0\\levelnfcn0\\leveljc0\\leveljcn0\\levelfollow0\n\\levelstartat1\\levelspace0\\levelindent0{\\leveltext\\'02\\'00.;}{\\levelnumbers\\'01;}\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\fi-360\\li720\\jclisttab\\tx720\\lin720 }{\\listname ;}\\listid-129}{\\list\\listtemplateid-1633241602\\listsimple{\\listlevel\\levelnfc23\\levelnfcn23\n\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace0\\levelindent0{\\leveltext\\'01\\u-3913 ?;}{\\levelnumbers;}\\f3\\fbias0 \\fi-360\\li1800\\jclisttab\\tx1800\\lin1800 }{\\listname ;}\\listid-128}{\\list\\listtemplateid-203631750\\listsimple{\\listlevel\\levelnfc23\n\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace0\\levelindent0{\\leveltext\\'01\\u-3913 ?;}{\\levelnumbers;}\\f3\\fbias0 \\fi-360\\li1440\\jclisttab\\tx1440\\lin1440 }{\\listname ;}\\listid-127}{\\list\\listtemplateid360335964\\listsimple{\\listlevel\n\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace0\\levelindent0{\\leveltext\\'01\\u-3913 ?;}{\\levelnumbers;}\\f3\\fbias0 \\fi-360\\li1080\\jclisttab\\tx1080\\lin1080 }{\\listname ;}\\listid-126}{\\list\\listtemplateid627448582\\listsimple\n{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace0\\levelindent0{\\leveltext\\'01\\u-3913 ?;}{\\levelnumbers;}\\f3\\fbias0 \\fi-360\\li720\\jclisttab\\tx720\\lin720 }{\\listname ;}\\listid-125}{\\list\\listtemplateid507960418\n\\listsimple{\\listlevel\\levelnfc0\\levelnfcn0\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace0\\levelindent0{\\leveltext\\'02\\'00.;}{\\levelnumbers\\'01;}\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\fi-360\\li360\\jclisttab\\tx360\\lin360 }{\\listname ;}\\listid-120}\n{\\list\\listtemplateid-1407048446\\listsimple{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace0\\levelindent0{\\leveltext\\'01\\u-3913 ?;}{\\levelnumbers;}\\f3\\fbias0 \\fi-360\\li360\\jclisttab\\tx360\\lin360 }{\\listname \n;}\\listid-119}{\\list\\listtemplateid-950138062\\listhybrid{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat0\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid-129700622\\'01-;}{\\levelnumbers;}\n\\loch\\af37\\hich\\af37\\dbch\\af0\\fbias0 \\fi-360\\li720\\lin720 }{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\lvltentative\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid67698691\\'01o;}{\\levelnumbers;}\\f2\\fbias0 \n\\fi-360\\li1440\\lin1440 }{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\lvltentative\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid67698693\\'01\\u-3929 ?;}{\\levelnumbers;}\\f10\\fbias0 \\fi-360\\li2160\\lin2160 }{\\listlevel\n\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\lvltentative\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid67698689\\'01\\u-3913 ?;}{\\levelnumbers;}\\f3\\fbias0 \\fi-360\\li2880\\lin2880 }{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\n\\leveljcn0\\levelfollow0\\levelstartat1\\lvltentative\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid67698691\\'01o;}{\\levelnumbers;}\\f2\\fbias0 \\fi-360\\li3600\\lin3600 }{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\n\\lvltentative\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid67698693\\'01\\u-3929 ?;}{\\levelnumbers;}\\f10\\fbias0 \\fi-360\\li4320\\lin4320 }{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\lvltentative\\levelspace0\n\\levelindent0{\\leveltext\\leveltemplateid67698689\\'01\\u-3913 ?;}{\\levelnumbers;}\\f3\\fbias0 \\fi-360\\li5040\\lin5040 }{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\lvltentative\\levelspace0\\levelindent0{\\leveltext\n\\leveltemplateid67698691\\'01o;}{\\levelnumbers;}\\f2\\fbias0 \\fi-360\\li5760\\lin5760 }{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\lvltentative\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid67698693\n\\'01\\u-3929 ?;}{\\levelnumbers;}\\f10\\fbias0 \\fi-360\\li6480\\lin6480 }{\\listname ;}\\listid162478944}{\\list\\listtemplateid181715488\\listhybrid{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat0\\levelspace0\\levelindent0{\\leveltext\n\\leveltemplateid1324631620\\'01-;}{\\levelnumbers;}\\loch\\af0\\hich\\af0\\dbch\\af0\\fbias0 \\fi-360\\li720\\lin720 }{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\lvltentative\\levelspace0\\levelindent0{\\leveltext\n\\leveltemplateid67698691\\'01o;}{\\levelnumbers;}\\f2\\fbias0 \\fi-360\\li1440\\lin1440 }{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\lvltentative\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid67698693\n\\'01\\u-3929 ?;}{\\levelnumbers;}\\f10\\fbias0 \\fi-360\\li2160\\lin2160 }{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\lvltentative\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid67698689\\'01\\u-3913 ?;}{\\levelnumbers;}\n\\f3\\fbias0 \\fi-360\\li2880\\lin2880 }{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\lvltentative\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid67698691\\'01o;}{\\levelnumbers;}\\f2\\fbias0 \\fi-360\\li3600\\lin3600 }\n{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\lvltentative\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid67698693\\'01\\u-3929 ?;}{\\levelnumbers;}\\f10\\fbias0 \\fi-360\\li4320\\lin4320 }{\\listlevel\\levelnfc23\\levelnfcn23\n\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\lvltentative\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid67698689\\'01\\u-3913 ?;}{\\levelnumbers;}\\f3\\fbias0 \\fi-360\\li5040\\lin5040 }{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\n\\levelstartat1\\lvltentative\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid67698691\\'01o;}{\\levelnumbers;}\\f2\\fbias0 \\fi-360\\li5760\\lin5760 }{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\lvltentative\\levelspace0\n\\levelindent0{\\leveltext\\leveltemplateid67698693\\'01\\u-3929 ?;}{\\levelnumbers;}\\f10\\fbias0 \\fi-360\\li6480\\lin6480 }{\\listname ;}\\listid984241419}{\\list\\listtemplateid81190112\\listhybrid{\\listlevel\\levelnfc0\\levelnfcn0\\leveljc0\\leveljcn0\\levelfollow0\n\\levelstartat1\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid1970803460\\'02\\'00);}{\\levelnumbers\\'01;}\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\fs22\\cf22\\loch\\af37\\hich\\af37\\dbch\\af0\\fbias0 \\fi-360\\li720\\lin720 }{\\listlevel\\levelnfc4\\levelnfcn4\\leveljc0\n\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid67698713\\'02\\'01.;}{\\levelnumbers\\'01;}\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\fi-360\\li1440\\lin1440 }{\\listlevel\\levelnfc2\\levelnfcn2\\leveljc2\\leveljcn2\\levelfollow0\n\\levelstartat1\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid67698715\\'02\\'02.;}{\\levelnumbers\\'01;}\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\fi-180\\li2160\\lin2160 }{\\listlevel\\levelnfc0\\levelnfcn0\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace0\n\\levelindent0{\\leveltext\\leveltemplateid67698703\\'02\\'03.;}{\\levelnumbers\\'01;}\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\fi-360\\li2880\\lin2880 }{\\listlevel\\levelnfc4\\levelnfcn4\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace0\\levelindent0{\\leveltext\n\\leveltemplateid67698713\\'02\\'04.;}{\\levelnumbers\\'01;}\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\fi-360\\li3600\\lin3600 }{\\listlevel\\levelnfc2\\levelnfcn2\\leveljc2\\leveljcn2\\levelfollow0\\levelstartat1\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid67698715\n\\'02\\'05.;}{\\levelnumbers\\'01;}\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\fi-180\\li4320\\lin4320 }{\\listlevel\\levelnfc0\\levelnfcn0\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid67698703\\'02\\'06.;}{\\levelnumbers\\'01;}\n\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\fi-360\\li5040\\lin5040 }{\\listlevel\\levelnfc4\\levelnfcn4\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid67698713\\'02\\'07.;}{\\levelnumbers\\'01;}\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\fi-360\\li5760\\lin5760 }{\\listlevel\\levelnfc2\\levelnfcn2\\leveljc2\\leveljcn2\\levelfollow0\\levelstartat1\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid67698715\\'02\\'08.;}{\\levelnumbers\\'01;}\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\fi-180\\li6480\\lin6480 }\n{\\listname ;}\\listid2094470365}}{\\*\\listoverridetable{\\listoverride\\listid-120\\listoverridecount0\\ls1}{\\listoverride\\listid-119\\listoverridecount0\\ls2}{\\listoverride\\listid-125\\listoverridecount0\\ls3}{\\listoverride\\listid-126\\listoverridecount0\\ls4}\n{\\listoverride\\listid-127\\listoverridecount0\\ls5}{\\listoverride\\listid-128\\listoverridecount0\\ls6}{\\listoverride\\listid-129\\listoverridecount0\\ls7}{\\listoverride\\listid-130\\listoverridecount0\\ls8}{\\listoverride\\listid-131\\listoverridecount0\\ls9}\n{\\listoverride\\listid-132\\listoverridecount0\\ls10}{\\listoverride\\listid-120\\listoverridecount0\\ls11}{\\listoverride\\listid-119\\listoverridecount0\\ls12}{\\listoverride\\listid-125\\listoverridecount0\\ls13}{\\listoverride\\listid-126\\listoverridecount0\\ls14}\n{\\listoverride\\listid-127\\listoverridecount0\\ls15}{\\listoverride\\listid-128\\listoverridecount0\\ls16}{\\listoverride\\listid-129\\listoverridecount0\\ls17}{\\listoverride\\listid-130\\listoverridecount0\\ls18}{\\listoverride\\listid-131\\listoverridecount0\\ls19}\n{\\listoverride\\listid2094470365\\listoverridecount9{\\lfolevel\\listoverridestartat\\levelstartat1}{\\lfolevel\\listoverridestartat\\levelstartat1}{\\lfolevel\\listoverridestartat\\levelstartat1}{\\lfolevel\\listoverridestartat\\levelstartat1}{\\lfolevel\n\\listoverridestartat\\levelstartat1}{\\lfolevel\\listoverridestartat\\levelstartat1}{\\lfolevel\\listoverridestartat\\levelstartat1}{\\lfolevel\\listoverridestartat\\levelstartat1}{\\lfolevel\\listoverridestartat\\levelstartat1}\\ls20}{\\listoverride\\listid984241419\n\\listoverridecount0\\ls21}{\\listoverride\\listid162478944\\listoverridecount0\\ls22}}{\\*\\pgptbl {\\pgp\\ipgp0\\itap0\\li0\\ri0\\sb0\\sa0}{\\pgp\\ipgp0\\itap0\\li0\\ri0\\sb0\\sa0}{\\pgp\\ipgp0\\itap0\\li0\\ri0\\sb0\\sa0}{\\pgp\\ipgp0\\itap0\\li0\\ri0\\sb0\\sa0}{\\pgp\\ipgp0\\itap0\\li0\\ri0\n\\sb0\\sa0}{\\pgp\\ipgp0\\itap0\\li0\\ri0\\sb0\\sa0}{\\pgp\\ipgp0\\itap0\\li0\\ri0\\sb0\\sa0}{\\pgp\\ipgp0\\itap0\\li0\\ri0\\sb0\\sa0}{\\pgp\\ipgp0\\itap0\\li0\\ri0\\sb0\\sa0}{\\pgp\\ipgp0\\itap0\\li0\\ri0\\sb0\\sa0}{\\pgp\\ipgp0\\itap0\\li0\\ri0\\sb0\\sa0}{\\pgp\\ipgp0\\itap0\\li0\\ri0\\sb0\\sa0}{\\pgp\n\\ipgp0\\itap0\\li0\\ri0\\sb0\\sa0}{\\pgp\\ipgp0\\itap0\\li0\\ri0\\sb0\\sa0}{\\pgp\\ipgp0\\itap0\\li0\\ri0\\sb0\\sa0}}{\\mmathPr\\mmathFont34\\mbrkBin0\\mbrkBinSub0\\msmallFrac0\\mdispDef1\\mlMargin0\\mrMargin0\\mdefJc1\\mwrapIndent1440\\mintLim0\\mnaryLim1}{\\info\n{\\title Spec 1.9a - Title page}{\\author The TWAIN Working Group}{\\operator Mark Mclaughlin}{\\creatim\\yr2013\\mo11\\dy4\\hr16\\min24}{\\revtim\\yr2020\\mo6\\dy5\\hr7\\min45}{\\printim\\yr2010\\mo7\\dy28\\hr8\\min8}{\\version42}{\\edmins167}{\\nofpages15}{\\nofwords5390}\n{\\nofchars30729}{\\*\\company JFL Peripheral Solutions Inc.}{\\nofcharsws36047}{\\vern111}}{\\*\\xmlnstbl {\\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}}\\paperw12240\\paperh15840\\margl1260\\margr1080\\margt1440\\margb1080\\gutter0\\ltrsect\\rtlgutter \n\\widowctrl\\ftnbj\\aenddoc\\trackmoves0\\trackformatting1\\donotembedsysfont0\\relyonvml0\\donotembedlingdata1\\grfdocevents0\\validatexml0\\showplaceholdtext0\\ignoremixedcontent0\\saveinvalidxml0\\showxmlerrors0\\margmirror\n\\noextrasprl\\cvmme\\sprsspbf\\brkfrm\\swpbdr\\noxlattoyen\\expshrtn\\noultrlspc\\dntblnsbdb\\nospaceforul\\lytprtmet\\hyphcaps0\\horzdoc\\fracwidth\\dghspace180\\dgvspace180\\dghorigin1701\\dgvorigin1984\\dghshow0\\dgvshow0\n\\jexpand\\viewkind1\\viewscale100\\pgbrdrhead\\pgbrdrfoot\\bdrrlswsix\\nolnhtadjtbl \\fet0{\\*\\wgrffmtfilter 013f}\\ilfomacatclnup12{\\*\\ftnsep \\ltrpar \\pard\\plain \\ltrpar\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \n\\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\chftnsep \n\\par }}{\\*\\ftnsepc \\ltrpar \\pard\\plain \\ltrpar\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af44 \n\\ltrch\\fcs0 \\chftnsepc \n\\par }}{\\*\\aftnsep \\ltrpar \\pard\\plain \\ltrpar\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af44 \n\\ltrch\\fcs0 \\chftnsep \n\\par }}{\\*\\aftnsepc \\ltrpar \\pard\\plain \\ltrpar\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af44 \n\\ltrch\\fcs0 \\chftnsepc \n\\par }}\\ltrpar \\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\footerr \\ltrpar \\pard\\plain \\ltrpar\\s25\\ql \\li0\\ri0\\widctlpar\\tqr\\tx9900\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \n\\ai\\af1\\afs16\\alang1025 \\ltrch\\fcs0 \\i\\f1\\fs16\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 TWAIN for C#\\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\cs32  PAGE }}{\\fldrslt {\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \n\\cs32\\lang1024\\langfe1024\\noproof 11}}}\\sectd \\ltrsect\\linex0\\endnhere\\sectdefaultcl\\sftnbj {\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\cs32 \n\\par Kodak Alaris Inc.}{\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \n\\par }}{\\*\\pnseclvl1\\pnucrm\\pnstart1\\pnindent720\\pnhang {\\pntxta .}}{\\*\\pnseclvl2\\pnucltr\\pnstart1\\pnindent720\\pnhang {\\pntxta .}}{\\*\\pnseclvl3\\pndec\\pnstart1\\pnindent720\\pnhang {\\pntxta .}}{\\*\\pnseclvl4\\pnlcltr\\pnstart1\\pnindent720\\pnhang {\\pntxta )}}\n{\\*\\pnseclvl5\\pndec\\pnstart1\\pnindent720\\pnhang {\\pntxtb (}{\\pntxta )}}{\\*\\pnseclvl6\\pnlcltr\\pnstart1\\pnindent720\\pnhang {\\pntxtb (}{\\pntxta )}}{\\*\\pnseclvl7\\pnlcrm\\pnstart1\\pnindent720\\pnhang {\\pntxtb (}{\\pntxta )}}{\\*\\pnseclvl8\n\\pnlcltr\\pnstart1\\pnindent720\\pnhang {\\pntxtb (}{\\pntxta )}}{\\*\\pnseclvl9\\pnlcrm\\pnstart1\\pnindent720\\pnhang {\\pntxtb (}{\\pntxta )}}\\pard\\plain \\ltrpar\\ql \\li0\\ri0\\sb1440\\widctlpar\\brdrt\\brdrs\\brdrw60\\brsp20\\brdrcf13 \n\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\f31506 \n\\par }\\pard \\ltrpar\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 {\\rtlch\\fcs1 \\af1\\afs56 \\ltrch\\fcs0 \\b\\f31506\\fs56\\cf9 TWAIN for C#\n\\par }\\pard \\ltrpar\\ql \\li1440\\ri0\\sb120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 {\\rtlch\\fcs1 \\ab\\af1\\afs28 \\ltrch\\fcs0 \\b\\f31506\\fs28\\cf13 For Version 2.4.10.0\n\\par }\\pard \\ltrpar\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 {\\rtlch\\fcs1 \\ab\\af1\\afs28 \\ltrch\\fcs0 \\b\\f31506\\fs28 June 5}{\\rtlch\\fcs1 \\ab\\af1\\afs28 \\ltrch\\fcs0 \\b\\f31506\\fs28\\super th}{\\rtlch\\fcs1 \\ab\\af1\\afs28 \n\\ltrch\\fcs0 \\b\\f31506\\fs28 , 2020\n\\par }\\pard \\ltrpar\\ql \\li1440\\ri0\\sb360\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 {\\rtlch\\fcs1 \\af1\\afs28 \\ltrch\\fcs0 \\f31506\\fs28 \n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\sb120\\widctlpar\\brdrt\\brdrs\\brdrw60\\brsp20\\brdrcf13 \\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\f31506 \n\\par }\\pard \\ltrpar\\ql \\li1440\\ri0\\sb240\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\f31506 \n\\par }\\pard \\ltrpar\\ql \\li1440\\ri0\\sb360\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\f31506 \n\\par \n\\par }\\pard \\ltrpar\\qc \\li0\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\f31506 \n\\par }\\pard \\ltrpar\\ql \\li720\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \\af44\\afs40 \\ltrch\\fcs0 \\f31506\\fs40 \\page }{\\rtlch\\fcs1 \\af1\\afs36 \\ltrch\\fcs0 \\b\\f31506\\fs36\\cf9  \n\\par }\\pard \\ltrpar\\ql \\li720\\ri0\\sb180\\keep\\keepn\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \\af1\\afs36 \\ltrch\\fcs0 \\b\\f31506\\fs36\\cf9 Contents\n\\par }\\pard\\plain \\ltrpar\\s98\\ql \\li1080\\ri0\\sb120\\keepn\\widctlpar\\tqr\\tldot\\tx9893\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1080\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs20\\alang1025 \\ltrch\\fcs0 \\b\\f1\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \n{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\b0\\f31506  TOC \\\\o \"1-3\" \\\\h \\\\z \\\\u }}{\\fldrslt {\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc36456524\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300330036003400350036003500320034000000000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\f37\\ul\\cf2\\lang1024\\langfe1024\\noproof Purpose}{\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc36456524 \\\\h }{\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300330036003400350036003500320034000000007300}}}{\\fldrslt {\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 4}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\ab0\\af0\\afs22 \\ltrch\\fcs0 \n\\b0\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc36456525\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300330036003400350036003500320035000000003500}}\n}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\f37\\ul\\cf2\\lang1024\\langfe1024\\noproof License}{\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc36456525 \\\\h }{\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300330036003400350036003500320035000000000300}}}{\\fldrslt {\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 4}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\ab0\\af0\\afs22 \\ltrch\\fcs0 \n\\b0\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc36456526\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300330036003400350036003500320036000000000000}}\n}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof Project Repository}{\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc36456526 \\\\h }{\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300330036003400350036003500320036000000000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 5}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\ab0\\af0\\afs22 \\ltrch\\fcs0 \n\\b0\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }\\pard\\plain \\ltrpar\\s176\\ql \\li1440\\ri0\\sb180\\widctlpar\\tqr\\tldot\\tx9883\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \n{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc36456527\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300330036003400350036003500320037000000000000}}\n}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof Installation}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc36456527 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300330036003400350036003500320037000000000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 5}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc36456528\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300330036003400350036003500320038000000000059}}\n}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof Versioning}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc36456528 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f0063003300360034003500360035003200380000000000d2}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 5}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }\\pard\\plain \\ltrpar\\s98\\ql \\li1080\\ri0\\sb120\\keepn\\widctlpar\\tqr\\tldot\\tx9893\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1080\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs20\\alang1025 \\ltrch\\fcs0 \\b\\f1\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \n{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc36456529\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300330036003400350036003500320039000000004f00}}\n}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof Project Layout}{\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc36456529 \\\\h }{\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300330036003400350036003500320039000000693600}}}{\\fldrslt {\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 6}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\ab0\\af0\\afs22 \\ltrch\\fcs0 \n\\b0\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }\\pard\\plain \\ltrpar\\s176\\ql \\li1440\\ri0\\sb180\\widctlpar\\tqr\\tldot\\tx9883\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \n{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc36456530\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300330036003400350036003500330030000000002200}}\n}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof Basic TWAIN C# Definitions and Helper Functions}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \n\\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc36456530 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300330036003400350036003500330030000000004500}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 6}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc36456531\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300330036003400350036003500330031000000690f00}}\n}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof A TWAIN C# Toolkit}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc36456531 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630033003600340035003600350033003100000000d400}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 7}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc36456532\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300330036003400350036003500330032000000007f02}}\n}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof A TWAIN C# Diagnostic Application}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc36456532 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300330036003400350036003500330032000000006800}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 7}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc36456533\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300330036003400350036003500330033000000000506}}\n}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof A TWAIN C# Sample Application}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc36456533 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f0063003300360034003500360035003300330000000001d7}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 8}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc36456534\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300330036003400350036003500330034000000001000}}\n}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof A TWAIN C# Self Certification Application}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc36456534 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f0063003300360034003500360035003300340000000000b0}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 8}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }\\pard\\plain \\ltrpar\\s98\\ql \\li1080\\ri0\\sb120\\keepn\\widctlpar\\tqr\\tldot\\tx9893\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1080\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs20\\alang1025 \\ltrch\\fcs0 \\b\\f1\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \n{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc36456535\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300330036003400350036003500330035000000000000}}\n}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof Release Notes}{\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc36456535 \\\\h }{\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300330036003400350036003500330035000000000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 10}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\ab0\\af0\\afs22 \\ltrch\\fcs0 \n\\b0\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }\\pard\\plain \\ltrpar\\s176\\ql \\li1440\\ri0\\sb180\\widctlpar\\tqr\\tldot\\tx9883\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \n{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc36456536\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300330036003400350036003500330036000000000000}}\n}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof V2.4.8.0 (30-Mar-2020)}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc36456536 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300330036003400350036003500330036000000ff00c9}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 10}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc36456537\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300330036003400350036003500330037000000000035}}\n}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof V2.4.6.0 (26-Mar-2020)}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc36456537 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300330036003400350036003500330037000000000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 10}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc36456538\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300330036003400350036003500330038000000007100}}\n}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof V2.4.5.0 (24-Mar-2020)}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc36456538 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300330036003400350036003500330038000000002000}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 10}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc36456539\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300330036003400350036003500330039000000001816}}\n}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof V2.4.4.0 (24-Mar-2020)}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc36456539 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300330036003400350036003500330039000000005200}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 10}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc36456540\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300330036003400350036003500340030000000006f08}}\n}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof V2.4.3.0 (20-Mar-2020)}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc36456540 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300330036003400350036003500340030000000004500}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 11}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc36456541\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300330036003400350036003500340031000000000feb}}\n}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof V2.4.2.0 (13-Mar-2020)}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc36456541 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630033003600340035003600350034003100000000d400}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 11}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc36456542\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300330036003400350036003500340032000000007f01}}\n}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof V2.4.1.0 (30-Jan-2020)}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc36456542 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300330036003400350036003500340032000000006801}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 11}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc36456543\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300330036003400350036003500340033000000004074}}\n}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof V2.4.0.3 (13-Mar-2019)}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc36456543 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300330036003400350036003500340033000000003604}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 11}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc36456544\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f0063003300360034003500360035003400340000000017b0}}\n}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof V2.4.0.2 (25-Jan-2019)}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc36456544 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630033003600340035003600350034003400000000bcca}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 12}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc36456545\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630033003600340035003600350034003500000000186e}}\n}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof V2.4.0.1 (19-Apr-2018)}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc36456545 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300330036003400350036003500340035000000005100}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 12}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc36456546\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300330036003400350036003500340036000000004500}}\n}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof V2.4.0.0 (darned if I know, 2017)}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc36456546 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300330036003400350036003500340036000000000f00}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 12}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc36456547\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630033003600340035003600350034003700000000d400}}\n}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof V2.3.2.0 (18-Oct-2015)}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc36456547 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300330036003400350036003500340037000000007f00}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 12}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc36456548\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300330036003400350036003500340038000000006820}}\n}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof V2.3.1.2 (13-Sep-2015)}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc36456548 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300330036003400350036003500340038000000006475}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 13}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc36456549\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300330036003400350036003500340039000000006f33}}\n}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof V2.3.1.1 (27-Aug-2015)}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc36456549 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300330036003400350036003500340039000000006700}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 13}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc36456550\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300330036003400350036003500350030000000006772}}\n}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof V2.3.1.0 (13-Mar-2015)}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc36456550 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630033003600340035003600350035003000000000732d}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 13}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc36456551\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630033003600340035003600350035003100000000676e}}\n}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof V2.3.0.6 (30-Oct-2014)}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc36456551 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300330036003400350036003500350031000000006754}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 13}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc36456552\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300330036003400350036003500350032000000000030}}\n}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof V2.3.0.5 (19-Oct-2014)}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc36456552 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300330036003400350036003500350032000000005800}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 14}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc36456553\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630033003600340035003600350035003300000000b000}}\n}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof V2.3.0.4 (13-Oct-2014)}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc36456553 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300330036003400350036003500350033000000000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 14}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc36456554\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300330036003400350036003500350034000000004800}}\n}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof V2.2.0 (11-Jul-2014)}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc36456554 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300330036003400350036003500350034000000006f01}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 15}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc36456555\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300330036003400350036003500350035000000004501}}\n}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof V2.1.0 (09-Jul-2014)}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc36456555 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300330036003400350036003500350035000000000f02}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 15}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc36456556\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630033003600340035003600350035003600000000d403}}\n}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof V2.0.0 (21-May-2014)}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc36456556 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300330036003400350036003500350036000000007f04}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 15}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc36456557\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300330036003400350036003500350037000000006800}}\n}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof V1.1.0 (27-Feb-2014)}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc36456557 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300330036003400350036003500350037000000006400}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 16}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc36456558\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300330036003400350036003500350038000000006100}}\n}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof V1.0.0 (05-Nov-2013)}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc36456558 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300330036003400350036003500350038000000006700}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 16}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }\\pard\\plain \\ltrpar\\s98\\ql \\li1440\\ri0\\sb120\\keep\\keepn\\widctlpar\\tqr\\tldot\\tx9893\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs20\\alang1025 \\ltrch\\fcs0 \\b\\f1\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 }}\n\\pard\\plain \\ltrpar\\s98\\ql \\li1440\\ri0\\sb120\\keep\\keepn\\widctlpar\\tqr\\tldot\\tx9893\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs20\\alang1025 \\ltrch\\fcs0 \\b\\f1\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \n\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\f31506\\cf9 {\\*\\bkmkstart _Toc234021027}\n\\par }\\pard\\plain \\ltrpar\\ql \\li720\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\f31506 \n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af50 \\ltrch\\fcs0 \\f31506 \n\\par }\\pard \\ltrpar\\ql \\li720\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \\af1\\afs36 \\ltrch\\fcs0 \\b\\f37\\fs36\\cf9 \n\\par }\\pard\\plain \\ltrpar\\s1\\ql \\li90\\ri0\\sb720\\keepn\\widctlpar\\brdrt\\brdrs\\brdrw30\\brsp120 \\wrapdefault\\nooverflow\\faroman\\outlinelevel0\\rin0\\lin90\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs36\\alang1025 \\ltrch\\fcs0 \n\\b\\f1\\fs36\\cf9\\lang1024\\langfe1024\\cgrid\\noproof\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\b0\\f37 \\page }{\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\f37\\noproof0 {\\*\\bkmkstart _Toc36456524}Purpose{\\*\\bkmkend _Toc36456524}\n\\par }\\pard\\plain \\ltrpar\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af44\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \nThis document serves as a brief introduction to the TWAIN CS projects.  It assumes familiarity with the C# programming language, and a basic understanding of the TWAIN Specification.\n\\par The version number supplied in the title is a guide to when the document wa\ns last modified.  TWAIN supports feature negotiated interoperability between all versions of TWAIN enabled applications, TWAIN drivers (data sources), and the TWAIN Data Source Manager.\n\\par }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\f37 \n\\par }\\pard\\plain \\ltrpar\\s1\\ql \\li0\\ri0\\sb720\\keepn\\widctlpar\\brdrt\\brdrs\\brdrw30\\brsp120 \\wrapdefault\\nooverflow\\faroman\\outlinelevel0\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs36\\alang1025 \\ltrch\\fcs0 \n\\b\\f1\\fs36\\cf9\\lang1024\\langfe1024\\cgrid\\noproof\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\f37 {\\*\\bkmkstart _Toc36456525}License{\\*\\bkmkend _Toc36456525}\n\\par }\\pard\\plain \\ltrpar\\ql \\li1440\\ri0\\widctlpar\\wrapdefault\\faauto\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af49 \\ltrch\\fcs0 \\f37 \n\\par }{\\rtlch\\fcs1 \\af49\\afs22 \\ltrch\\fcs0 \\f37\\fs22 Copyright (C) 2013-2020 Kodak Alaris Inc.\n\\par \n\\par Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, mod\nify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\\par \n\\par The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\\par \n\\par THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES \nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR \nIN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\\par }\\pard \\ltrpar\\ql \\li720\\ri0\\sb180\\keep\\keepn\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \\af1\\afs36 \\ltrch\\fcs0 \\b\\f37\\fs36\\cf9 \n\\par }\\pard \\ltrpar\\ql \\li720\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \\af50 \\ltrch\\fcs0 \\f31506 \n\\par }\\pard\\plain \\ltrpar\\s189\\ql \\li0\\ri0\\keepn\\pagebb\\widctlpar\\brdrt\\brdrs\\brdrw30\\brsp120 \\wrapdefault\\nooverflow\\faroman\\outlinelevel0\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs24\\alang1025 \\ltrch\\fcs0 \n\\b\\f1\\fs24\\cf9\\lang1024\\langfe1024\\cgrid\\noproof\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af1\\afs36 \\ltrch\\fcs0 \\f31506\\fs36\\noproof0 {\\*\\bkmkstart _Toc36456526}Project Repository{\\*\\bkmkend _Toc36456526}\n\\par }\\pard\\plain \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506\\cf6 \n\\par }\\pard\\plain \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af37\\afs22\\alang1025 \\ltrch\\fcs0 \\f37\\fs22\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\v\\f31506\\cf6 [Technical Notes]}{\\rtlch\\fcs1 \\af0\\afs20 \\ltrch\\fcs0 \\i\\v\\f31506\\fs20\\cf6 \n\\par }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\v\\f31506\\cf6 I think we made a mistake here.  All of the capabilities that use TW_ARRAY containers only show TW_ONEVALUE as the valid container for MSG_SET.  It should be TW_ONEVALUE and TW_ARRAY.\n\\par }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\f31506\\cf6 \n\\par }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\f31506 TWAIN for C-Sharp (C#) resides on GitHub at }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0  HYPERLINK \"https://github.com/twain/twain-cs\" }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 {\\*\\datafield \n00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b5c000000680074007400700073003a002f002f006700690074006800750062002e0063006f006d002f0074007700610069006e002f0074007700610069006e002d00630073000000795881f43b1d7f48af2c825dc485\n276300000000a5ab00030000001500ef00}}}{\\fldrslt {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\cs187\\ul\\cf2 https://github.com/twain/twain-cs}}}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n\\f31506 .\n\\par }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul {\\*\\bkmkstart _Toc36456527}Installation{\\*\\bkmkend _Toc36456527}\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n\\par There is a releases folder that contains release and debug copies of the binaries.  There is no installation kit, just run them as-is.  If running on Linux or macOS it may be necessary to install or upgrade Mono to v4.8 or higher.  The certification tool \nautomatically creates a \\lquote TWAIN Self Certification\\rquote  folder on the user\\rquote s desktop, which contains all the stuff needed for certification.\n\\par \n\\par \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul {\\*\\bkmkstart _Toc36456528}Versioning{\\*\\bkmkend _Toc36456528}\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\f31506 \n\\par The versioning scheme takes the form: TWAIN-ProtocolMajor.TWAIN-ProtocolMinor.Interface.Build\n\\par \n\\par If the TWAIN Specification is at 2.3 then the version will be 2.3.i.b.  This is for notational purposes only, TWAIN interoperates at all versions of the protocol, so there is no requirement that a developer has to use any specific version, or i\nmmediately upgrade if there is a change to the TWAIN Specification.\n\\par \n\\par The interface number rises if there is a modification to the TWAINCS or TWAINCSToolkit that requires a code change in TWAINCSTest or TWAINCSScan.  For instance, adding a new argument to t\nhe ReportImage function.  This lets a developer know that downloading the new version will most likely require some work in their code before they can use it.  This assumption always applies when the TWAIN Specification changes, so the interface number re\nsets to 0 when they are modified.\n\\par \n\\par The build number tracks releases for a given version of the TWAIN Specification, and always rises until a new version of the spec is adopted.\n\\par \n\\par So, for example (fictitious sequence, just to show how it works):\n\\par \n\\par 2.3.0.0 \\endash  initial release to go with TWAIN 2.3\n\\par 2.3.0.1 \\endash  bug fix\n\\par 2.3.0.2 \\endash  bug fix\n\\par 2.3.1.3 \\endash  interface change\n\\par 2.3.1.4 \\endash  bug fix\n\\par 2.4.0.0 \\endash  initial release to go with TWAIN 2.4\n\\par \n\\par }\\pard\\plain \\ltrpar\\s189\\ql \\li0\\ri0\\keepn\\pagebb\\widctlpar\\brdrt\\brdrs\\brdrw30\\brsp120 \\wrapdefault\\nooverflow\\faroman\\outlinelevel0\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs24\\alang1025 \\ltrch\\fcs0 \n\\b\\f1\\fs24\\cf9\\lang1024\\langfe1024\\cgrid\\noproof\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af1\\afs36 \\ltrch\\fcs0 \\f31506\\fs36\\noproof0 {\\*\\bkmkstart _Toc36456529}Project Layout{\\*\\bkmkend _Toc36456529}\n\\par }\\pard\\plain \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506\\cf6 \n\\par }\\pard\\plain \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af37\\afs22\\alang1025 \\ltrch\\fcs0 \\f37\\fs22\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\v\\f31506\\cf6 [Technical Notes]}{\\rtlch\\fcs1 \\af0\\afs20 \\ltrch\\fcs0 \\i\\v\\f31506\\fs20\\cf6 \n\\par }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\v\\f31506\\cf6 I think we made a mistake here.  All of the capabilities that use TW_ARRAY containers only show TW_ONEVALUE as the valid container for MSG_SET.  It should be TW_ONEVALUE and TW_ARRAY.\n\\par }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\f31506\\cf6 \n\\par }\\pard \\ltrpar\\s199\\ql \\li360\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin360\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\f31506 There are five projects in the TWAIN CS repository, with a single solution file to access them all:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 \\f31506 Basic TWAIN C# Definitions and Helper Functions\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}A TWAIN C# Toolkit\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}A TWAIN C# Diagnostic Application\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}A TWAIN C# Sample Application\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 A TWAIN C# Self Certification Application\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\f31506 \n\\par }\\pard \\ltrpar\\s199\\ql \\li360\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin360\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\f31506 \nThe toolkit references the base definitions, and the applications reference the toolkit (with the exception of of the Certification app).  This is done to maximize the amount of shared code within the repository, and to allow for the seamless addition of\n new projects.\n\\par \n\\par The toolkit seemed like a good idea once.  However, after writing the Certification tool the basic functions are so completely developed that a strong case can be made for accessing them directly.  If interested in doing that, then base any code on the Ce\nrtification tool instead of the Sample application.\n\\par \n\\par Application writers must not assume that these references will remain stable.  They will not be versioned.  The projects will be updated as needed, resulting in assemblies that are not compatible with prior releases.\n\\par \n\\par It\\rquote s assumed that application writers will opt to pull this source code into a single assembly, the most common selection being the basic definitions, the toolkit and the sample application.  Updates will be accomplished by pulling in newer v\nersions of these files.  Updates will typically come from the basic definitions and the toolkit.\n\\par \n\\par If you decide to keep the items as separate projects, then make a note of the <HintPath> inside of each of the .csproj files.  Replacing the platform\\\\configuration folder names with }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 $(Platform)\\\\\n$(Configuration) makes for a much better build experience, since the references correctly track to the current settings.\n\\par }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\f31506 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\f31506 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\f31506\\ul {\\*\\bkmkstart _Toc36456530}Basic TWAIN C# Definitions and Helper Functions\n{\\*\\bkmkend _Toc36456530}\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\f31506 \n\\par }\\pard \\ltrpar\\s199\\ql \\li360\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin360\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\f31506 TWAINH.CS contains all o\nf the C/C++ TWAIN.H definitions for the version of TWAIN referenced on the title page of this document.\n\\par \n\\par TWAIN.CS contains helper functions designed to hide platform specific details, and to promote best practices when interfacing with the TWAIN Data Source Manager and TWAIN drivers.  Best practices cover a few areas:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \\af0 \n\\ltrch\\fcs0 \\f31506 Funnel all commands through a single thread\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Automatically collect the condition code when TWRC.Failure is detected\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Automatically resynchronize the TWAIN state if a sequence error is detected\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Provide ways to acess the data through CSV strings\n\\par }\\pard \\ltrpar\\s199\\ql \\li360\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin360\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\f31506 \n\\par Both files expose their functionality through the TWAIN class in the TWAINWorkingGroup namespace.\n\\par \n\\par \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\f31506 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\f31506\\ul {\\*\\bkmkstart _Toc36456531}A TWAIN C# Toolkit{\\*\\bkmkend _Toc36456531}\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\f31506 \n\\par }\\pard \\ltrpar\\s199\\ql \\li360\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin360\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\f31506 The TWAIN C# Toolkit references TWAIN.  This toolkit isn\\rquote \nt as comprehensive as some designed for C/C++, which aim to hide much of the complexity of TWAIN.  Instead, this toolkit addresses two main concerns:  the data marshaling challenges of using a C/C++ API with C#, and the complexities of the scan loop.\n\n\\par \n\\par Honestly, it\\rquote s a bit of a mess.  Especially the ScanCallback function.  Give serious consideration to skipping it, using the TWAIN Cerification tool as a better template for code development.  At some point I\\rquote \nll make another project to demonstrate that.\n\\par \n\\par TWAIN depends upon C/C++ structures and pointers for communication bet\nween the application and the driver.  The TWAIN C# Toolkit addresses this by translating data into CSV strings.  These strings follow the format of the TWAIN structures (position and type), but are rendered as text.  This makes it relatively easy for a ca\nller to get and set data, while still fully operating within the TWAIN name and number space.\n\\par \n\\par The TWAIN C# Diagnostic Application presents and consumes CSV data in its user interface, so it\\rquote s easiest to see this system in action there, it can be used as a \ntest bed when seeking to understand how to construct CSV strings to send to the driver.  The TWAIN C# Sample Application also uses CSV to examine data, and to set capabilities, but does so programmatically instead of through a user interface.  It helps to\n have access to a copy of TWAINH.CS handy when looking at the CSV data.\n\\par \n\\par The scan loop is the second main issue most applications run into.  The loop runs inside of the TWAIN thread using callbacks to give the application access to the images and metadata r\neturned by the TWAIN driver.  This reduces that amount of code an application needs without sacrificing access to the full set of supported ICAP_XFERMECH transfer options.  It also guarantees the responsiveness of the application, since operations never i\nmpede the windowing message loop.\n\\par \n\\par Assuming a well-behaved TWAIN driver, the application user is able to gracefully exit from the application at any time they choose, even in the middle of scanning.\n\\par \n\\par This TWAIN Toolkit exposes its functionality through the TWAINCSToolkit class in the TWAINWorkingGroupToolkit namespace.\n\\par \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\f31506 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\f31506\\ul {\\*\\bkmkstart _Toc36456532}A TWAIN C# Diagnostic Application{\\*\\bkmkend _Toc36456532}\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\f31506 \n\\par }\\pard \\ltrpar\\s199\\ql \\li360\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin360\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\f31506 \nThis application references TWAINCSToolkit.  The code is not intended as seed code for applications.  It is a comprehensive fronten\nd to the TWAIN API.  It allows the selection of any combination of TWAIN triplets, including ones that are illegal or are out of sequence with the current TWAIN state.  It is best compared to the TWACKER application, which has long been the main way to ex\nercise TWAIN drivers on Microsoft Windows systems.\n\\par \n\\par Data is presented and consumed in the form of CSV strings.  Familiarity with the various TWAIN structures is essential, since these strings do not include self-referential metadata, aside from the content \ndescribed by the TWAIN Specification.  As mentioned above, }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 it helps to have access to a copy of TWAINH.CS handy when looking at the CSV data.}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\f31506 \n\\par \n\\par The application tries to reduce mouse clicks for some common operations.  For instance, upon successful completio\nn of the DG_CONTROL / DAT_PARENT / MSG_OPENDSM operation, the dropdown values are set to DG_CONTROL / DAT_IDENTITY / MSG_GETFIRST, to enumerate the first TWAIN driver in the list of drivers.  After a few uses it\\rquote \nll be apparent when the application is trying to help.\n\\par \n\\par A @-command system has been added.  It doesn\\rquote t do much at the moment, but it could be expanded to allow for more complex behavior.  For instance, some kind of scripting system that would allow the diagnostic tool to help with automated tests.  \nIt becomes available after opening a DSM.  Type @help in the text box and press the Send button to get the list of supported commands.\n\\par \n\\par \n\\par \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\f31506 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\f31506\\ul {\\*\\bkmkstart _Toc36456533}A TWAIN C# Sample Application{\\*\\bkmkend _Toc36456533}\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\f31506 \n\\par }\\pard \\ltrpar\\s199\\ql \\li360\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin360\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\f31506 \nThis application references TWAINCSToolkit.  The code is intended as seed code for applications, and demonstrates the easiest way to access the full range of functionality present in TWAIN.\n\\par \n\\par For TWAIN drivers that support DG_CONTROL / DAT_USERINTERFACE / MSG_ENABLEDSUIONLY and DG_CONTROL / DAT_CUSTOMDSDATA / MSG_*, the application supports a \\'93snapshot\\'94\n system.  This allows a user to configure a TWAIN driver and save its setting under a descriptive name that can be used to restore those settings prior to scanning.\n\\par \n\\par For drivers that don\\rquote t support these operations the application defaults to the older }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 DG_CONTROL / DAT_USERINTERFACE / MSG_ENABLEDS system, with TW_USERINTERFACE.ShowUI set to TRUE.\n\\par \n\\par An application writer also has the option to programmatically negotiate capabilities.  The sample app doesn\\rquote t show this path, but it\\rquote s relatively easy to add for a small number of configurable items.}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\f31506 \n\n\\par }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\par \n\\par \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul {\\*\\bkmkstart _Toc36456534}A TWAIN C# Self Certification Application{\\*\\bkmkend _Toc36456534}\n\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\par }\\pard \\ltrpar\\s199\\ql \\li360\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin360\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 This application serves three purposes.  It shows \na reasonably good way of interfacing with TWAIN from C#.  It allows a user to interact directly with a TWAIN driver (with the aid of scripts).  And it offers a way to certify that a TWAIN driver is compliant with the specification.\n\\par \n\\par Note that the correct binary must be run to interface with 32-bit or 64-bit drivers.  This code has been tested on Windows, Linux, and Mac (the last two using Mono 4.8 or later).\n\\par \n\\par The tool has help built into it.  It also comes with a large collection of scripts.  If you use the \\lquote runv\\rquote  command with the script, you\\rquote ll get some insight into what arguments are needed for the \\lquote dsmentry\\rquote  command.\n\n\\par \n\\par It should be a good tool for developers, allowing them to explore the kind of commands they\\rquote ll need to issue from other languages, like C++.\n\\par \n\\par If developing with the tool, it\\rquote ll use the data folder located with the binary.  The release version normally defaults to the \\'93TWAIN Self Certification/data\\'94 folder on the desktop.\n\\par }\\pard\\plain \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\faauto\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\f31506 \n\\par }\\pard\\plain \\ltrpar\\s189\\ql \\li0\\ri0\\keepn\\pagebb\\widctlpar\\brdrt\\brdrs\\brdrw30\\brsp120 \\wrapdefault\\nooverflow\\faroman\\outlinelevel0\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs24\\alang1025 \\ltrch\\fcs0 \n\\b\\f1\\fs24\\cf9\\lang1024\\langfe1024\\cgrid\\noproof\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af1\\afs36 \\ltrch\\fcs0 \\f31506\\fs36\\noproof0 {\\*\\bkmkstart _Toc36456535}Release Notes{\\*\\bkmkend _Toc36456535}\n\\par }\\pard\\plain \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af37\\afs22\\alang1025 \\ltrch\\fcs0 \\f37\\fs22\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\cf6 \n\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul {\\*\\bkmkstart _Toc36456536}V2.4.}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul 10}{\\rtlch\\fcs1 \\af37 \n\\ltrch\\fcs0 \\b\\ul .0 (}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul 06}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul -}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul Jun}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul -2020)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0  \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 New Features:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 (none)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Bug Fixes:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Fixed twaincert.exe to run from the releases folder without thinking it\\rquote s a development path, so it correctly creates the \\lquote data\\rquote  folder in the \\lquote }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 TWAIN Self Certification}{\n\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\rquote  folder on the desktop.}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Known Issues:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 (none)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Wish List:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Want to switch to something other than WinForms, especially for macOS\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Need to add some more certification tests, especially for things like printer, barcode, patch\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\cf6 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul V2.4.9.0 (30-Apr-2020)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 {\\*\\bkmkend _Toc36456536} \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 New Features:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 (none)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Bug Fixes:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 The MSG_SET certification test was using the MSG_GET container, when the 2.4 spec states that it should only use TW_ONEVALUE or TW_ARRAY (the others being for MSG_SETCONTAINER), so that\\rquote s fixed now\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}\nFixed TWBP_* values to not return symbolic names, the support for symbolic names with TW_RANGE gets too weird too fast, staying with numbers offers fewer problems\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Known Issues:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 (none)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Wish List:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Want to switch to something other than WinForms, especially for macOS\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Need to add some more certification tests, especially for things like printer, barcode, patch\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\cf6 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul V2.4.8.0 (30-Mar-2020)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0  \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 New Features:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Switched almost all of the csv functions to static\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}(yah, skipped 2.4.7, kinda)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Bug Fixes:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 (none)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Known Issues:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 (none)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Wish List:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Want to switch to something other than WinForms, especially for macOS\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Need to add some more certification tests, especially for things like printer, barcode, patch\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\cf6 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul {\\*\\bkmkstart _Toc36456537}V2.4.6.0 (26-Mar-2020)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n{\\*\\bkmkend _Toc36456537} \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 New Features:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 (none)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Bug Fixes:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 MSG_XFERREADY wasn\\rquote t being handled properly if ShowUI was TRUE\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Known Issues:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 (none)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Wish List:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Want to switch to something other than WinForms, especially for macOS\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Need to add some more certification tests, especially for things like printer, barcode, patch\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul {\\*\\bkmkstart _Toc36456538}V2.4.5.0 (24-Mar-2020)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n{\\*\\bkmkend _Toc36456538} \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 New Features:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 (none)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Bug Fixes:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Stupid data folder wasn\\rquote t being properly created (grrr)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Known Issues:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 (none)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Wish List:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Want to switch to something other than WinForms, especially for macOS\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Need to add some more certification tests, especially for things like printer, barcode, patch\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\cf6 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul {\\*\\bkmkstart _Toc36456539}V2.4.4.0 (24-Mar-2020)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n{\\*\\bkmkend _Toc36456539} \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 New Features:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Fixed issues related to TWAIN Direct support, and added it to certification\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Added makerelease.bat file\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Bug Fixes:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 (none)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Known Issues:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 (none)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Wish List:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Want to switch to something other than WinForms, especially for macOS\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Need to add some more certification tests, especially for things like printer, barcode, patch\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\cf6 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul {\\*\\bkmkstart _Toc36456540}V2.4.3.0 (20-Mar-2020)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n{\\*\\bkmkend _Toc36456540} \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 New Features:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Switched twaincsscan and twaincstst to directly access TWAIN.CS\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}The toolkit is officially deprecated now, don\\rquote t use it\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Bug Fixes:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Fixed an issue where xferready during enableds could be missed\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Known Issues:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 (none)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Wish List:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Want to switch to something other than WinForms, especially for macOS\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Need to add some more certification tests, especially for things like printer, barcode, patch\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\cf6 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul {\\*\\bkmkstart _Toc36456541}V2.4.2.0 (13-Mar-2020)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n{\\*\\bkmkend _Toc36456541} \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 New Features:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Massive update to TWAIN.CS\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}twaincscert is pretty much done\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Bug Fixes:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Too many to count, twaincscert helped scrub the code\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Known Issues:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 (none)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Wish List:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Want to switch to something other than WinForms, especially for macOS\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Need to add some more certification tests, especially for things like printer, barcode, patch\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\cf6 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul {\\*\\bkmkstart _Toc36456542}V2.4.1.0 (30-Jan-2020)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n{\\*\\bkmkend _Toc36456542} \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 New Features:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Added twaincscert project (it\\rquote s not done yet, but it is useable)\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Fixed reflection to allow use of capability enumerations in the CSV (ex: TWPT_RGB)\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Expanded ability to use TWAIN.CS without the toolkit (needed for cert)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Bug Fixes:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 (none)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Known Issues:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Runs rather slowly on Mac OS X\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Setup Dialog sometimes freaks out on Mac OS X (appears to be a WinForms bug)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Wish List:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 64-bit Mono support on Mac OS X (should just work, but needs building / testing)\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Want to switch to Xamarin\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\cf6 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul {\\*\\bkmkstart _Toc36456543}V2.4.0.3 (13-Mar-2019)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n{\\*\\bkmkend _Toc36456543} \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 New Features:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 (none)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Bug Fixes:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Fixed an encoding problem, TWAIN on Windows requires strings in the encoding specified by the driver (either through it\\rquote s TW_IDENTITY.Version.Language or the last successful set of CAP_LANGUAGE).  \nUntil this fix TWAIN CS was sending strings as UTF-8.  Note that on Linux and macOS UTF-8 is the encoding, that hasn\\rquote t changed.\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Known Issues:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Runs rather slowly on Mac OS X\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Setup Dialog sometimes freaks out on Mac OS X (appears to be a WinForms bug)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Wish List:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 64-bit Mono support on Mac OS X (should just work, but needs building / testing)\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Want to switch to Xamarin\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul {\\*\\bkmkstart _Toc36456544}V2.4.0.2 (25-Jan-2019)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n{\\*\\bkmkend _Toc36456544} \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 New Features:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 In sync with TWAIN Direct\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Updated to VS2017\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Bug Fixes:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Fixed problem with FIX32 in TW_RANGE\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Fixed problems with SendDat for custom DAT support\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Known Issues:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Runs rather slowly on Mac OS X\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Setup Dialog sometimes freaks out on Mac OS X (appears to be a WinForms bug)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Wish List:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 64-bit Mono support on Mac OS X (should just work, but needs building / testing)\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Want to switch to Xamarin\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\cf6 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul {\\*\\bkmkstart _Toc36456545}V2.4.0.1 (19-Apr-2018)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n{\\*\\bkmkend _Toc36456545} \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 New Features:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 In sync with TWAIN Direct\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Bug Fixes:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Code analysis with VS2015, fixed up everything, supressed some stuff\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Finally got the Linux 64-bit thing right (lots of edge cases)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Known Issues:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Runs rather slowly on Mac OS X\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Setup Dialog sometimes freaks out on Mac OS X (appears to be a WinForms bug)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Wish List:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 64-bit Mono support on Mac OS X (should just work, but needs building / testing)\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Want to switch to Xamarin, and VS2017\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\cf6 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul {\\*\\bkmkstart _Toc36456546}V2.4.0.0 (darned if I know, 2017)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n{\\*\\bkmkend _Toc36456546} \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 New Features:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Linux 64-bit support, despite the TW_INT32/TW_UINT32 fiasco\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Switched to log file backup scheme\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}In sync with TWAIN Direct\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Known Issues:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Runs rather slowly on Mac OS X\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Setup Dialog sometimes freaks out on Mac OS X (appears to be a WinForms bug)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Wish List:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 64-bit Mono support on Mac OS X (should just work, but needs building / testing)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\cf6 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul {\\*\\bkmkstart _Toc36456547}V2.3.2.0 (18-Oct-2015)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n{\\*\\bkmkend _Toc36456547} \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 New Features:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Override capability for logging\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Log files are now read shared, so they can be viewed while the code is running\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}RunInGuiThread scheme added to support Windows for bug listed below\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Added thread and state to the log lines, added OS to the title line\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Bug Fixes:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 DAT_USERINTERFACE and DAT_IMAGE*XFER run on the HWND thread on Windows, this fixes problems with a number of drivers that run their code in the message loop (addresses Ticket #11 and Ticket #14)\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}DsmMemLock on the native transfer handle (addresses Ticket #15)\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}I\\rquote m not closing the tickets until I get feedback, or if I hear nothing for a month or two\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Known Issues:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Runs rather slowly on Mac OS X\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Setup Dialog sometimes freaks out on Mac OS X (appears to be a WinForms bug)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Wish List:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 64-bit Mono support on Mac OS X (should just work, but needs building / testing)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\cf6 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul {\\*\\bkmkstart _Toc36456548}V2.3.1.2 (13-Sep-2015)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n{\\*\\bkmkend _Toc36456548} \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 New Features:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 (none)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Bug Fixes:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Solved issues with the DsmMem* functions\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Known Issues:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Runs rather slowly on Mac OS X\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Setup Dialog sometimes freaks out on Mac OS X (appears to be a WinForms bug)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Wish List:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 64-bit Mono support on Mac OS X (should just work, but needs building / testing)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul {\\*\\bkmkstart _Toc36456549}V2.3.1.1 (27-Aug-2015)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n{\\*\\bkmkend _Toc36456549} \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 New Features:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 (none)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Bug Fixes:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Log fix and sync with TWAIN Direct\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Known Issues:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Runs rather slowly on Mac OS X\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Setup Dialog sometimes freaks out on Mac OS X (appears to be a WinForms bug)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Wish List:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 64-bit Mono support on Mac OS X (should just work, but needs building / testing)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul {\\*\\bkmkstart _Toc36456550}V2.3.1.0 (13-Mar-2015)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n{\\*\\bkmkend _Toc36456550} \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 New Features:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Additional arguments to the ReportImage callback\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Bug Fixes:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Tested building using MonoDevelop on Ubuntu 14.04 (32-bit) using Mono 3.12.1, fixed two problems\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Known Issues:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Runs rather slowly on Mac OS X\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Setup Dialog sometimes freaks out on Mac OS X (appears to be a WinForms bug)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Wish List:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 64-bit Mono support on Mac OS X (should just work, but needs building / testing)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul {\\*\\bkmkstart _Toc36456551}V2.3.0.6 (30-Oct-2014)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n{\\*\\bkmkend _Toc36456551} \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 New Features:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 (none)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Bug Fixes:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Closed Ticket #6: DsmMemFree - Validate\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Ticket #5 has been resisting, this time I got it right\\'85\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Removed embedded tabs\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Confirmed successful tests with other vendors\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Fixed code to better handle when TWAIN DSM isn\\rquote t installed\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Known Issues:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Runs rather slowly on Mac OS X\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Setup Dialog sometimes freaks out on Mac OS X (appears to be a WinForms bug)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Wish List:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 64-bit Mono support on Mac OS X (should just work, but needs building / testing)\n\\par }\\pard\\plain \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f37\\cf6 \n\\par }\\pard\\plain \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af37\\afs22\\alang1025 \\ltrch\\fcs0 \\f37\\fs22\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\cf6 \n[Technical Notes]}{\\rtlch\\fcs1 \\af0\\afs20 \\ltrch\\fcs0 \\i\\v\\fs20\\cf6 \n\\par }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\v\\cf6 I think we made a mistake here.  All of the capabilities that use TW_ARRAY containers only show TW_ONEVALUE as the valid container for MSG_SET.  It should be TW_ONEVALUE and TW_ARRAY.\n\\par }\\pard\\plain \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f37\\cf6 \n\\par }\\pard\\plain \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af37\\afs22\\alang1025 \\ltrch\\fcs0 \\f37\\fs22\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\cf6 \n[Technical Notes]}{\\rtlch\\fcs1 \\af0\\afs20 \\ltrch\\fcs0 \\i\\v\\fs20\\cf6 \n\\par }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\v\\cf6 I think we made a mistake here.  All of the capabilities that use TW_ARRAY containers only show TW_ONEVALUE as the valid container for MSG_SET.  It should be TW_ONEVALUE and TW_ARRAY.\n\\par }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\cf6 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul {\\*\\bkmkstart _Toc36456552}V2.3.0.5 (19-Oct-2014)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n{\\*\\bkmkend _Toc36456552} \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 New Features:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 (none)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Bug Fixes:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Closed Ticket #3: can\\'b4t get capabilities; what can i get out of a_szMemref?\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Closed Ticket #4: Setup Scanner does not work in twancsscan (dialog freezes)\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Closed Ticket #5: Twain.DatParent - CloseDs should be CloseDsm\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Figured out the message pump issue\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Fixed SetImagePath to impact file transfers\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Known Issues:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Runs rather slowly on Mac OS X\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Setup Dialog sometimes freaks out on Mac OS X (looks like a race condition)\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Only tested on Kodak Alaris products and the TWAIN Sample Data Source\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Wish List:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Test with other vendors\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}64-bit Mono support on Mac OS X (should just work, but needs building / testing)\n\\par }\\pard\\plain \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f37\\cf6 \n\\par }\\pard\\plain \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af37\\afs22\\alang1025 \\ltrch\\fcs0 \\f37\\fs22\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\cf6 \n[Technical Notes]}{\\rtlch\\fcs1 \\af0\\afs20 \\ltrch\\fcs0 \\i\\v\\fs20\\cf6 \n\\par }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\v\\cf6 I think we made a mistake here.  All of the capabilities that use TW_ARRAY containers only show TW_ONEVALUE as the valid container for MSG_SET.  It should be TW_ONEVALUE and TW_ARRAY.\n\\par }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\cf6 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul {\\*\\bkmkstart _Toc36456553}V2.3.0.4 (13-Oct-2014)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n{\\*\\bkmkend _Toc36456553} \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 New Features:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 \nTracking the version number to the TWAIN Specification, so the major and minor will be the protocol value, the third number will call out major changes in the API within a version, and the fourth number will count minor changes to the API (like bug fixes)\n\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Added logging (still some work to do on this)\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Added auto JPEG/TIFF option for file  transfers\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Bug Fixes:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Fixed DAT_IMAGEMEMFILEXFER for Mac OS X\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Known Issues:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Runs rather slowly on Mac OS X\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Setup Dialog sometimes freaks out on Mac OS X (looks like a race condition)\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Only tested on Kodak Alaris products and the TWAIN Sample Data Source\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Wish List:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Test with other vendors\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}64-bit Mono support on Mac OS X (should just work, but needs testing)\n\\par }\\pard\\plain \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f37\\cf6 \n\\par }\\pard\\plain \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af37\\afs22\\alang1025 \\ltrch\\fcs0 \\f37\\fs22\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\cf6 \n[Technical Notes]}{\\rtlch\\fcs1 \\af0\\afs20 \\ltrch\\fcs0 \\i\\v\\fs20\\cf6 \n\\par }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\v\\cf6 I think we made a mistake here.  All of the capabilities that use TW_ARRAY containers only show TW_ONEVALUE as the valid container for MSG_SET.  It should be TW_ONEVALUE and TW_ARRAY.\n\\par }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\cf6 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul {\\*\\bkmkstart _Toc36456554}V2.2.0 (11-Jul-2014)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n{\\*\\bkmkend _Toc36456554} \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 New Features:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 (none)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Bug Fixes:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Fixed DAT_IMAGEMEMFILEXFER\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Known Issues:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Runs rather slowly on Mac OS X\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Setup Dialog sometimes freaks out on Mac OS X (looks like a race condition)\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Only tested on Kodak Alaris products and the TWAIN Sample Data Source\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Wish List:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Test with other vendors\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}64-bit Mono support on Mac OS X (should just work, but needs testing)\n\\par }\\pard\\plain \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506\\cf6 \n\\par }\\pard\\plain \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af37\\afs22\\alang1025 \\ltrch\\fcs0 \\f37\\fs22\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\v\\f31506\\cf6 [Technical Notes]}{\\rtlch\\fcs1 \\af0\\afs20 \\ltrch\\fcs0 \\i\\v\\f31506\\fs20\\cf6 \n\\par }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\v\\f31506\\cf6 I think we made a mistake here.  All of the capabilities that use TW_ARRAY containers only show TW_ONEVALUE as the valid container for MSG_SET.  It should be TW_ONEVALUE and TW_ARRAY.\n\\par }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\f31506\\cf6 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul {\\*\\bkmkstart _Toc36456555}V2.1.0 (09-Jul-2014)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n{\\*\\bkmkend _Toc36456555} \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 New Features:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 ReportImage\\rquote s bitmap no long locks access to the file\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Bug Fixes:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Handles MSG_XFERREADY when issued from MSG_ENABLEDS\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Known Issues:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Runs rather slowly on Mac OS X\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Setup Dialog sometimes freaks out on Mac OS X (looks like a race condition)\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Only tested on Kodak Alaris products and the TWAIN Sample Data Source\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Wish List:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Test with other vendors\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}64-bit Mono support on Mac OS X (should just work, but needs testing)\n\\par }\\pard \\ltrpar\\s199\\ql \\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\f31506\\ul {\\*\\bkmkstart _Toc36456556}V2.0.0 (21-May-2014)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\f31506 \n{\\*\\bkmkend _Toc36456556} \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\f31506 New Features:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 \\f31506 Support for 64-bit Linux (native only, 32-bit on 64-bit is too nasty)\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}ShowImage renamed to ReportImage\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\f31506 Known Issues:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 \\f31506 Runs rather slowly on Mac OS X\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Setup Dialog sometimes freaks out on Mac OS X (looks like a race condition)\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Only tested on Kodak Alaris products\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\f31506 Wish List:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 \\f31506 Test with other vendors\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}64-bit Mono support on Mac OS X (should just work, but needs testing)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\cf6 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul {\\*\\bkmkstart _Toc36456557}V1.1.0 (27-Feb-2014)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n{\\*\\bkmkend _Toc36456557} \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 New Features:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Additional arguments in ShowImage\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Code example of CAP_INDICATORS in TWAINCSScan\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Fixed projects to handle conditional references\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Added AnyCPU support\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Known Issues:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Runs rather slowly on Mac OS X\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Setup Dialog sometimes freaks out on Mac OS X (looks like a race condition)\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Only tested on Kodak Alaris products\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Wish List:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Test with other vendors\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}64-bit Mono support on Linux and Mac OS X\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\cf6 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul {\\*\\bkmkstart _Toc36456558}V1.0.0 (05-Nov-2013)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n{\\*\\bkmkend _Toc36456558} \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 New Features:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Initial release\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Known Issues:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Runs rather slowly on Mac OS X\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Setup Dialog sometimes freaks out on Mac OS X (looks like a race condition)\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Only tested on Kodak Alaris products\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Wish List:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls22\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Test with other vendors\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}64-bit Mono support on Linux and Mac OS X}{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\f31506 \n\\par }\\pard\\plain \\ltrpar\\s189\\ql \\li0\\ri0\\keepn\\widctlpar\\brdrt\\brdrs\\brdrw30\\brsp120 \\wrapdefault\\nooverflow\\faroman\\outlinelevel0\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs24\\alang1025 \\ltrch\\fcs0 \n\\b\\f1\\fs24\\cf9\\lang1024\\langfe1024\\cgrid\\noproof\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\v\\f31506\\noproof0 {\\*\\bkmkend _Toc234021027}General Comments }{\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\v\\f31506\\cf6\\noproof0 [DONE]}{\\rtlch\\fcs1 \\af1 \n\\ltrch\\fcs0 \\v\\f31506\\noproof0 \n\\par }\\pard\\plain \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506\\cf6 \n\\par }\\pard\\plain \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af37\\afs22\\alang1025 \\ltrch\\fcs0 \\f37\\fs22\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\v\\f31506\\cf6 [Technical Notes]}{\\rtlch\\fcs1 \\af0\\afs20 \\ltrch\\fcs0 \\i\\v\\f31506\\fs20\\cf6 \n\\par These are areas of discussion which may or may not lead to changes in the TWAIN Specification.  If changes do result, they\\rquote ll be moved into their own area.  There are no Update Instructions in this section.  When we\\rquote re done with it, it\n\\rquote ll be moved to the end of the document and given a status of \\'93DONE\\'94\\'85\n\\par }\\pard\\plain \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506 \n\\par \n\\par }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506\\cf6 [Note] \\endash  DONE\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\i\\v\\f31506\\fs22 Does a Boolean enumeration have an expected order to the TRUE/FALSE values in the list?\n\\par 8-22 (hunt this down and fix it)\n\\par We don\\rquote t want the values ordered, except in the context where the order impacts the UI, but there is no way to know if this is happening or not\\'85\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\faauto\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\v\\f31506 Stores a group of individual values describing a capability. The values are ordered from lowest to\n\\par highest values, but the step size between each value is probably not uniform. Such a list would be\n\\par useful to describe the discreet resolutions of a capture device supporting, say, 75, 150, 300, 400,\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\v\\f31506 and 800 dots per inch.}{\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\i\\v\\f31506\\fs22 \n\\par \n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\fs22 \\hich\\af0\\dbch\\af0\\loch\\f0 -\\tab}}\\pard \\ltrpar\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls21\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \\af0\\afs22 \n\\ltrch\\fcs0 \\i\\v\\f31506\\fs22 No, there is no required order for items in an enumeration or an array.  Ideally the Data Source would maintain the order of items send to it, and display the items in that order in the GUI, but I don\\rquote \nt believe there is anything in the Specification that even suggests that much.\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506 \n\\par \n\\par }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506\\cf6 [Note] \\endash  DONE\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\i\\v\\f31506\\fs22 \nIn particular, I was working on ICAP_BITDEPTH. If a Data Source only supports a single bitdepth for each specific pixeltype, wouldn\\rquote \nt it make sense to respond that SET and RESET are not supported? There would be no reason to do a set of Bitdepth, since only a single value is supported at a time.\n\\par \n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\fs22 \\hich\\af0\\dbch\\af0\\loch\\f0 -\\tab}}\\pard \\ltrpar\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls21\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \\af0\\afs22 \n\\ltrch\\fcs0 \\i\\v\\f31506\\fs22 I wonder if there should be a paragraph on this matter.  Here\\rquote s my take on it.  Applications tend to do one of two things when confronted by an error: they ignore it or they fail (sometimes they crash).  With tha\nt in mind a driver should always avoid returning an error if it has a valid alternative that allows it to return success instead.  Therefore, MSG_RESET and MSG_SET should always be allowed for capabilities that support a single value, except in those  cas\nes where the Specification makes it clear that the value is read only (like CAP_DEVICEONLINE).\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506 \n\\par \n\\par }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506\\cf6 [Note] \\endash  DONE\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\i\\v\\f31506\\fs22 \nAlso regarding ICAP_BITDEPTH, am I correct in understanding that a MSG_GET for this capability should only report the available values based on the current setting for PIXELTYPE? Ie. Don\\rquote \nt report all the bitdepths supported, only those supported for the current pixel type?\n\\par \n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\fs22 \\hich\\af0\\dbch\\af0\\loch\\f0 -\\tab}}\\pard \\ltrpar\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls21\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \\af0\\afs22 \n\\ltrch\\fcs0 \\i\\v\\f31506\\fs22 This is correct.  We know that some drivers show all of the bitdepth values for all of the supported pixeltypes.  It doesn\\rquote t look like we have a comment on this in the Legacy Issues section (3-39, PDF 71).\n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\fs22 \\hich\\af0\\dbch\\af0\\loch\\f0 -\\tab}Add a test to the self cert to watch out for this\\'85 (this has been added to the Proposed Changes doc)\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506 \n\\par \n\\par }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506\\cf6 \\page [Note] \\endash  DONE\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\i\\v\\f31506\\fs22 I have a question regarding the filename extension used\n in a File Transfer.  The filename is provided in the DG_CONTROL/DAT_SETUPFILEXFER/MSG_SET message.  Do I need to make sure the requested filename extension matches the type of the file I end up creating?\n\\par }{\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22 \n\\par A couple of examples:\n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f37\\fs22\\cf22 \\hich\\af37\\dbch\\af0\\loch\\f37 1)\\tab}}\\pard \\ltrpar\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls20\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22 Simple case: if \\'93filexfer.tmp\\'94 is requested, I\\rquote \nm guessing I should use the file extension as requested regardless of file type that I create. (ie. Even though I save a tiff/jpg/bmp etc. file, continue using the .tmp extention) Is this correct?\n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f37\\fs22\\cf22 \\hich\\af37\\dbch\\af0\\loch\\f37 2)\\tab}More complex case: Assume I\\rquote m doing auto color detect, and my non-color will be mapped to BW. If \\'93filexfer.jpg\\'94\n is requested and I detect a non-color image, this will be an *}{\\rtlch\\fcs1 \\ab\\af0\\afs22 \\ltrch\\fcs0 \\b\\v\\f31506\\fs22 incorrect}{\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22 \n* name in the end since I cannot save a BW image as a JPG file. I will create a BMP file instead. Should I change the requested filename to \\'93filexfer.bmp\\'94\n in this case? Or still use the filename as requested even though it gives the wrong impression of filetype?\n\\par }\\pard \\ltrpar\\ql \\li360\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin360\\itap0 {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22 \n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22 If I don\\rquote \nt use the filename exactly as requested, does the TWAIN app think the transfer failed? They really have no way to know what I saved it as if I make a change, so it seems the filename better not change, even in the case that it is incorrect.\n\\par \n\\par Do you know of some TWAIN apps that use FileXfer that I could try this with?\n\\par \n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\fs22 \\hich\\af0\\dbch\\af0\\loch\\f0 -\\tab}}\\pard \\ltrpar\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls21\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \\af0\\afs22 \n\\ltrch\\fcs0 \\v\\f31506\\fs22 TWAIN doesn\\rquote t recommend or enforce filename extensions for TWFF_* file formats.  This means that someone could produce a ridiculous result (like image.bmp for a JPEG image), but that\\rquote s okay,\n because application writers are free to use whatever naming system they need.\n\\par }\\pard \\ltrpar\\ql \\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22 \n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\fs22 \\hich\\af0\\dbch\\af0\\loch\\f0 -\\tab}}\\pard \\ltrpar\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls21\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \\af0\\afs22 \n\\ltrch\\fcs0 \\v\\f31506\\fs22 The only time a file transfer should fail is in situations where the application\\rquote s request can\\rquote t be met.  For example, if TWFF_JFIF is requested for a TWPT_BW TWCP_GROUP4 compressed image.\n\\par }\\pard\\plain \\ltrpar\\s199\\ql \\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \\af37\\afs22\\alang1025 \\ltrch\\fcs0 \\f37\\fs22\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\v\\f31506 \n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\fs22 \\hich\\af0\\dbch\\af0\\loch\\f0 -\\tab}}\\pard\\plain \\ltrpar\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls21\\adjustright\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \n\\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22 \nNote that DAT_IMAGEFILEXFER is still considered optional, so few drivers support it.  It was designed as a low memory transfer option, since the driver is able to transfer the image directly to disk.  Most application choose to do this th\nemselves, and using DAT_IMAGEMEMXFER can achieve results that require little memory, though an extra step is often needed to create the finished file, since the metadata that describes the image isn\\rquote t available until state 7.\n\\par }\\pard\\plain \\ltrpar\\s199\\ql \\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \\af37\\afs22\\alang1025 \\ltrch\\fcs0 \\f37\\fs22\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\v\\f31506 \n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\fs22 \\hich\\af0\\dbch\\af0\\loch\\f0 -\\tab}}\\pard\\plain \\ltrpar\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls21\\adjustright\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \n\\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22 I don\\rquote t know of any commonly used TWAIN applications that use DAT_IMAGEFILEXFER.\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22\\cf22 \n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506 \\page \n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506\\cf6 [Note] \\endash  DONE\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22 \nFor capabilities (ch.10 pages), if MSG_GET supports both TW_ONEVALUE and TW_ENUMERATION; should MSG_SET support both as well? Nowhere does the spec include TW_ ENUMERATION as a valid set container, but I think this is allowed.\n\\par \n\\par Oh....ICAP_HALFTONETYPES is the only cap I found that lists TW_ENUMERATION as a SET Container type.\n\\par \n\\par Do I correctly understand that you could replace MSG_SET with MSG_SETCONSTRAINT, and never use MSG_SET anymore? Ie. If sending a TW_ONEVALUE or TW_ARRAY via the MSG_SETCONSTRAINT, this is equivalent to the MSG_SET functionality.\n\\par \n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\fs22 \\hich\\af0\\dbch\\af0\\loch\\f0 -\\tab}}\\pard \\ltrpar\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls21\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \\af0\\afs22 \n\\ltrch\\fcs0 \\v\\f31506\\fs22 I can say with confidence that this part of the Spec hasn\\rquote \nt exactly turned out as planned.  The intention was to separate setting values from setting constraints.  However, I would always expect that one can call MSG_GET, MSG_GETCURRENT and take the result and pass it into MSG_SET.  The difference is that if bot\nh the application and the driver report themselves as 2.2 or higher the driver only takes the value from MSG_SET.\n\\par }\\pard \\ltrpar\\ql \\li360\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin360\\itap0 {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22 \n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\fs22 \\hich\\af0\\dbch\\af0\\loch\\f0 -\\tab}}\\pard \\ltrpar\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls21\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \\af0\\afs22 \n\\ltrch\\fcs0 \\v\\f31506\\fs22 The situation as described means that MSG_GET cannot be used as the input to MSG_SET.  I think that results in too much work for applications and drivers, given the radical departure from previous behavior.\n\\par }\\pard\\plain \\ltrpar\\s199\\ql \\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \\af37\\afs22\\alang1025 \\ltrch\\fcs0 \\f37\\fs22\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\v\\f31506 \n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\fs22 \\hich\\af0\\dbch\\af0\\loch\\f0 -\\tab}}\\pard\\plain \\ltrpar\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls21\\adjustright\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \n\\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22 \nUsing TW_ONEVALUE with MSG_SETCONTRAINT should constrain the capability to that one value.  Also, the value is always set with MSG_SETCONTRAINT.\n\\par }\\pard \\ltrpar\\ql \\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22 \n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\fs22 \\hich\\af0\\dbch\\af0\\loch\\f0 -\\tab}}\\pard \\ltrpar\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls21\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \\af0\\afs22 \n\\ltrch\\fcs0 \\v\\f31506\\fs22 Therefore, we need to make sure that the Spec clearly explains the difference between MSG_SET and MSG_SETCON\nTRAINT, and then make sure that for all capabilities the allowed containers for both MSG_SET and MSG_SETCONSTRAINT are identical.\n\\par }\\pard\\plain \\ltrpar\\s199\\ql \\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \\af37\\afs22\\alang1025 \\ltrch\\fcs0 \\f37\\fs22\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\v\\f31506 \n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\fs22 \\hich\\af0\\dbch\\af0\\loch\\f0 -\\tab}}\\pard\\plain \\ltrpar\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls21\\adjustright\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \n\\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22 I\\rquote \nm pretty sure that Self-Cert will support this change (meaning that it assumes that a MSG_GET can always be followed by a MSG_SET).  I\\rquote d be very surprised if anybody changed the behavior of MSG_SET without asking us what we\\rquote re thinking...\n\n\\par }\\pard\\plain \\ltrpar\\s199\\ql \\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \\af37\\afs22\\alang1025 \\ltrch\\fcs0 \\f37\\fs22\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\v\\f31506 \n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\fs22 \\hich\\af0\\dbch\\af0\\loch\\f0 -\\tab}}\\pard\\plain \\ltrpar\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls21\\adjustright\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \n\\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22 MSG_SET will only impact the current value\\'85\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506 \n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506\\cf6 \\page [Note] \\endash  DONE\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22 ICAP_XFERMECH (ch. 10, pg. 10-197): under Application section it reads, \\'93Th\ne current value of ICAP_XFERMECH must match the data argument type when starting the transfer using the triplet: DG_IMAGE / DAT_IMAGExxxxXFER / MSG_GET.\\'94 If it does not match, what should happen?\n\\par (NOTE: already discussed in the working group meeting on 17 July 2012)\n\\par \n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\fs22 \\hich\\af0\\dbch\\af0\\loch\\f0 -\\tab}}\\pard \\ltrpar\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls21\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \\af0\\afs22 \n\\ltrch\\fcs0 \\v\\f31506\\fs22 My recollection from the meeting is as follows:\n\\par }\\pard \\ltrpar\\ql \\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22 \n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\fs22 \\hich\\af0\\dbch\\af0\\loch\\f0 -\\tab}}\\pard \\ltrpar\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls21\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \\af0\\afs22 \n\\ltrch\\fcs0 \\v\\f31506\\fs22 The TWAIN Spec says that apps need to set ICAP_XFERMECH in state 4 to the transfer mechanism that\\rquote ll be used in state 6 and 7.  However, some apps don\\rquote t bother to do this.\n\\par }\\pard\\plain \\ltrpar\\s199\\ql \\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \\af37\\afs22\\alang1025 \\ltrch\\fcs0 \\f37\\fs22\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\v\\f31506 \n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\fs22 \\hich\\af0\\dbch\\af0\\loch\\f0 -\\tab}}\\pard\\plain \\ltrpar\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls21\\adjustright\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \n\\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22 \nThe thought is to leave the requirement intact, but add a bit to the Legacy Issues section warning driver writers not to assume this will happen.\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506 \n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506\\cf6 [Note] \\endash  DONE\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22 (ch. 2, pg. 2-16) I think a couple of string types are missing. It says: \\'93There are }{\\rtlch\\fcs1 \n\\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22\\ul four}{\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22  types of TWAIN strings defined for developer use:\\'94\n, and then lists TW_STR32, TW_STR64, TW_STR128, and TW_STR256. But in twain.h, there are now TW_STR1024 and a TW_UNI512 types defined. Should these be added, for a total of 6?\n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs20 \\ltrch\\fcs0 \\v\\fs20 \\hich\\af0\\dbch\\af0\\loch\\f0 -\\tab}}\\pard \\ltrpar\\ql \\fi-360\\li720\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\ls21\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506 \nTW_STR1024 and TW_UNI512 have been deprecated, so the number \\lquote four\\rquote  is right.}{\\rtlch\\fcs1 \\ab\\af0\\afs22 \\ltrch\\fcs0 \\b\\v\\f31506\\fs22 \n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506 \n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506\\cf6 [Note] \\endash  DONE\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22 Do I understand correctly that MSG_GETDEFAULT should return the Source\\rquote s *}{\\rtlch\\fcs1 \n\\ab\\af37\\afs22 \\ltrch\\fcs0 \\b\\v\\f31506\\fs22 Preferred}{\\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22 * default. But this may *}{\\rtlch\\fcs1 \\ab\\af37\\afs22 \\ltrch\\fcs0 \\b\\v\\f31506\\fs22 not}{\\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22 \n* be the value set when calling MSG_RESET, since MSG_RESET resets to the TWAIN default? If there is a Mandatory default, does MSG_GETDEFAULT need to return the mandatory default?\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506 \n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506\\cf6 [Note] \\endash  DONE\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22 \nSo is MSG_RESET meant to reset to the value listed in Ch. 10 always? (whether or not this is a mandatory default) Only if Ch. 10 says \\'93no default\\'94 can the source reset it to a preferred or user value?\n\\par }\\pard\\plain \\ltrpar\\s199\\ql \\li360\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin360\\itap0 \\rtlch\\fcs1 \\af37\\afs22\\alang1025 \\ltrch\\fcs0 \\f37\\fs22\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n\\i\\v\\f31506\\cf6 \n\\par }\\pard\\plain \\ltrpar\\ql \\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \n\\v\\f31506\\fs22\\cf23 \n\\par }{\\*\\themedata 504b030414000600080000002100e9de0fbfff0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb4ec3301045f748fc83e52d4a\n9cb2400825e982c78ec7a27cc0c8992416c9d8b2a755fbf74cd25442a820166c2cd933f79e3be372bd1f07b5c3989ca74aaff2422b24eb1b475da5df374fd9ad\n5689811a183c61a50f98f4babebc2837878049899a52a57be670674cb23d8e90721f90a4d2fa3802cb35762680fd800ecd7551dc18eb899138e3c943d7e503b6\nb01d583deee5f99824e290b4ba3f364eac4a430883b3c092d4eca8f946c916422ecab927f52ea42b89a1cd59c254f919b0e85e6535d135a8de20f20b8c12c3b0\n0c895fcf6720192de6bf3b9e89ecdbd6596cbcdd8eb28e7c365ecc4ec1ff1460f53fe813d3cc7f5b7f020000ffff0300504b030414000600080000002100a5d6\na7e7c0000000360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4f\nc7060abb0884a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b6309512\n0f88d94fbc52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462\na1a82fe353bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f746865\n6d652f7468656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b\n4b0d592c9c070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b\n4757e8d3f729e245eb2b260a0238fd010000ffff0300504b03041400060008000000210096b5ade296060000501b0000160000007468656d652f7468656d652f\n7468656d65312e786d6cec594f6fdb3614bf0fd87720746f6327761a07758ad8b19b2d4d1bc46e871e698996d850a240d2497d1bdae38001c3ba618715d86d87\n615b8116d8a5fb34d93a6c1dd0afb0475292c5585e9236d88aad3e2412f9e3fbff1e1fa9abd7eec70c1d1221294fda5efd72cd4324f1794093b0eddd1ef62fad\n79482a9c0498f184b4bd2991deb58df7dfbb8ad755446282607d22d771db8b944ad79796a40fc3585ee62949606ecc458c15bc8a702910f808e8c66c69b9565b\n5d8a314d3c94e018c8de1a8fa94fd05093f43672e23d06af89927ac06762a049136785c10607758d9053d965021d62d6f6804fc08f86e4bef210c352c144dbab\n999fb7b4717509af678b985ab0b6b4ae6f7ed9ba6c4170b06c788a705430adf71bad2b5b057d03606a1ed7ebf5babd7a41cf00b0ef83a6569632cd467faddec9\n699640f6719e76b7d6ac355c7c89feca9cccad4ea7d36c65b258a206641f1b73f8b5da6a6373d9c11b90c537e7f08dce66b7bbeae00dc8e257e7f0fd2badd586\n8b37a088d1e4600ead1ddaef67d40bc898b3ed4af81ac0d76a197c86826828a24bb318f3442d8ab518dfe3a20f000d6458d104a9694ac6d88728eee2782428d6\n0cf03ac1a5193be4cbb921cd0b495fd054b5bd0f530c1931a3f7eaf9f7af9e3f45c70f9e1d3ff8e9f8e1c3e3073f5a42ceaa6d9c84e5552fbffdeccfc71fa33f\n9e7ef3f2d117d57859c6fffac327bffcfc793510d26726ce8b2f9ffcf6ecc98baf3efdfdbb4715f04d814765f890c644a29be408edf3181433567125272371be\n15c308d3f28acd249438c19a4b05fd9e8a1cf4cd296699771c393ac4b5e01d01e5a30a787d72cf1178108989a2159c77a2d801ee72ce3a5c545a6147f32a9979\n3849c26ae66252c6ed637c58c5bb8b13c7bfbd490a75330f4b47f16e441c31f7184e140e494214d273fc80900aedee52ead87597fa824b3e56e82e451d4c2b4d\n32a423279a668bb6690c7e9956e90cfe766cb37b077538abd27a8b1cba48c80acc2a841f12e698f13a9e281c57911ce298950d7e03aba84ac8c154f8655c4f2a\nf074481847bd804859b5e696007d4b4edfc150b12addbecba6b18b148a1e54d1bc81392f23b7f84137c2715a851dd0242a633f900710a218ed715505dfe56e86\ne877f0034e16bafb0e258ebb4faf06b769e888340b103d3311da9750aa9d0a1cd3e4efca31a3508f6d0c5c5c398602f8e2ebc71591f5b616e24dd893aa3261fb\n44f95d843b5974bb5c04f4edafb95b7892ec1108f3f98de75dc97d5772bdff7cc95d94cf672db4b3da0a6557f70db629362d72bcb0431e53c6066acac80d699a\n6409fb44d08741bdce9c0e4971624a2378cceaba830b05366b90e0ea23aaa241845368b0eb9e2612ca8c742851ca251ceccc70256d8d87265dd96361531f186c\n3d9058edf2c00eafe8e1fc5c509031bb4d680e9f39a3154de0accc56ae644441edd76156d7429d995bdd88664a9dc3ad50197c38af1a0c16d684060441db0256\n5e85f3b9660d0713cc48a0ed6ef7dedc2dc60b17e92219e180643ed27acffba86e9c94c78ab90980d8a9f0913ee49d62b512b79626fb06dccee2a432bbc60276\nb9f7dec44b7904cfbca4f3f6443ab2a49c9c2c41476dafd55c6e7ac8c769db1bc399161ee314bc2e75cf8759081743be1236ec4f4d6693e5336fb672c5dc24a8\nc33585b5fb9cc24e1d4885545b58463634cc5416022cd19cacfccb4d30eb45296023fd35a458598360f8d7a4003bbaae25e331f155d9d9a5116d3bfb9a95523e\n51440ca2e0088dd844ec6370bf0e55d027a012ae264c45d02f708fa6ad6da6dce29c255df9f6cae0ec38666984b372ab5334cf640b37795cc860de4ae2816e95\nb21be5ceaf8a49f90b52a51cc6ff3355f47e0237052b81f6800fd7b802239daf6d8f0b1571a8426944fdbe80c6c1d40e8816b88b8569082ab84c36ff0539d4ff\n6dce591a26ade1c0a7f669880485fd484582903d284b26fa4e2156cff62e4b9265844c4495c495a9157b440e091bea1ab8aaf7760f4510eaa69a6465c0e04ec6\n9ffb9e65d028d44d4e39df9c1a52ecbd3607fee9cec7263328e5d661d3d0e4f62f44acd855ed7ab33cdf7bcb8ae889599bd5c8b3029895b6825696f6af29c239\nb75a5bb1e6345e6ee6c28117e73586c1a2214ae1be07e93fb0ff51e133fb65426fa843be0fb515c187064d0cc206a2fa926d3c902e907670048d931db4c1a449\n59d366ad93b65abe595f70a75bf03d616c2dd959fc7d4e6317cd99cbcec9c58b34766661c7d6766ca1a9c1b327531486c6f941c638c67cd22a7f75e2a37be0e8\n2db8df9f30254d30c1372581a1f51c983c80e4b71ccdd28dbf000000ffff0300504b0304140006000800000021000dd1909fb60000001b010000270000007468\n656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f78277086f6fd3ba109126dd88d0add40384e4\n350d363f2451eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89d93b64b060828e6f37ed1567914b284d2624\n52282e3198720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd5001996509affb3fd381a89672f1f165dfe5141\n73d9850528a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100e9de0fbfff0000001c020000130000000000000000\n0000000000000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6a7e7c0000000360100000b00000000000000\n000000000000300100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a0000001c0000000000000000000000000019\n0200007468656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d001400060008000000210096b5ade296060000501b00001600000000\n000000000000000000d60200007468656d652f7468656d652f7468656d65312e786d6c504b01022d00140006000800000021000dd1909fb60000001b01000027\n00000000000000000000000000a00900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d0100009b0a00000000}\n{\\*\\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d\n617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169\n6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363\n656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e}\n{\\*\\latentstyles\\lsdstimax377\\lsdlockeddef0\\lsdsemihiddendef0\\lsdunhideuseddef0\\lsdqformatdef0\\lsdprioritydef99{\\lsdlockedexcept \\lsdqformat1 \\lsdpriority0 \\lsdlocked0 Normal;\\lsdqformat1 \\lsdpriority0 \\lsdlocked0 heading 1;\n\\lsdqformat1 \\lsdpriority0 \\lsdlocked0 heading 2;\\lsdqformat1 \\lsdpriority0 \\lsdlocked0 heading 3;\\lsdqformat1 \\lsdpriority0 \\lsdlocked0 heading 4;\\lsdqformat1 \\lsdpriority0 \\lsdlocked0 heading 5;\\lsdqformat1 \\lsdpriority0 \\lsdlocked0 heading 6;\n\\lsdqformat1 \\lsdpriority0 \\lsdlocked0 heading 7;\\lsdqformat1 \\lsdpriority0 \\lsdlocked0 heading 8;\\lsdqformat1 \\lsdpriority0 \\lsdlocked0 heading 9;\\lsdsemihidden1 \\lsdunhideused1 index 1;\\lsdsemihidden1 \\lsdunhideused1 index 2;\n\\lsdsemihidden1 \\lsdunhideused1 index 3;\\lsdsemihidden1 \\lsdunhideused1 index 4;\\lsdsemihidden1 \\lsdunhideused1 index 5;\\lsdsemihidden1 \\lsdunhideused1 index 6;\\lsdsemihidden1 \\lsdunhideused1 index 7;\\lsdsemihidden1 \\lsdunhideused1 index 8;\n\\lsdsemihidden1 \\lsdunhideused1 index 9;\\lsdpriority39 \\lsdlocked0 toc 1;\\lsdpriority39 \\lsdlocked0 toc 2;\\lsdpriority0 \\lsdlocked0 toc 3;\\lsdpriority0 \\lsdlocked0 toc 4;\\lsdpriority0 \\lsdlocked0 toc 5;\\lsdpriority0 \\lsdlocked0 toc 6;\n\\lsdpriority0 \\lsdlocked0 toc 7;\\lsdpriority0 \\lsdlocked0 toc 8;\\lsdpriority0 \\lsdlocked0 toc 9;\\lsdsemihidden1 \\lsdunhideused1 Normal Indent;\\lsdsemihidden1 \\lsdunhideused1 footnote text;\\lsdsemihidden1 \\lsdunhideused1 annotation text;\n\\lsdsemihidden1 \\lsdunhideused1 header;\\lsdsemihidden1 \\lsdunhideused1 footer;\\lsdsemihidden1 \\lsdunhideused1 index heading;\\lsdqformat1 \\lsdpriority0 \\lsdlocked0 caption;\\lsdsemihidden1 \\lsdunhideused1 table of figures;\n\\lsdsemihidden1 \\lsdunhideused1 envelope address;\\lsdsemihidden1 \\lsdunhideused1 envelope return;\\lsdsemihidden1 \\lsdunhideused1 footnote reference;\\lsdsemihidden1 \\lsdunhideused1 annotation reference;\\lsdsemihidden1 \\lsdunhideused1 line number;\n\\lsdsemihidden1 \\lsdunhideused1 page number;\\lsdsemihidden1 \\lsdunhideused1 endnote reference;\\lsdsemihidden1 \\lsdunhideused1 endnote text;\\lsdsemihidden1 \\lsdunhideused1 table of authorities;\\lsdsemihidden1 \\lsdunhideused1 macro;\n\\lsdsemihidden1 \\lsdunhideused1 toa heading;\\lsdsemihidden1 \\lsdunhideused1 List;\\lsdsemihidden1 \\lsdunhideused1 List Bullet;\\lsdsemihidden1 \\lsdunhideused1 List Number;\\lsdsemihidden1 \\lsdunhideused1 List 2;\\lsdsemihidden1 \\lsdunhideused1 List 3;\n\\lsdsemihidden1 \\lsdunhideused1 List 4;\\lsdsemihidden1 \\lsdunhideused1 List 5;\\lsdsemihidden1 \\lsdunhideused1 List Bullet 2;\\lsdsemihidden1 \\lsdunhideused1 List Bullet 3;\\lsdsemihidden1 \\lsdunhideused1 List Bullet 4;\n\\lsdsemihidden1 \\lsdunhideused1 List Bullet 5;\\lsdsemihidden1 \\lsdunhideused1 List Number 2;\\lsdsemihidden1 \\lsdunhideused1 List Number 3;\\lsdsemihidden1 \\lsdunhideused1 List Number 4;\\lsdsemihidden1 \\lsdunhideused1 List Number 5;\n\\lsdqformat1 \\lsdpriority0 \\lsdlocked0 Title;\\lsdsemihidden1 \\lsdunhideused1 Closing;\\lsdsemihidden1 \\lsdunhideused1 Signature;\\lsdpriority0 \\lsdlocked0 Default Paragraph Font;\\lsdsemihidden1 \\lsdunhideused1 Body Text;\n\\lsdsemihidden1 \\lsdunhideused1 Body Text Indent;\\lsdsemihidden1 \\lsdunhideused1 List Continue;\\lsdsemihidden1 \\lsdunhideused1 List Continue 2;\\lsdsemihidden1 \\lsdunhideused1 List Continue 3;\\lsdsemihidden1 \\lsdunhideused1 List Continue 4;\n\\lsdsemihidden1 \\lsdunhideused1 List Continue 5;\\lsdsemihidden1 \\lsdunhideused1 Message Header;\\lsdqformat1 \\lsdpriority0 \\lsdlocked0 Subtitle;\\lsdsemihidden1 \\lsdunhideused1 Salutation;\\lsdsemihidden1 \\lsdunhideused1 Date;\n\\lsdsemihidden1 \\lsdunhideused1 Body Text First Indent;\\lsdsemihidden1 \\lsdunhideused1 Body Text First Indent 2;\\lsdsemihidden1 \\lsdunhideused1 Note Heading;\\lsdsemihidden1 \\lsdunhideused1 Body Text 2;\\lsdsemihidden1 \\lsdunhideused1 Body Text 3;\n\\lsdsemihidden1 \\lsdunhideused1 Body Text Indent 2;\\lsdsemihidden1 \\lsdunhideused1 Body Text Indent 3;\\lsdsemihidden1 \\lsdunhideused1 Block Text;\\lsdsemihidden1 \\lsdunhideused1 Hyperlink;\\lsdsemihidden1 \\lsdunhideused1 FollowedHyperlink;\n\\lsdqformat1 \\lsdpriority0 \\lsdlocked0 Strong;\\lsdqformat1 \\lsdpriority0 \\lsdlocked0 Emphasis;\\lsdsemihidden1 \\lsdunhideused1 Document Map;\\lsdsemihidden1 \\lsdunhideused1 Plain Text;\\lsdsemihidden1 \\lsdunhideused1 E-mail Signature;\n\\lsdsemihidden1 \\lsdunhideused1 HTML Top of Form;\\lsdsemihidden1 \\lsdunhideused1 HTML Bottom of Form;\\lsdsemihidden1 \\lsdunhideused1 Normal (Web);\\lsdsemihidden1 \\lsdunhideused1 HTML Acronym;\\lsdsemihidden1 \\lsdunhideused1 HTML Address;\n\\lsdsemihidden1 \\lsdunhideused1 HTML Cite;\\lsdsemihidden1 \\lsdunhideused1 HTML Code;\\lsdsemihidden1 \\lsdunhideused1 HTML Definition;\\lsdsemihidden1 \\lsdunhideused1 HTML Keyboard;\\lsdsemihidden1 \\lsdunhideused1 HTML Preformatted;\n\\lsdsemihidden1 \\lsdunhideused1 HTML Sample;\\lsdsemihidden1 \\lsdunhideused1 HTML Typewriter;\\lsdsemihidden1 \\lsdunhideused1 HTML Variable;Normal Table;\\lsdsemihidden1 \\lsdunhideused1 annotation subject;\\lsdsemihidden1 \\lsdunhideused1 No List;\n\\lsdsemihidden1 \\lsdunhideused1 Outline List 1;\\lsdsemihidden1 \\lsdunhideused1 Outline List 2;\\lsdsemihidden1 \\lsdunhideused1 Outline List 3;Table Simple 1;Table Simple 2;Table Simple 3;Table Classic 1;Table Classic 2;Table Classic 3;Table Classic 4;\nTable Colorful 1;Table Colorful 2;Table Colorful 3;Table Columns 1;Table Columns 2;Table Columns 3;Table Columns 4;Table Columns 5;Table Grid 1;Table Grid 2;Table Grid 3;Table Grid 4;Table Grid 5;Table Grid 6;Table Grid 7;Table Grid 8;Table List 1;\nTable List 2;Table List 3;Table List 4;Table List 5;Table List 6;Table List 7;Table List 8;Table 3D effects 1;Table 3D effects 2;Table 3D effects 3;Table Contemporary;Table Elegant;Table Professional;Table Subtle 1;Table Subtle 2;Table Web 1;Table Web 2;\nTable Web 3;\\lsdsemihidden1 \\lsdunhideused1 Balloon Text;\\lsdpriority0 \\lsdlocked0 Table Grid;Table Theme;\\lsdsemihidden1 \\lsdlocked0 Placeholder Text;\\lsdqformat1 \\lsdpriority1 \\lsdlocked0 No Spacing;\\lsdpriority60 \\lsdlocked0 Light Shading;\n\\lsdpriority61 \\lsdlocked0 Light List;\\lsdpriority62 \\lsdlocked0 Light Grid;\\lsdpriority63 \\lsdlocked0 Medium Shading 1;\\lsdpriority64 \\lsdlocked0 Medium Shading 2;\\lsdpriority65 \\lsdlocked0 Medium List 1;\\lsdpriority66 \\lsdlocked0 Medium List 2;\n\\lsdpriority67 \\lsdlocked0 Medium Grid 1;\\lsdpriority68 \\lsdlocked0 Medium Grid 2;\\lsdpriority69 \\lsdlocked0 Medium Grid 3;\\lsdpriority70 \\lsdlocked0 Dark List;\\lsdpriority71 \\lsdlocked0 Colorful Shading;\\lsdpriority72 \\lsdlocked0 Colorful List;\n\\lsdpriority73 \\lsdlocked0 Colorful Grid;\\lsdpriority60 \\lsdlocked0 Light Shading Accent 1;\\lsdpriority61 \\lsdlocked0 Light List Accent 1;\\lsdpriority62 \\lsdlocked0 Light Grid Accent 1;\\lsdpriority63 \\lsdlocked0 Medium Shading 1 Accent 1;\n\\lsdpriority64 \\lsdlocked0 Medium Shading 2 Accent 1;\\lsdpriority65 \\lsdlocked0 Medium List 1 Accent 1;\\lsdqformat1 \\lsdpriority34 \\lsdlocked0 List Paragraph;\\lsdqformat1 \\lsdpriority29 \\lsdlocked0 Quote;\n\\lsdqformat1 \\lsdpriority30 \\lsdlocked0 Intense Quote;\\lsdpriority66 \\lsdlocked0 Medium List 2 Accent 1;\\lsdpriority67 \\lsdlocked0 Medium Grid 1 Accent 1;\\lsdpriority68 \\lsdlocked0 Medium Grid 2 Accent 1;\\lsdpriority69 \\lsdlocked0 Medium Grid 3 Accent 1;\n\\lsdpriority70 \\lsdlocked0 Dark List Accent 1;\\lsdpriority71 \\lsdlocked0 Colorful Shading Accent 1;\\lsdpriority72 \\lsdlocked0 Colorful List Accent 1;\\lsdpriority73 \\lsdlocked0 Colorful Grid Accent 1;\\lsdpriority60 \\lsdlocked0 Light Shading Accent 2;\n\\lsdpriority61 \\lsdlocked0 Light List Accent 2;\\lsdpriority62 \\lsdlocked0 Light Grid Accent 2;\\lsdpriority63 \\lsdlocked0 Medium Shading 1 Accent 2;\\lsdpriority64 \\lsdlocked0 Medium Shading 2 Accent 2;\\lsdpriority65 \\lsdlocked0 Medium List 1 Accent 2;\n\\lsdpriority66 \\lsdlocked0 Medium List 2 Accent 2;\\lsdpriority67 \\lsdlocked0 Medium Grid 1 Accent 2;\\lsdpriority68 \\lsdlocked0 Medium Grid 2 Accent 2;\\lsdpriority69 \\lsdlocked0 Medium Grid 3 Accent 2;\\lsdpriority70 \\lsdlocked0 Dark List Accent 2;\n\\lsdpriority71 \\lsdlocked0 Colorful Shading Accent 2;\\lsdpriority72 \\lsdlocked0 Colorful List Accent 2;\\lsdpriority73 \\lsdlocked0 Colorful Grid Accent 2;\\lsdpriority60 \\lsdlocked0 Light Shading Accent 3;\\lsdpriority61 \\lsdlocked0 Light List Accent 3;\n\\lsdpriority62 \\lsdlocked0 Light Grid Accent 3;\\lsdpriority63 \\lsdlocked0 Medium Shading 1 Accent 3;\\lsdpriority64 \\lsdlocked0 Medium Shading 2 Accent 3;\\lsdpriority65 \\lsdlocked0 Medium List 1 Accent 3;\\lsdpriority66 \\lsdlocked0 Medium List 2 Accent 3;\n\\lsdpriority67 \\lsdlocked0 Medium Grid 1 Accent 3;\\lsdpriority68 \\lsdlocked0 Medium Grid 2 Accent 3;\\lsdpriority69 \\lsdlocked0 Medium Grid 3 Accent 3;\\lsdpriority70 \\lsdlocked0 Dark List Accent 3;\\lsdpriority71 \\lsdlocked0 Colorful Shading Accent 3;\n\\lsdpriority72 \\lsdlocked0 Colorful List Accent 3;\\lsdpriority73 \\lsdlocked0 Colorful Grid Accent 3;\\lsdpriority60 \\lsdlocked0 Light Shading Accent 4;\\lsdpriority61 \\lsdlocked0 Light List Accent 4;\\lsdpriority62 \\lsdlocked0 Light Grid Accent 4;\n\\lsdpriority63 \\lsdlocked0 Medium Shading 1 Accent 4;\\lsdpriority64 \\lsdlocked0 Medium Shading 2 Accent 4;\\lsdpriority65 \\lsdlocked0 Medium List 1 Accent 4;\\lsdpriority66 \\lsdlocked0 Medium List 2 Accent 4;\n\\lsdpriority67 \\lsdlocked0 Medium Grid 1 Accent 4;\\lsdpriority68 \\lsdlocked0 Medium Grid 2 Accent 4;\\lsdpriority69 \\lsdlocked0 Medium Grid 3 Accent 4;\\lsdpriority70 \\lsdlocked0 Dark List Accent 4;\\lsdpriority71 \\lsdlocked0 Colorful Shading Accent 4;\n\\lsdpriority72 \\lsdlocked0 Colorful List Accent 4;\\lsdpriority73 \\lsdlocked0 Colorful Grid Accent 4;\\lsdpriority60 \\lsdlocked0 Light Shading Accent 5;\\lsdpriority61 \\lsdlocked0 Light List Accent 5;\\lsdpriority62 \\lsdlocked0 Light Grid Accent 5;\n\\lsdpriority63 \\lsdlocked0 Medium Shading 1 Accent 5;\\lsdpriority64 \\lsdlocked0 Medium Shading 2 Accent 5;\\lsdpriority65 \\lsdlocked0 Medium List 1 Accent 5;\\lsdpriority66 \\lsdlocked0 Medium List 2 Accent 5;\n\\lsdpriority67 \\lsdlocked0 Medium Grid 1 Accent 5;\\lsdpriority68 \\lsdlocked0 Medium Grid 2 Accent 5;\\lsdpriority69 \\lsdlocked0 Medium Grid 3 Accent 5;\\lsdpriority70 \\lsdlocked0 Dark List Accent 5;\\lsdpriority71 \\lsdlocked0 Colorful Shading Accent 5;\n\\lsdpriority72 \\lsdlocked0 Colorful List Accent 5;\\lsdpriority73 \\lsdlocked0 Colorful Grid Accent 5;\\lsdpriority60 \\lsdlocked0 Light Shading Accent 6;\\lsdpriority61 \\lsdlocked0 Light List Accent 6;\\lsdpriority62 \\lsdlocked0 Light Grid Accent 6;\n\\lsdpriority63 \\lsdlocked0 Medium Shading 1 Accent 6;\\lsdpriority64 \\lsdlocked0 Medium Shading 2 Accent 6;\\lsdpriority65 \\lsdlocked0 Medium List 1 Accent 6;\\lsdpriority66 \\lsdlocked0 Medium List 2 Accent 6;\n\\lsdpriority67 \\lsdlocked0 Medium Grid 1 Accent 6;\\lsdpriority68 \\lsdlocked0 Medium Grid 2 Accent 6;\\lsdpriority69 \\lsdlocked0 Medium Grid 3 Accent 6;\\lsdpriority70 \\lsdlocked0 Dark List Accent 6;\\lsdpriority71 \\lsdlocked0 Colorful Shading Accent 6;\n\\lsdpriority72 \\lsdlocked0 Colorful List Accent 6;\\lsdpriority73 \\lsdlocked0 Colorful Grid Accent 6;\\lsdqformat1 \\lsdpriority19 \\lsdlocked0 Subtle Emphasis;\\lsdqformat1 \\lsdpriority21 \\lsdlocked0 Intense Emphasis;\n\\lsdqformat1 \\lsdpriority31 \\lsdlocked0 Subtle Reference;\\lsdqformat1 \\lsdpriority32 \\lsdlocked0 Intense Reference;\\lsdqformat1 \\lsdpriority33 \\lsdlocked0 Book Title;\\lsdsemihidden1 \\lsdunhideused1 \\lsdpriority37 \\lsdlocked0 Bibliography;\n\\lsdsemihidden1 \\lsdunhideused1 \\lsdqformat1 \\lsdpriority39 \\lsdlocked0 TOC Heading;\\lsdpriority41 \\lsdlocked0 Plain Table 1;\\lsdpriority42 \\lsdlocked0 Plain Table 2;\\lsdpriority43 \\lsdlocked0 Plain Table 3;\\lsdpriority44 \\lsdlocked0 Plain Table 4;\n\\lsdpriority45 \\lsdlocked0 Plain Table 5;\\lsdpriority40 \\lsdlocked0 Grid Table Light;\\lsdpriority46 \\lsdlocked0 Grid Table 1 Light;\\lsdpriority47 \\lsdlocked0 Grid Table 2;\\lsdpriority48 \\lsdlocked0 Grid Table 3;\\lsdpriority49 \\lsdlocked0 Grid Table 4;\n\\lsdpriority50 \\lsdlocked0 Grid Table 5 Dark;\\lsdpriority51 \\lsdlocked0 Grid Table 6 Colorful;\\lsdpriority52 \\lsdlocked0 Grid Table 7 Colorful;\\lsdpriority46 \\lsdlocked0 Grid Table 1 Light Accent 1;\\lsdpriority47 \\lsdlocked0 Grid Table 2 Accent 1;\n\\lsdpriority48 \\lsdlocked0 Grid Table 3 Accent 1;\\lsdpriority49 \\lsdlocked0 Grid Table 4 Accent 1;\\lsdpriority50 \\lsdlocked0 Grid Table 5 Dark Accent 1;\\lsdpriority51 \\lsdlocked0 Grid Table 6 Colorful Accent 1;\n\\lsdpriority52 \\lsdlocked0 Grid Table 7 Colorful Accent 1;\\lsdpriority46 \\lsdlocked0 Grid Table 1 Light Accent 2;\\lsdpriority47 \\lsdlocked0 Grid Table 2 Accent 2;\\lsdpriority48 \\lsdlocked0 Grid Table 3 Accent 2;\n\\lsdpriority49 \\lsdlocked0 Grid Table 4 Accent 2;\\lsdpriority50 \\lsdlocked0 Grid Table 5 Dark Accent 2;\\lsdpriority51 \\lsdlocked0 Grid Table 6 Colorful Accent 2;\\lsdpriority52 \\lsdlocked0 Grid Table 7 Colorful Accent 2;\n\\lsdpriority46 \\lsdlocked0 Grid Table 1 Light Accent 3;\\lsdpriority47 \\lsdlocked0 Grid Table 2 Accent 3;\\lsdpriority48 \\lsdlocked0 Grid Table 3 Accent 3;\\lsdpriority49 \\lsdlocked0 Grid Table 4 Accent 3;\n\\lsdpriority50 \\lsdlocked0 Grid Table 5 Dark Accent 3;\\lsdpriority51 \\lsdlocked0 Grid Table 6 Colorful Accent 3;\\lsdpriority52 \\lsdlocked0 Grid Table 7 Colorful Accent 3;\\lsdpriority46 \\lsdlocked0 Grid Table 1 Light Accent 4;\n\\lsdpriority47 \\lsdlocked0 Grid Table 2 Accent 4;\\lsdpriority48 \\lsdlocked0 Grid Table 3 Accent 4;\\lsdpriority49 \\lsdlocked0 Grid Table 4 Accent 4;\\lsdpriority50 \\lsdlocked0 Grid Table 5 Dark Accent 4;\n\\lsdpriority51 \\lsdlocked0 Grid Table 6 Colorful Accent 4;\\lsdpriority52 \\lsdlocked0 Grid Table 7 Colorful Accent 4;\\lsdpriority46 \\lsdlocked0 Grid Table 1 Light Accent 5;\\lsdpriority47 \\lsdlocked0 Grid Table 2 Accent 5;\n\\lsdpriority48 \\lsdlocked0 Grid Table 3 Accent 5;\\lsdpriority49 \\lsdlocked0 Grid Table 4 Accent 5;\\lsdpriority50 \\lsdlocked0 Grid Table 5 Dark Accent 5;\\lsdpriority51 \\lsdlocked0 Grid Table 6 Colorful Accent 5;\n\\lsdpriority52 \\lsdlocked0 Grid Table 7 Colorful Accent 5;\\lsdpriority46 \\lsdlocked0 Grid Table 1 Light Accent 6;\\lsdpriority47 \\lsdlocked0 Grid Table 2 Accent 6;\\lsdpriority48 \\lsdlocked0 Grid Table 3 Accent 6;\n\\lsdpriority49 \\lsdlocked0 Grid Table 4 Accent 6;\\lsdpriority50 \\lsdlocked0 Grid Table 5 Dark Accent 6;\\lsdpriority51 \\lsdlocked0 Grid Table 6 Colorful Accent 6;\\lsdpriority52 \\lsdlocked0 Grid Table 7 Colorful Accent 6;\n\\lsdpriority46 \\lsdlocked0 List Table 1 Light;\\lsdpriority47 \\lsdlocked0 List Table 2;\\lsdpriority48 \\lsdlocked0 List Table 3;\\lsdpriority49 \\lsdlocked0 List Table 4;\\lsdpriority50 \\lsdlocked0 List Table 5 Dark;\n\\lsdpriority51 \\lsdlocked0 List Table 6 Colorful;\\lsdpriority52 \\lsdlocked0 List Table 7 Colorful;\\lsdpriority46 \\lsdlocked0 List Table 1 Light Accent 1;\\lsdpriority47 \\lsdlocked0 List Table 2 Accent 1;\\lsdpriority48 \\lsdlocked0 List Table 3 Accent 1;\n\\lsdpriority49 \\lsdlocked0 List Table 4 Accent 1;\\lsdpriority50 \\lsdlocked0 List Table 5 Dark Accent 1;\\lsdpriority51 \\lsdlocked0 List Table 6 Colorful Accent 1;\\lsdpriority52 \\lsdlocked0 List Table 7 Colorful Accent 1;\n\\lsdpriority46 \\lsdlocked0 List Table 1 Light Accent 2;\\lsdpriority47 \\lsdlocked0 List Table 2 Accent 2;\\lsdpriority48 \\lsdlocked0 List Table 3 Accent 2;\\lsdpriority49 \\lsdlocked0 List Table 4 Accent 2;\n\\lsdpriority50 \\lsdlocked0 List Table 5 Dark Accent 2;\\lsdpriority51 \\lsdlocked0 List Table 6 Colorful Accent 2;\\lsdpriority52 \\lsdlocked0 List Table 7 Colorful Accent 2;\\lsdpriority46 \\lsdlocked0 List Table 1 Light Accent 3;\n\\lsdpriority47 \\lsdlocked0 List Table 2 Accent 3;\\lsdpriority48 \\lsdlocked0 List Table 3 Accent 3;\\lsdpriority49 \\lsdlocked0 List Table 4 Accent 3;\\lsdpriority50 \\lsdlocked0 List Table 5 Dark Accent 3;\n\\lsdpriority51 \\lsdlocked0 List Table 6 Colorful Accent 3;\\lsdpriority52 \\lsdlocked0 List Table 7 Colorful Accent 3;\\lsdpriority46 \\lsdlocked0 List Table 1 Light Accent 4;\\lsdpriority47 \\lsdlocked0 List Table 2 Accent 4;\n\\lsdpriority48 \\lsdlocked0 List Table 3 Accent 4;\\lsdpriority49 \\lsdlocked0 List Table 4 Accent 4;\\lsdpriority50 \\lsdlocked0 List Table 5 Dark Accent 4;\\lsdpriority51 \\lsdlocked0 List Table 6 Colorful Accent 4;\n\\lsdpriority52 \\lsdlocked0 List Table 7 Colorful Accent 4;\\lsdpriority46 \\lsdlocked0 List Table 1 Light Accent 5;\\lsdpriority47 \\lsdlocked0 List Table 2 Accent 5;\\lsdpriority48 \\lsdlocked0 List Table 3 Accent 5;\n\\lsdpriority49 \\lsdlocked0 List Table 4 Accent 5;\\lsdpriority50 \\lsdlocked0 List Table 5 Dark Accent 5;\\lsdpriority51 \\lsdlocked0 List Table 6 Colorful Accent 5;\\lsdpriority52 \\lsdlocked0 List Table 7 Colorful Accent 5;\n\\lsdpriority46 \\lsdlocked0 List Table 1 Light Accent 6;\\lsdpriority47 \\lsdlocked0 List Table 2 Accent 6;\\lsdpriority48 \\lsdlocked0 List Table 3 Accent 6;\\lsdpriority49 \\lsdlocked0 List Table 4 Accent 6;\n\\lsdpriority50 \\lsdlocked0 List Table 5 Dark Accent 6;\\lsdpriority51 \\lsdlocked0 List Table 6 Colorful Accent 6;\\lsdpriority52 \\lsdlocked0 List Table 7 Colorful Accent 6;\\lsdsemihidden1 \\lsdunhideused1 \\lsdlocked0 Mention;\n\\lsdsemihidden1 \\lsdunhideused1 \\lsdlocked0 Smart Hyperlink;\\lsdsemihidden1 \\lsdunhideused1 \\lsdlocked0 Hashtag;\\lsdsemihidden1 \\lsdunhideused1 \\lsdlocked0 Unresolved Mention;\\lsdsemihidden1 \\lsdunhideused1 \\lsdlocked0 Smart Link;\n\\lsdsemihidden1 \\lsdunhideused1 \\lsdlocked0 Smart Link Error;}}{\\*\\datastore 0105000002000000180000004d73786d6c322e534158584d4c5265616465722e362e30000000000000000000000e0000\nd0cf11e0a1b11ae1000000000000000000000000000000003e000300feff0900060000000000000000000000010000000100000000000000001000000200000001000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nfffffffffffffffffdffffff04000000feffffff05000000fefffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffff010000000c6ad98892f1d411a65f0040963251e5000000000000000000000000e042\nf1c72e3bd60103000000c0020000000000004d0073006f004400610074006100530074006f0072006500000000000000000000000000000000000000000000000000000000000000000000000000000000001a000101ffffffffffffffff020000000000000000000000000000000000000000000000e042f1c72e3bd601\ne042f1c72e3bd601000000000000000000000000df004b00cc00df00d200c4004900c000c700c40034003000c400d000470049004300300041005000d000c0003d003d000000000000000000000000000000000032000101ffffffffffffffff030000000000000000000000000000000000000000000000e042f1c72e3b\nd601e042f1c72e3bd6010000000000000000000000004900740065006d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000201ffffffff04000000ffffffff000000000000000000000000000000000000000000000000\n000000000000000000000000000000000e0100000000000001000000020000000300000004000000feffffff060000000700000008000000090000000a000000feffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d226e6f223f3e3c623a536f75726365732053656c65637465645374796c653d225c4150412e58534c22205374796c\n654e616d653d224150412220786d6c6e733a623d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f6269626c696f6772617068792220786d6c6e733d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e\n6f72672f6f6666696365446f63756d656e742f323030362f6269626c696f677261706879223e3c2f623a536f75726365733e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003c3f786d6c2076657273696f6e3d22312e302220656e636f6469\n6e673d225554462d3822207374616e64616c6f6e653d226e6f223f3e0d0a3c64733a6461746173746f72654974656d2064733a6974656d49443d227b43413346414246432d323034322d343739452d394139332d3031383830394130304643327d2220786d6c6e733a64733d22687474703a2f2f736368656d61732e6f70\n656e786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f637573500072006f007000650072007400690065007300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000200ffffffffffffffffffffffff000000000000\n0000000000000000000000000000000000000000000000000000000000000500000055010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000\n000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff\n000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000746f6d586d6c223e3c64733a736368656d61526566733e3c64733a736368656d615265662064733a7572693d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f7267\n2f6f6666696365446f63756d656e742f323030362f6269626c696f677261706879222f3e3c2f64733a736368656d61526566733e3c2f64733a6461746173746f72654974656d3e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000105000000000000}}"
  },
  {
    "path": "releases/twain-cs_02041000/twaincscert/AnyCPU/Debug/twaincscert.exe.config",
    "content": "<?xml version=\"1.0\"?>\n<configuration>\n  <startup>\n    <supportedRuntime version=\"v4.5\" />\n    <supportedRuntime version=\"v4.0.30319\" />\n    <supportedRuntime version=\"v4.0\" />\n    <supportedRuntime version=\"v2.0.50727\" />\n  </startup>\n</configuration>\n"
  },
  {
    "path": "releases/twain-cs_02041000/twaincscert/AnyCPU/Release/twaincscert.exe.config",
    "content": "<?xml version=\"1.0\"?>\n<configuration>\n  <startup>\n    <supportedRuntime version=\"v4.5\" />\n    <supportedRuntime version=\"v4.0.30319\" />\n    <supportedRuntime version=\"v4.0\" />\n    <supportedRuntime version=\"v2.0.50727\" />\n  </startup>\n</configuration>\n"
  },
  {
    "path": "releases/twain-cs_02041000/twaincscert/x64/Debug/twaincscert.exe.config",
    "content": "<?xml version=\"1.0\"?>\n<configuration>\n  <startup>\n    <supportedRuntime version=\"v4.5\" />\n    <supportedRuntime version=\"v4.0.30319\" />\n    <supportedRuntime version=\"v4.0\" />\n    <supportedRuntime version=\"v2.0.50727\" />\n  </startup>\n</configuration>\n"
  },
  {
    "path": "releases/twain-cs_02041000/twaincscert/x64/Release/twaincscert.exe.config",
    "content": "<?xml version=\"1.0\"?>\n<configuration>\n  <startup>\n    <supportedRuntime version=\"v4.5\" />\n    <supportedRuntime version=\"v4.0.30319\" />\n    <supportedRuntime version=\"v4.0\" />\n    <supportedRuntime version=\"v2.0.50727\" />\n  </startup>\n</configuration>\n"
  },
  {
    "path": "releases/twain-cs_02041000/twaincscert/x86/Debug/twaincscert.exe.config",
    "content": "<?xml version=\"1.0\"?>\n<configuration>\n  <startup>\n    <supportedRuntime version=\"v4.5\" />\n    <supportedRuntime version=\"v4.0.30319\" />\n    <supportedRuntime version=\"v4.0\" />\n    <supportedRuntime version=\"v2.0.50727\" />\n  </startup>\n</configuration>\n"
  },
  {
    "path": "releases/twain-cs_02041000/twaincscert/x86/Release/twaincscert.exe.config",
    "content": "<?xml version=\"1.0\"?>\n<configuration>\n  <startup>\n    <supportedRuntime version=\"v4.5\" />\n    <supportedRuntime version=\"v4.0.30319\" />\n    <supportedRuntime version=\"v4.0\" />\n    <supportedRuntime version=\"v2.0.50727\" />\n  </startup>\n</configuration>\n"
  },
  {
    "path": "releases/twain-cs_02041000/twaincsscan/AnyCPU/Debug/twaincsscan.exe.config",
    "content": "<?xml version=\"1.0\"?>\n<configuration>\n  <startup>\n    <supportedRuntime version=\"v4.5\" />\n    <supportedRuntime version=\"v4.0.30319\" />\n    <supportedRuntime version=\"v4.0\" />\n    <supportedRuntime version=\"v2.0.50727\" />\n  </startup>\n</configuration>\n"
  },
  {
    "path": "releases/twain-cs_02041000/twaincsscan/AnyCPU/Release/twaincsscan.exe.config",
    "content": "<?xml version=\"1.0\"?>\n<configuration>\n  <startup>\n    <supportedRuntime version=\"v4.5\" />\n    <supportedRuntime version=\"v4.0.30319\" />\n    <supportedRuntime version=\"v4.0\" />\n    <supportedRuntime version=\"v2.0.50727\" />\n  </startup>\n</configuration>\n"
  },
  {
    "path": "releases/twain-cs_02041000/twaincsscan/x64/Debug/twaincsscan.exe.config",
    "content": "<?xml version=\"1.0\"?>\n<configuration>\n  <startup>\n    <supportedRuntime version=\"v4.5\" />\n    <supportedRuntime version=\"v4.0.30319\" />\n    <supportedRuntime version=\"v4.0\" />\n    <supportedRuntime version=\"v2.0.50727\" />\n  </startup>\n</configuration>\n"
  },
  {
    "path": "releases/twain-cs_02041000/twaincsscan/x64/Release/twaincsscan.exe.config",
    "content": "<?xml version=\"1.0\"?>\n<configuration>\n  <startup>\n    <supportedRuntime version=\"v4.5\" />\n    <supportedRuntime version=\"v4.0.30319\" />\n    <supportedRuntime version=\"v4.0\" />\n    <supportedRuntime version=\"v2.0.50727\" />\n  </startup>\n</configuration>\n"
  },
  {
    "path": "releases/twain-cs_02041000/twaincsscan/x86/Debug/twaincsscan.exe.config",
    "content": "<?xml version=\"1.0\"?>\n<configuration>\n  <startup>\n    <supportedRuntime version=\"v4.5\" />\n    <supportedRuntime version=\"v4.0.30319\" />\n    <supportedRuntime version=\"v4.0\" />\n    <supportedRuntime version=\"v2.0.50727\" />\n  </startup>\n</configuration>\n"
  },
  {
    "path": "releases/twain-cs_02041000/twaincsscan/x86/Release/twaincsscan.exe.config",
    "content": "<?xml version=\"1.0\"?>\n<configuration>\n  <startup>\n    <supportedRuntime version=\"v4.5\" />\n    <supportedRuntime version=\"v4.0.30319\" />\n    <supportedRuntime version=\"v4.0\" />\n    <supportedRuntime version=\"v2.0.50727\" />\n  </startup>\n</configuration>\n"
  },
  {
    "path": "releases/twain-cs_02041000/twaincstst/AnyCPU/Debug/twaincstst.exe.config",
    "content": "﻿<?xml version=\"1.0\"?>\n<configuration>\n  <startup>\n    <supportedRuntime version=\"v4.5\" />\n    <supportedRuntime version=\"v4.0.30319\" />\n    <supportedRuntime version=\"v4.0\" />\n    <supportedRuntime version=\"v2.0.50727\" />\n  </startup>\n</configuration>\n"
  },
  {
    "path": "releases/twain-cs_02041000/twaincstst/AnyCPU/Release/twaincstst.exe.config",
    "content": "﻿<?xml version=\"1.0\"?>\n<configuration>\n  <startup>\n    <supportedRuntime version=\"v4.5\" />\n    <supportedRuntime version=\"v4.0.30319\" />\n    <supportedRuntime version=\"v4.0\" />\n    <supportedRuntime version=\"v2.0.50727\" />\n  </startup>\n</configuration>\n"
  },
  {
    "path": "releases/twain-cs_02041000/twaincstst/x64/Debug/twaincstst.exe.config",
    "content": "﻿<?xml version=\"1.0\"?>\n<configuration>\n  <startup>\n    <supportedRuntime version=\"v4.5\" />\n    <supportedRuntime version=\"v4.0.30319\" />\n    <supportedRuntime version=\"v4.0\" />\n    <supportedRuntime version=\"v2.0.50727\" />\n  </startup>\n</configuration>\n"
  },
  {
    "path": "releases/twain-cs_02041000/twaincstst/x64/Release/twaincstst.exe.config",
    "content": "﻿<?xml version=\"1.0\"?>\n<configuration>\n  <startup>\n    <supportedRuntime version=\"v4.5\" />\n    <supportedRuntime version=\"v4.0.30319\" />\n    <supportedRuntime version=\"v4.0\" />\n    <supportedRuntime version=\"v2.0.50727\" />\n  </startup>\n</configuration>\n"
  },
  {
    "path": "releases/twain-cs_02041000/twaincstst/x86/Debug/twaincstst.exe.config",
    "content": "﻿<?xml version=\"1.0\"?>\n<configuration>\n  <startup>\n    <supportedRuntime version=\"v4.5\" />\n    <supportedRuntime version=\"v4.0.30319\" />\n    <supportedRuntime version=\"v4.0\" />\n    <supportedRuntime version=\"v2.0.50727\" />\n  </startup>\n</configuration>\n"
  },
  {
    "path": "releases/twain-cs_02041000/twaincstst/x86/Release/twaincstst.exe.config",
    "content": "﻿<?xml version=\"1.0\"?>\n<configuration>\n  <startup>\n    <supportedRuntime version=\"v4.5\" />\n    <supportedRuntime version=\"v4.0.30319\" />\n    <supportedRuntime version=\"v4.0\" />\n    <supportedRuntime version=\"v2.0.50727\" />\n  </startup>\n</configuration>\n"
  },
  {
    "path": "releases/twain-cs_02041100/TWAIN CS.rtf",
    "content": "{\\rtf1\\adeflang1025\\ansi\\ansicpg1252\\uc1\\adeff44\\deff0\\stshfdbch0\\stshfloch0\\stshfhich0\\stshfbi0\\deflang1033\\deflangfe1033\\themelang1033\\themelangfe0\\themelangcs0{\\fonttbl{\\f0\\fbidi \\froman\\fcharset0\\fprq2{\\*\\panose 02020603050405020304}Times New Roman{\\*\\falt Times New Roman};}\n{\\f1\\fbidi \\fswiss\\fcharset0\\fprq2{\\*\\panose 020b0604020202020204}Arial{\\*\\falt Arial};}{\\f2\\fbidi \\fmodern\\fcharset0\\fprq1{\\*\\panose 02070309020205020404}Courier New{\\*\\falt Courier New};}\n{\\f3\\fbidi \\froman\\fcharset2\\fprq2{\\*\\panose 05050102010706020507}Symbol;}{\\f4\\fbidi \\fswiss\\fcharset0\\fprq2{\\*\\panose 020b0604020202020204}Helvetica;}{\\f5\\fbidi \\fmodern\\fcharset0\\fprq1{\\*\\panose 02070409020205020404}Courier{\\*\\falt Courier New};}\n{\\f10\\fbidi \\fnil\\fcharset2\\fprq2{\\*\\panose 05000000000000000000}Wingdings;}{\\f34\\fbidi \\froman\\fcharset0\\fprq2{\\*\\panose 02040503050406030204}Cambria Math;}\n{\\f37\\fbidi \\fswiss\\fcharset0\\fprq2{\\*\\panose 020f0502020204030204}Calibri{\\*\\falt Century Gothic};}{\\f42\\fbidi \\froman\\fcharset0\\fprq2{\\*\\panose 00000000000000000000}Cambria{\\*\\falt Palatino Linotype};}\n{\\f43\\fbidi \\fswiss\\fcharset0\\fprq2{\\*\\panose 00000000000000000000}Tahoma;}{\\f44\\fbidi \\froman\\fcharset0\\fprq2{\\*\\panose 00000000000000000000}Book Antiqua{\\*\\falt Book Antiqua};}\n{\\f45\\fbidi \\froman\\fcharset0\\fprq0{\\*\\panose 00000000000000000000}BookAntiqua{\\*\\falt Book Antiqua};}{\\f46\\fbidi \\froman\\fcharset0\\fprq2{\\*\\panose 00000000000000000000}MS Serif;}\n{\\f47\\fbidi \\fswiss\\fcharset0\\fprq2{\\*\\panose 00000000000000000000}Geneva{\\*\\falt Arial};}{\\f48\\fbidi \\fnil\\fcharset0\\fprq0{\\*\\panose 00000000000000000000}Courier Std;}{\\f49\\fbidi \\fmodern\\fcharset0\\fprq1{\\*\\panose 020b0609020204030204}Consolas;}\n{\\f50\\fbidi \\froman\\fcharset0\\fprq0{\\*\\panose 00000000000000000000}CourierNewPSMT;}{\\flomajor\\f31500\\fbidi \\froman\\fcharset0\\fprq2{\\*\\panose 02020603050405020304}Times New Roman{\\*\\falt Times New Roman};}\n{\\fdbmajor\\f31501\\fbidi \\froman\\fcharset0\\fprq2{\\*\\panose 02020603050405020304}Times New Roman{\\*\\falt Times New Roman};}{\\fhimajor\\f31502\\fbidi \\froman\\fcharset0\\fprq2{\\*\\panose 00000000000000000000}Cambria{\\*\\falt Palatino Linotype};}\n{\\fbimajor\\f31503\\fbidi \\froman\\fcharset0\\fprq2{\\*\\panose 02020603050405020304}Times New Roman{\\*\\falt Times New Roman};}{\\flominor\\f31504\\fbidi \\froman\\fcharset0\\fprq2{\\*\\panose 02020603050405020304}Times New Roman{\\*\\falt Times New Roman};}\n{\\fdbminor\\f31505\\fbidi \\froman\\fcharset0\\fprq2{\\*\\panose 02020603050405020304}Times New Roman{\\*\\falt Times New Roman};}{\\fhiminor\\f31506\\fbidi \\fswiss\\fcharset0\\fprq2{\\*\\panose 020f0502020204030204}Calibri{\\*\\falt Century Gothic};}\n{\\fbiminor\\f31507\\fbidi \\froman\\fcharset0\\fprq2{\\*\\panose 02020603050405020304}Times New Roman{\\*\\falt Times New Roman};}{\\f52\\fbidi \\froman\\fcharset238\\fprq2 Times New Roman CE{\\*\\falt Times New Roman};}\n{\\f53\\fbidi \\froman\\fcharset204\\fprq2 Times New Roman Cyr{\\*\\falt Times New Roman};}{\\f55\\fbidi \\froman\\fcharset161\\fprq2 Times New Roman Greek{\\*\\falt Times New Roman};}{\\f56\\fbidi \\froman\\fcharset162\\fprq2 Times New Roman Tur{\\*\\falt Times New Roman};}\n{\\f57\\fbidi \\froman\\fcharset177\\fprq2 Times New Roman (Hebrew){\\*\\falt Times New Roman};}{\\f58\\fbidi \\froman\\fcharset178\\fprq2 Times New Roman (Arabic){\\*\\falt Times New Roman};}\n{\\f59\\fbidi \\froman\\fcharset186\\fprq2 Times New Roman Baltic{\\*\\falt Times New Roman};}{\\f60\\fbidi \\froman\\fcharset163\\fprq2 Times New Roman (Vietnamese){\\*\\falt Times New Roman};}{\\f62\\fbidi \\fswiss\\fcharset238\\fprq2 Arial CE{\\*\\falt Arial};}\n{\\f63\\fbidi \\fswiss\\fcharset204\\fprq2 Arial Cyr{\\*\\falt Arial};}{\\f65\\fbidi \\fswiss\\fcharset161\\fprq2 Arial Greek{\\*\\falt Arial};}{\\f66\\fbidi \\fswiss\\fcharset162\\fprq2 Arial Tur{\\*\\falt Arial};}\n{\\f67\\fbidi \\fswiss\\fcharset177\\fprq2 Arial (Hebrew){\\*\\falt Arial};}{\\f68\\fbidi \\fswiss\\fcharset178\\fprq2 Arial (Arabic){\\*\\falt Arial};}{\\f69\\fbidi \\fswiss\\fcharset186\\fprq2 Arial Baltic{\\*\\falt Arial};}\n{\\f70\\fbidi \\fswiss\\fcharset163\\fprq2 Arial (Vietnamese){\\*\\falt Arial};}{\\f72\\fbidi \\fmodern\\fcharset238\\fprq1 Courier New CE{\\*\\falt Courier New};}{\\f73\\fbidi \\fmodern\\fcharset204\\fprq1 Courier New Cyr{\\*\\falt Courier New};}\n{\\f75\\fbidi \\fmodern\\fcharset161\\fprq1 Courier New Greek{\\*\\falt Courier New};}{\\f76\\fbidi \\fmodern\\fcharset162\\fprq1 Courier New Tur{\\*\\falt Courier New};}{\\f77\\fbidi \\fmodern\\fcharset177\\fprq1 Courier New (Hebrew){\\*\\falt Courier New};}\n{\\f78\\fbidi \\fmodern\\fcharset178\\fprq1 Courier New (Arabic){\\*\\falt Courier New};}{\\f79\\fbidi \\fmodern\\fcharset186\\fprq1 Courier New Baltic{\\*\\falt Courier New};}{\\f80\\fbidi \\fmodern\\fcharset163\\fprq1 Courier New (Vietnamese){\\*\\falt Courier New};}\n{\\f92\\fbidi \\fswiss\\fcharset238\\fprq2 Helvetica CE;}{\\f93\\fbidi \\fswiss\\fcharset204\\fprq2 Helvetica Cyr;}{\\f95\\fbidi \\fswiss\\fcharset161\\fprq2 Helvetica Greek;}{\\f96\\fbidi \\fswiss\\fcharset162\\fprq2 Helvetica Tur;}\n{\\f97\\fbidi \\fswiss\\fcharset177\\fprq2 Helvetica (Hebrew);}{\\f98\\fbidi \\fswiss\\fcharset178\\fprq2 Helvetica (Arabic);}{\\f99\\fbidi \\fswiss\\fcharset186\\fprq2 Helvetica Baltic;}{\\f100\\fbidi \\fswiss\\fcharset163\\fprq2 Helvetica (Vietnamese);}\n{\\f392\\fbidi \\froman\\fcharset238\\fprq2 Cambria Math CE;}{\\f393\\fbidi \\froman\\fcharset204\\fprq2 Cambria Math Cyr;}{\\f395\\fbidi \\froman\\fcharset161\\fprq2 Cambria Math Greek;}{\\f396\\fbidi \\froman\\fcharset162\\fprq2 Cambria Math Tur;}\n{\\f399\\fbidi \\froman\\fcharset186\\fprq2 Cambria Math Baltic;}{\\f400\\fbidi \\froman\\fcharset163\\fprq2 Cambria Math (Vietnamese);}{\\f422\\fbidi \\fswiss\\fcharset238\\fprq2 Calibri CE{\\*\\falt Century Gothic};}\n{\\f423\\fbidi \\fswiss\\fcharset204\\fprq2 Calibri Cyr{\\*\\falt Century Gothic};}{\\f425\\fbidi \\fswiss\\fcharset161\\fprq2 Calibri Greek{\\*\\falt Century Gothic};}{\\f426\\fbidi \\fswiss\\fcharset162\\fprq2 Calibri Tur{\\*\\falt Century Gothic};}\n{\\f427\\fbidi \\fswiss\\fcharset177\\fprq2 Calibri (Hebrew){\\*\\falt Century Gothic};}{\\f428\\fbidi \\fswiss\\fcharset178\\fprq2 Calibri (Arabic){\\*\\falt Century Gothic};}{\\f429\\fbidi \\fswiss\\fcharset186\\fprq2 Calibri Baltic{\\*\\falt Century Gothic};}\n{\\f430\\fbidi \\fswiss\\fcharset163\\fprq2 Calibri (Vietnamese){\\*\\falt Century Gothic};}{\\f472\\fbidi \\froman\\fcharset238\\fprq2 Cambria CE{\\*\\falt Palatino Linotype};}{\\f473\\fbidi \\froman\\fcharset204\\fprq2 Cambria Cyr{\\*\\falt Palatino Linotype};}\n{\\f475\\fbidi \\froman\\fcharset161\\fprq2 Cambria Greek{\\*\\falt Palatino Linotype};}{\\f476\\fbidi \\froman\\fcharset162\\fprq2 Cambria Tur{\\*\\falt Palatino Linotype};}{\\f479\\fbidi \\froman\\fcharset186\\fprq2 Cambria Baltic{\\*\\falt Palatino Linotype};}\n{\\f480\\fbidi \\froman\\fcharset163\\fprq2 Cambria (Vietnamese){\\*\\falt Palatino Linotype};}{\\f482\\fbidi \\fswiss\\fcharset238\\fprq2 Tahoma CE;}{\\f483\\fbidi \\fswiss\\fcharset204\\fprq2 Tahoma Cyr;}{\\f485\\fbidi \\fswiss\\fcharset161\\fprq2 Tahoma Greek;}\n{\\f486\\fbidi \\fswiss\\fcharset162\\fprq2 Tahoma Tur;}{\\f487\\fbidi \\fswiss\\fcharset177\\fprq2 Tahoma (Hebrew);}{\\f488\\fbidi \\fswiss\\fcharset178\\fprq2 Tahoma (Arabic);}{\\f489\\fbidi \\fswiss\\fcharset186\\fprq2 Tahoma Baltic;}\n{\\f490\\fbidi \\fswiss\\fcharset163\\fprq2 Tahoma (Vietnamese);}{\\f491\\fbidi \\fswiss\\fcharset222\\fprq2 Tahoma (Thai);}{\\f492\\fbidi \\froman\\fcharset238\\fprq2 Book Antiqua CE{\\*\\falt Book Antiqua};}\n{\\f493\\fbidi \\froman\\fcharset204\\fprq2 Book Antiqua Cyr{\\*\\falt Book Antiqua};}{\\f495\\fbidi \\froman\\fcharset161\\fprq2 Book Antiqua Greek{\\*\\falt Book Antiqua};}{\\f496\\fbidi \\froman\\fcharset162\\fprq2 Book Antiqua Tur{\\*\\falt Book Antiqua};}\n{\\f499\\fbidi \\froman\\fcharset186\\fprq2 Book Antiqua Baltic{\\*\\falt Book Antiqua};}{\\f542\\fbidi \\fmodern\\fcharset238\\fprq1 Consolas CE;}{\\f543\\fbidi \\fmodern\\fcharset204\\fprq1 Consolas Cyr;}{\\f545\\fbidi \\fmodern\\fcharset161\\fprq1 Consolas Greek;}\n{\\f546\\fbidi \\fmodern\\fcharset162\\fprq1 Consolas Tur;}{\\f549\\fbidi \\fmodern\\fcharset186\\fprq1 Consolas Baltic;}{\\f550\\fbidi \\fmodern\\fcharset163\\fprq1 Consolas (Vietnamese);}\n{\\flomajor\\f31508\\fbidi \\froman\\fcharset238\\fprq2 Times New Roman CE{\\*\\falt Times New Roman};}{\\flomajor\\f31509\\fbidi \\froman\\fcharset204\\fprq2 Times New Roman Cyr{\\*\\falt Times New Roman};}\n{\\flomajor\\f31511\\fbidi \\froman\\fcharset161\\fprq2 Times New Roman Greek{\\*\\falt Times New Roman};}{\\flomajor\\f31512\\fbidi \\froman\\fcharset162\\fprq2 Times New Roman Tur{\\*\\falt Times New Roman};}\n{\\flomajor\\f31513\\fbidi \\froman\\fcharset177\\fprq2 Times New Roman (Hebrew){\\*\\falt Times New Roman};}{\\flomajor\\f31514\\fbidi \\froman\\fcharset178\\fprq2 Times New Roman (Arabic){\\*\\falt Times New Roman};}\n{\\flomajor\\f31515\\fbidi \\froman\\fcharset186\\fprq2 Times New Roman Baltic{\\*\\falt Times New Roman};}{\\flomajor\\f31516\\fbidi \\froman\\fcharset163\\fprq2 Times New Roman (Vietnamese){\\*\\falt Times New Roman};}\n{\\fdbmajor\\f31518\\fbidi \\froman\\fcharset238\\fprq2 Times New Roman CE{\\*\\falt Times New Roman};}{\\fdbmajor\\f31519\\fbidi \\froman\\fcharset204\\fprq2 Times New Roman Cyr{\\*\\falt Times New Roman};}\n{\\fdbmajor\\f31521\\fbidi \\froman\\fcharset161\\fprq2 Times New Roman Greek{\\*\\falt Times New Roman};}{\\fdbmajor\\f31522\\fbidi \\froman\\fcharset162\\fprq2 Times New Roman Tur{\\*\\falt Times New Roman};}\n{\\fdbmajor\\f31523\\fbidi \\froman\\fcharset177\\fprq2 Times New Roman (Hebrew){\\*\\falt Times New Roman};}{\\fdbmajor\\f31524\\fbidi \\froman\\fcharset178\\fprq2 Times New Roman (Arabic){\\*\\falt Times New Roman};}\n{\\fdbmajor\\f31525\\fbidi \\froman\\fcharset186\\fprq2 Times New Roman Baltic{\\*\\falt Times New Roman};}{\\fdbmajor\\f31526\\fbidi \\froman\\fcharset163\\fprq2 Times New Roman (Vietnamese){\\*\\falt Times New Roman};}\n{\\fhimajor\\f31528\\fbidi \\froman\\fcharset238\\fprq2 Cambria CE{\\*\\falt Palatino Linotype};}{\\fhimajor\\f31529\\fbidi \\froman\\fcharset204\\fprq2 Cambria Cyr{\\*\\falt Palatino Linotype};}\n{\\fhimajor\\f31531\\fbidi \\froman\\fcharset161\\fprq2 Cambria Greek{\\*\\falt Palatino Linotype};}{\\fhimajor\\f31532\\fbidi \\froman\\fcharset162\\fprq2 Cambria Tur{\\*\\falt Palatino Linotype};}\n{\\fhimajor\\f31535\\fbidi \\froman\\fcharset186\\fprq2 Cambria Baltic{\\*\\falt Palatino Linotype};}{\\fhimajor\\f31536\\fbidi \\froman\\fcharset163\\fprq2 Cambria (Vietnamese){\\*\\falt Palatino Linotype};}\n{\\fbimajor\\f31538\\fbidi \\froman\\fcharset238\\fprq2 Times New Roman CE{\\*\\falt Times New Roman};}{\\fbimajor\\f31539\\fbidi \\froman\\fcharset204\\fprq2 Times New Roman Cyr{\\*\\falt Times New Roman};}\n{\\fbimajor\\f31541\\fbidi \\froman\\fcharset161\\fprq2 Times New Roman Greek{\\*\\falt Times New Roman};}{\\fbimajor\\f31542\\fbidi \\froman\\fcharset162\\fprq2 Times New Roman Tur{\\*\\falt Times New Roman};}\n{\\fbimajor\\f31543\\fbidi \\froman\\fcharset177\\fprq2 Times New Roman (Hebrew){\\*\\falt Times New Roman};}{\\fbimajor\\f31544\\fbidi \\froman\\fcharset178\\fprq2 Times New Roman (Arabic){\\*\\falt Times New Roman};}\n{\\fbimajor\\f31545\\fbidi \\froman\\fcharset186\\fprq2 Times New Roman Baltic{\\*\\falt Times New Roman};}{\\fbimajor\\f31546\\fbidi \\froman\\fcharset163\\fprq2 Times New Roman (Vietnamese){\\*\\falt Times New Roman};}\n{\\flominor\\f31548\\fbidi \\froman\\fcharset238\\fprq2 Times New Roman CE{\\*\\falt Times New Roman};}{\\flominor\\f31549\\fbidi \\froman\\fcharset204\\fprq2 Times New Roman Cyr{\\*\\falt Times New Roman};}\n{\\flominor\\f31551\\fbidi \\froman\\fcharset161\\fprq2 Times New Roman Greek{\\*\\falt Times New Roman};}{\\flominor\\f31552\\fbidi \\froman\\fcharset162\\fprq2 Times New Roman Tur{\\*\\falt Times New Roman};}\n{\\flominor\\f31553\\fbidi \\froman\\fcharset177\\fprq2 Times New Roman (Hebrew){\\*\\falt Times New Roman};}{\\flominor\\f31554\\fbidi \\froman\\fcharset178\\fprq2 Times New Roman (Arabic){\\*\\falt Times New Roman};}\n{\\flominor\\f31555\\fbidi \\froman\\fcharset186\\fprq2 Times New Roman Baltic{\\*\\falt Times New Roman};}{\\flominor\\f31556\\fbidi \\froman\\fcharset163\\fprq2 Times New Roman (Vietnamese){\\*\\falt Times New Roman};}\n{\\fdbminor\\f31558\\fbidi \\froman\\fcharset238\\fprq2 Times New Roman CE{\\*\\falt Times New Roman};}{\\fdbminor\\f31559\\fbidi \\froman\\fcharset204\\fprq2 Times New Roman Cyr{\\*\\falt Times New Roman};}\n{\\fdbminor\\f31561\\fbidi \\froman\\fcharset161\\fprq2 Times New Roman Greek{\\*\\falt Times New Roman};}{\\fdbminor\\f31562\\fbidi \\froman\\fcharset162\\fprq2 Times New Roman Tur{\\*\\falt Times New Roman};}\n{\\fdbminor\\f31563\\fbidi \\froman\\fcharset177\\fprq2 Times New Roman (Hebrew){\\*\\falt Times New Roman};}{\\fdbminor\\f31564\\fbidi \\froman\\fcharset178\\fprq2 Times New Roman (Arabic){\\*\\falt Times New Roman};}\n{\\fdbminor\\f31565\\fbidi \\froman\\fcharset186\\fprq2 Times New Roman Baltic{\\*\\falt Times New Roman};}{\\fdbminor\\f31566\\fbidi \\froman\\fcharset163\\fprq2 Times New Roman (Vietnamese){\\*\\falt Times New Roman};}\n{\\fhiminor\\f31568\\fbidi \\fswiss\\fcharset238\\fprq2 Calibri CE{\\*\\falt Century Gothic};}{\\fhiminor\\f31569\\fbidi \\fswiss\\fcharset204\\fprq2 Calibri Cyr{\\*\\falt Century Gothic};}\n{\\fhiminor\\f31571\\fbidi \\fswiss\\fcharset161\\fprq2 Calibri Greek{\\*\\falt Century Gothic};}{\\fhiminor\\f31572\\fbidi \\fswiss\\fcharset162\\fprq2 Calibri Tur{\\*\\falt Century Gothic};}\n{\\fhiminor\\f31573\\fbidi \\fswiss\\fcharset177\\fprq2 Calibri (Hebrew){\\*\\falt Century Gothic};}{\\fhiminor\\f31574\\fbidi \\fswiss\\fcharset178\\fprq2 Calibri (Arabic){\\*\\falt Century Gothic};}\n{\\fhiminor\\f31575\\fbidi \\fswiss\\fcharset186\\fprq2 Calibri Baltic{\\*\\falt Century Gothic};}{\\fhiminor\\f31576\\fbidi \\fswiss\\fcharset163\\fprq2 Calibri (Vietnamese){\\*\\falt Century Gothic};}\n{\\fbiminor\\f31578\\fbidi \\froman\\fcharset238\\fprq2 Times New Roman CE{\\*\\falt Times New Roman};}{\\fbiminor\\f31579\\fbidi \\froman\\fcharset204\\fprq2 Times New Roman Cyr{\\*\\falt Times New Roman};}\n{\\fbiminor\\f31581\\fbidi \\froman\\fcharset161\\fprq2 Times New Roman Greek{\\*\\falt Times New Roman};}{\\fbiminor\\f31582\\fbidi \\froman\\fcharset162\\fprq2 Times New Roman Tur{\\*\\falt Times New Roman};}\n{\\fbiminor\\f31583\\fbidi \\froman\\fcharset177\\fprq2 Times New Roman (Hebrew){\\*\\falt Times New Roman};}{\\fbiminor\\f31584\\fbidi \\froman\\fcharset178\\fprq2 Times New Roman (Arabic){\\*\\falt Times New Roman};}\n{\\fbiminor\\f31585\\fbidi \\froman\\fcharset186\\fprq2 Times New Roman Baltic{\\*\\falt Times New Roman};}{\\fbiminor\\f31586\\fbidi \\froman\\fcharset163\\fprq2 Times New Roman (Vietnamese){\\*\\falt Times New Roman};}}{\\colortbl;\\red0\\green0\\blue0;\n\\red0\\green0\\blue255;\\red0\\green255\\blue255;\\red0\\green255\\blue0;\\red255\\green0\\blue255;\\red255\\green0\\blue0;\\red255\\green255\\blue0;\\red255\\green255\\blue255;\\red0\\green0\\blue128;\\red0\\green128\\blue128;\\red0\\green128\\blue0;\\red128\\green0\\blue128;\n\\red128\\green0\\blue0;\\red128\\green128\\blue0;\\red128\\green128\\blue128;\\red192\\green192\\blue192;\\red0\\green0\\blue0;\\red0\\green0\\blue0;\\cfollowedhyperlink\\ctint255\\cshade255\\red128\\green0\\blue128;\\red96\\green94\\blue92;\\red225\\green223\\blue221;\n\\red31\\green73\\blue125;\\red0\\green176\\blue80;}{\\*\\defchp \\fs22 }{\\*\\defpap \\ql \\li0\\ri0\\sa200\\sl276\\slmult1\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 }\\noqfpromote {\\stylesheet{\n\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\snext0 \\sqformat \\spriority0 Normal;}{\n\\s1\\ql \\li0\\ri0\\sb720\\keepn\\widctlpar\\brdrt\\brdrs\\brdrw30\\brsp120 \\wrapdefault\\nooverflow\\faroman\\outlinelevel0\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs36\\alang1025 \\ltrch\\fcs0 \\b\\f1\\fs36\\cf9\\lang1024\\langfe1024\\cgrid\\noproof\\langnp1033\\langfenp1033 \n\\sbasedon0 \\snext0 \\slink15 \\sqformat heading 1;}{\\s2\\ql \\li720\\ri0\\sb360\\keepn\\widctlpar\\wrapdefault\\nooverflow\\faroman\\outlinelevel1\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs20\\alang1025 \\ltrch\\fcs0 \n\\b\\f1\\fs20\\cf13\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\slink16 \\sqformat heading 2;}{\\s3\\ql \\li1440\\ri0\\sb180\\keepn\\widctlpar\\wrapdefault\\nooverflow\\faroman\\outlinelevel2\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \n\\ab\\af1\\afs20\\alang1025 \\ltrch\\fcs0 \\b\\f1\\fs20\\cf10\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext24 \\slink17 \\sqformat heading 3;}{\\s4\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\outlinelevel3\\rin0\\lin1440\\itap0 \n\\rtlch\\fcs1 \\af46\\afs24\\alang1025 \\ltrch\\fcs0 \\f46\\fs24\\ul\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext24 \\slink18 \\sqformat heading 4;}{\n\\s5\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\outlinelevel4\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\ab\\af46\\afs20\\alang1025 \\ltrch\\fcs0 \\b\\f46\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext24 \\slink19 \\sqformat \nheading 5;}{\\s6\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\outlinelevel5\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af46\\afs20\\alang1025 \\ltrch\\fcs0 \\f46\\fs20\\ul\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \n\\sbasedon0 \\snext24 \\slink20 \\sqformat heading 6;}{\\s7\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\outlinelevel6\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\ai\\af46\\afs20\\alang1025 \\ltrch\\fcs0 \n\\i\\f46\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext24 \\slink21 \\sqformat heading 7;}{\\s8\\ql \\li1440\\ri0\\sb240\\sa60\\widctlpar\\wrapdefault\\nooverflow\\faroman\\outlinelevel7\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\ai\\af44\\afs20\\alang1025 \n\\ltrch\\fcs0 \\i\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\slink22 \\sqformat heading 8;}{\\s9\\ql \\li1440\\ri0\\sb240\\sa60\\widctlpar\\wrapdefault\\nooverflow\\faroman\\outlinelevel8\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \n\\ab\\ai\\af44\\afs18\\alang1025 \\ltrch\\fcs0 \\b\\i\\f44\\fs18\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\slink23 \\sqformat heading 9;}{\\*\\cs10 \\additive \\ssemihidden Default Paragraph Font;}{\\*\n\\ts11\\tsrowd\\trftsWidthB3\\trpaddl108\\trpaddr108\\trpaddfl3\\trpaddft3\\trpaddfb3\\trpaddfr3\\trcbpat1\\trcfpat1\\tblind0\\tblindtype3\\tsvertalt\\tsbrdrt\\tsbrdrl\\tsbrdrb\\tsbrdrr\\tsbrdrdgl\\tsbrdrdgr\\tsbrdrh\\tsbrdrv \\ql \\li0\\ri0\\sa200\\sl276\\slmult1\n\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af0\\afs22\\alang1025 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\snext11 \\ssemihidden \\sunhideused Normal Table;}{\\*\\cs15 \\additive \\rtlch\\fcs1 \n\\ab\\af0\\afs32 \\ltrch\\fcs0 \\b\\f42\\fs32\\kerning32 \\sbasedon10 \\slink1 \\slocked Heading 1 Char;}{\\*\\cs16 \\additive \\rtlch\\fcs1 \\ab\\ai\\af0\\afs28 \\ltrch\\fcs0 \\b\\i\\f42\\fs28 \\sbasedon10 \\slink2 \\slocked \\ssemihidden Heading 2 Char;}{\\*\\cs17 \\additive \n\\rtlch\\fcs1 \\ab\\af0\\afs26 \\ltrch\\fcs0 \\b\\f42\\fs26 \\sbasedon10 \\slink3 \\slocked \\ssemihidden Heading 3 Char;}{\\*\\cs18 \\additive \\rtlch\\fcs1 \\ab\\af0\\afs28 \\ltrch\\fcs0 \\b\\f37\\fs28 \\sbasedon10 \\slink4 \\slocked \\ssemihidden Heading 4 Char;}{\\*\\cs19 \\additive \n\\rtlch\\fcs1 \\ab\\ai\\af0\\afs26 \\ltrch\\fcs0 \\b\\i\\f37\\fs26 \\sbasedon10 \\slink5 \\slocked \\ssemihidden Heading 5 Char;}{\\*\\cs20 \\additive \\rtlch\\fcs1 \\ab\\af0 \\ltrch\\fcs0 \\b\\f37 \\sbasedon10 \\slink6 \\slocked \\ssemihidden Heading 6 Char;}{\\*\\cs21 \\additive \n\\rtlch\\fcs1 \\af0\\afs24 \\ltrch\\fcs0 \\f37\\fs24 \\sbasedon10 \\slink7 \\slocked \\ssemihidden Heading 7 Char;}{\\*\\cs22 \\additive \\rtlch\\fcs1 \\ai\\af0\\afs24 \\ltrch\\fcs0 \\i\\f37\\fs24 \\sbasedon10 \\slink8 \\slocked \\ssemihidden Heading 8 Char;}{\\*\\cs23 \\additive \n\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\f42 \\sbasedon10 \\slink9 \\slocked \\ssemihidden Heading 9 Char;}{\\s24\\ql \\li1800\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1800\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext24 Normal Indent;}{\\s25\\ql \\li0\\ri0\\widctlpar\\tqr\\tx9360\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\ai\\af1\\afs16\\alang1025 \\ltrch\\fcs0 \n\\i\\f1\\fs16\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext25 \\slink26 footer;}{\\*\\cs26 \\additive \\rtlch\\fcs1 \\af44\\afs20 \\ltrch\\fcs0 \\f44\\fs20 \\sbasedon10 \\slink25 \\slocked \\ssemihidden Footer Char;}{\\s27\\ql \\li0\\ri0\\widctlpar\n\\tqr\\tx9900\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\ab\\ai\\af1\\afs20\\alang1025 \\ltrch\\fcs0 \\b\\i\\f1\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext27 \\slink28 header;}{\\*\\cs28 \\additive \\rtlch\\fcs1 \\af44\\afs20 \n\\ltrch\\fcs0 \\f44\\fs20 \\sbasedon10 \\slink27 \\slocked \\ssemihidden Header Char;}{\\s29\\ql \\li2160\\ri0\\sb40\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin2160\\itap0 \\rtlch\\fcs1 \\af2\\afs18\\alang1025 \\ltrch\\fcs0 \n\\f2\\fs18\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon30 \\snext29 prog indent;}{\\s30\\ql \\li1800\\ri0\\sb40\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1800\\itap0 \\rtlch\\fcs1 \\af2\\afs18\\alang1025 \\ltrch\\fcs0 \n\\f2\\fs18\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon31 \\snext30 prog;}{\\s31\\ql \\fi-360\\li360\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin360\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext31 List;}{\\*\\cs32 \\additive \\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\sbasedon10 page number;}{\\s33\\ql \\fi-216\\li2016\\ri0\\sb40\\widctlpar\\wrapdefault{\\*\\pn \\pnlvlblt\\ilvl10\\ls2047\\pnrnot0\n\\pnf5\\pnstart1\\pnindent216\\pnhang {\\pntxtb ?}}\\nooverflow\\faroman\\ls2047\\ilvl10\\rin0\\lin2016\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext33 bullet;}{\n\\s34\\ql \\li0\\ri0\\sb720\\keepn\\widctlpar\\brdrt\\brdrs\\brdrw30\\brsp120 \\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs36\\alang1025 \\ltrch\\fcs0 \\b\\f1\\fs36\\cf9\\lang1024\\langfe1024\\cgrid\\noproof\\langnp1033\\langfenp1033 \n\\sbasedon1 \\snext34 Style1;}{\\s35\\ql \\fi-216\\li2016\\ri0\\sb120\\widctlpar\\wrapdefault{\\*\\pn \\pnlvlblt\\ilvl10\\ls2047\\pnrnot0\\pnf5\\pnstart1\\pnindent216\\pnhang {\\pntxtb ?}}\\nooverflow\\faroman\\ls2047\\ilvl10\\rin0\\lin2016\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \n\\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon33 \\snext33 bullet first;}{\\s36\\ql \\li1440\\ri0\\sb180\\widctlpar\\tx5220\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs20\\alang1025 \\ltrch\\fcs0 \n\\b\\f1\\fs20\\cf13\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext38 chapter contents;}{\\s37\\ql \\li1440\\ri0\\sb40\\widctlpar\\tx5400\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext37 chapter contents list;}{\\s38\\ql \\li1440\\ri0\\sb80\\widctlpar\\tx5400\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext37 chapter contents list first;}{\\s39\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs200\\alang1025 \\ltrch\\fcs0 \n\\b\\f1\\fs200\\lang1024\\langfe1024\\cgrid\\noproof\\langnp1033\\langfenp1033 \\snext0 chapter num;}{\\s40\\qr \\li0\\ri0\\sa720\\widctlpar\\brdrt\\brdrs\\brdrw60\\brsp20 \\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs54\\alang1025 \\ltrch\\fcs0 \n\\b\\f1\\fs54\\cf9\\lang1024\\langfe1024\\cgrid\\noproof\\langnp1033\\langfenp1033 \\snext36 chapter title;}{\\s41\\ql \\li1800\\ri0\\sb120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1800\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon31 \\snext31 list first;}{\\s42\\ql \\fi-216\\li2376\\ri0\\sb40\\widctlpar\\wrapdefault{\\*\\pn \\pnlvlblt\\ilvl10\\ls2047\\pnrnot0\\pnf47\\pnstart1\\pnindent216\\pnhang {\\pntxtb ?}}\n\\nooverflow\\faroman\\ls2047\\ilvl10\\rin0\\lin2376\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext42 bullet indent;}{\n\\s43\\ql \\li1440\\ri0\\sb120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 normal after heading 3;}{\n\\s44\\ql \\fi-216\\li2376\\ri0\\sb80\\widctlpar\\wrapdefault{\\*\\pn \\pnlvlblt\\ilvl10\\ls2047\\pnrnot0\\pnf47\\pnstart1\\pnindent216\\pnhang {\\pntxtb ?}}\\nooverflow\\faroman\\ls2047\\ilvl10\\rin0\\lin2376\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon33 \\snext42 bullet indent first;}{\\s45\\qr \\li720\\ri0\\sa360\\sl-1060\\slmult0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \\ab\\ai\\af1\\afs48\\alang1025 \\ltrch\\fcs0 \n\\b\\i\\f1\\fs48\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 contents title;}{\\s46\\ql \\li2160\\ri0\\sb40\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin2160\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon31 \\snext46 def;}{\\s47\\ql \\li2160\\ri0\\sb80\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin2160\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon46 \\snext47 def 2;}{\\s48\\ql \\li1080\\ri0\\sb120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1080\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon41 \\snext46 def first;}{\\s49\\ql \\li2160\\ri0\\sb40\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin2160\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon46 \\snext0 def last;}{\\s50\\ql \\li2160\\ri0\\sb80\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin2160\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon49 \\snext0 def last 2;}{\\s51\\ql \\li1800\\ri0\\sb120\\keepn\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1800\\itap0 \\rtlch\\fcs1 \\ab\\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\b\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon41 \\snext46 def term;}{\\s52\\ql \\li1800\\ri0\\sb120\\keepn\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1800\\itap0 \\rtlch\\fcs1 \\ab\\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\b\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon41 \\snext52 def term first;}{\\s53\\qc \\li1440\\ri0\\sb240\\keepn\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext54 figure;}{\\s54\\qc \\li1440\\ri0\\sb180\\sa240\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs20\\alang1025 \\ltrch\\fcs0 \n\\b\\f1\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 figure title;}{\\s55\\qc \\li1440\\ri0\\sb240\\keepn\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon53 \\snext0 figure after step;}{\\s56\\qc \\li1440\\ri0\\sb180\\sa240\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs20\\alang1025 \\ltrch\\fcs0 \n\\b\\f1\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon54 \\snext56 figure title after step;}{\\s57\\qc \\li1440\\ri0\\sb180\\sa360\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs20\\alang1025 \\ltrch\\fcs0 \n\\b\\f1\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon54 \\snext0 figure title continued;}{\\*\\cs58 \\additive \\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\sbasedon10 line number;}{\n\\s59\\ql \\li2160\\ri0\\sb40\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin2160\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon31 \\snext59 list indent;}{\n\\s60\\ql \\li2160\\ri0\\sb80\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin2160\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon31 \\snext59 list indent first;}{\n\\s61\\ql \\fi-360\\li2160\\ri0\\sb120\\widctlpar\\wrapdefault{\\*\\pn \\pnlvlbody\\ilvl11\\ls2047\\pnrnot0\\pndec\\pnstart1\\pnindent360\\pnhang {\\pntxta .}}\\nooverflow\\faroman\\ls2047\\ilvl11\\rin0\\lin2160\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext61 List Number;}{\\s62\\ql \\li2160\\ri0\\sb80\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin2160\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon60 \\snext62 list number no number;}{\\s63\\ql \\li720\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext63 normal before table;}{\\s64\\ql \\fi-806\\li2246\\ri0\\sb240\\sa120\\widctlpar\\brdrt\\brdrs\\brdrw15\\brsp100 \\brdrb\\brdrs\\brdrw15\\brsp100 \n\\tx2250\\wrapdefault\\nooverflow\\faroman\\rin0\\lin2246\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 note;}{\n\\s65\\qr \\li0\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\ai\\af1\\afs20\\alang1025 \\ltrch\\fcs0 \\i\\f1\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext65 part number;}{\n\\s66\\ql \\li1800\\ri0\\sb120\\widctlpar\\tx4770\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1800\\itap0 \\rtlch\\fcs1 \\af2\\afs18\\alang1025 \\ltrch\\fcs0 \\f2\\fs18\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon41 \\snext30 prog first;}{\n\\s67\\ql \\li1800\\ri0\\sb40\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1800\\itap0 \\rtlch\\fcs1 \\af2\\afs18\\alang1025 \\ltrch\\fcs0 \\f2\\fs18\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon31 \\snext67 prog last;}{\n\\s68\\ql \\li1800\\ri0\\sb120\\widctlpar\\tx4770\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1800\\itap0 \\rtlch\\fcs1 \\af2\\afs18\\alang1025 \\ltrch\\fcs0 \\f2\\fs18\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon66 \\snext68 prog single;}{\n\\s69\\ql \\li878\\ri144\\sl-180\\slmult0\\widctlpar\\brdrt\\brdrs\\brdrw15\\brsp100 \\brdrl\\brdrs\\brdrw15\\brsp100 \\brdrb\\brdrs\\brdrw15\\brsp100 \\brdrr\\brdrs\\brdrw15\\brsp100 \n\\tx1152\\tx1440\\tx1728\\tx2016\\tx2304\\tx2592\\tx2880\\wrapdefault\\nooverflow\\faroman\\rin144\\lin878\\itap0 \\rtlch\\fcs1 \\af2\\afs15\\alang1025 \\ltrch\\fcs0 \\f2\\fs15\\lang1024\\langfe1024\\cgrid\\noproof\\langnp1033\\langfenp1033 \\snext69 program text;}{\n\\s70\\ql \\fi-360\\li2520\\ri0\\sb80\\widctlpar\\wrapdefault{\\*\\pn \\pnlvlbody\\ilvl11\\ls2047\\pnrnot0\\pnlcltr\\pnb0\\pni0\\pnf4\\pnfs20\\pnstart1\\pnindent360\\pnhang {\\pntxta . }}\\nooverflow\\faroman\\ls2047\\ilvl11\\rin0\\lin2520\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \n\\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext70 substep;}{\\s71\\ql \\li72\\ri72\\sb80\\sa80\\keepn\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin72\\lin72\\itap0 \\rtlch\\fcs1 \\ab\\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\b\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 table head;}{\\s72\\ql \\li72\\ri72\\sb80\\sa80\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin72\\lin72\\itap0 \\rtlch\\fcs1 \\af44\\afs18\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs18\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\snext72 table text;}{\\s73\\qc \\li1440\\ri0\\sb300\\sa120\\keepn\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs20\\alang1025 \\ltrch\\fcs0 \n\\b\\f1\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext71 table title;}{\\s74\\qc \\li1440\\ri0\\sb300\\sa120\\keepn\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs20\\alang1025 \\ltrch\\fcs0 \n\\b\\f1\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon73 \\snext71 table title continued;}{\\s75\\ql \\li1800\\ri0\\sb120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1800\\itap0 \\rtlch\\fcs1 \\af1\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f1\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 triplet single;}{\\s76\\ql \\li720\\ri0\\sb360\\keepn\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs20\\alang1025 \\ltrch\\fcs0 \n\\b\\f1\\fs20\\cf13\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon2 \\snext0 triplet heading 2;}{\\s77\\ql \\li0\\ri0\\sb180\\keepn\\pagebb\\widctlpar\\brdrt\\brdrs\\brdrw30\\brsp120 \\tqr\\tx9893\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \n\\ab\\af1\\afs24\\alang1025 \\ltrch\\fcs0 \\b\\f1\\fs24\\cf9\\lang1024\\langfe1024\\cgrid\\noproof\\langnp1033\\langfenp1033 \\sbasedon1 \\snext77 triplet heading;}{\\s78\\ql \\li1080\\ri0\\sb120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1080\\itap0 \\rtlch\\fcs1 \n\\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext79 glossary def;}{\\s79\\ql \\li720\\ri0\\sb180\\keepn\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \n\\ab\\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\b\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon80 \\snext78 glossary word;}{\\s80\\ql \\li720\\ri0\\sb180\\keepn\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \n\\ab\\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\b\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext78 glossary word first;}{\\s81\\ql \\li1080\\ri0\\sb120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1080\\itap0 \\rtlch\\fcs1 \n\\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon78 \\snext0 glossary def last;}{\\s82\\ql \\fi-216\\li2736\\ri0\\sb80\\widctlpar\\wrapdefault{\\*\\pn \\pnlvlblt\\ilvl10\\ls2047\\pnrnot0\n\\pnf5\\pnstart1\\pnindent216\\pnhang {\\pntxtb ?}}\\nooverflow\\faroman\\ls2047\\ilvl10\\rin0\\lin2736\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext82 ref bullet 1;}{\n\\s83\\ql \\fi-216\\li2736\\ri0\\sb40\\widctlpar\\wrapdefault{\\*\\pn \\pnlvlblt\\ilvl10\\ls2047\\pnrnot0\\pnf5\\pnstart1\\pnindent216\\pnhang {\\pntxtb ?}}\\nooverflow\\faroman\\ls2047\\ilvl10\\rin0\\lin2736\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon82 \\snext83 ref bullet 2;}{\\s84\\ql \\fi-1440\\li2160\\ri0\\sb180\\widctlpar\\tx2160\\wrapdefault\\nooverflow\\faroman\\rin0\\lin2160\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext84 ref para 1;}{\\s85\\ql \\li2160\\ri0\\sb80\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin2160\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon84 \\snext84 ref para 2;}{\\s86\\ql \\li2520\\ri0\\sb80\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin2520\\itap0 \\rtlch\\fcs1 \\af2\\afs18\\alang1025 \\ltrch\\fcs0 \n\\f2\\fs18\\lang1024\\langfe1024\\cgrid\\noproof\\langnp1033\\langfenp1033 \\snext86 ref prog 1;}{\\s87\\ql \\li2520\\ri0\\sb40\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin2520\\itap0 \\rtlch\\fcs1 \\af2\\afs18\\alang1025 \\ltrch\\fcs0 \n\\f2\\fs18\\lang1024\\langfe1024\\cgrid\\noproof\\langnp1033\\langfenp1033 \\sbasedon86 \\snext87 ref prog 2;}{\\s88\\ql \\li2160\\ri0\\sb120\\widctlpar\\tx4770\\wrapdefault\\nooverflow\\faroman\\rin0\\lin2160\\itap0 \\rtlch\\fcs1 \\af2\\afs18\\alang1025 \\ltrch\\fcs0 \n\\f2\\fs18\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon66 \\snext88 prog indent first;}{\\s89\\ql \\li2160\\ri0\\sb40\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin2160\\itap0 \\rtlch\\fcs1 \\af2\\afs18\\alang1025 \\ltrch\\fcs0 \n\\f2\\fs18\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon67 \\snext89 prog indent last;}{\\s90\\ql \\li0\\ri0\\sb180\\keepn\\pagebb\\widctlpar\\brdrt\\brdrs\\brdrw30\\brsp120 \\tqr\\tx9893\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \n\\ab\\af1\\afs24\\alang1025 \\ltrch\\fcs0 \\b\\f1\\fs24\\cf9\\lang1024\\langfe1024\\cgrid\\noproof\\langnp1033\\langfenp1033 \\sbasedon77 \\snext0 ref heading;}{\\s91\\ql \\li720\\ri0\\sb360\\keepn\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \n\\ab\\af1\\afs20\\alang1025 \\ltrch\\fcs0 \\b\\f1\\fs20\\cf13\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon76 \\snext0 ref heading 2;}{\\s92\\ql \\li1440\\ri0\\sb120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \n\\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon41 \\snext93 ref list first;}{\\s93\\ql \\li1440\\ri0\\sb40\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \n\\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon31 \\snext93 ref list;}{\\s94\\ql \\fi-2160\\li3240\\ri0\\sb120\\widctlpar\\tx3240\\wrapdefault\\nooverflow\\faroman\\rin0\\lin3240\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon43 \\snext94 ref subhead first;}{\\s95\\ql \\fi-2160\\li3240\\ri0\\sb40\\widctlpar\\tx3240\\wrapdefault\\nooverflow\\faroman\\rin0\\lin3240\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext94 ref subhead last;}{\\s96\\ql \\li1440\\ri0\\sb180\\sa120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext96 \\slink97 Body Text;}{\\*\\cs97 \\additive \\rtlch\\fcs1 \\af44\\afs20 \\ltrch\\fcs0 \\f44\\fs20 \\sbasedon10 \\slink96 \\slocked \\ssemihidden Body Text Char;}{\n\\s98\\ql \\li1080\\ri0\\sb120\\keepn\\widctlpar\\tqr\\tldot\\tx9893\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1080\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs20\\alang1025 \\ltrch\\fcs0 \\b\\f1\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \n\\sbasedon0 \\snext0 \\sautoupd \\spriority39 toc 1;}{\\s99\\ql \\li1440\\ri1440\\sb180\\sa120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin1440\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \n\\sbasedon0 \\snext99 Block Text;}{\\s100\\ql \\li360\\ri0\\sb180\\sa120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin360\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \n\\sbasedon0 \\snext100 \\slink101 Body Text 2;}{\\*\\cs101 \\additive \\rtlch\\fcs1 \\af44\\afs20 \\ltrch\\fcs0 \\f44\\fs20 \\sbasedon10 \\slink100 \\slocked \\ssemihidden Body Text 2 Char;}{\n\\s102\\ql \\li1440\\ri0\\sb180\\sa120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs16\\alang1025 \\ltrch\\fcs0 \\f44\\fs16\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext102 \\slink103 Body Text 3;}{\\*\\cs103 \n\\additive \\rtlch\\fcs1 \\af44\\afs16 \\ltrch\\fcs0 \\f44\\fs16 \\sbasedon10 \\slink102 \\slocked \\ssemihidden Body Text 3 Char;}{\\s104\\ql \\fi210\\li1440\\ri0\\sb180\\sa120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \n\\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon96 \\snext104 \\slink105 Body Text First Indent;}{\\*\\cs105 \\additive \\rtlch\\fcs1 \\af44\\afs20 \\ltrch\\fcs0 \\f44\\fs20 \\sbasedon97 \\slink104 \\slocked \\ssemihidden \nBody Text First Indent Char;}{\\s106\\ql \\li283\\ri0\\sb180\\sa120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin283\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \n\\sbasedon0 \\snext106 \\slink107 Body Text Indent;}{\\*\\cs107 \\additive \\rtlch\\fcs1 \\af44\\afs20 \\ltrch\\fcs0 \\f44\\fs20 \\sbasedon10 \\slink106 \\slocked \\ssemihidden Body Text Indent Char;}{\n\\s108\\ql \\fi210\\li360\\ri0\\sb180\\sa120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin360\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon100 \\snext108 \\slink109 \nBody Text First Indent 2;}{\\*\\cs109 \\additive \\rtlch\\fcs1 \\af44\\afs20 \\ltrch\\fcs0 \\f44\\fs20 \\sbasedon107 \\slink108 \\slocked \\ssemihidden Body Text First Indent 2 Char;}{\\s110\\ql \\li360\\ri0\\sb180\\sa120\\sl480\\slmult1\n\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin360\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext110 \\slink111 Body Text Indent 2;}{\\*\\cs111 \\additive \\rtlch\\fcs1 \n\\af44\\afs20 \\ltrch\\fcs0 \\f44\\fs20 \\sbasedon10 \\slink110 \\slocked \\ssemihidden Body Text Indent 2 Char;}{\\s112\\ql \\li360\\ri0\\sb180\\sa120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin360\\itap0 \\rtlch\\fcs1 \\af44\\afs16\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs16\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext112 \\slink113 Body Text Indent 3;}{\\*\\cs113 \\additive \\rtlch\\fcs1 \\af44\\afs16 \\ltrch\\fcs0 \\f44\\fs16 \\sbasedon10 \\slink112 \\slocked \\ssemihidden Body Text Indent 3 Char;}{\n\\s114\\ql \\li1440\\ri0\\sb120\\sa120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\ab\\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\b\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\sqformat caption;}{\n\\s115\\ql \\li4320\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin4320\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext115 \\slink116 Closing;}{\\*\\cs116 \\additive \n\\rtlch\\fcs1 \\af44\\afs20 \\ltrch\\fcs0 \\f44\\fs20 \\sbasedon10 \\slink115 \\slocked \\ssemihidden Closing Char;}{\\s117\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext117 \\slink118 \\ssemihidden annotation text;}{\\*\\cs118 \\additive \\rtlch\\fcs1 \\af44\\afs20 \\ltrch\\fcs0 \\f44\\fs20 \\sbasedon10 \\slink117 \\slocked \\ssemihidden Comment Text Char;}{\n\\s119\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\slink120 Date;}{\\*\\cs120 \\additive \n\\rtlch\\fcs1 \\af44\\afs20 \\ltrch\\fcs0 \\f44\\fs20 \\sbasedon10 \\slink119 \\slocked \\ssemihidden Date Char;}{\\s121\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\cbpat9 \\rtlch\\fcs1 \\af43\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f43\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext121 \\slink122 \\ssemihidden Document Map;}{\\*\\cs122 \\additive \\rtlch\\fcs1 \\af43\\afs16 \\ltrch\\fcs0 \\f43\\fs16 \\sbasedon10 \\slink121 \\slocked \\ssemihidden Document Map Char;}{\n\\s123\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext123 \\slink124 \\ssemihidden endnote text;}{\\*\n\\cs124 \\additive \\rtlch\\fcs1 \\af44\\afs20 \\ltrch\\fcs0 \\f44\\fs20 \\sbasedon10 \\slink123 \\slocked \\ssemihidden Endnote Text Char;}{\n\\s125\\ql \\li2880\\ri0\\sb180\\widctlpar\\phpg\\posxc\\posyb\\absh-1980\\absw7920\\dxfrtext180\\dfrmtxtx180\\dfrmtxty0\\wrapdefault\\nooverflow\\faroman\\rin0\\lin2880\\itap0 \\rtlch\\fcs1 \\af1\\afs24\\alang1025 \\ltrch\\fcs0 \n\\f1\\fs24\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext125 envelope address;}{\\s126\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af1\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f1\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext126 envelope return;}{\\s127\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext127 \\slink128 \\ssemihidden footnote text;}{\\*\\cs128 \\additive \\rtlch\\fcs1 \\af44\\afs20 \\ltrch\\fcs0 \\f44\\fs20 \\sbasedon10 \\slink127 \\slocked \\ssemihidden Footnote Text Char;}{\n\\s129\\ql \\fi-200\\li200\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin200\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\sautoupd \\ssemihidden index 1;}{\n\\s130\\ql \\fi-200\\li400\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin400\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\sautoupd \\ssemihidden index 2;}{\n\\s131\\ql \\fi-200\\li600\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin600\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\sautoupd \\ssemihidden index 3;}{\n\\s132\\ql \\fi-200\\li800\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin800\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\sautoupd \\ssemihidden index 4;}{\n\\s133\\ql \\fi-200\\li1000\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1000\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\sautoupd \\ssemihidden index 5;}{\n\\s134\\ql \\fi-200\\li1200\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1200\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\sautoupd \\ssemihidden index 6;}{\n\\s135\\ql \\fi-200\\li1400\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1400\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\sautoupd \\ssemihidden index 7;}{\n\\s136\\ql \\fi-200\\li1600\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1600\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\sautoupd \\ssemihidden index 8;}{\n\\s137\\ql \\fi-200\\li1800\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1800\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\sautoupd \\ssemihidden index 9;}{\n\\s138\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs20\\alang1025 \\ltrch\\fcs0 \\b\\f1\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext129 \\ssemihidden index heading;}{\n\\s139\\ql \\fi-360\\li720\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext139 List 2;}{\n\\s140\\ql \\fi-360\\li1080\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1080\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext140 List 3;}{\n\\s141\\ql \\fi-360\\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext141 List 4;}{\n\\s142\\ql \\fi-360\\li1800\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1800\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext142 List 5;}{\n\\s143\\ql \\fi-360\\li360\\ri0\\sb180\\widctlpar\\jclisttab\\tx360\\wrapdefault{\\*\\pn \\pnlvlbody\\ilvl0\\ls1\\pnrnot0\\pndec }\\nooverflow\\faroman\\ls1\\rin0\\lin360\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext143 \\sautoupd List Bullet;}{\\s144\\ql \\fi-360\\li720\\ri0\\sb180\\widctlpar\\jclisttab\\tx720\\wrapdefault{\\*\\pn \\pnlvlbody\\ilvl0\\ls2\\pnrnot0\\pndec }\n\\nooverflow\\faroman\\ls2\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext144 \\sautoupd List Bullet 2;}{\\s145\\ql \\fi-360\\li1080\\ri0\\sb180\\widctlpar\n\\jclisttab\\tx1080\\wrapdefault{\\*\\pn \\pnlvlbody\\ilvl0\\ls3\\pnrnot0\\pndec }\\nooverflow\\faroman\\ls3\\rin0\\lin1080\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext145 \\sautoupd \nList Bullet 3;}{\\s146\\ql \\fi-360\\li1440\\ri0\\sb180\\widctlpar\\jclisttab\\tx1440\\wrapdefault{\\*\\pn \\pnlvlbody\\ilvl0\\ls4\\pnrnot0\\pndec }\\nooverflow\\faroman\\ls4\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext146 \\sautoupd List Bullet 4;}{\\s147\\ql \\fi-360\\li1800\\ri0\\sb180\\widctlpar\\jclisttab\\tx1800\\wrapdefault{\\*\\pn \\pnlvlbody\\ilvl0\\ls5\\pnrnot0\\pndec }\n\\nooverflow\\faroman\\ls5\\rin0\\lin1800\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext147 \\sautoupd List Bullet 5;}{\n\\s148\\ql \\li360\\ri0\\sb180\\sa120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin360\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext148 List Continue;}{\n\\s149\\ql \\li720\\ri0\\sb180\\sa120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext149 List Continue 2;}{\n\\s150\\ql \\li1080\\ri0\\sb180\\sa120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1080\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext150 List Continue 3;}{\n\\s151\\ql \\li1440\\ri0\\sb180\\sa120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext151 List Continue 4;}{\n\\s152\\ql \\li1800\\ri0\\sb180\\sa120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1800\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext152 List Continue 5;}{\n\\s153\\ql \\fi-360\\li720\\ri0\\sb180\\widctlpar\\jclisttab\\tx720\\wrapdefault{\\*\\pn \\pnlvlbody\\ilvl0\\ls6\\pnrnot0\\pndec }\\nooverflow\\faroman\\ls6\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext153 List Number 2;}{\\s154\\ql \\fi-360\\li1080\\ri0\\sb180\\widctlpar\\jclisttab\\tx1080\\wrapdefault{\\*\\pn \\pnlvlbody\\ilvl0\\ls7\\pnrnot0\\pndec }\\nooverflow\\faroman\\ls7\\rin0\\lin1080\\itap0 \n\\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext154 List Number 3;}{\\s155\\ql \\fi-360\\li1440\\ri0\\sb180\\widctlpar\\jclisttab\\tx1440\\wrapdefault{\\*\\pn \\pnlvlbody\\ilvl0\\ls8\\pnrnot0\n\\pndec }\\nooverflow\\faroman\\ls8\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext155 List Number 4;}{\\s156\\ql \\fi-360\\li1800\\ri0\\sb180\\widctlpar\n\\jclisttab\\tx1800\\wrapdefault{\\*\\pn \\pnlvlbody\\ilvl0\\ls9\\pnrnot0\\pndec }\\nooverflow\\faroman\\ls9\\rin0\\lin1800\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext156 \nList Number 5;}{\\s157\\ql \\li1440\\ri0\\sb180\\widctlpar\\tx480\\tx960\\tx1440\\tx1920\\tx2400\\tx2880\\tx3360\\tx3840\\tx4320\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af2\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f2\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\snext157 \\slink158 \\ssemihidden macro;}{\\*\\cs158 \\additive \\rtlch\\fcs1 \\af2\\afs20 \\ltrch\\fcs0 \\f2\\fs20 \\sbasedon10 \\slink157 \\slocked \\ssemihidden Macro Text Char;}{\n\\s159\\ql \\fi-1080\\li1080\\ri0\\sb180\\widctlpar\\brdrt\\brdrs\\brdrw15\\brsp20 \\brdrl\\brdrs\\brdrw15\\brsp20 \\brdrb\\brdrs\\brdrw15\\brsp20 \\brdrr\\brdrs\\brdrw15\\brsp20 \\wrapdefault\\nooverflow\\faroman\\rin0\\lin1080\\itap0 \\shading2000 \\rtlch\\fcs1 \\af1\\afs24\\alang1025 \n\\ltrch\\fcs0 \\f1\\fs24\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext159 \\slink160 Message Header;}{\\*\\cs160 \\additive \\rtlch\\fcs1 \\af0\\afs24 \\ltrch\\fcs0 \\f42\\fs24\\chshdng2000\\chcfpat0\\chcbpat0 \n\\sbasedon10 \\slink159 \\slocked \\ssemihidden Message Header Char;}{\\s161\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\slink162 Note Heading;}{\\*\\cs162 \\additive \\rtlch\\fcs1 \\af44\\afs20 \\ltrch\\fcs0 \\f44\\fs20 \\sbasedon10 \\slink161 \\slocked \\ssemihidden Note Heading Char;}{\n\\s163\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af2\\afs20\\alang1025 \\ltrch\\fcs0 \\f2\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext163 \\slink164 Plain Text;}{\\*\\cs164 \\additive \n\\rtlch\\fcs1 \\af2\\afs20 \\ltrch\\fcs0 \\f2\\fs20 \\sbasedon10 \\slink163 \\slocked \\ssemihidden Plain Text Char;}{\\s165\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \n\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\slink166 Salutation;}{\\*\\cs166 \\additive \\rtlch\\fcs1 \\af44\\afs20 \\ltrch\\fcs0 \\f44\\fs20 \\sbasedon10 \\slink165 \\slocked \\ssemihidden Salutation Char;}{\n\\s167\\ql \\li4320\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin4320\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext167 \\slink168 Signature;}{\\*\\cs168 \\additive \n\\rtlch\\fcs1 \\af44\\afs20 \\ltrch\\fcs0 \\f44\\fs20 \\sbasedon10 \\slink167 \\slocked \\ssemihidden Signature Char;}{\\s169\\qc \\li1440\\ri0\\sb180\\sa60\\widctlpar\\wrapdefault\\nooverflow\\faroman\\outlinelevel1\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af1\\afs24\\alang1025 \n\\ltrch\\fcs0 \\f1\\fs24\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext169 \\slink170 \\sqformat Subtitle;}{\\*\\cs170 \\additive \\rtlch\\fcs1 \\af0\\afs24 \\ltrch\\fcs0 \\f42\\fs24 \\sbasedon10 \\slink169 \\slocked Subtitle Char;}{\n\\s171\\ql \\fi-200\\li200\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin200\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\ssemihidden table of authorities;}{\n\\s172\\ql \\fi-400\\li400\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin400\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\ssemihidden table of figures;}{\n\\s173\\qc \\li1440\\ri0\\sb240\\sa60\\widctlpar\\wrapdefault\\nooverflow\\faroman\\outlinelevel0\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs32\\alang1025 \\ltrch\\fcs0 \\b\\f1\\fs32\\lang1033\\langfe1033\\kerning28\\cgrid\\langnp1033\\langfenp1033 \n\\sbasedon0 \\snext173 \\slink174 \\sqformat Title;}{\\*\\cs174 \\additive \\rtlch\\fcs1 \\ab\\af0\\afs32 \\ltrch\\fcs0 \\b\\f42\\fs32\\kerning28 \\sbasedon10 \\slink173 \\slocked Title Char;}{\n\\s175\\ql \\li1440\\ri0\\sb120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs24\\alang1025 \\ltrch\\fcs0 \\b\\f1\\fs24\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\ssemihidden toa heading;}{\n\\s176\\ql \\li1440\\ri0\\sb180\\widctlpar\\tqr\\tldot\\tx9883\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\sautoupd \\spriority39 \ntoc 2;}{\\s177\\ql \\li400\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin400\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\sautoupd \\ssemihidden toc 3;}{\n\\s178\\ql \\li600\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin600\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\sautoupd \\ssemihidden toc 4;}{\n\\s179\\ql \\li800\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin800\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\sautoupd \\ssemihidden toc 5;}{\n\\s180\\ql \\li1000\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1000\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\sautoupd \\ssemihidden toc 6;}{\n\\s181\\ql \\li1200\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1200\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\sautoupd \\ssemihidden toc 7;}{\n\\s182\\ql \\li1400\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1400\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\sautoupd \\ssemihidden toc 8;}{\n\\s183\\ql \\li1600\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1600\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\sautoupd \\ssemihidden toc 9;}{\n\\s184\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af43\\afs16\\alang1025 \\ltrch\\fcs0 \\f43\\fs16\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext184 \\slink185 \\ssemihidden Balloon Text;}{\\*\n\\cs185 \\additive \\rtlch\\fcs1 \\af43\\afs16 \\ltrch\\fcs0 \\f43\\fs16 \\sbasedon10 \\slink184 \\slocked \\ssemihidden Balloon Text Char;}{\\*\\ts186\\tsrowd\\trbrdrt\\brdrs\\brdrw10 \\trbrdrl\\brdrs\\brdrw10 \\trbrdrb\\brdrs\\brdrw10 \\trbrdrr\\brdrs\\brdrw10 \\trbrdrh\n\\brdrs\\brdrw10 \\trbrdrv\\brdrs\\brdrw10 \\trftsWidthB3\\trpaddl108\\trpaddr108\\trpaddfl3\\trpaddft3\\trpaddfb3\\trpaddfr3\\trcbpat1\\trcfpat1\\tblind0\\tblindtype3\\tsvertalt\\tsbrdrt\\tsbrdrl\\tsbrdrb\\tsbrdrr\\tsbrdrdgl\\tsbrdrdgr\\tsbrdrh\\tsbrdrv \n\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af0\\afs20\\alang1025 \\ltrch\\fcs0 \\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon11 \\snext186 Table Grid;}{\\*\\cs187 \\additive \\rtlch\\fcs1 \\af0 \n\\ltrch\\fcs0 \\ul\\cf2 \\sbasedon10 Hyperlink;}{\\*\\cs188 \\additive \\rtlch\\fcs1 \\af0\\afs19 \\ltrch\\fcs0 \\fs19 \\sbasedon10 postbody1;}{\\s189\\ql \\li0\\ri0\\keepn\\pagebb\\widctlpar\\brdrt\\brdrs\\brdrw30\\brsp120 \n\\wrapdefault\\nooverflow\\faroman\\outlinelevel0\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs24\\alang1025 \\ltrch\\fcs0 \\b\\f1\\fs24\\cf9\\lang1024\\langfe1024\\cgrid\\noproof\\langnp1033\\langfenp1033 \\sbasedon1 \\snext189 \\slink190 TWAIN Header;}{\\*\\cs190 \\additive \n\\rtlch\\fcs1 \\ab\\af1\\afs24 \\ltrch\\fcs0 \\b\\f1\\fs24\\cf9\\lang1024\\langfe1024\\kerning32\\noproof \\sbasedon15 \\slink189 \\slocked TWAIN Header Char;}{\\s191\\ql \\li720\\ri0\\sb360\\sl240\\slmult0\\widctlpar\\tx720\\wrapdefault\\hyphpar0\\faauto\\rin0\\lin720\\itap0 \n\\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\cf1\\lang1033\\langfe1033\\charscalex0\\cgrid\\langnp1033\\langfenp1033 \\snext191 body;}{\\s192\\ql \\li1440\\ri0\\sb120\\sl240\\slmult0\\widctlpar\n\\tx720\\tx1080\\tx1440\\tx1800\\tx2160\\tx2520\\tx2880\\tx3240\\tx3600\\tx3960\\tx4320\\tx4680\\tx5040\\tx5400\\tx5760\\tx6120\\tx6480\\tx6840\\tx7200\\tx7560\\tx7920\\tx8280\\tx8640\\tx9000\\wrapdefault\\hyphpar0\\faauto\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af48\\afs20\\alang1025 \n\\ltrch\\fcs0 \\f48\\fs20\\cf1\\lang1033\\langfe1033\\charscalex0\\cgrid\\langnp1033\\langfenp1033 \\snext0 Code;}{\\s193\\ql \\fi-3240\\li4680\\ri0\\sb120\\sl240\\slmult0\\widctlpar\\tx4680\\tx7400\\wrapdefault\\hyphpar0\\faauto\\rin0\\lin4680\\itap0 \\rtlch\\fcs1 \n\\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\cf1\\lang1033\\langfe1033\\charscalex0\\cgrid\\langnp1033\\langfenp1033 \\snext31 twocol;}{\\*\\cs194 \\additive \\f2 Code2;}{\\s195\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\faauto\\adjustright\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \n\\af0\\afs24\\alang1025 \\ltrch\\fcs0 \\fs24\\cf1\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext195 Default;}{\\*\\cs196 \\additive \\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\sbasedon10 \\spriority0 postbody;}{\\*\\cs197 \\additive \\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\ul\\cf19 \\sbasedon10 \\slocked \\ssemihidden \\sunhideused FollowedHyperlink;}{\\s198\\ql \\li60\\ri60\\sb80\\sa80\\sl240\\slmult0\\widctlpar\\tx720\\tx2520\\wrapdefault\\hyphpar0\\faauto\\rin60\\lin60\\itap0 \\rtlch\\fcs1 \\af2\\afs20\\alang1025 \\ltrch\\fcs0 \n\\fs20\\cf1\\lang1033\\langfe2052\\loch\\f2\\hich\\af2\\dbch\\af31505\\charscalex0\\cgrid\\langnp1033\\langfenp2052 \\snext198 table_code;}{\\s199\\ql \\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \\af37\\afs22\\alang1025 \n\\ltrch\\fcs0 \\f37\\fs22\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext199 \\sqformat \\spriority34 List Paragraph;}{\\*\\cs200 \\additive \\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cf20\\chshdng0\\chcfpat0\\chcbpat21 \\sbasedon10 \\ssemihidden \\sunhideused \nUnresolved Mention;}}{\\*\\listtable{\\list\\listtemplateid-1403649448\\listsimple{\\listlevel\\levelnfc0\\levelnfcn0\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace0\\levelindent0{\\leveltext\\'02\\'00.;}{\\levelnumbers\\'01;}\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\fi-360\\li1800\\jclisttab\\tx1800\\lin1800 }{\\listname ;}\\listid-132}{\\list\\listtemplateid-537102814\\listsimple{\\listlevel\\levelnfc0\\levelnfcn0\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace0\\levelindent0{\\leveltext\\'02\\'00.;}{\\levelnumbers\\'01;}\n\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\fi-360\\li1440\\jclisttab\\tx1440\\lin1440 }{\\listname ;}\\listid-131}{\\list\\listtemplateid-241933882\\listsimple{\\listlevel\\levelnfc0\\levelnfcn0\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace0\\levelindent0{\\leveltext\n\\'02\\'00.;}{\\levelnumbers\\'01;}\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\fi-360\\li1080\\jclisttab\\tx1080\\lin1080 }{\\listname ;}\\listid-130}{\\list\\listtemplateid894471834\\listsimple{\\listlevel\\levelnfc0\\levelnfcn0\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\n\\levelspace0\\levelindent0{\\leveltext\\'02\\'00.;}{\\levelnumbers\\'01;}\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\fi-360\\li720\\jclisttab\\tx720\\lin720 }{\\listname ;}\\listid-129}{\\list\\listtemplateid-1633241602\\listsimple{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\n\\levelfollow0\\levelstartat1\\levelspace0\\levelindent0{\\leveltext\\'01\\u-3913 ?;}{\\levelnumbers;}\\f3\\fbias0 \\fi-360\\li1800\\jclisttab\\tx1800\\lin1800 }{\\listname ;}\\listid-128}{\\list\\listtemplateid-203631750\\listsimple{\\listlevel\\levelnfc23\\levelnfcn23\n\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace0\\levelindent0{\\leveltext\\'01\\u-3913 ?;}{\\levelnumbers;}\\f3\\fbias0 \\fi-360\\li1440\\jclisttab\\tx1440\\lin1440 }{\\listname ;}\\listid-127}{\\list\\listtemplateid360335964\\listsimple{\\listlevel\\levelnfc23\n\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace0\\levelindent0{\\leveltext\\'01\\u-3913 ?;}{\\levelnumbers;}\\f3\\fbias0 \\fi-360\\li1080\\jclisttab\\tx1080\\lin1080 }{\\listname ;}\\listid-126}{\\list\\listtemplateid627448582\\listsimple{\\listlevel\n\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace0\\levelindent0{\\leveltext\\'01\\u-3913 ?;}{\\levelnumbers;}\\f3\\fbias0 \\fi-360\\li720\\jclisttab\\tx720\\lin720 }{\\listname ;}\\listid-125}{\\list\\listtemplateid507960418\\listsimple\n{\\listlevel\\levelnfc0\\levelnfcn0\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace0\\levelindent0{\\leveltext\\'02\\'00.;}{\\levelnumbers\\'01;}\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\fi-360\\li360\\jclisttab\\tx360\\lin360 }{\\listname ;}\\listid-120}\n{\\list\\listtemplateid-1407048446\\listsimple{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace0\\levelindent0{\\leveltext\\'01\\u-3913 ?;}{\\levelnumbers;}\\f3\\fbias0 \\fi-360\\li360\\jclisttab\\tx360\\lin360 }{\\listname \n;}\\listid-119}{\\list\\listtemplateid-950138062\\listhybrid{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat0\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid-129700622\\'01-;}{\\levelnumbers;}\n\\loch\\af37\\hich\\af37\\dbch\\af0\\fbias0 \\fi-360\\li720\\lin720 }{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\lvltentative\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid67698691\\'01o;}{\\levelnumbers;}\\f2\\fbias0 \n\\fi-360\\li1440\\lin1440 }{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\lvltentative\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid67698693\\'01\\u-3929 ?;}{\\levelnumbers;}\\f10\\fbias0 \\fi-360\\li2160\\lin2160 }{\\listlevel\n\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\lvltentative\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid67698689\\'01\\u-3913 ?;}{\\levelnumbers;}\\f3\\fbias0 \\fi-360\\li2880\\lin2880 }{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\n\\leveljcn0\\levelfollow0\\levelstartat1\\lvltentative\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid67698691\\'01o;}{\\levelnumbers;}\\f2\\fbias0 \\fi-360\\li3600\\lin3600 }{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\n\\lvltentative\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid67698693\\'01\\u-3929 ?;}{\\levelnumbers;}\\f10\\fbias0 \\fi-360\\li4320\\lin4320 }{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\lvltentative\\levelspace0\n\\levelindent0{\\leveltext\\leveltemplateid67698689\\'01\\u-3913 ?;}{\\levelnumbers;}\\f3\\fbias0 \\fi-360\\li5040\\lin5040 }{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\lvltentative\\levelspace0\\levelindent0{\\leveltext\n\\leveltemplateid67698691\\'01o;}{\\levelnumbers;}\\f2\\fbias0 \\fi-360\\li5760\\lin5760 }{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\lvltentative\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid67698693\n\\'01\\u-3929 ?;}{\\levelnumbers;}\\f10\\fbias0 \\fi-360\\li6480\\lin6480 }{\\listname ;}\\listid162478944}{\\list\\listtemplateid181715488\\listhybrid{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat0\\levelspace0\\levelindent0{\\leveltext\n\\leveltemplateid1324631620\\'01-;}{\\levelnumbers;}\\loch\\af0\\hich\\af0\\dbch\\af0\\fbias0 \\fi-360\\li720\\lin720 }{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\lvltentative\\levelspace0\\levelindent0{\\leveltext\n\\leveltemplateid67698691\\'01o;}{\\levelnumbers;}\\f2\\fbias0 \\fi-360\\li1440\\lin1440 }{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\lvltentative\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid67698693\n\\'01\\u-3929 ?;}{\\levelnumbers;}\\f10\\fbias0 \\fi-360\\li2160\\lin2160 }{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\lvltentative\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid67698689\\'01\\u-3913 ?;}{\\levelnumbers;}\n\\f3\\fbias0 \\fi-360\\li2880\\lin2880 }{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\lvltentative\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid67698691\\'01o;}{\\levelnumbers;}\\f2\\fbias0 \\fi-360\\li3600\\lin3600 }\n{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\lvltentative\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid67698693\\'01\\u-3929 ?;}{\\levelnumbers;}\\f10\\fbias0 \\fi-360\\li4320\\lin4320 }{\\listlevel\\levelnfc23\\levelnfcn23\n\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\lvltentative\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid67698689\\'01\\u-3913 ?;}{\\levelnumbers;}\\f3\\fbias0 \\fi-360\\li5040\\lin5040 }{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\n\\levelstartat1\\lvltentative\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid67698691\\'01o;}{\\levelnumbers;}\\f2\\fbias0 \\fi-360\\li5760\\lin5760 }{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\lvltentative\\levelspace0\n\\levelindent0{\\leveltext\\leveltemplateid67698693\\'01\\u-3929 ?;}{\\levelnumbers;}\\f10\\fbias0 \\fi-360\\li6480\\lin6480 }{\\listname ;}\\listid984241419}{\\list\\listtemplateid81190112\\listhybrid{\\listlevel\\levelnfc0\\levelnfcn0\\leveljc0\\leveljcn0\\levelfollow0\n\\levelstartat1\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid1970803460\\'02\\'00);}{\\levelnumbers\\'01;}\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\fs22\\cf22\\loch\\af37\\hich\\af37\\dbch\\af0\\fbias0 \\fi-360\\li720\\lin720 }{\\listlevel\\levelnfc4\\levelnfcn4\\leveljc0\n\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid67698713\\'02\\'01.;}{\\levelnumbers\\'01;}\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\fi-360\\li1440\\lin1440 }{\\listlevel\\levelnfc2\\levelnfcn2\\leveljc2\\leveljcn2\\levelfollow0\n\\levelstartat1\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid67698715\\'02\\'02.;}{\\levelnumbers\\'01;}\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\fi-180\\li2160\\lin2160 }{\\listlevel\\levelnfc0\\levelnfcn0\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace0\n\\levelindent0{\\leveltext\\leveltemplateid67698703\\'02\\'03.;}{\\levelnumbers\\'01;}\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\fi-360\\li2880\\lin2880 }{\\listlevel\\levelnfc4\\levelnfcn4\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace0\\levelindent0{\\leveltext\n\\leveltemplateid67698713\\'02\\'04.;}{\\levelnumbers\\'01;}\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\fi-360\\li3600\\lin3600 }{\\listlevel\\levelnfc2\\levelnfcn2\\leveljc2\\leveljcn2\\levelfollow0\\levelstartat1\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid67698715\n\\'02\\'05.;}{\\levelnumbers\\'01;}\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\fi-180\\li4320\\lin4320 }{\\listlevel\\levelnfc0\\levelnfcn0\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid67698703\\'02\\'06.;}{\\levelnumbers\\'01;}\n\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\fi-360\\li5040\\lin5040 }{\\listlevel\\levelnfc4\\levelnfcn4\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid67698713\\'02\\'07.;}{\\levelnumbers\\'01;}\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\fi-360\\li5760\\lin5760 }{\\listlevel\\levelnfc2\\levelnfcn2\\leveljc2\\leveljcn2\\levelfollow0\\levelstartat1\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid67698715\\'02\\'08.;}{\\levelnumbers\\'01;}\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\fi-180\\li6480\\lin6480 }\n{\\listname ;}\\listid2094470365}}{\\*\\listoverridetable{\\listoverride\\listid-120\\listoverridecount0\\ls1}{\\listoverride\\listid-119\\listoverridecount0\\ls2}{\\listoverride\\listid-125\\listoverridecount0\\ls3}{\\listoverride\\listid-126\\listoverridecount0\\ls4}\n{\\listoverride\\listid-127\\listoverridecount0\\ls5}{\\listoverride\\listid-128\\listoverridecount0\\ls6}{\\listoverride\\listid-129\\listoverridecount0\\ls7}{\\listoverride\\listid-130\\listoverridecount0\\ls8}{\\listoverride\\listid-131\\listoverridecount0\\ls9}\n{\\listoverride\\listid-132\\listoverridecount0\\ls10}{\\listoverride\\listid-120\\listoverridecount0\\ls11}{\\listoverride\\listid-119\\listoverridecount0\\ls12}{\\listoverride\\listid-125\\listoverridecount0\\ls13}{\\listoverride\\listid-126\\listoverridecount0\\ls14}\n{\\listoverride\\listid-127\\listoverridecount0\\ls15}{\\listoverride\\listid-128\\listoverridecount0\\ls16}{\\listoverride\\listid-129\\listoverridecount0\\ls17}{\\listoverride\\listid-130\\listoverridecount0\\ls18}{\\listoverride\\listid-131\\listoverridecount0\\ls19}\n{\\listoverride\\listid-132\\listoverridecount0\\ls20}{\\listoverride\\listid-120\\listoverridecount0\\ls21}{\\listoverride\\listid-119\\listoverridecount0\\ls22}{\\listoverride\\listid-125\\listoverridecount0\\ls23}{\\listoverride\\listid-126\\listoverridecount0\\ls24}\n{\\listoverride\\listid-127\\listoverridecount0\\ls25}{\\listoverride\\listid-128\\listoverridecount0\\ls26}{\\listoverride\\listid-129\\listoverridecount0\\ls27}{\\listoverride\\listid-130\\listoverridecount0\\ls28}{\\listoverride\\listid-131\\listoverridecount0\\ls29}\n{\\listoverride\\listid2094470365\\listoverridecount9{\\lfolevel\\listoverridestartat\\levelstartat1}{\\lfolevel\\listoverridestartat\\levelstartat1}{\\lfolevel\\listoverridestartat\\levelstartat1}{\\lfolevel\\listoverridestartat\\levelstartat1}{\\lfolevel\n\\listoverridestartat\\levelstartat1}{\\lfolevel\\listoverridestartat\\levelstartat1}{\\lfolevel\\listoverridestartat\\levelstartat1}{\\lfolevel\\listoverridestartat\\levelstartat1}{\\lfolevel\\listoverridestartat\\levelstartat1}\\ls30}{\\listoverride\\listid984241419\n\\listoverridecount0\\ls31}{\\listoverride\\listid162478944\\listoverridecount0\\ls32}}{\\*\\pgptbl {\\pgp\\ipgp0\\itap0\\li0\\ri0\\sb0\\sa0}{\\pgp\\ipgp0\\itap0\\li0\\ri0\\sb0\\sa0}{\\pgp\\ipgp0\\itap0\\li0\\ri0\\sb0\\sa0}{\\pgp\\ipgp0\\itap0\\li0\\ri0\\sb0\\sa0}{\\pgp\\ipgp0\\itap0\\li0\\ri0\n\\sb0\\sa0}{\\pgp\\ipgp0\\itap0\\li0\\ri0\\sb0\\sa0}{\\pgp\\ipgp0\\itap0\\li0\\ri0\\sb0\\sa0}{\\pgp\\ipgp0\\itap0\\li0\\ri0\\sb0\\sa0}{\\pgp\\ipgp0\\itap0\\li0\\ri0\\sb0\\sa0}{\\pgp\\ipgp0\\itap0\\li0\\ri0\\sb0\\sa0}{\\pgp\\ipgp0\\itap0\\li0\\ri0\\sb0\\sa0}{\\pgp\\ipgp0\\itap0\\li0\\ri0\\sb0\\sa0}{\\pgp\n\\ipgp0\\itap0\\li0\\ri0\\sb0\\sa0}{\\pgp\\ipgp0\\itap0\\li0\\ri0\\sb0\\sa0}{\\pgp\\ipgp0\\itap0\\li0\\ri0\\sb0\\sa0}}{\\mmathPr\\mmathFont34\\mbrkBin0\\mbrkBinSub0\\msmallFrac0\\mdispDef1\\mlMargin0\\mrMargin0\\mdefJc1\\mwrapIndent1440\\mintLim0\\mnaryLim1}{\\info\n{\\title Spec 1.9a - Title page}{\\author The TWAIN Working Group}{\\operator Mark Mclaughlin}{\\creatim\\yr2013\\mo11\\dy4\\hr16\\min24}{\\revtim\\yr2020\\mo7\\dy8\\hr10\\min28}{\\printim\\yr2010\\mo7\\dy28\\hr8\\min8}{\\version43}{\\edmins169}{\\nofpages15}{\\nofwords5493}\n{\\nofchars31316}{\\*\\company JFL Peripheral Solutions Inc.}{\\nofcharsws36736}{\\vern111}}{\\*\\xmlnstbl {\\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}}\\paperw12240\\paperh15840\\margl1260\\margr1080\\margt1440\\margb1080\\gutter0\\ltrsect\\rtlgutter \n\\widowctrl\\ftnbj\\aenddoc\\trackmoves0\\trackformatting1\\donotembedsysfont0\\relyonvml0\\donotembedlingdata1\\grfdocevents0\\validatexml0\\showplaceholdtext0\\ignoremixedcontent0\\saveinvalidxml0\\showxmlerrors0\\margmirror\n\\noextrasprl\\cvmme\\sprsspbf\\brkfrm\\swpbdr\\noxlattoyen\\expshrtn\\noultrlspc\\dntblnsbdb\\nospaceforul\\lytprtmet\\hyphcaps0\\horzdoc\\fracwidth\\dghspace180\\dgvspace180\\dghorigin1701\\dgvorigin1984\\dghshow0\\dgvshow0\n\\jexpand\\viewkind1\\viewscale100\\pgbrdrhead\\pgbrdrfoot\\bdrrlswsix\\nolnhtadjtbl \\fet0{\\*\\wgrffmtfilter 013f}\\ilfomacatclnup12{\\*\\ftnsep \\ltrpar \\pard\\plain \\ltrpar\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \n\\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\chftnsep \n\\par }}{\\*\\ftnsepc \\ltrpar \\pard\\plain \\ltrpar\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af44 \n\\ltrch\\fcs0 \\chftnsepc \n\\par }}{\\*\\aftnsep \\ltrpar \\pard\\plain \\ltrpar\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af44 \n\\ltrch\\fcs0 \\chftnsep \n\\par }}{\\*\\aftnsepc \\ltrpar \\pard\\plain \\ltrpar\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af44 \n\\ltrch\\fcs0 \\chftnsepc \n\\par }}\\ltrpar \\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\footerr \\ltrpar \\pard\\plain \\ltrpar\\s25\\ql \\li0\\ri0\\widctlpar\\tqr\\tx9900\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \n\\ai\\af1\\afs16\\alang1025 \\ltrch\\fcs0 \\i\\f1\\fs16\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 TWAIN for C#\\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\cs32  PAGE }}{\\fldrslt {\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \n\\cs32\\lang1024\\langfe1024\\noproof 11}}}\\sectd \\ltrsect\\linex0\\endnhere\\sectdefaultcl\\sftnbj {\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\cs32 \n\\par Kodak Alaris Inc.}{\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \n\\par }}{\\*\\pnseclvl1\\pnucrm\\pnstart1\\pnindent720\\pnhang {\\pntxta .}}{\\*\\pnseclvl2\\pnucltr\\pnstart1\\pnindent720\\pnhang {\\pntxta .}}{\\*\\pnseclvl3\\pndec\\pnstart1\\pnindent720\\pnhang {\\pntxta .}}{\\*\\pnseclvl4\\pnlcltr\\pnstart1\\pnindent720\\pnhang {\\pntxta )}}\n{\\*\\pnseclvl5\\pndec\\pnstart1\\pnindent720\\pnhang {\\pntxtb (}{\\pntxta )}}{\\*\\pnseclvl6\\pnlcltr\\pnstart1\\pnindent720\\pnhang {\\pntxtb (}{\\pntxta )}}{\\*\\pnseclvl7\\pnlcrm\\pnstart1\\pnindent720\\pnhang {\\pntxtb (}{\\pntxta )}}{\\*\\pnseclvl8\n\\pnlcltr\\pnstart1\\pnindent720\\pnhang {\\pntxtb (}{\\pntxta )}}{\\*\\pnseclvl9\\pnlcrm\\pnstart1\\pnindent720\\pnhang {\\pntxtb (}{\\pntxta )}}\\pard\\plain \\ltrpar\\ql \\li0\\ri0\\sb1440\\widctlpar\\brdrt\\brdrs\\brdrw60\\brsp20\\brdrcf13 \n\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\f31506 \n\\par }\\pard \\ltrpar\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 {\\rtlch\\fcs1 \\af1\\afs56 \\ltrch\\fcs0 \\b\\f31506\\fs56\\cf9 TWAIN for C#\n\\par }\\pard \\ltrpar\\ql \\li1440\\ri0\\sb120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 {\\rtlch\\fcs1 \\ab\\af1\\afs28 \\ltrch\\fcs0 \\b\\f31506\\fs28\\cf13 For Version 2.4.11.0\n\\par }\\pard \\ltrpar\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 {\\rtlch\\fcs1 \\ab\\af1\\afs28 \\ltrch\\fcs0 \\b\\f31506\\fs28 July 8}{\\rtlch\\fcs1 \\ab\\af1\\afs28 \\ltrch\\fcs0 \\b\\f31506\\fs28\\super th}{\\rtlch\\fcs1 \\ab\\af1\\afs28 \n\\ltrch\\fcs0 \\b\\f31506\\fs28 , 2020\n\\par }\\pard \\ltrpar\\ql \\li1440\\ri0\\sb360\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 {\\rtlch\\fcs1 \\af1\\afs28 \\ltrch\\fcs0 \\f31506\\fs28 \n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\sb120\\widctlpar\\brdrt\\brdrs\\brdrw60\\brsp20\\brdrcf13 \\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\f31506 \n\\par }\\pard \\ltrpar\\ql \\li1440\\ri0\\sb240\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\f31506 \n\\par }\\pard \\ltrpar\\ql \\li1440\\ri0\\sb360\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\f31506 \n\\par \n\\par }\\pard \\ltrpar\\qc \\li0\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\f31506 \n\\par }\\pard \\ltrpar\\ql \\li720\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \\af44\\afs40 \\ltrch\\fcs0 \\f31506\\fs40 \\page }{\\rtlch\\fcs1 \\af1\\afs36 \\ltrch\\fcs0 \\b\\f31506\\fs36\\cf9  \n\\par }\\pard \\ltrpar\\ql \\li720\\ri0\\sb180\\keep\\keepn\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \\af1\\afs36 \\ltrch\\fcs0 \\b\\f31506\\fs36\\cf9 Contents\n\\par }\\pard\\plain \\ltrpar\\s98\\ql \\li1080\\ri0\\sb120\\keepn\\widctlpar\\tqr\\tldot\\tx9893\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1080\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs20\\alang1025 \\ltrch\\fcs0 \\b\\f1\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \n{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\b0\\f31506  TOC \\\\o \"1-3\" \\\\h \\\\z \\\\u }}{\\fldrslt {\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc45096514\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500310034000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\f37\\ul\\cf2\\lang1024\\langfe1024\\noproof Purpose}{\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc45096514 \\\\h }{\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500310034000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 4}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\ab0\\af31507\\afs22 \\ltrch\\fcs0 \n\\b0\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc45096515\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500310035000000}}}{\\fldrslt {\n\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\f37\\ul\\cf2\\lang1024\\langfe1024\\noproof License}{\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF \n_Toc45096515 \\\\h }{\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500310035000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden 4}}}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \n\\ab0\\af31507\\afs22 \\ltrch\\fcs0 \\b0\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc45096516\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500310036000000}}}{\\fldrslt {\n\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof Project Repository}{\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden  \nPAGEREF _Toc45096516 \\\\h }{\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500310036000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af1 \n\\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 5}}}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\n\\rtlch\\fcs1 \\ab0\\af31507\\afs22 \\ltrch\\fcs0 \\b0\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }\\pard\\plain \\ltrpar\\s176\\ql \\li1440\\ri0\\sb180\\widctlpar\\tqr\\tldot\\tx9883\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \n{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc45096517\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500310037000000}}}{\\fldrslt {\n\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof Installation}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden  \nPAGEREF _Toc45096517 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500310037000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \n\\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 5}}}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\n\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc45096518\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500310038000000}}}{\\fldrslt {\n\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof Versioning}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden  \nPAGEREF _Toc45096518 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500310038000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \n\\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 5}}}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\n\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }\\pard\\plain \\ltrpar\\s98\\ql \\li1080\\ri0\\sb120\\keepn\\widctlpar\\tqr\\tldot\\tx9893\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1080\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs20\\alang1025 \\ltrch\\fcs0 \\b\\f1\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \n{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc45096519\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500310039000000}}}{\\fldrslt {\n\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof Project Layout}{\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden  \nPAGEREF _Toc45096519 \\\\h }{\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500310039000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af1 \n\\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 6}}}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\n\\rtlch\\fcs1 \\ab0\\af31507\\afs22 \\ltrch\\fcs0 \\b0\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }\\pard\\plain \\ltrpar\\s176\\ql \\li1440\\ri0\\sb180\\widctlpar\\tqr\\tldot\\tx9883\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \n{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc45096520\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500320030000000}}}{\\fldrslt {\n\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof Basic TWAIN C# Definitions and Helper Functions}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc45096520 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500320030000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 6}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc45096521\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500320031000000}}}{\\fldrslt {\n\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof A TWAIN C# Toolkit}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc45096521 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500320031000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 7}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc45096522\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500320032000000}}}{\\fldrslt {\n\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof A TWAIN C# Diagnostic Application}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc45096522 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500320032000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 7}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc45096523\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500320033000000}}}{\\fldrslt {\n\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof A TWAIN C# Sample Application}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc45096523 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500320033000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 8}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc45096524\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500320034000000}}}{\\fldrslt {\n\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof A TWAIN C# Self Certification Application}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc45096524 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500320034000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 8}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }\\pard\\plain \\ltrpar\\s98\\ql \\li1080\\ri0\\sb120\\keepn\\widctlpar\\tqr\\tldot\\tx9893\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1080\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs20\\alang1025 \\ltrch\\fcs0 \\b\\f1\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \n{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc45096525\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500320035000000}}}{\\fldrslt {\n\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof Release Notes}{\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden  \nPAGEREF _Toc45096525 \\\\h }{\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500320035000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af1 \n\\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 10}}}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\n\\rtlch\\fcs1 \\ab0\\af31507\\afs22 \\ltrch\\fcs0 \\b0\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }\\pard\\plain \\ltrpar\\s176\\ql \\li1440\\ri0\\sb180\\widctlpar\\tqr\\tldot\\tx9883\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \n{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc45096526\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500320036000000}}}{\\fldrslt {\n\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof V2.4.11.0 (08-Jul-2020)}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc45096526 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500320036000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 10}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc45096527\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500320037000000}}}{\\fldrslt {\n\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof V2.4.10.0 (06-Jun-2020)}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc45096527 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500320037000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 10}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc45096528\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500320038000000}}}{\\fldrslt {\n\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof V2.4.9.0 (30-Apr-2020)}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc45096528 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500320038000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 10}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc45096529\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500320039000000}}}{\\fldrslt {\n\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof V2.4.8.0 (30-Mar-2020)}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc45096529 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500320039000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 10}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc45096530\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500330030000000}}}{\\fldrslt {\n\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof V2.4.6.0 (26-Mar-2020)}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc45096530 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500330030000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 11}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc45096531\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500330031000000}}}{\\fldrslt {\n\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof V2.4.5.0 (24-Mar-2020)}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc45096531 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500330031000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 11}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc45096532\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500330032000000}}}{\\fldrslt {\n\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof V2.4.4.0 (24-Mar-2020)}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc45096532 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500330032000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 11}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc45096533\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500330033000000}}}{\\fldrslt {\n\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof V2.4.3.0 (20-Mar-2020)}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc45096533 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500330033000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 11}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc45096534\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500330034000000}}}{\\fldrslt {\n\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof V2.4.2.0 (13-Mar-2020)}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc45096534 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500330034000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 12}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc45096535\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500330035000000}}}{\\fldrslt {\n\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof V2.4.1.0 (30-Jan-2020)}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc45096535 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500330035000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 12}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc45096536\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500330036000000}}}{\\fldrslt {\n\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof V2.4.0.3 (13-Mar-2019)}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc45096536 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500330036000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 12}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc45096537\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500330037000000}}}{\\fldrslt {\n\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof V2.4.0.2 (25-Jan-2019)}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc45096537 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500330037000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 12}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc45096538\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500330038000000}}}{\\fldrslt {\n\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof V2.4.0.1 (19-Apr-2018)}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc45096538 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500330038000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 13}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc45096539\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500330039000000}}}{\\fldrslt {\n\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof V2.4.0.0 (darned if I know, 2017)}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc45096539 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500330039000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 13}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc45096540\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500340030000000}}}{\\fldrslt {\n\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof V2.3.2.0 (18-Oct-2015)}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc45096540 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500340030000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 13}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc45096541\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500340031000000}}}{\\fldrslt {\n\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof V2.3.1.2 (13-Sep-2015)}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc45096541 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500340031000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 14}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc45096542\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500340032000000}}}{\\fldrslt {\n\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof V2.3.1.1 (27-Aug-2015)}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc45096542 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500340032000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 14}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc45096543\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500340033000000}}}{\\fldrslt {\n\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof V2.3.1.0 (13-Mar-2015)}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc45096543 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500340033000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 14}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc45096544\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500340034000000}}}{\\fldrslt {\n\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof V2.3.0.6 (30-Oct-2014)}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc45096544 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500340034000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 14}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc45096545\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500340035000000}}}{\\fldrslt {\n\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof V2.3.0.5 (19-Oct-2014)}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc45096545 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500340035000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 15}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc45096546\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500340036000000}}}{\\fldrslt {\n\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof V2.3.0.4 (13-Oct-2014)}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc45096546 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500340036000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 15}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc45096547\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500340037000000}}}{\\fldrslt {\n\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof V2.2.0 (11-Jul-2014)}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc45096547 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500340037000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 16}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc45096548\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500340038000000}}}{\\fldrslt {\n\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof V2.1.0 (09-Jul-2014)}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc45096548 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500340038000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 16}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc45096549\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500340039000000}}}{\\fldrslt {\n\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof V2.0.0 (21-May-2014)}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc45096549 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500340039000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 16}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc45096550\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500350030000000}}}{\\fldrslt {\n\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof V1.1.0 (27-Feb-2014)}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc45096550 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500350030000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 16}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof HYPERLINK \\\\l \"_Toc45096551\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500350031000000}}}{\\fldrslt {\n\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof V1.0.0 (05-Nov-2013)}{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \n\\lang1024\\langfe1024\\noproof\\webhidden  PAGEREF _Toc45096551 \\\\h }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden {\\*\\datafield \n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300340035003000390036003500350031000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden 17}}}\\sectd \\ltrsect\\rtlgutter\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \n\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof \n\\par }\\pard\\plain \\ltrpar\\s98\\ql \\li1440\\ri0\\sb120\\keep\\keepn\\widctlpar\\tqr\\tldot\\tx9893\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs20\\alang1025 \\ltrch\\fcs0 \\b\\f1\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 }}\n\\pard\\plain \\ltrpar\\s98\\ql \\li1440\\ri0\\sb120\\keep\\keepn\\widctlpar\\tqr\\tldot\\tx9893\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs20\\alang1025 \\ltrch\\fcs0 \\b\\f1\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \n\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\f31506\\cf9 {\\*\\bkmkstart _Toc234021027}\n\\par }\\pard\\plain \\ltrpar\\ql \\li720\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\f31506 \n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af50 \\ltrch\\fcs0 \\f31506 \n\\par }\\pard \\ltrpar\\ql \\li720\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \\af1\\afs36 \\ltrch\\fcs0 \\b\\f37\\fs36\\cf9 \n\\par }\\pard\\plain \\ltrpar\\s1\\ql \\li90\\ri0\\sb720\\keepn\\widctlpar\\brdrt\\brdrs\\brdrw30\\brsp120 \\wrapdefault\\nooverflow\\faroman\\outlinelevel0\\rin0\\lin90\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs36\\alang1025 \\ltrch\\fcs0 \n\\b\\f1\\fs36\\cf9\\lang1024\\langfe1024\\cgrid\\noproof\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\b0\\f37 \\page }{\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\f37\\noproof0 {\\*\\bkmkstart _Toc45096514}Purpose{\\*\\bkmkend _Toc45096514}\n\\par }\\pard\\plain \\ltrpar\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af44\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \nThis document serves as a brief introduction to the TWAIN CS projects.  It assumes familiarity with the C# programming language, and a basic understanding of the TWAIN Specification.\n\\par The version number supp\nlied in the title is a guide to when the document was last modified.  TWAIN supports feature negotiated interoperability between all versions of TWAIN enabled applications, TWAIN drivers (data sources), and the TWAIN Data Source Manager.\n\\par }{\\rtlch\\fcs1 \\af44 \\ltrch\\fcs0 \\f37 \n\\par }\\pard\\plain \\ltrpar\\s1\\ql \\li0\\ri0\\sb720\\keepn\\widctlpar\\brdrt\\brdrs\\brdrw30\\brsp120 \\wrapdefault\\nooverflow\\faroman\\outlinelevel0\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs36\\alang1025 \\ltrch\\fcs0 \n\\b\\f1\\fs36\\cf9\\lang1024\\langfe1024\\cgrid\\noproof\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\f37 {\\*\\bkmkstart _Toc45096515}License{\\*\\bkmkend _Toc45096515}\n\\par }\\pard\\plain \\ltrpar\\ql \\li1440\\ri0\\widctlpar\\wrapdefault\\faauto\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af49 \\ltrch\\fcs0 \\f37 \n\\par }{\\rtlch\\fcs1 \\af49\\afs22 \\ltrch\\fcs0 \\f37\\fs22 Copyright (C) 2013-2020 Kodak Alaris Inc.\n\\par \n\\par Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, inclu\nding without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\\par \n\\par The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\\par \n\\par THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES \nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR \nIN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\\par }\\pard \\ltrpar\\ql \\li720\\ri0\\sb180\\keep\\keepn\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \\af1\\afs36 \\ltrch\\fcs0 \\b\\f37\\fs36\\cf9 \n\\par }\\pard \\ltrpar\\ql \\li720\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \\af50 \\ltrch\\fcs0 \\f31506 \n\\par }\\pard\\plain \\ltrpar\\s189\\ql \\li0\\ri0\\keepn\\pagebb\\widctlpar\\brdrt\\brdrs\\brdrw30\\brsp120 \\wrapdefault\\nooverflow\\faroman\\outlinelevel0\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs24\\alang1025 \\ltrch\\fcs0 \n\\b\\f1\\fs24\\cf9\\lang1024\\langfe1024\\cgrid\\noproof\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af1\\afs36 \\ltrch\\fcs0 \\f31506\\fs36\\noproof0 {\\*\\bkmkstart _Toc45096516}Project Repository{\\*\\bkmkend _Toc45096516}\n\\par }\\pard\\plain \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506\\cf6 \n\\par }\\pard\\plain \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af37\\afs22\\alang1025 \\ltrch\\fcs0 \\f37\\fs22\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\v\\f31506\\cf6 [Technical Notes]}{\\rtlch\\fcs1 \\af0\\afs20 \\ltrch\\fcs0 \\i\\v\\f31506\\fs20\\cf6 \n\\par }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\v\\f31506\\cf6 I think we made a mistake here.  All of the capabilities that use TW_ARRAY containers only show TW_ONEVALUE as the valid container for MSG_SET.  It should be TW_ONEVALUE and TW_ARRAY.\n\\par }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\f31506\\cf6 \n\\par }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\f31506 TWAIN for C-Sharp (C#) resides on GitHub at }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0  HYPERLINK \"https://github.com/twain/twain-cs\" }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 {\\*\\datafield \n00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b5c000000680074007400700073003a002f002f006700690074006800750062002e0063006f006d002f0074007700610069006e002f0074007700610069006e002d00630073000000795881f43b1d7f48af2c825dc485\n276300000000a5ab00030000001500ef0000}}}{\\fldrslt {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\cs187\\ul\\cf2 https://github.com/twain/twain-cs}}}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af37 \n\\ltrch\\fcs0 \\f31506 .\n\\par }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul {\\*\\bkmkstart _Toc45096517}Installation{\\*\\bkmkend _Toc45096517}\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n\\par There is a releases folder that contains release and debug copies of the binaries.  There is no installation kit, just run them as-is.  If running on Linux or macOS \nit may be necessary to install or upgrade Mono to v4.8 or higher.  The certification tool automatically creates a \\lquote TWAIN Self Certification\\rquote  folder on the user\\rquote s desktop, which contains all the stuff needed for certification.\n\\par \n\\par \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul {\\*\\bkmkstart _Toc45096518}Versioning{\\*\\bkmkend _Toc45096518}\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\f31506 \n\\par The versioning scheme takes the form: TWAIN-ProtocolMajor.TWAIN-ProtocolMinor.Interface.Build\n\\par \n\\par If the TWAIN Specification is at 2.3 then the version will be 2.3.i.b.  This is for notational purposes only, TWAIN interoperates at all \nversions of the protocol, so there is no requirement that a developer has to use any specific version, or immediately upgrade if there is a change to the TWAIN Specification.\n\\par \n\\par The interface number rises if there is a modification to the TWAINCS or TWAINCST\noolkit that requires a code change in TWAINCSTest or TWAINCSScan.  For instance, adding a new argument to the ReportImage function.  This lets a developer know that downloading the new version will most likely require some work in their code before they c\nan use it.  This assumption always applies when the TWAIN Specification changes, so the interface number resets to 0 when they are modified.\n\\par \n\\par The build number tracks releases for a given version of the TWAIN Specification, and always rises until a new version of the spec is adopted.\n\\par \n\\par So, for example (fictitious sequence, just to show how it works):\n\\par \n\\par 2.3.0.0 \\endash  initial release to go with TWAIN 2.3\n\\par 2.3.0.1 \\endash  bug fix\n\\par 2.3.0.2 \\endash  bug fix\n\\par 2.3.1.3 \\endash  interface change\n\\par 2.3.1.4 \\endash  bug fix\n\\par 2.4.0.0 \\endash  initial release to go with TWAIN 2.4\n\\par \n\\par }\\pard\\plain \\ltrpar\\s189\\ql \\li0\\ri0\\keepn\\pagebb\\widctlpar\\brdrt\\brdrs\\brdrw30\\brsp120 \\wrapdefault\\nooverflow\\faroman\\outlinelevel0\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs24\\alang1025 \\ltrch\\fcs0 \n\\b\\f1\\fs24\\cf9\\lang1024\\langfe1024\\cgrid\\noproof\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af1\\afs36 \\ltrch\\fcs0 \\f31506\\fs36\\noproof0 {\\*\\bkmkstart _Toc45096519}Project Layout{\\*\\bkmkend _Toc45096519}\n\\par }\\pard\\plain \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506\\cf6 \n\\par }\\pard\\plain \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af37\\afs22\\alang1025 \\ltrch\\fcs0 \\f37\\fs22\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\v\\f31506\\cf6 [Technical Notes]}{\\rtlch\\fcs1 \\af0\\afs20 \\ltrch\\fcs0 \\i\\v\\f31506\\fs20\\cf6 \n\\par }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\v\\f31506\\cf6 I think we made a mistake here.  All of the capabilities that use TW_ARRAY containers only show TW_ONEVALUE as the valid container for MSG_SET.  It should be TW_ONEVALUE and TW_ARRAY.\n\\par }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\f31506\\cf6 \n\\par }\\pard \\ltrpar\\s199\\ql \\li360\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin360\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\f31506 There are five projects in the TWAIN CS repository, with a single solution file to access them all:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 \\f31506 Basic TWAIN C# Definitions and Helper Functions\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}A TWAIN C# Toolkit\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}A TWAIN C# Diagnostic Application\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}A TWAIN C# Sample Application\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 A TWAIN C# Self Certification Application\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\f31506 \n\\par }\\pard \\ltrpar\\s199\\ql \\li360\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin360\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\f31506 \nThe toolkit references the base definitions, and the applications reference the toolkit (with the exception of \nof the Certification app).  This is done to maximize the amount of shared code within the repository, and to allow for the seamless addition of new projects.\n\\par \n\\par The toolkit seemed like a good idea once.  However, after writing the Certification tool the basic functions are so completely developed that a strong case can be made for accessing them directly.  If interested in doing that, then base any code on the Ce\nrtification tool instead of the Sample application.\n\\par \n\\par Application writers must not assume that these references will remain stable.  They will not be versioned.  The projects will be updated as needed, resulting in assemblies that are not compatible with prior releases.\n\\par \n\\par It\\rquote s assumed that application writers will opt to pull this source code into a single assembly, the most common selection being the basic definitions, the toolkit and the sample application.  Updates will be accomplished by pulling in newer v\nersions of these files.  Updates will typically come from the basic definitions and the toolkit.\n\\par \n\\par If you decide to keep the items as separate projects, then make a note of the <HintPath> inside of each of the .csproj files.  Replacing the platform\\\\configuration folder names with }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 $(Platform)\\\\\n$(Configuration) makes for a much better build experience, since the references correctly track to the current settings.\n\\par }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\f31506 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\f31506 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\f31506\\ul {\\*\\bkmkstart _Toc45096520}Basic TWAIN C# Definitions and Helper Functions\n{\\*\\bkmkend _Toc45096520}\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\f31506 \n\\par }\\pard \\ltrpar\\s199\\ql \\li360\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin360\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\f31506 TWAINH.CS contains all o\nf the C/C++ TWAIN.H definitions for the version of TWAIN referenced on the title page of this document.\n\\par \n\\par TWAIN.CS contains helper functions designed to hide platform specific details, and to promote best practices when interfacing with the TWAIN Data Source Manager and TWAIN drivers.  Best practices cover a few areas:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \\af0 \n\\ltrch\\fcs0 \\f31506 Funnel all commands through a single thread\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Automatically collect the condition code when TWRC.Failure is detected\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Automatically resynchronize the TWAIN state if a sequence error is detected\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Provide ways to acess the data through CSV strings\n\\par }\\pard \\ltrpar\\s199\\ql \\li360\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin360\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\f31506 \n\\par Both files expose their functionality through the TWAIN class in the TWAINWorkingGroup namespace.\n\\par \n\\par \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\f31506 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\f31506\\ul {\\*\\bkmkstart _Toc45096521}A TWAIN C# Toolkit{\\*\\bkmkend _Toc45096521}\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\f31506 \n\\par }\\pard \\ltrpar\\s199\\ql \\li360\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin360\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\f31506 The TWAIN C# Toolkit references TWAIN.  This toolkit isn\\rquote \nt as comprehensive as some designed for C/C++, which aim to hide much of the complexity of TWAIN.  Instead, this toolkit addresses two main concerns:  the data marshaling challenges of using a C/C++ API with C#, and the complexities of the scan loop.\n\n\\par \n\\par Honestly, it\\rquote s a bit of a mess.  Especially the ScanCallback function.  Give serious consideration to skipping it, using the TWAIN Cerification tool as a better template for code development.  At some point I\\rquote \nll make another project to demonstrate that.\n\\par \n\\par TWAIN depends upon C/C++ structures and pointers for communication between the application and the driver.  The TWAIN C# Toolkit addresses this by translating data into CSV strings.  These strings follow the format of the TWAIN structures (position and ty\npe), but are rendered as text.  This makes it relatively easy for a caller to get and set data, while still fully operating within the TWAIN name and number space.\n\\par \n\\par The TWAIN C# Diagnostic Application presents and consumes CSV data in its user interface, so it\\rquote \ns easiest to see this system in action there, it can be used as a test bed when seeking to understand how to construct CSV strings to send to the driver.  The TWAIN C# Sample Application also uses CSV to examine data, and to set capabilities, but does \nso programmatically instead of through a user interface.  It helps to have access to a copy of TWAINH.CS handy when looking at the CSV data.\n\\par \n\\par The scan loop is the second main issue most applications run into.  The loop runs inside of the TWAIN thread using\n callbacks to give the application access to the images and metadata returned by the TWAIN driver.  This reduces that amount of code an application needs without sacrificing access to the full set of supported ICAP_XFERMECH transfer options.  It also guar\nantees the responsiveness of the application, since operations never impede the windowing message loop.\n\\par \n\\par Assuming a well-behaved TWAIN driver, the application user is able to gracefully exit from the application at any time they choose, even in the middle of scanning.\n\\par \n\\par This TWAIN Toolkit exposes its functionality through the TWAINCSToolkit class in the TWAINWorkingGroupToolkit namespace.\n\\par \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\f31506 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\f31506\\ul {\\*\\bkmkstart _Toc45096522}A TWAIN C# Diagnostic Application{\\*\\bkmkend _Toc45096522}\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\f31506 \n\\par }\\pard \\ltrpar\\s199\\ql \\li360\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin360\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\f31506 This application references TWAINCSToolkit.  The code is not \nintended as seed code for applications.  It is a comprehensive frontend to the TWAIN API.  It allows the selection of any combination of TWAIN triplets, including ones that are illegal or are out of sequence with the current TWAIN state.  It is best compa\nred to the TWACKER application, which has long been the main way to exercise TWAIN drivers on Microsoft Windows systems.\n\\par \n\\par Data is presented and consumed in the form of CSV strings.  Familiarity with the various TWAIN structures is essential, since these str\nings do not include self-referential metadata, aside from the content described by the TWAIN Specification.  As mentioned above, }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 it helps to have access to a copy of TWAINH.CS handy when looking at the CSV data.}{\n\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\f31506 \n\\par \n\\par The application tries to reduce mouse click\ns for some common operations.  For instance, upon successful completion of the DG_CONTROL / DAT_PARENT / MSG_OPENDSM operation, the dropdown values are set to DG_CONTROL / DAT_IDENTITY / MSG_GETFIRST, to enumerate the first TWAIN driver in the list of dri\nvers.  After a few uses it\\rquote ll be apparent when the application is trying to help.\n\\par \n\\par A @-command system has been added.  It doesn\\rquote t do much at the moment, but it could be expanded to allow for more complex behavior.  For instance, some kind of scripting syste\nm that would allow the diagnostic tool to help with automated tests.  It becomes available after opening a DSM.  Type @help in the text box and press the Send button to get the list of supported commands.\n\\par \n\\par \n\\par \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\f31506 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\f31506\\ul {\\*\\bkmkstart _Toc45096523}A TWAIN C# Sample Application{\\*\\bkmkend _Toc45096523}\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\f31506 \n\\par }\\pard \\ltrpar\\s199\\ql \\li360\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin360\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\f31506 \nThis application references TWAINCSToolkit.  The code is intended as seed code for applications, and demonstrates the easiest way to access the full range of functionality present in TWAIN.\n\\par \n\\par For TWAIN drivers that support DG_CONTROL / DAT_USERINTERFACE / MSG_ENABLEDSUIONLY and DG_CONTROL / DAT_CUSTOMDSDATA / MSG_*, the application supports a \\'93snapshot\\'94\n system.  This allows a user to configure a TWAIN driver and save its setting under a descriptive name that can be used to restore those settings prior to scanning.\n\\par \n\\par For drivers that don\\rquote t support these operations the application defaults to the older }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 DG_CONTROL / DAT_USERINTERFACE / MSG_ENABLEDS system, with TW_USERINTERFACE.ShowUI set to TRUE.\n\\par \n\\par An application writer also has the option to programmatically negotiate capabilities.  The sample app doesn\\rquote t show this path, but it\\rquote s relatively easy to add for a small number of configurable items.}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\f31506 \n\n\\par }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\par \n\\par \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul {\\*\\bkmkstart _Toc45096524}A TWAIN C# Self Certification Application{\\*\\bkmkend _Toc45096524}\n\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\par }\\pard \\ltrpar\\s199\\ql \\li360\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin360\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 This ap\nplication serves three purposes.  It shows a reasonably good way of interfacing with TWAIN from C#.  It allows a user to interact directly with a TWAIN driver (with the aid of scripts).  And it offers a way to certify that a TWAIN driver is compliant with\n the specification.\n\\par \n\\par Note that the correct binary must be run to interface with 32-bit or 64-bit drivers.  This code has been tested on Windows, Linux, and Mac (the last two using Mono 4.8 or later).\n\\par \n\\par The tool has help built into it.  It also comes with a large collection of scripts.  If you use the \\lquote runv\\rquote  command with the script, you\\rquote ll get some insight into what arguments are needed for the \\lquote dsmentry\\rquote  command.\n\n\\par \n\\par It should be a good tool for developers, allowing them to explore the kind of commands they\\rquote ll need to issue from other languages, like C++.\n\\par \n\\par If developing with the tool, it\\rquote ll use the data folder located with the binary.  The release version normally defaults to the \\'93TWAIN Self Certification/data\\'94 folder on the desktop.\n\\par }\\pard\\plain \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\faauto\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\f31506 \n\\par }\\pard\\plain \\ltrpar\\s189\\ql \\li0\\ri0\\keepn\\pagebb\\widctlpar\\brdrt\\brdrs\\brdrw30\\brsp120 \\wrapdefault\\nooverflow\\faroman\\outlinelevel0\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs24\\alang1025 \\ltrch\\fcs0 \n\\b\\f1\\fs24\\cf9\\lang1024\\langfe1024\\cgrid\\noproof\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af1\\afs36 \\ltrch\\fcs0 \\f31506\\fs36\\noproof0 {\\*\\bkmkstart _Toc45096525}Release Notes{\\*\\bkmkend _Toc45096525}\n\\par }\\pard\\plain \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af37\\afs22\\alang1025 \\ltrch\\fcs0 \\f37\\fs22\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\cf6 \n\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul {\\*\\bkmkstart _Toc45096526}V2.4.11.0 (08-Jul-2020)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n{\\*\\bkmkend _Toc45096526} \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 New Features:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 (none)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Bug Fixes:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Added deprecated capabilites to LookupTable.tc\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Fixed cert to skip deprecated capabilties\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Fixed to better handle when a driver isn\\rquote t successfully opened (skip  the tests)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Known Issues:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 (none)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Wish List:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Want to switch to something other than WinForms, especially for macOS\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Need to add some more certification tests, especially for things like printer, barcode, patch\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\cf6 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul {\\*\\bkmkstart _Toc45096527}V2.4.10.0 (06-Jun-2020)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n{\\*\\bkmkend _Toc45096527} \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 New Features:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 (none)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Bug Fixes:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Fixed twaincert.exe to run from the releases folder without thinking it\\rquote s a development path, so it correctly creates the \\lquote data\\rquote  folder in the \\lquote TWAIN Self Certification\\rquote  folder on the desktop.\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Known Issues:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 (none)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Wish List:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Want to switch to something other than WinForms, especially for macOS\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Need to add some more certification tests, especially for things like printer, barcode, patch\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\cf6 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul {\\*\\bkmkstart _Toc45096528}V2.4.9.0 (30-Apr-2020)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n{\\*\\bkmkend _Toc45096528} \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 New Features:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 (none)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Bug Fixes:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 The MSG_SET certification test was using the MSG_GET container, when the 2.4 spec states that it should only use TW_ONEVALUE or TW_ARRAY (the others being for MSG_SETCONTAINER), so that\\rquote s fixed now\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}\nFixed TWBP_* values to not return symbolic names, the support for symbolic names with TW_RANGE gets too weird too fast, staying with numbers offers fewer problems\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Known Issues:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 (none)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Wish List:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Want to switch to something other than WinForms, especially for macOS\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Need to add some more certification tests, especially for things like printer, barcode, patch\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\cf6 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul {\\*\\bkmkstart _Toc45096529}V2.4.8.0 (30-Mar-2020)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n{\\*\\bkmkend _Toc45096529} \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 New Features:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Switched almost all of the csv functions to static\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}(yah, skipped 2.4.7, kinda)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Bug Fixes:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 (none)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Known Issues:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 (none)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Wish List:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Want to switch to something other than WinForms, especially for macOS\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Need to add some more certification tests, especially for things like printer, barcode, patch\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\cf6 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul {\\*\\bkmkstart _Toc45096530}V2.4.6.0 (26-Mar-2020)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n{\\*\\bkmkend _Toc45096530} \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 New Features:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 (none)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Bug Fixes:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 MSG_XFERREADY wasn\\rquote t being handled properly if ShowUI was TRUE\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Known Issues:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 (none)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Wish List:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Want to switch to something other than WinForms, especially for macOS\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Need to add some more certification tests, especially for things like printer, barcode, patch\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul {\\*\\bkmkstart _Toc45096531}V2.4.5.0 (24-Mar-2020)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n{\\*\\bkmkend _Toc45096531} \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 New Features:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 (none)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Bug Fixes:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Stupid data folder wasn\\rquote t being properly created (grrr)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Known Issues:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 (none)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Wish List:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Want to switch to something other than WinForms, especially for macOS\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Need to add some more certification tests, especially for things like printer, barcode, patch\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\cf6 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul {\\*\\bkmkstart _Toc45096532}V2.4.4.0 (24-Mar-2020)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n{\\*\\bkmkend _Toc45096532} \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 New Features:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Fixed issues related to TWAIN Direct support, and added it to certification\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Added makerelease.bat file\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Bug Fixes:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 (none)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Known Issues:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 (none)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Wish List:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Want to switch to something other than WinForms, especially for macOS\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Need to add some more certification tests, especially for things like printer, barcode, patch\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\cf6 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul {\\*\\bkmkstart _Toc45096533}V2.4.3.0 (20-Mar-2020)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n{\\*\\bkmkend _Toc45096533} \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 New Features:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Switched twaincsscan and twaincstst to directly access TWAIN.CS\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}The toolkit is officially deprecated now, don\\rquote t use it\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Bug Fixes:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Fixed an issue where xferready during enableds could be missed\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Known Issues:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 (none)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Wish List:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Want to switch to something other than WinForms, especially for macOS\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Need to add some more certification tests, especially for things like printer, barcode, patch\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\cf6 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul {\\*\\bkmkstart _Toc45096534}V2.4.2.0 (13-Mar-2020)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n{\\*\\bkmkend _Toc45096534} \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 New Features:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Massive update to TWAIN.CS\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}twaincscert is pretty much done\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Bug Fixes:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Too many to count, twaincscert helped scrub the code\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Known Issues:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 (none)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Wish List:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Want to switch to something other than WinForms, especially for macOS\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Need to add some more certification tests, especially for things like printer, barcode, patch\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\cf6 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul {\\*\\bkmkstart _Toc45096535}V2.4.1.0 (30-Jan-2020)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n{\\*\\bkmkend _Toc45096535} \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 New Features:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Added twaincscert project (it\\rquote s not done yet, but it is useable)\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Fixed reflection to allow use of capability enumerations in the CSV (ex: TWPT_RGB)\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Expanded ability to use TWAIN.CS without the toolkit (needed for cert)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Bug Fixes:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 (none)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Known Issues:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Runs rather slowly on Mac OS X\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Setup Dialog sometimes freaks out on Mac OS X (appears to be a WinForms bug)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Wish List:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 64-bit Mono support on Mac OS X (should just work, but needs building / testing)\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Want to switch to Xamarin\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\cf6 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul {\\*\\bkmkstart _Toc45096536}V2.4.0.3 (13-Mar-2019)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n{\\*\\bkmkend _Toc45096536} \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 New Features:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 (none)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Bug Fixes:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Fixed an encoding problem, TWAIN on Windows requires strings in the encoding specified by the driver (either through it\\rquote \ns TW_IDENTITY.Version.Language or the last successful set of CAP_LANGUAGE).  Until this fix TWAIN CS was sending strings as UTF-8.  Note that on Linux and macOS UTF-8 is the encoding, that hasn\\rquote t changed.\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Known Issues:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Runs rather slowly on Mac OS X\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Setup Dialog sometimes freaks out on Mac OS X (appears to be a WinForms bug)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Wish List:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 64-bit Mono support on Mac OS X (should just work, but needs building / testing)\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Want to switch to Xamarin\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul {\\*\\bkmkstart _Toc45096537}V2.4.0.2 (25-Jan-2019)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n{\\*\\bkmkend _Toc45096537} \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 New Features:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 In sync with TWAIN Direct\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Updated to VS2017\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Bug Fixes:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Fixed problem with FIX32 in TW_RANGE\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Fixed problems with SendDat for custom DAT support\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Known Issues:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Runs rather slowly on Mac OS X\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Setup Dialog sometimes freaks out on Mac OS X (appears to be a WinForms bug)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Wish List:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 64-bit Mono support on Mac OS X (should just work, but needs building / testing)\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Want to switch to Xamarin\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\cf6 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul {\\*\\bkmkstart _Toc45096538}V2.4.0.1 (19-Apr-2018)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n{\\*\\bkmkend _Toc45096538} \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 New Features:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 In sync with TWAIN Direct\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Bug Fixes:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Code analysis with VS2015, fixed up everything, supressed some stuff\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Finally got the Linux 64-bit thing right (lots of edge cases)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Known Issues:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Runs rather slowly on Mac OS X\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Setup Dialog sometimes freaks out on Mac OS X (appears to be a WinForms bug)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Wish List:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 64-bit Mono support on Mac OS X (should just work, but needs building / testing)\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Want to switch to Xamarin, and VS2017\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\cf6 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul {\\*\\bkmkstart _Toc45096539}V2.4.0.0 (darned if I know, 2017)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n{\\*\\bkmkend _Toc45096539} \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 New Features:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Linux 64-bit support, despite the TW_INT32/TW_UINT32 fiasco\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Switched to log file backup scheme\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}In sync with TWAIN Direct\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Known Issues:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Runs rather slowly on Mac OS X\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Setup Dialog sometimes freaks out on Mac OS X (appears to be a WinForms bug)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Wish List:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 64-bit Mono support on Mac OS X (should just work, but needs building / testing)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\cf6 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul {\\*\\bkmkstart _Toc45096540}V2.3.2.0 (18-Oct-2015)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n{\\*\\bkmkend _Toc45096540} \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 New Features:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Override capability for logging\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Log files are now read shared, so they can be viewed while the code is running\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}RunInGuiThread scheme added to support Windows for bug listed below\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Added thread and state to the log lines, added OS to the title line\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Bug Fixes:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 DAT_USERINTERFACE and DAT_IMAGE*XFER run on the HWND thread on Windows, this fixes problems with a number of drivers that run their code in the message loop (addresses Ticket #11 and Ticket #14)\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}DsmMemLock on the native transfer handle (addresses Ticket #15)\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}I\\rquote m not closing the tickets until I get feedback, or if I hear nothing for a month or two\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Known Issues:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Runs rather slowly on Mac OS X\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Setup Dialog sometimes freaks out on Mac OS X (appears to be a WinForms bug)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Wish List:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 64-bit Mono support on Mac OS X (should just work, but needs building / testing)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\cf6 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul {\\*\\bkmkstart _Toc45096541}V2.3.1.2 (13-Sep-2015)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n{\\*\\bkmkend _Toc45096541} \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 New Features:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 (none)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Bug Fixes:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Solved issues with the DsmMem* functions\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Known Issues:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Runs rather slowly on Mac OS X\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Setup Dialog sometimes freaks out on Mac OS X (appears to be a WinForms bug)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Wish List:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 64-bit Mono support on Mac OS X (should just work, but needs building / testing)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul {\\*\\bkmkstart _Toc45096542}V2.3.1.1 (27-Aug-2015)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n{\\*\\bkmkend _Toc45096542} \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 New Features:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 (none)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Bug Fixes:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Log fix and sync with TWAIN Direct\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Known Issues:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Runs rather slowly on Mac OS X\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Setup Dialog sometimes freaks out on Mac OS X (appears to be a WinForms bug)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Wish List:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 64-bit Mono support on Mac OS X (should just work, but needs building / testing)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul {\\*\\bkmkstart _Toc45096543}V2.3.1.0 (13-Mar-2015)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n{\\*\\bkmkend _Toc45096543} \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 New Features:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Additional arguments to the ReportImage callback\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Bug Fixes:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Tested building using MonoDevelop on Ubuntu 14.04 (32-bit) using Mono 3.12.1, fixed two problems\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Known Issues:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Runs rather slowly on Mac OS X\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Setup Dialog sometimes freaks out on Mac OS X (appears to be a WinForms bug)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Wish List:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 64-bit Mono support on Mac OS X (should just work, but needs building / testing)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul {\\*\\bkmkstart _Toc45096544}V2.3.0.6 (30-Oct-2014)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n{\\*\\bkmkend _Toc45096544} \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 New Features:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 (none)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Bug Fixes:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Closed Ticket #6: DsmMemFree - Validate\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Ticket #5 has been resisting, this time I got it right\\'85\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Removed embedded tabs\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Confirmed successful tests with other vendors\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Fixed code to better handle when TWAIN DSM isn\\rquote t installed\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Known Issues:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Runs rather slowly on Mac OS X\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Setup Dialog sometimes freaks out on Mac OS X (appears to be a WinForms bug)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Wish List:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 64-bit Mono support on Mac OS X (should just work, but needs building / testing)\n\\par }\\pard\\plain \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f37\\cf6 \n\\par }\\pard\\plain \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af37\\afs22\\alang1025 \\ltrch\\fcs0 \\f37\\fs22\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\cf6 \n[Technical Notes]}{\\rtlch\\fcs1 \\af0\\afs20 \\ltrch\\fcs0 \\i\\v\\fs20\\cf6 \n\\par }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\v\\cf6 I think we made a mistake here.  All of the capabilities that use TW_ARRAY containers only show TW_ONEVALUE as the valid container for MSG_SET.  It should be TW_ONEVALUE and TW_ARRAY.\n\\par }\\pard\\plain \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f37\\cf6 \n\\par }\\pard\\plain \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af37\\afs22\\alang1025 \\ltrch\\fcs0 \\f37\\fs22\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\cf6 \n[Technical Notes]}{\\rtlch\\fcs1 \\af0\\afs20 \\ltrch\\fcs0 \\i\\v\\fs20\\cf6 \n\\par }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\v\\cf6 I think we made a mistake here.  All of the capabilities that use TW_ARRAY containers only show TW_ONEVALUE as the valid container for MSG_SET.  It should be TW_ONEVALUE and TW_ARRAY.\n\\par }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\cf6 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul {\\*\\bkmkstart _Toc45096545}V2.3.0.5 (19-Oct-2014)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n{\\*\\bkmkend _Toc45096545} \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 New Features:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 (none)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Bug Fixes:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Closed Ticket #3: can\\'b4t get capabilities; what can i get out of a_szMemref?\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Closed Ticket #4: Setup Scanner does not work in twancsscan (dialog freezes)\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Closed Ticket #5: Twain.DatParent - CloseDs should be CloseDsm\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Figured out the message pump issue\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Fixed SetImagePath to impact file transfers\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Known Issues:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Runs rather slowly on Mac OS X\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Setup Dialog sometimes freaks out on Mac OS X (looks like a race condition)\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Only tested on Kodak Alaris products and the TWAIN Sample Data Source\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Wish List:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Test with other vendors\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}64-bit Mono support on Mac OS X (should just work, but needs building / testing)\n\\par }\\pard\\plain \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f37\\cf6 \n\\par }\\pard\\plain \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af37\\afs22\\alang1025 \\ltrch\\fcs0 \\f37\\fs22\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\cf6 \n[Technical Notes]}{\\rtlch\\fcs1 \\af0\\afs20 \\ltrch\\fcs0 \\i\\v\\fs20\\cf6 \n\\par }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\v\\cf6 I think we made a mistake here.  All of the capabilities that use TW_ARRAY containers only show TW_ONEVALUE as the valid container for MSG_SET.  It should be TW_ONEVALUE and TW_ARRAY.\n\\par }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\cf6 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul {\\*\\bkmkstart _Toc45096546}V2.3.0.4 (13-Oct-2014)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n{\\*\\bkmkend _Toc45096546} \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 New Features:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Tracking the version number to the TWAIN Specification, so the major and minor will be the protocol value, the third number will call out major changes in the API \nwithin a version, and the fourth number will count minor changes to the API (like bug fixes)\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Added logging (still some work to do on this)\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Added auto JPEG/TIFF option for file  transfers\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Bug Fixes:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Fixed DAT_IMAGEMEMFILEXFER for Mac OS X\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Known Issues:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Runs rather slowly on Mac OS X\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Setup Dialog sometimes freaks out on Mac OS X (looks like a race condition)\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Only tested on Kodak Alaris products and the TWAIN Sample Data Source\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Wish List:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Test with other vendors\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}64-bit Mono support on Mac OS X (should just work, but needs testing)\n\\par }\\pard\\plain \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f37\\cf6 \n\\par }\\pard\\plain \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af37\\afs22\\alang1025 \\ltrch\\fcs0 \\f37\\fs22\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\cf6 \n[Technical Notes]}{\\rtlch\\fcs1 \\af0\\afs20 \\ltrch\\fcs0 \\i\\v\\fs20\\cf6 \n\\par }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\v\\cf6 I think we made a mistake here.  All of the capabilities that use TW_ARRAY containers only show TW_ONEVALUE as the valid container for MSG_SET.  It should be TW_ONEVALUE and TW_ARRAY.\n\\par }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\cf6 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul {\\*\\bkmkstart _Toc45096547}V2.2.0 (11-Jul-2014)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n{\\*\\bkmkend _Toc45096547} \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 New Features:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 (none)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Bug Fixes:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Fixed DAT_IMAGEMEMFILEXFER\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Known Issues:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Runs rather slowly on Mac OS X\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Setup Dialog sometimes freaks out on Mac OS X (looks like a race condition)\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Only tested on Kodak Alaris products and the TWAIN Sample Data Source\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Wish List:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Test with other vendors\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}64-bit Mono support on Mac OS X (should just work, but needs testing)\n\\par }\\pard\\plain \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506\\cf6 \n\\par }\\pard\\plain \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af37\\afs22\\alang1025 \\ltrch\\fcs0 \\f37\\fs22\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\v\\f31506\\cf6 [Technical Notes]}{\\rtlch\\fcs1 \\af0\\afs20 \\ltrch\\fcs0 \\i\\v\\f31506\\fs20\\cf6 \n\\par }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\v\\f31506\\cf6 I think we made a mistake here.  All of the capabilities that use TW_ARRAY containers only show TW_ONEVALUE as the valid container for MSG_SET.  It should be TW_ONEVALUE and TW_ARRAY.\n\\par }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\f31506\\cf6 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul {\\*\\bkmkstart _Toc45096548}V2.1.0 (09-Jul-2014)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n{\\*\\bkmkend _Toc45096548} \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 New Features:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 ReportImage\\rquote s bitmap no long locks access to the file\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Bug Fixes:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Handles MSG_XFERREADY when issued from MSG_ENABLEDS\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Known Issues:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Runs rather slowly on Mac OS X\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Setup Dialog sometimes freaks out on Mac OS X (looks like a race condition)\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Only tested on Kodak Alaris products and the TWAIN Sample Data Source\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Wish List:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Test with other vendors\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}64-bit Mono support on Mac OS X (should just work, but needs testing)\n\\par }\\pard \\ltrpar\\s199\\ql \\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\f31506\\ul {\\*\\bkmkstart _Toc45096549}V2.0.0 (21-May-2014)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\f31506 \n{\\*\\bkmkend _Toc45096549} \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\f31506 New Features:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 \\f31506 Support for 64-bit Linux (native only, 32-bit on 64-bit is too nasty)\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}ShowImage renamed to ReportImage\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\f31506 Known Issues:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 \\f31506 Runs rather slowly on Mac OS X\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Setup Dialog sometimes freaks out on Mac OS X (looks like a race condition)\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Only tested on Kodak Alaris products\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\f31506 Wish List:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 \\f31506 Test with other vendors\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}64-bit Mono support on Mac OS X (should just work, but needs testing)\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\cf6 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul {\\*\\bkmkstart _Toc45096550}V1.1.0 (27-Feb-2014)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n{\\*\\bkmkend _Toc45096550} \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 New Features:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Additional arguments in ShowImage\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Code example of CAP_INDICATORS in TWAINCSScan\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Fixed projects to handle conditional references\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Added AnyCPU support\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Known Issues:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Runs rather slowly on Mac OS X\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Setup Dialog sometimes freaks out on Mac OS X (looks like a race condition)\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Only tested on Kodak Alaris products\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Wish List:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Test with other vendors\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}64-bit Mono support on Linux and Mac OS X\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\cf6 \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul {\\*\\bkmkstart _Toc45096551}V1.0.0 (05-Nov-2013)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n{\\*\\bkmkend _Toc45096551} \n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 New Features:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Initial release\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Known Issues:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Runs rather slowly on Mac OS X\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Setup Dialog sometimes freaks out on Mac OS X (looks like a race condition)\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Only tested on Kodak Alaris products\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 Wish List:\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls32\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af37 \\ltrch\\fcs0 Test with other vendors\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}64-bit Mono support on Linux and Mac OS X}{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\f31506 \n\\par }\\pard\\plain \\ltrpar\\s189\\ql \\li0\\ri0\\keepn\\widctlpar\\brdrt\\brdrs\\brdrw30\\brsp120 \\wrapdefault\\nooverflow\\faroman\\outlinelevel0\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs24\\alang1025 \\ltrch\\fcs0 \n\\b\\f1\\fs24\\cf9\\lang1024\\langfe1024\\cgrid\\noproof\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\v\\f31506\\noproof0 {\\*\\bkmkend _Toc234021027}General Comments }{\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\v\\f31506\\cf6\\noproof0 [DONE]}{\\rtlch\\fcs1 \\af1 \n\\ltrch\\fcs0 \\v\\f31506\\noproof0 \n\\par }\\pard\\plain \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506\\cf6 \n\\par }\\pard\\plain \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af37\\afs22\\alang1025 \\ltrch\\fcs0 \\f37\\fs22\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\v\\f31506\\cf6 [Technical Notes]}{\\rtlch\\fcs1 \\af0\\afs20 \\ltrch\\fcs0 \\i\\v\\f31506\\fs20\\cf6 \n\\par These are areas of discussion which may or may not lead to changes in the TWAIN Specification.  If changes do result, they\\rquote ll be moved into their own area.  There are no Update Instructions in this section.  When we\\rquote re done with it, it\n\\rquote ll be moved to the end of the document and given a status of \\'93DONE\\'94\\'85\n\\par }\\pard\\plain \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506 \n\\par \n\\par }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506\\cf6 [Note] \\endash  DONE\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\i\\v\\f31506\\fs22 Does a Boolean enumeration have an expected order to the TRUE/FALSE values in the list?\n\\par 8-22 (hunt this down and fix it)\n\\par We don\\rquote t want the values ordered, except in the context where the order impacts the UI, but there is no way to know if this is happening or not\\'85\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\faauto\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\v\\f31506 Stores a group of individual values describing a capability. The values are ordered from lowest to\n\\par highest values, but the step size between each value is probably not uniform. Such a list would be\n\\par useful to describe the discreet resolutions of a capture device supporting, say, 75, 150, 300, 400,\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\v\\f31506 and 800 dots per inch.}{\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\i\\v\\f31506\\fs22 \n\\par \n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\fs22 \\hich\\af0\\dbch\\af0\\loch\\f0 -\\tab}}\\pard \\ltrpar\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls31\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \\af0\\afs22 \n\\ltrch\\fcs0 \\i\\v\\f31506\\fs22 No, there is no required order for items in an enumeration or an array.  Ideally the Data Source would maintain the order of items send to it, and display the items in that order in the GUI, but I don\\rquote \nt believe there is anything in the Specification that even suggests that much.\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506 \n\\par \n\\par }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506\\cf6 [Note] \\endash  DONE\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\i\\v\\f31506\\fs22 \nIn particular, I was working on ICAP_BITDEPTH. If a Data Source only supports a single bitdepth for each specific pixeltype, wouldn\\rquote \nt it make sense to respond that SET and RESET are not supported? There would be no reason to do a set of Bitdepth, since only a single value is supported at a time.\n\\par \n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\fs22 \\hich\\af0\\dbch\\af0\\loch\\f0 -\\tab}}\\pard \\ltrpar\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls31\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \\af0\\afs22 \n\\ltrch\\fcs0 \\i\\v\\f31506\\fs22 I wonder if there should be a paragraph on this matter.  Here\\rquote s my take on it.  Applications tend to do one of two things when confronted by an error: they ignore it or they fail (sometimes they crash).  With tha\nt in mind a driver should always avoid returning an error if it has a valid alternative that allows it to return success instead.  Therefore, MSG_RESET and MSG_SET should always be allowed for capabilities that support a single value, except in those  cas\nes where the Specification makes it clear that the value is read only (like CAP_DEVICEONLINE).\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506 \n\\par \n\\par }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506\\cf6 [Note] \\endash  DONE\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\i\\v\\f31506\\fs22 \nAlso regarding ICAP_BITDEPTH, am I correct in understanding that a MSG_GET for this capability should only report the available values based on the current setting for PIXELTYPE? Ie. Don\\rquote \nt report all the bitdepths supported, only those supported for the current pixel type?\n\\par \n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\fs22 \\hich\\af0\\dbch\\af0\\loch\\f0 -\\tab}}\\pard \\ltrpar\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls31\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \\af0\\afs22 \n\\ltrch\\fcs0 \\i\\v\\f31506\\fs22 This is correct.  We know that some drivers show all of the bitdepth values for all of the supported pixeltypes.  It doesn\\rquote t look like we have a comment on this in the Legacy Issues section (3-39, PDF 71).\n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\fs22 \\hich\\af0\\dbch\\af0\\loch\\f0 -\\tab}Add a test to the self cert to watch out for this\\'85 (this has been added to the Proposed Changes doc)\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506 \n\\par \n\\par }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506\\cf6 \\page [Note] \\endash  DONE\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\i\\v\\f31506\\fs22 I have a question regarding the filename extension used\n in a File Transfer.  The filename is provided in the DG_CONTROL/DAT_SETUPFILEXFER/MSG_SET message.  Do I need to make sure the requested filename extension matches the type of the file I end up creating?\n\\par }{\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22 \n\\par A couple of examples:\n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f37\\fs22\\cf22 \\hich\\af37\\dbch\\af0\\loch\\f37 1)\\tab}}\\pard \\ltrpar\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls30\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \n\\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22 Simple case: if \\'93filexfer.tmp\\'94 is requested, I\\rquote \nm guessing I should use the file extension as requested regardless of file type that I create. (ie. Even though I save a tiff/jpg/bmp etc. file, continue using the .tmp extention) Is this correct?\n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f37\\fs22\\cf22 \\hich\\af37\\dbch\\af0\\loch\\f37 2)\\tab}More complex case: Assume I\\rquote m doing auto color detect, and my non-color will be mapped to BW. If \\'93filexfer.jpg\\'94\n is requested and I detect a non-color image, this will be an *}{\\rtlch\\fcs1 \\ab\\af0\\afs22 \\ltrch\\fcs0 \\b\\v\\f31506\\fs22 incorrect}{\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22 * name in the end since I cannot save a BW image as a JPG file. I will cr\neate a BMP file instead. Should I change the requested filename to \\'93filexfer.bmp\\'94 in this case? Or still use the filename as requested even though it gives the wrong impression of filetype?\n\\par }\\pard \\ltrpar\\ql \\li360\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin360\\itap0 {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22 \n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22 If I don\\rquote t use the filename exactly as requested, does the TWAIN \napp think the transfer failed? They really have no way to know what I saved it as if I make a change, so it seems the filename better not change, even in the case that it is incorrect.\n\\par \n\\par Do you know of some TWAIN apps that use FileXfer that I could try this with?\n\\par \n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\fs22 \\hich\\af0\\dbch\\af0\\loch\\f0 -\\tab}}\\pard \\ltrpar\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls31\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \\af0\\afs22 \n\\ltrch\\fcs0 \\v\\f31506\\fs22 TWAIN doesn\\rquote t recommend or enforce filename extensions for TWFF_* file formats.  This means that someone could produce a ridiculous result (like image.bmp for a JPEG image), but that\\rquote \ns okay, because application writers are free to use whatever naming system they need.\n\\par }\\pard \\ltrpar\\ql \\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22 \n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\fs22 \\hich\\af0\\dbch\\af0\\loch\\f0 -\\tab}}\\pard \\ltrpar\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls31\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \\af0\\afs22 \n\\ltrch\\fcs0 \\v\\f31506\\fs22 The only time a file transfer should fail is in situations where the application\\rquote s request can\\rquote t be met.  For example, if TWFF_JFIF is requested for a TWPT_BW TWCP_GROUP4 compressed image.\n\\par }\\pard\\plain \\ltrpar\\s199\\ql \\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \\af37\\afs22\\alang1025 \\ltrch\\fcs0 \\f37\\fs22\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\v\\f31506 \n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\fs22 \\hich\\af0\\dbch\\af0\\loch\\f0 -\\tab}}\\pard\\plain \\ltrpar\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls31\\adjustright\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \n\\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22 Note that DAT_IMAGEFILEXFER is still c\nonsidered optional, so few drivers support it.  It was designed as a low memory transfer option, since the driver is able to transfer the image directly to disk.  Most application choose to do this themselves, and using DAT_IMAGEMEMXFER can achieve result\ns that require little memory, though an extra step is often needed to create the finished file, since the metadata that describes the image isn\\rquote t available until state 7.\n\\par }\\pard\\plain \\ltrpar\\s199\\ql \\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \\af37\\afs22\\alang1025 \\ltrch\\fcs0 \\f37\\fs22\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\v\\f31506 \n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\fs22 \\hich\\af0\\dbch\\af0\\loch\\f0 -\\tab}}\\pard\\plain \\ltrpar\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls31\\adjustright\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \n\\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22 I don\\rquote t know of any commonly used TWAIN applications that use DAT_IMAGEFILEXFER.\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22\\cf22 \n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506 \\page \n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506\\cf6 [Note] \\endash  DONE\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22 \nFor capabilities (ch.10 pages), if MSG_GET supports both TW_ONEVALUE and TW_ENUMERATION; should MSG_SET support both as well? Nowhere does the spec include TW_ ENUMERATION as a valid set container, but I think this is allowed.\n\\par \n\\par Oh....ICAP_HALFTONETYPES is the only cap I found that lists TW_ENUMERATION as a SET Container type.\n\\par \n\\par Do I correctly understand that you could replace MSG_SET with MSG_SETCONSTRAINT, and never use MSG_SET anymore? Ie. If sending a TW_ONEVALUE or TW_ARRAY via the MSG_SETCONSTRAINT, this is equivalent to the MSG_SET functionality.\n\\par \n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\fs22 \\hich\\af0\\dbch\\af0\\loch\\f0 -\\tab}}\\pard \\ltrpar\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls31\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \\af0\\afs22 \n\\ltrch\\fcs0 \\v\\f31506\\fs22 I can say with confidence that this part of the Spec hasn\\rquote t exactly turned out as planned.  The intention was to separate setting values from setting constraints.  However, I woul\nd always expect that one can call MSG_GET, MSG_GETCURRENT and take the result and pass it into MSG_SET.  The difference is that if both the application and the driver report themselves as 2.2 or higher the driver only takes the value from MSG_SET.\n\\par }\\pard \\ltrpar\\ql \\li360\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin360\\itap0 {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22 \n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\fs22 \\hich\\af0\\dbch\\af0\\loch\\f0 -\\tab}}\\pard \\ltrpar\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls31\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \\af0\\afs22 \n\\ltrch\\fcs0 \\v\\f31506\\fs22 The situation as described means that MSG_GET cannot be used as the input to MSG_SET.  I think that results in too much work for applications and drivers, given the radical departure from previous behavior.\n\\par }\\pard\\plain \\ltrpar\\s199\\ql \\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \\af37\\afs22\\alang1025 \\ltrch\\fcs0 \\f37\\fs22\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\v\\f31506 \n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\fs22 \\hich\\af0\\dbch\\af0\\loch\\f0 -\\tab}}\\pard\\plain \\ltrpar\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls31\\adjustright\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \n\\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22 Using TW_ONEVALUE with MSG_SETCONTRAINT should cons\ntrain the capability to that one value.  Also, the value is always set with MSG_SETCONTRAINT.\n\\par }\\pard \\ltrpar\\ql \\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22 \n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\fs22 \\hich\\af0\\dbch\\af0\\loch\\f0 -\\tab}}\\pard \\ltrpar\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls31\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \\af0\\afs22 \n\\ltrch\\fcs0 \\v\\f31506\\fs22 Therefore, we need to make sure that the Spec clearly explains the difference between MSG_SET and MSG_SETCONTRAINT, and then make sure that for all capabilitie\ns the allowed containers for both MSG_SET and MSG_SETCONSTRAINT are identical.\n\\par }\\pard\\plain \\ltrpar\\s199\\ql \\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \\af37\\afs22\\alang1025 \\ltrch\\fcs0 \\f37\\fs22\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\v\\f31506 \n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\fs22 \\hich\\af0\\dbch\\af0\\loch\\f0 -\\tab}}\\pard\\plain \\ltrpar\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls31\\adjustright\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \n\\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22 I\\rquote \nm pretty sure that Self-Cert will support this change (meaning that it assumes that a MSG_GET can always be followed by a MSG_SET).  I\\rquote d be very surprised if anybody changed the behavior of MSG_SET without asking us what we\\rquote re thinking...\n\n\\par }\\pard\\plain \\ltrpar\\s199\\ql \\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \\af37\\afs22\\alang1025 \\ltrch\\fcs0 \\f37\\fs22\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\v\\f31506 \n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\fs22 \\hich\\af0\\dbch\\af0\\loch\\f0 -\\tab}}\\pard\\plain \\ltrpar\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls31\\adjustright\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \n\\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22 MSG_SET will only impact the current value\\'85\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506 \n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506\\cf6 \\page [Note] \\endash  DONE\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22 ICAP_XFERMECH (ch. 10, pg. 10-197): under Application section it reads, \\'93\nThe current value of ICAP_XFERMECH must match the data argument type when starting the transfer using the triplet: DG_IMAGE / DAT_IMAGExxxxXFER / MSG_GET.\\'94 If it does not match, what should happen?\n\\par (NOTE: already discussed in the working group meeting on 17 July 2012)\n\\par \n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\fs22 \\hich\\af0\\dbch\\af0\\loch\\f0 -\\tab}}\\pard \\ltrpar\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls31\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \\af0\\afs22 \n\\ltrch\\fcs0 \\v\\f31506\\fs22 My recollection from the meeting is as follows:\n\\par }\\pard \\ltrpar\\ql \\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22 \n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\fs22 \\hich\\af0\\dbch\\af0\\loch\\f0 -\\tab}}\\pard \\ltrpar\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls31\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \\af0\\afs22 \n\\ltrch\\fcs0 \\v\\f31506\\fs22 The TWAIN Spec says that apps need to set ICAP_XFERMECH in state 4 to the transfer mechanism that\\rquote ll be used in state 6 and 7.  However, some apps don\\rquote t bother to do this.\n\\par }\\pard\\plain \\ltrpar\\s199\\ql \\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \\af37\\afs22\\alang1025 \\ltrch\\fcs0 \\f37\\fs22\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \n\\v\\f31506 \n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\fs22 \\hich\\af0\\dbch\\af0\\loch\\f0 -\\tab}}\\pard\\plain \\ltrpar\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls31\\adjustright\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \n\\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22 \nThe thought is to leave the requirement intact, but add a bit to the Legacy Issues section warning driver writers not to assume this will happen.\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506 \n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506\\cf6 [Note] \\endash  DONE\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22 (ch. 2, pg. 2-16) I think a couple of string types are missing. It says: \\'93There are }{\\rtlch\\fcs1 \n\\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22\\ul four}{\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22  types of TWAIN strings defined for developer use:\\'94\n, and then lists TW_STR32, TW_STR64, TW_STR128, and TW_STR256. But in twain.h, there are now TW_STR1024 and a TW_UNI512 types defined. Should these be added, for a total of 6?\n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs20 \\ltrch\\fcs0 \\v\\fs20 \\hich\\af0\\dbch\\af0\\loch\\f0 -\\tab}}\\pard \\ltrpar\\ql \\fi-360\\li720\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\ls31\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506 \nTW_STR1024 and TW_UNI512 have been deprecated, so the number \\lquote four\\rquote  is right.}{\\rtlch\\fcs1 \\ab\\af0\\afs22 \\ltrch\\fcs0 \\b\\v\\f31506\\fs22 \n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506 \n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506\\cf6 [Note] \\endash  DONE\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22 Do I understand correctly that MSG_GETDEFAULT should return the Source\\rquote s *}{\\rtlch\\fcs1 \n\\ab\\af37\\afs22 \\ltrch\\fcs0 \\b\\v\\f31506\\fs22 Preferred}{\\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22 * default. But this may *}{\\rtlch\\fcs1 \\ab\\af37\\afs22 \\ltrch\\fcs0 \\b\\v\\f31506\\fs22 not}{\\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22 \n* be the value set when calling MSG_RESET, since MSG_RESET resets to the TWAIN default? If there is a Mandatory default, does MSG_GETDEFAULT need to return the mandatory default?\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506 \n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506\\cf6 [Note] \\endash  DONE\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22 \nSo is MSG_RESET meant to reset to the value listed in Ch. 10 always? (whether or not this is a mandatory default) Only if Ch. 10 says \\'93no default\\'94 can the source reset it to a preferred or user value?\n\\par }\\pard\\plain \\ltrpar\\s199\\ql \\li360\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin360\\itap0 \\rtlch\\fcs1 \\af37\\afs22\\alang1025 \\ltrch\\fcs0 \\f37\\fs22\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \n\\i\\v\\f31506\\cf6 \n\\par }\\pard\\plain \\ltrpar\\ql \\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \n\\v\\f31506\\fs22\\cf23 \n\\par }{\\*\\themedata 504b030414000600080000002100e9de0fbfff0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb4ec3301045f748fc83e52d4a\n9cb2400825e982c78ec7a27cc0c8992416c9d8b2a755fbf74cd25442a820166c2cd933f79e3be372bd1f07b5c3989ca74aaff2422b24eb1b475da5df374fd9ad\n5689811a183c61a50f98f4babebc2837878049899a52a57be670674cb23d8e90721f90a4d2fa3802cb35762680fd800ecd7551dc18eb899138e3c943d7e503b6\nb01d583deee5f99824e290b4ba3f364eac4a430883b3c092d4eca8f946c916422ecab927f52ea42b89a1cd59c254f919b0e85e6535d135a8de20f20b8c12c3b0\n0c895fcf6720192de6bf3b9e89ecdbd6596cbcdd8eb28e7c365ecc4ec1ff1460f53fe813d3cc7f5b7f020000ffff0300504b030414000600080000002100a5d6\na7e7c0000000360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4f\nc7060abb0884a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b6309512\n0f88d94fbc52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462\na1a82fe353bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f746865\n6d652f7468656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b\n4b0d592c9c070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b\n4757e8d3f729e245eb2b260a0238fd010000ffff0300504b03041400060008000000210096b5ade296060000501b0000160000007468656d652f7468656d652f\n7468656d65312e786d6cec594f6fdb3614bf0fd87720746f6327761a07758ad8b19b2d4d1bc46e871e698996d850a240d2497d1bdae38001c3ba618715d86d87\n615b8116d8a5fb34d93a6c1dd0afb0475292c5585e9236d88aad3e2412f9e3fbff1e1fa9abd7eec70c1d1221294fda5efd72cd4324f1794093b0eddd1ef62fad\n79482a9c0498f184b4bd2991deb58df7dfbb8ad755446282607d22d771db8b944ad79796a40fc3585ee62949606ecc458c15bc8a702910f808e8c66c69b9565b\n5d8a314d3c94e018c8de1a8fa94fd05093f43672e23d06af89927ac06762a049136785c10607758d9053d965021d62d6f6804fc08f86e4bef210c352c144dbab\n999fb7b4717509af678b985ab0b6b4ae6f7ed9ba6c4170b06c788a705430adf71bad2b5b057d03606a1ed7ebf5babd7a41cf00b0ef83a6569632cd467faddec9\n699640f6719e76b7d6ac355c7c89feca9cccad4ea7d36c65b258a206641f1b73f8b5da6a6373d9c11b90c537e7f08dce66b7bbeae00dc8e257e7f0fd2badd586\n8b37a088d1e4600ead1ddaef67d40bc898b3ed4af81ac0d76a197c86826828a24bb318f3442d8ab518dfe3a20f000d6458d104a9694ac6d88728eee2782428d6\n0cf03ac1a5193be4cbb921cd0b495fd054b5bd0f530c1931a3f7eaf9f7af9e3f45c70f9e1d3ff8e9f8e1c3e3073f5a42ceaa6d9c84e5552fbffdeccfc71fa33f\n9e7ef3f2d117d57859c6fffac327bffcfc793510d26726ce8b2f9ffcf6ecc98baf3efdfdbb4715f04d814765f890c644a29be408edf3181433567125272371be\n15c308d3f28acd249438c19a4b05fd9e8a1cf4cd296699771c393ac4b5e01d01e5a30a787d72cf1178108989a2159c77a2d801ee72ce3a5c545a6147f32a9979\n3849c26ae66252c6ed637c58c5bb8b13c7bfbd490a75330f4b47f16e441c31f7184e140e494214d273fc80900aedee52ead87597fa824b3e56e82e451d4c2b4d\n32a423279a668bb6690c7e9956e90cfe766cb37b077538abd27a8b1cba48c80acc2a841f12e698f13a9e281c57911ce298950d7e03aba84ac8c154f8655c4f2a\nf074481847bd804859b5e696007d4b4edfc150b12addbecba6b18b148a1e54d1bc81392f23b7f84137c2715a851dd0242a633f900710a218ed715505dfe56e86\ne877f0034e16bafb0e258ebb4faf06b769e888340b103d3311da9750aa9d0a1cd3e4efca31a3508f6d0c5c5c398602f8e2ebc71591f5b616e24dd893aa3261fb\n44f95d843b5974bb5c04f4edafb95b7892ec1108f3f98de75dc97d5772bdff7cc95d94cf672db4b3da0a6557f70db629362d72bcb0431e53c6066acac80d699a\n6409fb44d08741bdce9c0e4971624a2378cceaba830b05366b90e0ea23aaa241845368b0eb9e2612ca8c742851ca251ceccc70256d8d87265dd96361531f186c\n3d9058edf2c00eafe8e1fc5c509031bb4d680e9f39a3154de0accc56ae644441edd76156d7429d995bdd88664a9dc3ad50197c38af1a0c16d684060441db0256\n5e85f3b9660d0713cc48a0ed6ef7dedc2dc60b17e92219e180643ed27acffba86e9c94c78ab90980d8a9f0913ee49d62b512b79626fb06dccee2a432bbc60276\nb9f7dec44b7904cfbca4f3f6443ab2a49c9c2c41476dafd55c6e7ac8c769db1bc399161ee314bc2e75cf8759081743be1236ec4f4d6693e5336fb672c5dc24a8\nc33585b5fb9cc24e1d4885545b58463634cc5416022cd19cacfccb4d30eb45296023fd35a458598360f8d7a4003bbaae25e331f155d9d9a5116d3bfb9a95523e\n51440ca2e0088dd844ec6370bf0e55d027a012ae264c45d02f708fa6ad6da6dce29c255df9f6cae0ec38666984b372ab5334cf640b37795cc860de4ae2816e95\nb21be5ceaf8a49f90b52a51cc6ff3355f47e0237052b81f6800fd7b802239daf6d8f0b1571a8426944fdbe80c6c1d40e8816b88b8569082ab84c36ff0539d4ff\n6dce591a26ade1c0a7f669880485fd484582903d284b26fa4e2156cff62e4b9265844c4495c495a9157b440e091bea1ab8aaf7760f4510eaa69a6465c0e04ec6\n9ffb9e65d028d44d4e39df9c1a52ecbd3607fee9cec7263328e5d661d3d0e4f62f44acd855ed7ab33cdf7bcb8ae889599bd5c8b3029895b6825696f6af29c239\nb75a5bb1e6345e6ee6c28117e73586c1a2214ae1be07e93fb0ff51e133fb65426fa843be0fb515c187064d0cc206a2fa926d3c902e907670048d931db4c1a449\n59d366ad93b65abe595f70a75bf03d616c2dd959fc7d4e6317cd99cbcec9c58b34766661c7d6766ca1a9c1b327531486c6f941c638c67cd22a7f75e2a37be0e8\n2db8df9f30254d30c1372581a1f51c983c80e4b71ccdd28dbf000000ffff0300504b0304140006000800000021000dd1909fb60000001b010000270000007468\n656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f78277086f6fd3ba109126dd88d0add40384e4\n350d363f2451eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89d93b64b060828e6f37ed1567914b284d2624\n52282e3198720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd5001996509affb3fd381a89672f1f165dfe5141\n73d9850528a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100e9de0fbfff0000001c020000130000000000000000\n0000000000000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6a7e7c0000000360100000b00000000000000\n000000000000300100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a0000001c0000000000000000000000000019\n0200007468656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d001400060008000000210096b5ade296060000501b00001600000000\n000000000000000000d60200007468656d652f7468656d652f7468656d65312e786d6c504b01022d00140006000800000021000dd1909fb60000001b01000027\n00000000000000000000000000a00900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d0100009b0a00000000}\n{\\*\\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d\n617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169\n6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363\n656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e}\n{\\*\\latentstyles\\lsdstimax377\\lsdlockeddef0\\lsdsemihiddendef0\\lsdunhideuseddef0\\lsdqformatdef0\\lsdprioritydef99{\\lsdlockedexcept \\lsdqformat1 \\lsdpriority0 \\lsdlocked0 Normal;\\lsdqformat1 \\lsdpriority0 \\lsdlocked0 heading 1;\n\\lsdqformat1 \\lsdpriority0 \\lsdlocked0 heading 2;\\lsdqformat1 \\lsdpriority0 \\lsdlocked0 heading 3;\\lsdqformat1 \\lsdpriority0 \\lsdlocked0 heading 4;\\lsdqformat1 \\lsdpriority0 \\lsdlocked0 heading 5;\\lsdqformat1 \\lsdpriority0 \\lsdlocked0 heading 6;\n\\lsdqformat1 \\lsdpriority0 \\lsdlocked0 heading 7;\\lsdqformat1 \\lsdpriority0 \\lsdlocked0 heading 8;\\lsdqformat1 \\lsdpriority0 \\lsdlocked0 heading 9;\\lsdsemihidden1 \\lsdunhideused1 index 1;\\lsdsemihidden1 \\lsdunhideused1 index 2;\n\\lsdsemihidden1 \\lsdunhideused1 index 3;\\lsdsemihidden1 \\lsdunhideused1 index 4;\\lsdsemihidden1 \\lsdunhideused1 index 5;\\lsdsemihidden1 \\lsdunhideused1 index 6;\\lsdsemihidden1 \\lsdunhideused1 index 7;\\lsdsemihidden1 \\lsdunhideused1 index 8;\n\\lsdsemihidden1 \\lsdunhideused1 index 9;\\lsdpriority39 \\lsdlocked0 toc 1;\\lsdpriority39 \\lsdlocked0 toc 2;\\lsdpriority0 \\lsdlocked0 toc 3;\\lsdpriority0 \\lsdlocked0 toc 4;\\lsdpriority0 \\lsdlocked0 toc 5;\\lsdpriority0 \\lsdlocked0 toc 6;\n\\lsdpriority0 \\lsdlocked0 toc 7;\\lsdpriority0 \\lsdlocked0 toc 8;\\lsdpriority0 \\lsdlocked0 toc 9;\\lsdsemihidden1 \\lsdunhideused1 Normal Indent;\\lsdsemihidden1 \\lsdunhideused1 footnote text;\\lsdsemihidden1 \\lsdunhideused1 annotation text;\n\\lsdsemihidden1 \\lsdunhideused1 header;\\lsdsemihidden1 \\lsdunhideused1 footer;\\lsdsemihidden1 \\lsdunhideused1 index heading;\\lsdqformat1 \\lsdpriority0 \\lsdlocked0 caption;\\lsdsemihidden1 \\lsdunhideused1 table of figures;\n\\lsdsemihidden1 \\lsdunhideused1 envelope address;\\lsdsemihidden1 \\lsdunhideused1 envelope return;\\lsdsemihidden1 \\lsdunhideused1 footnote reference;\\lsdsemihidden1 \\lsdunhideused1 annotation reference;\\lsdsemihidden1 \\lsdunhideused1 line number;\n\\lsdsemihidden1 \\lsdunhideused1 page number;\\lsdsemihidden1 \\lsdunhideused1 endnote reference;\\lsdsemihidden1 \\lsdunhideused1 endnote text;\\lsdsemihidden1 \\lsdunhideused1 table of authorities;\\lsdsemihidden1 \\lsdunhideused1 macro;\n\\lsdsemihidden1 \\lsdunhideused1 toa heading;\\lsdsemihidden1 \\lsdunhideused1 List;\\lsdsemihidden1 \\lsdunhideused1 List Bullet;\\lsdsemihidden1 \\lsdunhideused1 List Number;\\lsdsemihidden1 \\lsdunhideused1 List 2;\\lsdsemihidden1 \\lsdunhideused1 List 3;\n\\lsdsemihidden1 \\lsdunhideused1 List 4;\\lsdsemihidden1 \\lsdunhideused1 List 5;\\lsdsemihidden1 \\lsdunhideused1 List Bullet 2;\\lsdsemihidden1 \\lsdunhideused1 List Bullet 3;\\lsdsemihidden1 \\lsdunhideused1 List Bullet 4;\n\\lsdsemihidden1 \\lsdunhideused1 List Bullet 5;\\lsdsemihidden1 \\lsdunhideused1 List Number 2;\\lsdsemihidden1 \\lsdunhideused1 List Number 3;\\lsdsemihidden1 \\lsdunhideused1 List Number 4;\\lsdsemihidden1 \\lsdunhideused1 List Number 5;\n\\lsdqformat1 \\lsdpriority0 \\lsdlocked0 Title;\\lsdsemihidden1 \\lsdunhideused1 Closing;\\lsdsemihidden1 \\lsdunhideused1 Signature;\\lsdpriority0 \\lsdlocked0 Default Paragraph Font;\\lsdsemihidden1 \\lsdunhideused1 Body Text;\n\\lsdsemihidden1 \\lsdunhideused1 Body Text Indent;\\lsdsemihidden1 \\lsdunhideused1 List Continue;\\lsdsemihidden1 \\lsdunhideused1 List Continue 2;\\lsdsemihidden1 \\lsdunhideused1 List Continue 3;\\lsdsemihidden1 \\lsdunhideused1 List Continue 4;\n\\lsdsemihidden1 \\lsdunhideused1 List Continue 5;\\lsdsemihidden1 \\lsdunhideused1 Message Header;\\lsdqformat1 \\lsdpriority0 \\lsdlocked0 Subtitle;\\lsdsemihidden1 \\lsdunhideused1 Salutation;\\lsdsemihidden1 \\lsdunhideused1 Date;\n\\lsdsemihidden1 \\lsdunhideused1 Body Text First Indent;\\lsdsemihidden1 \\lsdunhideused1 Body Text First Indent 2;\\lsdsemihidden1 \\lsdunhideused1 Note Heading;\\lsdsemihidden1 \\lsdunhideused1 Body Text 2;\\lsdsemihidden1 \\lsdunhideused1 Body Text 3;\n\\lsdsemihidden1 \\lsdunhideused1 Body Text Indent 2;\\lsdsemihidden1 \\lsdunhideused1 Body Text Indent 3;\\lsdsemihidden1 \\lsdunhideused1 Block Text;\\lsdsemihidden1 \\lsdunhideused1 Hyperlink;\\lsdsemihidden1 \\lsdunhideused1 FollowedHyperlink;\n\\lsdqformat1 \\lsdpriority0 \\lsdlocked0 Strong;\\lsdqformat1 \\lsdpriority0 \\lsdlocked0 Emphasis;\\lsdsemihidden1 \\lsdunhideused1 Document Map;\\lsdsemihidden1 \\lsdunhideused1 Plain Text;\\lsdsemihidden1 \\lsdunhideused1 E-mail Signature;\n\\lsdsemihidden1 \\lsdunhideused1 HTML Top of Form;\\lsdsemihidden1 \\lsdunhideused1 HTML Bottom of Form;\\lsdsemihidden1 \\lsdunhideused1 Normal (Web);\\lsdsemihidden1 \\lsdunhideused1 HTML Acronym;\\lsdsemihidden1 \\lsdunhideused1 HTML Address;\n\\lsdsemihidden1 \\lsdunhideused1 HTML Cite;\\lsdsemihidden1 \\lsdunhideused1 HTML Code;\\lsdsemihidden1 \\lsdunhideused1 HTML Definition;\\lsdsemihidden1 \\lsdunhideused1 HTML Keyboard;\\lsdsemihidden1 \\lsdunhideused1 HTML Preformatted;\n\\lsdsemihidden1 \\lsdunhideused1 HTML Sample;\\lsdsemihidden1 \\lsdunhideused1 HTML Typewriter;\\lsdsemihidden1 \\lsdunhideused1 HTML Variable;Normal Table;\\lsdsemihidden1 \\lsdunhideused1 annotation subject;\\lsdsemihidden1 \\lsdunhideused1 No List;\n\\lsdsemihidden1 \\lsdunhideused1 Outline List 1;\\lsdsemihidden1 \\lsdunhideused1 Outline List 2;\\lsdsemihidden1 \\lsdunhideused1 Outline List 3;Table Simple 1;Table Simple 2;Table Simple 3;Table Classic 1;Table Classic 2;Table Classic 3;Table Classic 4;\nTable Colorful 1;Table Colorful 2;Table Colorful 3;Table Columns 1;Table Columns 2;Table Columns 3;Table Columns 4;Table Columns 5;Table Grid 1;Table Grid 2;Table Grid 3;Table Grid 4;Table Grid 5;Table Grid 6;Table Grid 7;Table Grid 8;Table List 1;\nTable List 2;Table List 3;Table List 4;Table List 5;Table List 6;Table List 7;Table List 8;Table 3D effects 1;Table 3D effects 2;Table 3D effects 3;Table Contemporary;Table Elegant;Table Professional;Table Subtle 1;Table Subtle 2;Table Web 1;Table Web 2;\nTable Web 3;\\lsdsemihidden1 \\lsdunhideused1 Balloon Text;\\lsdpriority0 \\lsdlocked0 Table Grid;Table Theme;\\lsdsemihidden1 \\lsdlocked0 Placeholder Text;\\lsdqformat1 \\lsdpriority1 \\lsdlocked0 No Spacing;\\lsdpriority60 \\lsdlocked0 Light Shading;\n\\lsdpriority61 \\lsdlocked0 Light List;\\lsdpriority62 \\lsdlocked0 Light Grid;\\lsdpriority63 \\lsdlocked0 Medium Shading 1;\\lsdpriority64 \\lsdlocked0 Medium Shading 2;\\lsdpriority65 \\lsdlocked0 Medium List 1;\\lsdpriority66 \\lsdlocked0 Medium List 2;\n\\lsdpriority67 \\lsdlocked0 Medium Grid 1;\\lsdpriority68 \\lsdlocked0 Medium Grid 2;\\lsdpriority69 \\lsdlocked0 Medium Grid 3;\\lsdpriority70 \\lsdlocked0 Dark List;\\lsdpriority71 \\lsdlocked0 Colorful Shading;\\lsdpriority72 \\lsdlocked0 Colorful List;\n\\lsdpriority73 \\lsdlocked0 Colorful Grid;\\lsdpriority60 \\lsdlocked0 Light Shading Accent 1;\\lsdpriority61 \\lsdlocked0 Light List Accent 1;\\lsdpriority62 \\lsdlocked0 Light Grid Accent 1;\\lsdpriority63 \\lsdlocked0 Medium Shading 1 Accent 1;\n\\lsdpriority64 \\lsdlocked0 Medium Shading 2 Accent 1;\\lsdpriority65 \\lsdlocked0 Medium List 1 Accent 1;\\lsdqformat1 \\lsdpriority34 \\lsdlocked0 List Paragraph;\\lsdqformat1 \\lsdpriority29 \\lsdlocked0 Quote;\n\\lsdqformat1 \\lsdpriority30 \\lsdlocked0 Intense Quote;\\lsdpriority66 \\lsdlocked0 Medium List 2 Accent 1;\\lsdpriority67 \\lsdlocked0 Medium Grid 1 Accent 1;\\lsdpriority68 \\lsdlocked0 Medium Grid 2 Accent 1;\\lsdpriority69 \\lsdlocked0 Medium Grid 3 Accent 1;\n\\lsdpriority70 \\lsdlocked0 Dark List Accent 1;\\lsdpriority71 \\lsdlocked0 Colorful Shading Accent 1;\\lsdpriority72 \\lsdlocked0 Colorful List Accent 1;\\lsdpriority73 \\lsdlocked0 Colorful Grid Accent 1;\\lsdpriority60 \\lsdlocked0 Light Shading Accent 2;\n\\lsdpriority61 \\lsdlocked0 Light List Accent 2;\\lsdpriority62 \\lsdlocked0 Light Grid Accent 2;\\lsdpriority63 \\lsdlocked0 Medium Shading 1 Accent 2;\\lsdpriority64 \\lsdlocked0 Medium Shading 2 Accent 2;\\lsdpriority65 \\lsdlocked0 Medium List 1 Accent 2;\n\\lsdpriority66 \\lsdlocked0 Medium List 2 Accent 2;\\lsdpriority67 \\lsdlocked0 Medium Grid 1 Accent 2;\\lsdpriority68 \\lsdlocked0 Medium Grid 2 Accent 2;\\lsdpriority69 \\lsdlocked0 Medium Grid 3 Accent 2;\\lsdpriority70 \\lsdlocked0 Dark List Accent 2;\n\\lsdpriority71 \\lsdlocked0 Colorful Shading Accent 2;\\lsdpriority72 \\lsdlocked0 Colorful List Accent 2;\\lsdpriority73 \\lsdlocked0 Colorful Grid Accent 2;\\lsdpriority60 \\lsdlocked0 Light Shading Accent 3;\\lsdpriority61 \\lsdlocked0 Light List Accent 3;\n\\lsdpriority62 \\lsdlocked0 Light Grid Accent 3;\\lsdpriority63 \\lsdlocked0 Medium Shading 1 Accent 3;\\lsdpriority64 \\lsdlocked0 Medium Shading 2 Accent 3;\\lsdpriority65 \\lsdlocked0 Medium List 1 Accent 3;\\lsdpriority66 \\lsdlocked0 Medium List 2 Accent 3;\n\\lsdpriority67 \\lsdlocked0 Medium Grid 1 Accent 3;\\lsdpriority68 \\lsdlocked0 Medium Grid 2 Accent 3;\\lsdpriority69 \\lsdlocked0 Medium Grid 3 Accent 3;\\lsdpriority70 \\lsdlocked0 Dark List Accent 3;\\lsdpriority71 \\lsdlocked0 Colorful Shading Accent 3;\n\\lsdpriority72 \\lsdlocked0 Colorful List Accent 3;\\lsdpriority73 \\lsdlocked0 Colorful Grid Accent 3;\\lsdpriority60 \\lsdlocked0 Light Shading Accent 4;\\lsdpriority61 \\lsdlocked0 Light List Accent 4;\\lsdpriority62 \\lsdlocked0 Light Grid Accent 4;\n\\lsdpriority63 \\lsdlocked0 Medium Shading 1 Accent 4;\\lsdpriority64 \\lsdlocked0 Medium Shading 2 Accent 4;\\lsdpriority65 \\lsdlocked0 Medium List 1 Accent 4;\\lsdpriority66 \\lsdlocked0 Medium List 2 Accent 4;\n\\lsdpriority67 \\lsdlocked0 Medium Grid 1 Accent 4;\\lsdpriority68 \\lsdlocked0 Medium Grid 2 Accent 4;\\lsdpriority69 \\lsdlocked0 Medium Grid 3 Accent 4;\\lsdpriority70 \\lsdlocked0 Dark List Accent 4;\\lsdpriority71 \\lsdlocked0 Colorful Shading Accent 4;\n\\lsdpriority72 \\lsdlocked0 Colorful List Accent 4;\\lsdpriority73 \\lsdlocked0 Colorful Grid Accent 4;\\lsdpriority60 \\lsdlocked0 Light Shading Accent 5;\\lsdpriority61 \\lsdlocked0 Light List Accent 5;\\lsdpriority62 \\lsdlocked0 Light Grid Accent 5;\n\\lsdpriority63 \\lsdlocked0 Medium Shading 1 Accent 5;\\lsdpriority64 \\lsdlocked0 Medium Shading 2 Accent 5;\\lsdpriority65 \\lsdlocked0 Medium List 1 Accent 5;\\lsdpriority66 \\lsdlocked0 Medium List 2 Accent 5;\n\\lsdpriority67 \\lsdlocked0 Medium Grid 1 Accent 5;\\lsdpriority68 \\lsdlocked0 Medium Grid 2 Accent 5;\\lsdpriority69 \\lsdlocked0 Medium Grid 3 Accent 5;\\lsdpriority70 \\lsdlocked0 Dark List Accent 5;\\lsdpriority71 \\lsdlocked0 Colorful Shading Accent 5;\n\\lsdpriority72 \\lsdlocked0 Colorful List Accent 5;\\lsdpriority73 \\lsdlocked0 Colorful Grid Accent 5;\\lsdpriority60 \\lsdlocked0 Light Shading Accent 6;\\lsdpriority61 \\lsdlocked0 Light List Accent 6;\\lsdpriority62 \\lsdlocked0 Light Grid Accent 6;\n\\lsdpriority63 \\lsdlocked0 Medium Shading 1 Accent 6;\\lsdpriority64 \\lsdlocked0 Medium Shading 2 Accent 6;\\lsdpriority65 \\lsdlocked0 Medium List 1 Accent 6;\\lsdpriority66 \\lsdlocked0 Medium List 2 Accent 6;\n\\lsdpriority67 \\lsdlocked0 Medium Grid 1 Accent 6;\\lsdpriority68 \\lsdlocked0 Medium Grid 2 Accent 6;\\lsdpriority69 \\lsdlocked0 Medium Grid 3 Accent 6;\\lsdpriority70 \\lsdlocked0 Dark List Accent 6;\\lsdpriority71 \\lsdlocked0 Colorful Shading Accent 6;\n\\lsdpriority72 \\lsdlocked0 Colorful List Accent 6;\\lsdpriority73 \\lsdlocked0 Colorful Grid Accent 6;\\lsdqformat1 \\lsdpriority19 \\lsdlocked0 Subtle Emphasis;\\lsdqformat1 \\lsdpriority21 \\lsdlocked0 Intense Emphasis;\n\\lsdqformat1 \\lsdpriority31 \\lsdlocked0 Subtle Reference;\\lsdqformat1 \\lsdpriority32 \\lsdlocked0 Intense Reference;\\lsdqformat1 \\lsdpriority33 \\lsdlocked0 Book Title;\\lsdsemihidden1 \\lsdunhideused1 \\lsdpriority37 \\lsdlocked0 Bibliography;\n\\lsdsemihidden1 \\lsdunhideused1 \\lsdqformat1 \\lsdpriority39 \\lsdlocked0 TOC Heading;\\lsdpriority41 \\lsdlocked0 Plain Table 1;\\lsdpriority42 \\lsdlocked0 Plain Table 2;\\lsdpriority43 \\lsdlocked0 Plain Table 3;\\lsdpriority44 \\lsdlocked0 Plain Table 4;\n\\lsdpriority45 \\lsdlocked0 Plain Table 5;\\lsdpriority40 \\lsdlocked0 Grid Table Light;\\lsdpriority46 \\lsdlocked0 Grid Table 1 Light;\\lsdpriority47 \\lsdlocked0 Grid Table 2;\\lsdpriority48 \\lsdlocked0 Grid Table 3;\\lsdpriority49 \\lsdlocked0 Grid Table 4;\n\\lsdpriority50 \\lsdlocked0 Grid Table 5 Dark;\\lsdpriority51 \\lsdlocked0 Grid Table 6 Colorful;\\lsdpriority52 \\lsdlocked0 Grid Table 7 Colorful;\\lsdpriority46 \\lsdlocked0 Grid Table 1 Light Accent 1;\\lsdpriority47 \\lsdlocked0 Grid Table 2 Accent 1;\n\\lsdpriority48 \\lsdlocked0 Grid Table 3 Accent 1;\\lsdpriority49 \\lsdlocked0 Grid Table 4 Accent 1;\\lsdpriority50 \\lsdlocked0 Grid Table 5 Dark Accent 1;\\lsdpriority51 \\lsdlocked0 Grid Table 6 Colorful Accent 1;\n\\lsdpriority52 \\lsdlocked0 Grid Table 7 Colorful Accent 1;\\lsdpriority46 \\lsdlocked0 Grid Table 1 Light Accent 2;\\lsdpriority47 \\lsdlocked0 Grid Table 2 Accent 2;\\lsdpriority48 \\lsdlocked0 Grid Table 3 Accent 2;\n\\lsdpriority49 \\lsdlocked0 Grid Table 4 Accent 2;\\lsdpriority50 \\lsdlocked0 Grid Table 5 Dark Accent 2;\\lsdpriority51 \\lsdlocked0 Grid Table 6 Colorful Accent 2;\\lsdpriority52 \\lsdlocked0 Grid Table 7 Colorful Accent 2;\n\\lsdpriority46 \\lsdlocked0 Grid Table 1 Light Accent 3;\\lsdpriority47 \\lsdlocked0 Grid Table 2 Accent 3;\\lsdpriority48 \\lsdlocked0 Grid Table 3 Accent 3;\\lsdpriority49 \\lsdlocked0 Grid Table 4 Accent 3;\n\\lsdpriority50 \\lsdlocked0 Grid Table 5 Dark Accent 3;\\lsdpriority51 \\lsdlocked0 Grid Table 6 Colorful Accent 3;\\lsdpriority52 \\lsdlocked0 Grid Table 7 Colorful Accent 3;\\lsdpriority46 \\lsdlocked0 Grid Table 1 Light Accent 4;\n\\lsdpriority47 \\lsdlocked0 Grid Table 2 Accent 4;\\lsdpriority48 \\lsdlocked0 Grid Table 3 Accent 4;\\lsdpriority49 \\lsdlocked0 Grid Table 4 Accent 4;\\lsdpriority50 \\lsdlocked0 Grid Table 5 Dark Accent 4;\n\\lsdpriority51 \\lsdlocked0 Grid Table 6 Colorful Accent 4;\\lsdpriority52 \\lsdlocked0 Grid Table 7 Colorful Accent 4;\\lsdpriority46 \\lsdlocked0 Grid Table 1 Light Accent 5;\\lsdpriority47 \\lsdlocked0 Grid Table 2 Accent 5;\n\\lsdpriority48 \\lsdlocked0 Grid Table 3 Accent 5;\\lsdpriority49 \\lsdlocked0 Grid Table 4 Accent 5;\\lsdpriority50 \\lsdlocked0 Grid Table 5 Dark Accent 5;\\lsdpriority51 \\lsdlocked0 Grid Table 6 Colorful Accent 5;\n\\lsdpriority52 \\lsdlocked0 Grid Table 7 Colorful Accent 5;\\lsdpriority46 \\lsdlocked0 Grid Table 1 Light Accent 6;\\lsdpriority47 \\lsdlocked0 Grid Table 2 Accent 6;\\lsdpriority48 \\lsdlocked0 Grid Table 3 Accent 6;\n\\lsdpriority49 \\lsdlocked0 Grid Table 4 Accent 6;\\lsdpriority50 \\lsdlocked0 Grid Table 5 Dark Accent 6;\\lsdpriority51 \\lsdlocked0 Grid Table 6 Colorful Accent 6;\\lsdpriority52 \\lsdlocked0 Grid Table 7 Colorful Accent 6;\n\\lsdpriority46 \\lsdlocked0 List Table 1 Light;\\lsdpriority47 \\lsdlocked0 List Table 2;\\lsdpriority48 \\lsdlocked0 List Table 3;\\lsdpriority49 \\lsdlocked0 List Table 4;\\lsdpriority50 \\lsdlocked0 List Table 5 Dark;\n\\lsdpriority51 \\lsdlocked0 List Table 6 Colorful;\\lsdpriority52 \\lsdlocked0 List Table 7 Colorful;\\lsdpriority46 \\lsdlocked0 List Table 1 Light Accent 1;\\lsdpriority47 \\lsdlocked0 List Table 2 Accent 1;\\lsdpriority48 \\lsdlocked0 List Table 3 Accent 1;\n\\lsdpriority49 \\lsdlocked0 List Table 4 Accent 1;\\lsdpriority50 \\lsdlocked0 List Table 5 Dark Accent 1;\\lsdpriority51 \\lsdlocked0 List Table 6 Colorful Accent 1;\\lsdpriority52 \\lsdlocked0 List Table 7 Colorful Accent 1;\n\\lsdpriority46 \\lsdlocked0 List Table 1 Light Accent 2;\\lsdpriority47 \\lsdlocked0 List Table 2 Accent 2;\\lsdpriority48 \\lsdlocked0 List Table 3 Accent 2;\\lsdpriority49 \\lsdlocked0 List Table 4 Accent 2;\n\\lsdpriority50 \\lsdlocked0 List Table 5 Dark Accent 2;\\lsdpriority51 \\lsdlocked0 List Table 6 Colorful Accent 2;\\lsdpriority52 \\lsdlocked0 List Table 7 Colorful Accent 2;\\lsdpriority46 \\lsdlocked0 List Table 1 Light Accent 3;\n\\lsdpriority47 \\lsdlocked0 List Table 2 Accent 3;\\lsdpriority48 \\lsdlocked0 List Table 3 Accent 3;\\lsdpriority49 \\lsdlocked0 List Table 4 Accent 3;\\lsdpriority50 \\lsdlocked0 List Table 5 Dark Accent 3;\n\\lsdpriority51 \\lsdlocked0 List Table 6 Colorful Accent 3;\\lsdpriority52 \\lsdlocked0 List Table 7 Colorful Accent 3;\\lsdpriority46 \\lsdlocked0 List Table 1 Light Accent 4;\\lsdpriority47 \\lsdlocked0 List Table 2 Accent 4;\n\\lsdpriority48 \\lsdlocked0 List Table 3 Accent 4;\\lsdpriority49 \\lsdlocked0 List Table 4 Accent 4;\\lsdpriority50 \\lsdlocked0 List Table 5 Dark Accent 4;\\lsdpriority51 \\lsdlocked0 List Table 6 Colorful Accent 4;\n\\lsdpriority52 \\lsdlocked0 List Table 7 Colorful Accent 4;\\lsdpriority46 \\lsdlocked0 List Table 1 Light Accent 5;\\lsdpriority47 \\lsdlocked0 List Table 2 Accent 5;\\lsdpriority48 \\lsdlocked0 List Table 3 Accent 5;\n\\lsdpriority49 \\lsdlocked0 List Table 4 Accent 5;\\lsdpriority50 \\lsdlocked0 List Table 5 Dark Accent 5;\\lsdpriority51 \\lsdlocked0 List Table 6 Colorful Accent 5;\\lsdpriority52 \\lsdlocked0 List Table 7 Colorful Accent 5;\n\\lsdpriority46 \\lsdlocked0 List Table 1 Light Accent 6;\\lsdpriority47 \\lsdlocked0 List Table 2 Accent 6;\\lsdpriority48 \\lsdlocked0 List Table 3 Accent 6;\\lsdpriority49 \\lsdlocked0 List Table 4 Accent 6;\n\\lsdpriority50 \\lsdlocked0 List Table 5 Dark Accent 6;\\lsdpriority51 \\lsdlocked0 List Table 6 Colorful Accent 6;\\lsdpriority52 \\lsdlocked0 List Table 7 Colorful Accent 6;\\lsdsemihidden1 \\lsdunhideused1 \\lsdlocked0 Mention;\n\\lsdsemihidden1 \\lsdunhideused1 \\lsdlocked0 Smart Hyperlink;\\lsdsemihidden1 \\lsdunhideused1 \\lsdlocked0 Hashtag;\\lsdsemihidden1 \\lsdunhideused1 \\lsdlocked0 Unresolved Mention;\\lsdsemihidden1 \\lsdunhideused1 \\lsdlocked0 Smart Link;\n\\lsdsemihidden1 \\lsdunhideused1 \\lsdlocked0 Smart Link Error;}}{\\*\\datastore 0105000002000000180000004d73786d6c322e534158584d4c5265616465722e362e30000000000000000000000e0000\nd0cf11e0a1b11ae1000000000000000000000000000000003e000300feff0900060000000000000000000000010000000100000000000000001000000200000001000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nfffffffffffffffffdffffff04000000feffffff05000000fefffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffff010000000c6ad98892f1d411a65f0040963251e500000000000000000000000020a3\n2f0b3455d60103000000c0020000000000004d0073006f004400610074006100530074006f0072006500000000000000000000000000000000000000000000000000000000000000000000000000000000001a000101ffffffffffffffff02000000000000000000000000000000000000000000000020a32f0b3455d601\n20a32f0b3455d60100000000000000000000000056003500d00049004400d00043003000ce00c400da0045004f004b0057004c004f0051004400d7003300c0003d003d000000000000000000000000000000000032000101ffffffffffffffff03000000000000000000000000000000000000000000000020a32f0b3455\nd60120a32f0b3455d6010000000000000000000000004900740065006d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000201ffffffff04000000ffffffff000000000000000000000000000000000000000000000000\n000000000000000000000000000000000e0100000000000001000000020000000300000004000000feffffff060000000700000008000000090000000a000000feffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d226e6f223f3e3c623a536f75726365732053656c65637465645374796c653d225c4150412e58534c22205374796c\n654e616d653d224150412220786d6c6e733a623d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f6269626c696f6772617068792220786d6c6e733d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e\n6f72672f6f6666696365446f63756d656e742f323030362f6269626c696f677261706879223e3c2f623a536f75726365733e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003c3f786d6c2076657273696f6e3d22312e302220656e636f6469\n6e673d225554462d3822207374616e64616c6f6e653d226e6f223f3e0d0a3c64733a6461746173746f72654974656d2064733a6974656d49443d227b30463038464335352d394130302d344542412d383433382d4135384233393030463737367d2220786d6c6e733a64733d22687474703a2f2f736368656d61732e6f70\n656e786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f637573500072006f007000650072007400690065007300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000200ffffffffffffffffffffffff000000000000\n0000000000000000000000000000000000000000000000000000000000000500000055010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000\n000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff\n000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000746f6d586d6c223e3c64733a736368656d61526566733e3c64733a736368656d615265662064733a7572693d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f7267\n2f6f6666696365446f63756d656e742f323030362f6269626c696f677261706879222f3e3c2f64733a736368656d61526566733e3c2f64733a6461746173746f72654974656d3e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000105000000000000}}"
  },
  {
    "path": "releases/twain-cs_02041100/twaincscert/AnyCPU/Debug/twaincscert.exe.config",
    "content": "<?xml version=\"1.0\"?>\n<configuration>\n  <startup>\n    <supportedRuntime version=\"v4.5\" />\n    <supportedRuntime version=\"v4.0.30319\" />\n    <supportedRuntime version=\"v4.0\" />\n    <supportedRuntime version=\"v2.0.50727\" />\n  </startup>\n</configuration>\n"
  },
  {
    "path": "releases/twain-cs_02041100/twaincscert/AnyCPU/Release/twaincscert.exe.config",
    "content": "<?xml version=\"1.0\"?>\n<configuration>\n  <startup>\n    <supportedRuntime version=\"v4.5\" />\n    <supportedRuntime version=\"v4.0.30319\" />\n    <supportedRuntime version=\"v4.0\" />\n    <supportedRuntime version=\"v2.0.50727\" />\n  </startup>\n</configuration>\n"
  },
  {
    "path": "releases/twain-cs_02041100/twaincscert/x64/Debug/twaincscert.exe.config",
    "content": "<?xml version=\"1.0\"?>\n<configuration>\n  <startup>\n    <supportedRuntime version=\"v4.5\" />\n    <supportedRuntime version=\"v4.0.30319\" />\n    <supportedRuntime version=\"v4.0\" />\n    <supportedRuntime version=\"v2.0.50727\" />\n  </startup>\n</configuration>\n"
  },
  {
    "path": "releases/twain-cs_02041100/twaincscert/x64/Release/twaincscert.exe.config",
    "content": "<?xml version=\"1.0\"?>\n<configuration>\n  <startup>\n    <supportedRuntime version=\"v4.5\" />\n    <supportedRuntime version=\"v4.0.30319\" />\n    <supportedRuntime version=\"v4.0\" />\n    <supportedRuntime version=\"v2.0.50727\" />\n  </startup>\n</configuration>\n"
  },
  {
    "path": "releases/twain-cs_02041100/twaincscert/x86/Debug/twaincscert.exe.config",
    "content": "<?xml version=\"1.0\"?>\n<configuration>\n  <startup>\n    <supportedRuntime version=\"v4.5\" />\n    <supportedRuntime version=\"v4.0.30319\" />\n    <supportedRuntime version=\"v4.0\" />\n    <supportedRuntime version=\"v2.0.50727\" />\n  </startup>\n</configuration>\n"
  },
  {
    "path": "releases/twain-cs_02041100/twaincscert/x86/Release/twaincscert.exe.config",
    "content": "<?xml version=\"1.0\"?>\n<configuration>\n  <startup>\n    <supportedRuntime version=\"v4.5\" />\n    <supportedRuntime version=\"v4.0.30319\" />\n    <supportedRuntime version=\"v4.0\" />\n    <supportedRuntime version=\"v2.0.50727\" />\n  </startup>\n</configuration>\n"
  },
  {
    "path": "releases/twain-cs_02041100/twaincsscan/AnyCPU/Debug/twaincsscan.exe.config",
    "content": "<?xml version=\"1.0\"?>\n<configuration>\n  <startup>\n    <supportedRuntime version=\"v4.5\" />\n    <supportedRuntime version=\"v4.0.30319\" />\n    <supportedRuntime version=\"v4.0\" />\n    <supportedRuntime version=\"v2.0.50727\" />\n  </startup>\n</configuration>\n"
  },
  {
    "path": "releases/twain-cs_02041100/twaincsscan/AnyCPU/Release/twaincsscan.exe.config",
    "content": "<?xml version=\"1.0\"?>\n<configuration>\n  <startup>\n    <supportedRuntime version=\"v4.5\" />\n    <supportedRuntime version=\"v4.0.30319\" />\n    <supportedRuntime version=\"v4.0\" />\n    <supportedRuntime version=\"v2.0.50727\" />\n  </startup>\n</configuration>\n"
  },
  {
    "path": "releases/twain-cs_02041100/twaincsscan/x64/Debug/twaincsscan.exe.config",
    "content": "<?xml version=\"1.0\"?>\n<configuration>\n  <startup>\n    <supportedRuntime version=\"v4.5\" />\n    <supportedRuntime version=\"v4.0.30319\" />\n    <supportedRuntime version=\"v4.0\" />\n    <supportedRuntime version=\"v2.0.50727\" />\n  </startup>\n</configuration>\n"
  },
  {
    "path": "releases/twain-cs_02041100/twaincsscan/x64/Release/twaincsscan.exe.config",
    "content": "<?xml version=\"1.0\"?>\n<configuration>\n  <startup>\n    <supportedRuntime version=\"v4.5\" />\n    <supportedRuntime version=\"v4.0.30319\" />\n    <supportedRuntime version=\"v4.0\" />\n    <supportedRuntime version=\"v2.0.50727\" />\n  </startup>\n</configuration>\n"
  },
  {
    "path": "releases/twain-cs_02041100/twaincsscan/x86/Debug/twaincsscan.exe.config",
    "content": "<?xml version=\"1.0\"?>\n<configuration>\n  <startup>\n    <supportedRuntime version=\"v4.5\" />\n    <supportedRuntime version=\"v4.0.30319\" />\n    <supportedRuntime version=\"v4.0\" />\n    <supportedRuntime version=\"v2.0.50727\" />\n  </startup>\n</configuration>\n"
  },
  {
    "path": "releases/twain-cs_02041100/twaincsscan/x86/Release/twaincsscan.exe.config",
    "content": "<?xml version=\"1.0\"?>\n<configuration>\n  <startup>\n    <supportedRuntime version=\"v4.5\" />\n    <supportedRuntime version=\"v4.0.30319\" />\n    <supportedRuntime version=\"v4.0\" />\n    <supportedRuntime version=\"v2.0.50727\" />\n  </startup>\n</configuration>\n"
  },
  {
    "path": "releases/twain-cs_02041100/twaincstst/AnyCPU/Debug/twaincstst.exe.config",
    "content": "﻿<?xml version=\"1.0\"?>\n<configuration>\n  <startup>\n    <supportedRuntime version=\"v4.5\" />\n    <supportedRuntime version=\"v4.0.30319\" />\n    <supportedRuntime version=\"v4.0\" />\n    <supportedRuntime version=\"v2.0.50727\" />\n  </startup>\n</configuration>\n"
  },
  {
    "path": "releases/twain-cs_02041100/twaincstst/AnyCPU/Release/twaincstst.exe.config",
    "content": "﻿<?xml version=\"1.0\"?>\n<configuration>\n  <startup>\n    <supportedRuntime version=\"v4.5\" />\n    <supportedRuntime version=\"v4.0.30319\" />\n    <supportedRuntime version=\"v4.0\" />\n    <supportedRuntime version=\"v2.0.50727\" />\n  </startup>\n</configuration>\n"
  },
  {
    "path": "releases/twain-cs_02041100/twaincstst/x64/Debug/twaincstst.exe.config",
    "content": "﻿<?xml version=\"1.0\"?>\n<configuration>\n  <startup>\n    <supportedRuntime version=\"v4.5\" />\n    <supportedRuntime version=\"v4.0.30319\" />\n    <supportedRuntime version=\"v4.0\" />\n    <supportedRuntime version=\"v2.0.50727\" />\n  </startup>\n</configuration>\n"
  },
  {
    "path": "releases/twain-cs_02041100/twaincstst/x64/Release/twaincstst.exe.config",
    "content": "﻿<?xml version=\"1.0\"?>\n<configuration>\n  <startup>\n    <supportedRuntime version=\"v4.5\" />\n    <supportedRuntime version=\"v4.0.30319\" />\n    <supportedRuntime version=\"v4.0\" />\n    <supportedRuntime version=\"v2.0.50727\" />\n  </startup>\n</configuration>\n"
  },
  {
    "path": "releases/twain-cs_02041100/twaincstst/x86/Debug/twaincstst.exe.config",
    "content": "﻿<?xml version=\"1.0\"?>\n<configuration>\n  <startup>\n    <supportedRuntime version=\"v4.5\" />\n    <supportedRuntime version=\"v4.0.30319\" />\n    <supportedRuntime version=\"v4.0\" />\n    <supportedRuntime version=\"v2.0.50727\" />\n  </startup>\n</configuration>\n"
  },
  {
    "path": "releases/twain-cs_02041100/twaincstst/x86/Release/twaincstst.exe.config",
    "content": "﻿<?xml version=\"1.0\"?>\n<configuration>\n  <startup>\n    <supportedRuntime version=\"v4.5\" />\n    <supportedRuntime version=\"v4.0.30319\" />\n    <supportedRuntime version=\"v4.0\" />\n    <supportedRuntime version=\"v2.0.50727\" />\n  </startup>\n</configuration>\n"
  },
  {
    "path": "twaincs/source/Properties/AssemblyInfo.cs",
    "content": "﻿///////////////////////////////////////////////////////////////////////////////////////\r\n//\r\n// TWAINCSScan AssemblyInfo\r\n//\r\n///////////////////////////////////////////////////////////////////////////////////////\r\n//  Copyright (C) 2013-2021 Kodak Alaris Inc.\r\n//\r\n//  Permission is hereby granted, free of charge, to any person obtaining a\r\n//  copy of this software and associated documentation files (the \"Software\"),\r\n//  to deal in the Software without restriction, including without limitation\r\n//  the rights to use, copy, modify, merge, publish, distribute, sublicense,\r\n//  and/or sell copies of the Software, and to permit persons to whom the\r\n//  Software is furnished to do so, subject to the following conditions:\r\n//\r\n//  The above copyright notice and this permission notice shall be included in\r\n//  all copies or substantial portions of the Software.\r\n//\r\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\r\n//  THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\r\n//  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\r\n//  DEALINGS IN THE SOFTWARE.\r\n///////////////////////////////////////////////////////////////////////////////////////\r\n\r\nusing System.Reflection;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Runtime.InteropServices;\r\n\r\n// General Information about an assembly is controlled through the following \r\n// set of attributes. Change these attribute values to modify the information\r\n// associated with an assembly.\r\n[assembly: AssemblyTitle(\"TWAIN\")]\r\n[assembly: AssemblyDescription(\"TWAIN Driver Interface for C#\")]\r\n[assembly: AssemblyConfiguration(\"\")]\r\n[assembly: AssemblyCompany(\"Kodak Alaris Inc.\")]\r\n[assembly: AssemblyProduct(\"TWAIN\")]\r\n[assembly: AssemblyCopyright(\"Copyright © 2013-2020, Kodak Alaris Inc.\")]\r\n[assembly: AssemblyTrademark(\"\")]\r\n[assembly: AssemblyCulture(\"\")]\r\n\r\n// Setting ComVisible to false makes the types in this assembly not visible \r\n// to COM components.  If you need to access a type in this assembly from \r\n// COM, set the ComVisible attribute to true on that type.\r\n[assembly: ComVisible(false)]\r\n\r\n// The following GUID is for the ID of the typelib if this project is exposed to COM\r\n[assembly: Guid(\"d3017689-1db2-4ee8-8d89-b5f78ba9ae90\")]\r\n\r\n// Version information for an assembly consists of the following four values:\r\n//\r\n//      Major Version\r\n//      Minor Version \r\n//      Build Number\r\n//      Revision\r\n//\r\n// You can specify all the values or you can default the Build and Revision Numbers \r\n// by using the '*' as shown below:\r\n[assembly: AssemblyVersion(\"2.5.0.0\")]\r\n[assembly: AssemblyFileVersion(\"2.5.0.0\")]\r\n"
  },
  {
    "path": "twaincs/source/TWAIN CS.rtf",
    "content": "{\\rtf1\\adeflang1025\\ansi\\ansicpg1252\\uc1\\adeff45\\deff0\\stshfdbch0\\stshfloch0\\stshfhich0\\stshfbi0\\deflang1033\\deflangfe1033\\themelang1033\\themelangfe0\\themelangcs0{\\fonttbl{\\f0\\fbidi \\froman\\fcharset0\\fprq2{\\*\\panose 02020603050405020304}Times New Roman{\\*\\falt Times New Roman};}\r\n{\\f1\\fbidi \\fswiss\\fcharset0\\fprq2{\\*\\panose 020b0604020202020204}Arial{\\*\\falt Arial};}{\\f2\\fbidi \\fmodern\\fcharset0\\fprq1{\\*\\panose 02070309020205020404}Courier New{\\*\\falt Courier New};}\r\n{\\f3\\fbidi \\froman\\fcharset2\\fprq2{\\*\\panose 05050102010706020507}Symbol;}{\\f4\\fbidi \\fswiss\\fcharset0\\fprq2{\\*\\panose 020b0604020202020204}Helvetica;}{\\f5\\fbidi \\fmodern\\fcharset0\\fprq1{\\*\\panose 02070409020205020404}Courier{\\*\\falt Courier New};}\r\n{\\f10\\fbidi \\fnil\\fcharset2\\fprq2{\\*\\panose 05000000000000000000}Wingdings;}{\\f34\\fbidi \\froman\\fcharset0\\fprq2{\\*\\panose 02040503050406030204}Cambria Math;}\r\n{\\f37\\fbidi \\fswiss\\fcharset0\\fprq2{\\*\\panose 020f0502020204030204}Calibri{\\*\\falt Century Gothic};}{\\f43\\fbidi \\froman\\fcharset0\\fprq2{\\*\\panose 00000000000000000000}Cambria{\\*\\falt Palatino Linotype};}\r\n{\\f44\\fbidi \\fswiss\\fcharset0\\fprq2{\\*\\panose 00000000000000000000}Tahoma;}{\\f45\\fbidi \\froman\\fcharset0\\fprq2{\\*\\panose 00000000000000000000}Book Antiqua{\\*\\falt Book Antiqua};}\r\n{\\f46\\fbidi \\froman\\fcharset0\\fprq0{\\*\\panose 00000000000000000000}BookAntiqua{\\*\\falt Book Antiqua};}{\\f47\\fbidi \\froman\\fcharset0\\fprq2{\\*\\panose 00000000000000000000}MS Serif;}\r\n{\\f48\\fbidi \\fswiss\\fcharset0\\fprq2{\\*\\panose 00000000000000000000}Geneva{\\*\\falt Arial};}{\\f49\\fbidi \\fmodern\\fcharset0\\fprq1{\\*\\panose 00000000000000000000}Courier Std;}{\\f50\\fbidi \\fmodern\\fcharset0\\fprq1{\\*\\panose 020b0609020204030204}Consolas;}\r\n{\\f51\\fbidi \\froman\\fcharset0\\fprq0{\\*\\panose 00000000000000000000}CourierNewPSMT;}{\\flomajor\\f31500\\fbidi \\froman\\fcharset0\\fprq2{\\*\\panose 02020603050405020304}Times New Roman{\\*\\falt Times New Roman};}\r\n{\\fdbmajor\\f31501\\fbidi \\froman\\fcharset0\\fprq2{\\*\\panose 02020603050405020304}Times New Roman{\\*\\falt Times New Roman};}{\\fhimajor\\f31502\\fbidi \\froman\\fcharset0\\fprq2{\\*\\panose 00000000000000000000}Cambria{\\*\\falt Palatino Linotype};}\r\n{\\fbimajor\\f31503\\fbidi \\froman\\fcharset0\\fprq2{\\*\\panose 02020603050405020304}Times New Roman{\\*\\falt Times New Roman};}{\\flominor\\f31504\\fbidi \\froman\\fcharset0\\fprq2{\\*\\panose 02020603050405020304}Times New Roman{\\*\\falt Times New Roman};}\r\n{\\fdbminor\\f31505\\fbidi \\froman\\fcharset0\\fprq2{\\*\\panose 02020603050405020304}Times New Roman{\\*\\falt Times New Roman};}{\\fhiminor\\f31506\\fbidi \\fswiss\\fcharset0\\fprq2{\\*\\panose 020f0502020204030204}Calibri{\\*\\falt Century Gothic};}\r\n{\\fbiminor\\f31507\\fbidi \\froman\\fcharset0\\fprq2{\\*\\panose 02020603050405020304}Times New Roman{\\*\\falt Times New Roman};}{\\f53\\fbidi \\froman\\fcharset238\\fprq2 Times New Roman CE{\\*\\falt Times New Roman};}\r\n{\\f54\\fbidi \\froman\\fcharset204\\fprq2 Times New Roman Cyr{\\*\\falt Times New Roman};}{\\f56\\fbidi \\froman\\fcharset161\\fprq2 Times New Roman Greek{\\*\\falt Times New Roman};}{\\f57\\fbidi \\froman\\fcharset162\\fprq2 Times New Roman Tur{\\*\\falt Times New Roman};}\r\n{\\f58\\fbidi \\froman\\fcharset177\\fprq2 Times New Roman (Hebrew){\\*\\falt Times New Roman};}{\\f59\\fbidi \\froman\\fcharset178\\fprq2 Times New Roman (Arabic){\\*\\falt Times New Roman};}\r\n{\\f60\\fbidi \\froman\\fcharset186\\fprq2 Times New Roman Baltic{\\*\\falt Times New Roman};}{\\f61\\fbidi \\froman\\fcharset163\\fprq2 Times New Roman (Vietnamese){\\*\\falt Times New Roman};}{\\f63\\fbidi \\fswiss\\fcharset238\\fprq2 Arial CE{\\*\\falt Arial};}\r\n{\\f64\\fbidi \\fswiss\\fcharset204\\fprq2 Arial Cyr{\\*\\falt Arial};}{\\f66\\fbidi \\fswiss\\fcharset161\\fprq2 Arial Greek{\\*\\falt Arial};}{\\f67\\fbidi \\fswiss\\fcharset162\\fprq2 Arial Tur{\\*\\falt Arial};}\r\n{\\f68\\fbidi \\fswiss\\fcharset177\\fprq2 Arial (Hebrew){\\*\\falt Arial};}{\\f69\\fbidi \\fswiss\\fcharset178\\fprq2 Arial (Arabic){\\*\\falt Arial};}{\\f70\\fbidi \\fswiss\\fcharset186\\fprq2 Arial Baltic{\\*\\falt Arial};}\r\n{\\f71\\fbidi \\fswiss\\fcharset163\\fprq2 Arial (Vietnamese){\\*\\falt Arial};}{\\f73\\fbidi \\fmodern\\fcharset238\\fprq1 Courier New CE{\\*\\falt Courier New};}{\\f74\\fbidi \\fmodern\\fcharset204\\fprq1 Courier New Cyr{\\*\\falt Courier New};}\r\n{\\f76\\fbidi \\fmodern\\fcharset161\\fprq1 Courier New Greek{\\*\\falt Courier New};}{\\f77\\fbidi \\fmodern\\fcharset162\\fprq1 Courier New Tur{\\*\\falt Courier New};}{\\f78\\fbidi \\fmodern\\fcharset177\\fprq1 Courier New (Hebrew){\\*\\falt Courier New};}\r\n{\\f79\\fbidi \\fmodern\\fcharset178\\fprq1 Courier New (Arabic){\\*\\falt Courier New};}{\\f80\\fbidi \\fmodern\\fcharset186\\fprq1 Courier New Baltic{\\*\\falt Courier New};}{\\f81\\fbidi \\fmodern\\fcharset163\\fprq1 Courier New (Vietnamese){\\*\\falt Courier New};}\r\n{\\f93\\fbidi \\fswiss\\fcharset238\\fprq2 Helvetica CE;}{\\f94\\fbidi \\fswiss\\fcharset204\\fprq2 Helvetica Cyr;}{\\f96\\fbidi \\fswiss\\fcharset161\\fprq2 Helvetica Greek;}{\\f97\\fbidi \\fswiss\\fcharset162\\fprq2 Helvetica Tur;}\r\n{\\f98\\fbidi \\fswiss\\fcharset177\\fprq2 Helvetica (Hebrew);}{\\f99\\fbidi \\fswiss\\fcharset178\\fprq2 Helvetica (Arabic);}{\\f100\\fbidi \\fswiss\\fcharset186\\fprq2 Helvetica Baltic;}{\\f101\\fbidi \\fswiss\\fcharset163\\fprq2 Helvetica (Vietnamese);}\r\n{\\f393\\fbidi \\froman\\fcharset238\\fprq2 Cambria Math CE;}{\\f394\\fbidi \\froman\\fcharset204\\fprq2 Cambria Math Cyr;}{\\f396\\fbidi \\froman\\fcharset161\\fprq2 Cambria Math Greek;}{\\f397\\fbidi \\froman\\fcharset162\\fprq2 Cambria Math Tur;}\r\n{\\f400\\fbidi \\froman\\fcharset186\\fprq2 Cambria Math Baltic;}{\\f401\\fbidi \\froman\\fcharset163\\fprq2 Cambria Math (Vietnamese);}{\\f423\\fbidi \\fswiss\\fcharset238\\fprq2 Calibri CE{\\*\\falt Century Gothic};}\r\n{\\f424\\fbidi \\fswiss\\fcharset204\\fprq2 Calibri Cyr{\\*\\falt Century Gothic};}{\\f426\\fbidi \\fswiss\\fcharset161\\fprq2 Calibri Greek{\\*\\falt Century Gothic};}{\\f427\\fbidi \\fswiss\\fcharset162\\fprq2 Calibri Tur{\\*\\falt Century Gothic};}\r\n{\\f428\\fbidi \\fswiss\\fcharset177\\fprq2 Calibri (Hebrew){\\*\\falt Century Gothic};}{\\f429\\fbidi \\fswiss\\fcharset178\\fprq2 Calibri (Arabic){\\*\\falt Century Gothic};}{\\f430\\fbidi \\fswiss\\fcharset186\\fprq2 Calibri Baltic{\\*\\falt Century Gothic};}\r\n{\\f431\\fbidi \\fswiss\\fcharset163\\fprq2 Calibri (Vietnamese){\\*\\falt Century Gothic};}{\\f483\\fbidi \\froman\\fcharset238\\fprq2 Cambria CE{\\*\\falt Palatino Linotype};}{\\f484\\fbidi \\froman\\fcharset204\\fprq2 Cambria Cyr{\\*\\falt Palatino Linotype};}\r\n{\\f486\\fbidi \\froman\\fcharset161\\fprq2 Cambria Greek{\\*\\falt Palatino Linotype};}{\\f487\\fbidi \\froman\\fcharset162\\fprq2 Cambria Tur{\\*\\falt Palatino Linotype};}{\\f490\\fbidi \\froman\\fcharset186\\fprq2 Cambria Baltic{\\*\\falt Palatino Linotype};}\r\n{\\f491\\fbidi \\froman\\fcharset163\\fprq2 Cambria (Vietnamese){\\*\\falt Palatino Linotype};}{\\f493\\fbidi \\fswiss\\fcharset238\\fprq2 Tahoma CE;}{\\f494\\fbidi \\fswiss\\fcharset204\\fprq2 Tahoma Cyr;}{\\f496\\fbidi \\fswiss\\fcharset161\\fprq2 Tahoma Greek;}\r\n{\\f497\\fbidi \\fswiss\\fcharset162\\fprq2 Tahoma Tur;}{\\f498\\fbidi \\fswiss\\fcharset177\\fprq2 Tahoma (Hebrew);}{\\f499\\fbidi \\fswiss\\fcharset178\\fprq2 Tahoma (Arabic);}{\\f500\\fbidi \\fswiss\\fcharset186\\fprq2 Tahoma Baltic;}\r\n{\\f501\\fbidi \\fswiss\\fcharset163\\fprq2 Tahoma (Vietnamese);}{\\f502\\fbidi \\fswiss\\fcharset222\\fprq2 Tahoma (Thai);}{\\f503\\fbidi \\froman\\fcharset238\\fprq2 Book Antiqua CE{\\*\\falt Book Antiqua};}\r\n{\\f504\\fbidi \\froman\\fcharset204\\fprq2 Book Antiqua Cyr{\\*\\falt Book Antiqua};}{\\f506\\fbidi \\froman\\fcharset161\\fprq2 Book Antiqua Greek{\\*\\falt Book Antiqua};}{\\f507\\fbidi \\froman\\fcharset162\\fprq2 Book Antiqua Tur{\\*\\falt Book Antiqua};}\r\n{\\f510\\fbidi \\froman\\fcharset186\\fprq2 Book Antiqua Baltic{\\*\\falt Book Antiqua};}{\\f553\\fbidi \\fmodern\\fcharset238\\fprq1 Consolas CE;}{\\f554\\fbidi \\fmodern\\fcharset204\\fprq1 Consolas Cyr;}{\\f556\\fbidi \\fmodern\\fcharset161\\fprq1 Consolas Greek;}\r\n{\\f557\\fbidi \\fmodern\\fcharset162\\fprq1 Consolas Tur;}{\\f560\\fbidi \\fmodern\\fcharset186\\fprq1 Consolas Baltic;}{\\f561\\fbidi \\fmodern\\fcharset163\\fprq1 Consolas (Vietnamese);}\r\n{\\flomajor\\f31508\\fbidi \\froman\\fcharset238\\fprq2 Times New Roman CE{\\*\\falt Times New Roman};}{\\flomajor\\f31509\\fbidi \\froman\\fcharset204\\fprq2 Times New Roman Cyr{\\*\\falt Times New Roman};}\r\n{\\flomajor\\f31511\\fbidi \\froman\\fcharset161\\fprq2 Times New Roman Greek{\\*\\falt Times New Roman};}{\\flomajor\\f31512\\fbidi \\froman\\fcharset162\\fprq2 Times New Roman Tur{\\*\\falt Times New Roman};}\r\n{\\flomajor\\f31513\\fbidi \\froman\\fcharset177\\fprq2 Times New Roman (Hebrew){\\*\\falt Times New Roman};}{\\flomajor\\f31514\\fbidi \\froman\\fcharset178\\fprq2 Times New Roman (Arabic){\\*\\falt Times New Roman};}\r\n{\\flomajor\\f31515\\fbidi \\froman\\fcharset186\\fprq2 Times New Roman Baltic{\\*\\falt Times New Roman};}{\\flomajor\\f31516\\fbidi \\froman\\fcharset163\\fprq2 Times New Roman (Vietnamese){\\*\\falt Times New Roman};}\r\n{\\fdbmajor\\f31518\\fbidi \\froman\\fcharset238\\fprq2 Times New Roman CE{\\*\\falt Times New Roman};}{\\fdbmajor\\f31519\\fbidi \\froman\\fcharset204\\fprq2 Times New Roman Cyr{\\*\\falt Times New Roman};}\r\n{\\fdbmajor\\f31521\\fbidi \\froman\\fcharset161\\fprq2 Times New Roman Greek{\\*\\falt Times New Roman};}{\\fdbmajor\\f31522\\fbidi \\froman\\fcharset162\\fprq2 Times New Roman Tur{\\*\\falt Times New Roman};}\r\n{\\fdbmajor\\f31523\\fbidi \\froman\\fcharset177\\fprq2 Times New Roman (Hebrew){\\*\\falt Times New Roman};}{\\fdbmajor\\f31524\\fbidi \\froman\\fcharset178\\fprq2 Times New Roman (Arabic){\\*\\falt Times New Roman};}\r\n{\\fdbmajor\\f31525\\fbidi \\froman\\fcharset186\\fprq2 Times New Roman Baltic{\\*\\falt Times New Roman};}{\\fdbmajor\\f31526\\fbidi \\froman\\fcharset163\\fprq2 Times New Roman (Vietnamese){\\*\\falt Times New Roman};}\r\n{\\fhimajor\\f31528\\fbidi \\froman\\fcharset238\\fprq2 Cambria CE{\\*\\falt Palatino Linotype};}{\\fhimajor\\f31529\\fbidi \\froman\\fcharset204\\fprq2 Cambria Cyr{\\*\\falt Palatino Linotype};}\r\n{\\fhimajor\\f31531\\fbidi \\froman\\fcharset161\\fprq2 Cambria Greek{\\*\\falt Palatino Linotype};}{\\fhimajor\\f31532\\fbidi \\froman\\fcharset162\\fprq2 Cambria Tur{\\*\\falt Palatino Linotype};}\r\n{\\fhimajor\\f31535\\fbidi \\froman\\fcharset186\\fprq2 Cambria Baltic{\\*\\falt Palatino Linotype};}{\\fhimajor\\f31536\\fbidi \\froman\\fcharset163\\fprq2 Cambria (Vietnamese){\\*\\falt Palatino Linotype};}\r\n{\\fbimajor\\f31538\\fbidi \\froman\\fcharset238\\fprq2 Times New Roman CE{\\*\\falt Times New Roman};}{\\fbimajor\\f31539\\fbidi \\froman\\fcharset204\\fprq2 Times New Roman Cyr{\\*\\falt Times New Roman};}\r\n{\\fbimajor\\f31541\\fbidi \\froman\\fcharset161\\fprq2 Times New Roman Greek{\\*\\falt Times New Roman};}{\\fbimajor\\f31542\\fbidi \\froman\\fcharset162\\fprq2 Times New Roman Tur{\\*\\falt Times New Roman};}\r\n{\\fbimajor\\f31543\\fbidi \\froman\\fcharset177\\fprq2 Times New Roman (Hebrew){\\*\\falt Times New Roman};}{\\fbimajor\\f31544\\fbidi \\froman\\fcharset178\\fprq2 Times New Roman (Arabic){\\*\\falt Times New Roman};}\r\n{\\fbimajor\\f31545\\fbidi \\froman\\fcharset186\\fprq2 Times New Roman Baltic{\\*\\falt Times New Roman};}{\\fbimajor\\f31546\\fbidi \\froman\\fcharset163\\fprq2 Times New Roman (Vietnamese){\\*\\falt Times New Roman};}\r\n{\\flominor\\f31548\\fbidi \\froman\\fcharset238\\fprq2 Times New Roman CE{\\*\\falt Times New Roman};}{\\flominor\\f31549\\fbidi \\froman\\fcharset204\\fprq2 Times New Roman Cyr{\\*\\falt Times New Roman};}\r\n{\\flominor\\f31551\\fbidi \\froman\\fcharset161\\fprq2 Times New Roman Greek{\\*\\falt Times New Roman};}{\\flominor\\f31552\\fbidi \\froman\\fcharset162\\fprq2 Times New Roman Tur{\\*\\falt Times New Roman};}\r\n{\\flominor\\f31553\\fbidi \\froman\\fcharset177\\fprq2 Times New Roman (Hebrew){\\*\\falt Times New Roman};}{\\flominor\\f31554\\fbidi \\froman\\fcharset178\\fprq2 Times New Roman (Arabic){\\*\\falt Times New Roman};}\r\n{\\flominor\\f31555\\fbidi \\froman\\fcharset186\\fprq2 Times New Roman Baltic{\\*\\falt Times New Roman};}{\\flominor\\f31556\\fbidi \\froman\\fcharset163\\fprq2 Times New Roman (Vietnamese){\\*\\falt Times New Roman};}\r\n{\\fdbminor\\f31558\\fbidi \\froman\\fcharset238\\fprq2 Times New Roman CE{\\*\\falt Times New Roman};}{\\fdbminor\\f31559\\fbidi \\froman\\fcharset204\\fprq2 Times New Roman Cyr{\\*\\falt Times New Roman};}\r\n{\\fdbminor\\f31561\\fbidi \\froman\\fcharset161\\fprq2 Times New Roman Greek{\\*\\falt Times New Roman};}{\\fdbminor\\f31562\\fbidi \\froman\\fcharset162\\fprq2 Times New Roman Tur{\\*\\falt Times New Roman};}\r\n{\\fdbminor\\f31563\\fbidi \\froman\\fcharset177\\fprq2 Times New Roman (Hebrew){\\*\\falt Times New Roman};}{\\fdbminor\\f31564\\fbidi \\froman\\fcharset178\\fprq2 Times New Roman (Arabic){\\*\\falt Times New Roman};}\r\n{\\fdbminor\\f31565\\fbidi \\froman\\fcharset186\\fprq2 Times New Roman Baltic{\\*\\falt Times New Roman};}{\\fdbminor\\f31566\\fbidi \\froman\\fcharset163\\fprq2 Times New Roman (Vietnamese){\\*\\falt Times New Roman};}\r\n{\\fhiminor\\f31568\\fbidi \\fswiss\\fcharset238\\fprq2 Calibri CE{\\*\\falt Century Gothic};}{\\fhiminor\\f31569\\fbidi \\fswiss\\fcharset204\\fprq2 Calibri Cyr{\\*\\falt Century Gothic};}\r\n{\\fhiminor\\f31571\\fbidi \\fswiss\\fcharset161\\fprq2 Calibri Greek{\\*\\falt Century Gothic};}{\\fhiminor\\f31572\\fbidi \\fswiss\\fcharset162\\fprq2 Calibri Tur{\\*\\falt Century Gothic};}\r\n{\\fhiminor\\f31573\\fbidi \\fswiss\\fcharset177\\fprq2 Calibri (Hebrew){\\*\\falt Century Gothic};}{\\fhiminor\\f31574\\fbidi \\fswiss\\fcharset178\\fprq2 Calibri (Arabic){\\*\\falt Century Gothic};}\r\n{\\fhiminor\\f31575\\fbidi \\fswiss\\fcharset186\\fprq2 Calibri Baltic{\\*\\falt Century Gothic};}{\\fhiminor\\f31576\\fbidi \\fswiss\\fcharset163\\fprq2 Calibri (Vietnamese){\\*\\falt Century Gothic};}\r\n{\\fbiminor\\f31578\\fbidi \\froman\\fcharset238\\fprq2 Times New Roman CE{\\*\\falt Times New Roman};}{\\fbiminor\\f31579\\fbidi \\froman\\fcharset204\\fprq2 Times New Roman Cyr{\\*\\falt Times New Roman};}\r\n{\\fbiminor\\f31581\\fbidi \\froman\\fcharset161\\fprq2 Times New Roman Greek{\\*\\falt Times New Roman};}{\\fbiminor\\f31582\\fbidi \\froman\\fcharset162\\fprq2 Times New Roman Tur{\\*\\falt Times New Roman};}\r\n{\\fbiminor\\f31583\\fbidi \\froman\\fcharset177\\fprq2 Times New Roman (Hebrew){\\*\\falt Times New Roman};}{\\fbiminor\\f31584\\fbidi \\froman\\fcharset178\\fprq2 Times New Roman (Arabic){\\*\\falt Times New Roman};}\r\n{\\fbiminor\\f31585\\fbidi \\froman\\fcharset186\\fprq2 Times New Roman Baltic{\\*\\falt Times New Roman};}{\\fbiminor\\f31586\\fbidi \\froman\\fcharset163\\fprq2 Times New Roman (Vietnamese){\\*\\falt Times New Roman};}}{\\colortbl;\\red0\\green0\\blue0;\r\n\\red0\\green0\\blue255;\\red0\\green255\\blue255;\\red0\\green255\\blue0;\\red255\\green0\\blue255;\\red255\\green0\\blue0;\\red255\\green255\\blue0;\\red255\\green255\\blue255;\\red0\\green0\\blue128;\\red0\\green128\\blue128;\\red0\\green128\\blue0;\\red128\\green0\\blue128;\r\n\\red128\\green0\\blue0;\\red128\\green128\\blue0;\\red128\\green128\\blue128;\\red192\\green192\\blue192;\\red0\\green0\\blue0;\\red0\\green0\\blue0;\\cfollowedhyperlink\\ctint255\\cshade255\\red128\\green0\\blue128;\\red96\\green94\\blue92;\\red225\\green223\\blue221;\r\n\\red31\\green73\\blue125;\\red0\\green176\\blue80;}{\\*\\defchp \\fs22 }{\\*\\defpap \\ql \\li0\\ri0\\sa200\\sl276\\slmult1\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 }\\noqfpromote {\\stylesheet{\r\n\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\snext0 \\sqformat \\spriority0 Normal;}{\r\n\\s1\\ql \\li0\\ri0\\sb720\\keepn\\widctlpar\\brdrt\\brdrs\\brdrw30\\brsp120 \\wrapdefault\\nooverflow\\faroman\\outlinelevel0\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs36\\alang1025 \\ltrch\\fcs0 \\b\\f1\\fs36\\cf9\\lang1024\\langfe1024\\cgrid\\noproof\\langnp1033\\langfenp1033 \r\n\\sbasedon0 \\snext0 \\slink15 \\sqformat heading 1;}{\\s2\\ql \\li720\\ri0\\sb360\\keepn\\widctlpar\\wrapdefault\\nooverflow\\faroman\\outlinelevel1\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs20\\alang1025 \\ltrch\\fcs0 \r\n\\b\\f1\\fs20\\cf13\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\slink16 \\sqformat heading 2;}{\\s3\\ql \\li1440\\ri0\\sb180\\keepn\\widctlpar\\wrapdefault\\nooverflow\\faroman\\outlinelevel2\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \r\n\\ab\\af1\\afs20\\alang1025 \\ltrch\\fcs0 \\b\\f1\\fs20\\cf10\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext24 \\slink17 \\sqformat heading 3;}{\\s4\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\outlinelevel3\\rin0\\lin1440\\itap0 \r\n\\rtlch\\fcs1 \\af47\\afs24\\alang1025 \\ltrch\\fcs0 \\f47\\fs24\\ul\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext24 \\slink18 \\sqformat heading 4;}{\r\n\\s5\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\outlinelevel4\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\ab\\af47\\afs20\\alang1025 \\ltrch\\fcs0 \\b\\f47\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext24 \\slink19 \\sqformat \r\nheading 5;}{\\s6\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\outlinelevel5\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af47\\afs20\\alang1025 \\ltrch\\fcs0 \\f47\\fs20\\ul\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \r\n\\sbasedon0 \\snext24 \\slink20 \\sqformat heading 6;}{\\s7\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\outlinelevel6\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\ai\\af47\\afs20\\alang1025 \\ltrch\\fcs0 \r\n\\i\\f47\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext24 \\slink21 \\sqformat heading 7;}{\\s8\\ql \\li1440\\ri0\\sb240\\sa60\\widctlpar\\wrapdefault\\nooverflow\\faroman\\outlinelevel7\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\ai\\af45\\afs20\\alang1025 \r\n\\ltrch\\fcs0 \\i\\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\slink22 \\sqformat heading 8;}{\\s9\\ql \\li1440\\ri0\\sb240\\sa60\\widctlpar\\wrapdefault\\nooverflow\\faroman\\outlinelevel8\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \r\n\\ab\\ai\\af45\\afs18\\alang1025 \\ltrch\\fcs0 \\b\\i\\f45\\fs18\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\slink23 \\sqformat heading 9;}{\\*\\cs10 \\additive \\ssemihidden Default Paragraph Font;}{\\*\r\n\\ts11\\tsrowd\\trftsWidthB3\\trpaddl108\\trpaddr108\\trpaddfl3\\trpaddft3\\trpaddfb3\\trpaddfr3\\trcbpat1\\trcfpat1\\tblind0\\tblindtype3\\tsvertalt\\tsbrdrt\\tsbrdrl\\tsbrdrb\\tsbrdrr\\tsbrdrdgl\\tsbrdrdgr\\tsbrdrh\\tsbrdrv \\ql \\li0\\ri0\\sa200\\sl276\\slmult1\r\n\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af0\\afs22\\alang1025 \\ltrch\\fcs0 \\fs22\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\snext11 \\ssemihidden \\sunhideused Normal Table;}{\\*\\cs15 \\additive \\rtlch\\fcs1 \r\n\\ab\\af0\\afs32 \\ltrch\\fcs0 \\b\\f43\\fs32\\kerning32 \\sbasedon10 \\slink1 \\slocked Heading 1 Char;}{\\*\\cs16 \\additive \\rtlch\\fcs1 \\ab\\ai\\af0\\afs28 \\ltrch\\fcs0 \\b\\i\\f43\\fs28 \\sbasedon10 \\slink2 \\slocked \\ssemihidden Heading 2 Char;}{\\*\\cs17 \\additive \r\n\\rtlch\\fcs1 \\ab\\af0\\afs26 \\ltrch\\fcs0 \\b\\f43\\fs26 \\sbasedon10 \\slink3 \\slocked \\ssemihidden Heading 3 Char;}{\\*\\cs18 \\additive \\rtlch\\fcs1 \\ab\\af0\\afs28 \\ltrch\\fcs0 \\b\\f37\\fs28 \\sbasedon10 \\slink4 \\slocked \\ssemihidden Heading 4 Char;}{\\*\\cs19 \\additive \r\n\\rtlch\\fcs1 \\ab\\ai\\af0\\afs26 \\ltrch\\fcs0 \\b\\i\\f37\\fs26 \\sbasedon10 \\slink5 \\slocked \\ssemihidden Heading 5 Char;}{\\*\\cs20 \\additive \\rtlch\\fcs1 \\ab\\af0 \\ltrch\\fcs0 \\b\\f37 \\sbasedon10 \\slink6 \\slocked \\ssemihidden Heading 6 Char;}{\\*\\cs21 \\additive \r\n\\rtlch\\fcs1 \\af0\\afs24 \\ltrch\\fcs0 \\f37\\fs24 \\sbasedon10 \\slink7 \\slocked \\ssemihidden Heading 7 Char;}{\\*\\cs22 \\additive \\rtlch\\fcs1 \\ai\\af0\\afs24 \\ltrch\\fcs0 \\i\\f37\\fs24 \\sbasedon10 \\slink8 \\slocked \\ssemihidden Heading 8 Char;}{\\*\\cs23 \\additive \r\n\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\f43 \\sbasedon10 \\slink9 \\slocked \\ssemihidden Heading 9 Char;}{\\s24\\ql \\li1800\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1800\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \r\n\\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext24 Normal Indent;}{\\s25\\ql \\li0\\ri0\\widctlpar\\tqr\\tx9360\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\ai\\af1\\afs16\\alang1025 \\ltrch\\fcs0 \r\n\\i\\f1\\fs16\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext25 \\slink26 footer;}{\\*\\cs26 \\additive \\rtlch\\fcs1 \\af45\\afs20 \\ltrch\\fcs0 \\f45\\fs20 \\sbasedon10 \\slink25 \\slocked \\ssemihidden Footer Char;}{\\s27\\ql \\li0\\ri0\\widctlpar\r\n\\tqr\\tx9900\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\ab\\ai\\af1\\afs20\\alang1025 \\ltrch\\fcs0 \\b\\i\\f1\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext27 \\slink28 header;}{\\*\\cs28 \\additive \\rtlch\\fcs1 \\af45\\afs20 \r\n\\ltrch\\fcs0 \\f45\\fs20 \\sbasedon10 \\slink27 \\slocked \\ssemihidden Header Char;}{\\s29\\ql \\li2160\\ri0\\sb40\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin2160\\itap0 \\rtlch\\fcs1 \\af2\\afs18\\alang1025 \\ltrch\\fcs0 \r\n\\f2\\fs18\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon30 \\snext29 prog indent;}{\\s30\\ql \\li1800\\ri0\\sb40\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1800\\itap0 \\rtlch\\fcs1 \\af2\\afs18\\alang1025 \\ltrch\\fcs0 \r\n\\f2\\fs18\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon31 \\snext30 prog;}{\\s31\\ql \\fi-360\\li360\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin360\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \r\n\\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext31 List;}{\\*\\cs32 \\additive \\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\sbasedon10 page number;}{\\s33\\ql \\fi-216\\li2016\\ri0\\sb40\\widctlpar\\wrapdefault{\\*\\pn \\pnlvlblt\\ilvl10\\ls2047\\pnrnot0\r\n\\pnf5\\pnstart1\\pnindent216\\pnhang {\\pntxtb ?}}\\nooverflow\\faroman\\ls2047\\ilvl10\\rin0\\lin2016\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext33 bullet;}{\r\n\\s34\\ql \\li0\\ri0\\sb720\\keepn\\widctlpar\\brdrt\\brdrs\\brdrw30\\brsp120 \\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs36\\alang1025 \\ltrch\\fcs0 \\b\\f1\\fs36\\cf9\\lang1024\\langfe1024\\cgrid\\noproof\\langnp1033\\langfenp1033 \r\n\\sbasedon1 \\snext34 Style1;}{\\s35\\ql \\fi-216\\li2016\\ri0\\sb120\\widctlpar\\wrapdefault{\\*\\pn \\pnlvlblt\\ilvl10\\ls2047\\pnrnot0\\pnf5\\pnstart1\\pnindent216\\pnhang {\\pntxtb ?}}\\nooverflow\\faroman\\ls2047\\ilvl10\\rin0\\lin2016\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \r\n\\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon33 \\snext33 bullet first;}{\\s36\\ql \\li1440\\ri0\\sb180\\widctlpar\\tx5220\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs20\\alang1025 \\ltrch\\fcs0 \r\n\\b\\f1\\fs20\\cf13\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext38 chapter contents;}{\\s37\\ql \\li1440\\ri0\\sb40\\widctlpar\\tx5400\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \r\n\\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext37 chapter contents list;}{\\s38\\ql \\li1440\\ri0\\sb80\\widctlpar\\tx5400\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \r\n\\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext37 chapter contents list first;}{\\s39\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs200\\alang1025 \\ltrch\\fcs0 \r\n\\b\\f1\\fs200\\lang1024\\langfe1024\\cgrid\\noproof\\langnp1033\\langfenp1033 \\snext0 chapter num;}{\\s40\\qr \\li0\\ri0\\sa720\\widctlpar\\brdrt\\brdrs\\brdrw60\\brsp20 \\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs54\\alang1025 \\ltrch\\fcs0 \r\n\\b\\f1\\fs54\\cf9\\lang1024\\langfe1024\\cgrid\\noproof\\langnp1033\\langfenp1033 \\snext36 chapter title;}{\\s41\\ql \\li1800\\ri0\\sb120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1800\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \r\n\\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon31 \\snext31 list first;}{\\s42\\ql \\fi-216\\li2376\\ri0\\sb40\\widctlpar\\wrapdefault{\\*\\pn \\pnlvlblt\\ilvl10\\ls2047\\pnrnot0\\pnf48\\pnstart1\\pnindent216\\pnhang {\\pntxtb ?}}\r\n\\nooverflow\\faroman\\ls2047\\ilvl10\\rin0\\lin2376\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext42 bullet indent;}{\r\n\\s43\\ql \\li1440\\ri0\\sb120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 normal after heading 3;}{\r\n\\s44\\ql \\fi-216\\li2376\\ri0\\sb80\\widctlpar\\wrapdefault{\\*\\pn \\pnlvlblt\\ilvl10\\ls2047\\pnrnot0\\pnf48\\pnstart1\\pnindent216\\pnhang {\\pntxtb ?}}\\nooverflow\\faroman\\ls2047\\ilvl10\\rin0\\lin2376\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \r\n\\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon33 \\snext42 bullet indent first;}{\\s45\\qr \\li720\\ri0\\sa360\\sl-1060\\slmult0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \\ab\\ai\\af1\\afs48\\alang1025 \\ltrch\\fcs0 \r\n\\b\\i\\f1\\fs48\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 contents title;}{\\s46\\ql \\li2160\\ri0\\sb40\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin2160\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \r\n\\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon31 \\snext46 def;}{\\s47\\ql \\li2160\\ri0\\sb80\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin2160\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \r\n\\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon46 \\snext47 def 2;}{\\s48\\ql \\li1080\\ri0\\sb120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1080\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \r\n\\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon41 \\snext46 def first;}{\\s49\\ql \\li2160\\ri0\\sb40\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin2160\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \r\n\\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon46 \\snext0 def last;}{\\s50\\ql \\li2160\\ri0\\sb80\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin2160\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \r\n\\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon49 \\snext0 def last 2;}{\\s51\\ql \\li1800\\ri0\\sb120\\keepn\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1800\\itap0 \\rtlch\\fcs1 \\ab\\af45\\afs20\\alang1025 \\ltrch\\fcs0 \r\n\\b\\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon41 \\snext46 def term;}{\\s52\\ql \\li1800\\ri0\\sb120\\keepn\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1800\\itap0 \\rtlch\\fcs1 \\ab\\af45\\afs20\\alang1025 \\ltrch\\fcs0 \r\n\\b\\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon41 \\snext52 def term first;}{\\s53\\qc \\li1440\\ri0\\sb240\\keepn\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \r\n\\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext54 figure;}{\\s54\\qc \\li1440\\ri0\\sb180\\sa240\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs20\\alang1025 \\ltrch\\fcs0 \r\n\\b\\f1\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 figure title;}{\\s55\\qc \\li1440\\ri0\\sb240\\keepn\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \r\n\\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon53 \\snext0 figure after step;}{\\s56\\qc \\li1440\\ri0\\sb180\\sa240\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs20\\alang1025 \\ltrch\\fcs0 \r\n\\b\\f1\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon54 \\snext56 figure title after step;}{\\s57\\qc \\li1440\\ri0\\sb180\\sa360\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs20\\alang1025 \\ltrch\\fcs0 \r\n\\b\\f1\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon54 \\snext0 figure title continued;}{\\*\\cs58 \\additive \\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\sbasedon10 line number;}{\r\n\\s59\\ql \\li2160\\ri0\\sb40\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin2160\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon31 \\snext59 list indent;}{\r\n\\s60\\ql \\li2160\\ri0\\sb80\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin2160\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon31 \\snext59 list indent first;}{\r\n\\s61\\ql \\fi-360\\li2160\\ri0\\sb120\\widctlpar\\wrapdefault{\\*\\pn \\pnlvlbody\\ilvl11\\ls2047\\pnrnot0\\pndec\\pnstart1\\pnindent360\\pnhang {\\pntxta .}}\\nooverflow\\faroman\\ls2047\\ilvl11\\rin0\\lin2160\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \r\n\\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext61 List Number;}{\\s62\\ql \\li2160\\ri0\\sb80\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin2160\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \r\n\\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon60 \\snext62 list number no number;}{\\s63\\ql \\li720\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \r\n\\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext63 normal before table;}{\\s64\\ql \\fi-806\\li2246\\ri0\\sb240\\sa120\\widctlpar\\brdrt\\brdrs\\brdrw15\\brsp100 \\brdrb\\brdrs\\brdrw15\\brsp100 \r\n\\tx2250\\wrapdefault\\nooverflow\\faroman\\rin0\\lin2246\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 note;}{\r\n\\s65\\qr \\li0\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\ai\\af1\\afs20\\alang1025 \\ltrch\\fcs0 \\i\\f1\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext65 part number;}{\r\n\\s66\\ql \\li1800\\ri0\\sb120\\widctlpar\\tx4770\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1800\\itap0 \\rtlch\\fcs1 \\af2\\afs18\\alang1025 \\ltrch\\fcs0 \\f2\\fs18\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon41 \\snext30 prog first;}{\r\n\\s67\\ql \\li1800\\ri0\\sb40\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1800\\itap0 \\rtlch\\fcs1 \\af2\\afs18\\alang1025 \\ltrch\\fcs0 \\f2\\fs18\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon31 \\snext67 prog last;}{\r\n\\s68\\ql \\li1800\\ri0\\sb120\\widctlpar\\tx4770\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1800\\itap0 \\rtlch\\fcs1 \\af2\\afs18\\alang1025 \\ltrch\\fcs0 \\f2\\fs18\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon66 \\snext68 prog single;}{\r\n\\s69\\ql \\li878\\ri144\\sl-180\\slmult0\\widctlpar\\brdrt\\brdrs\\brdrw15\\brsp100 \\brdrl\\brdrs\\brdrw15\\brsp100 \\brdrb\\brdrs\\brdrw15\\brsp100 \\brdrr\\brdrs\\brdrw15\\brsp100 \r\n\\tx1152\\tx1440\\tx1728\\tx2016\\tx2304\\tx2592\\tx2880\\wrapdefault\\nooverflow\\faroman\\rin144\\lin878\\itap0 \\rtlch\\fcs1 \\af2\\afs15\\alang1025 \\ltrch\\fcs0 \\f2\\fs15\\lang1024\\langfe1024\\cgrid\\noproof\\langnp1033\\langfenp1033 \\snext69 program text;}{\r\n\\s70\\ql \\fi-360\\li2520\\ri0\\sb80\\widctlpar\\wrapdefault{\\*\\pn \\pnlvlbody\\ilvl11\\ls2047\\pnrnot0\\pnlcltr\\pnb0\\pni0\\pnf4\\pnfs20\\pnstart1\\pnindent360\\pnhang {\\pntxta . }}\\nooverflow\\faroman\\ls2047\\ilvl11\\rin0\\lin2520\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \r\n\\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext70 substep;}{\\s71\\ql \\li72\\ri72\\sb80\\sa80\\keepn\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin72\\lin72\\itap0 \\rtlch\\fcs1 \\ab\\af45\\afs20\\alang1025 \\ltrch\\fcs0 \r\n\\b\\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 table head;}{\\s72\\ql \\li72\\ri72\\sb80\\sa80\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin72\\lin72\\itap0 \\rtlch\\fcs1 \\af45\\afs18\\alang1025 \\ltrch\\fcs0 \r\n\\f45\\fs18\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\snext72 table text;}{\\s73\\qc \\li1440\\ri0\\sb300\\sa120\\keepn\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs20\\alang1025 \\ltrch\\fcs0 \r\n\\b\\f1\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext71 table title;}{\\s74\\qc \\li1440\\ri0\\sb300\\sa120\\keepn\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs20\\alang1025 \\ltrch\\fcs0 \r\n\\b\\f1\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon73 \\snext71 table title continued;}{\\s75\\ql \\li1800\\ri0\\sb120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1800\\itap0 \\rtlch\\fcs1 \\af1\\afs20\\alang1025 \\ltrch\\fcs0 \r\n\\f1\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 triplet single;}{\\s76\\ql \\li720\\ri0\\sb360\\keepn\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs20\\alang1025 \\ltrch\\fcs0 \r\n\\b\\f1\\fs20\\cf13\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon2 \\snext0 triplet heading 2;}{\\s77\\ql \\li0\\ri0\\sb180\\keepn\\pagebb\\widctlpar\\brdrt\\brdrs\\brdrw30\\brsp120 \\tqr\\tx9893\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \r\n\\ab\\af1\\afs24\\alang1025 \\ltrch\\fcs0 \\b\\f1\\fs24\\cf9\\lang1024\\langfe1024\\cgrid\\noproof\\langnp1033\\langfenp1033 \\sbasedon1 \\snext77 triplet heading;}{\\s78\\ql \\li1080\\ri0\\sb120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1080\\itap0 \\rtlch\\fcs1 \r\n\\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext79 glossary def;}{\\s79\\ql \\li720\\ri0\\sb180\\keepn\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \r\n\\ab\\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\b\\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon80 \\snext78 glossary word;}{\\s80\\ql \\li720\\ri0\\sb180\\keepn\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \r\n\\ab\\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\b\\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext78 glossary word first;}{\\s81\\ql \\li1080\\ri0\\sb120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1080\\itap0 \\rtlch\\fcs1 \r\n\\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon78 \\snext0 glossary def last;}{\\s82\\ql \\fi-216\\li2736\\ri0\\sb80\\widctlpar\\wrapdefault{\\*\\pn \\pnlvlblt\\ilvl10\\ls2047\\pnrnot0\r\n\\pnf5\\pnstart1\\pnindent216\\pnhang {\\pntxtb ?}}\\nooverflow\\faroman\\ls2047\\ilvl10\\rin0\\lin2736\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext82 ref bullet 1;}{\r\n\\s83\\ql \\fi-216\\li2736\\ri0\\sb40\\widctlpar\\wrapdefault{\\*\\pn \\pnlvlblt\\ilvl10\\ls2047\\pnrnot0\\pnf5\\pnstart1\\pnindent216\\pnhang {\\pntxtb ?}}\\nooverflow\\faroman\\ls2047\\ilvl10\\rin0\\lin2736\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \r\n\\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon82 \\snext83 ref bullet 2;}{\\s84\\ql \\fi-1440\\li2160\\ri0\\sb180\\widctlpar\\tx2160\\wrapdefault\\nooverflow\\faroman\\rin0\\lin2160\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \r\n\\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext84 ref para 1;}{\\s85\\ql \\li2160\\ri0\\sb80\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin2160\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \r\n\\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon84 \\snext84 ref para 2;}{\\s86\\ql \\li2520\\ri0\\sb80\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin2520\\itap0 \\rtlch\\fcs1 \\af2\\afs18\\alang1025 \\ltrch\\fcs0 \r\n\\f2\\fs18\\lang1024\\langfe1024\\cgrid\\noproof\\langnp1033\\langfenp1033 \\snext86 ref prog 1;}{\\s87\\ql \\li2520\\ri0\\sb40\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin2520\\itap0 \\rtlch\\fcs1 \\af2\\afs18\\alang1025 \\ltrch\\fcs0 \r\n\\f2\\fs18\\lang1024\\langfe1024\\cgrid\\noproof\\langnp1033\\langfenp1033 \\sbasedon86 \\snext87 ref prog 2;}{\\s88\\ql \\li2160\\ri0\\sb120\\widctlpar\\tx4770\\wrapdefault\\nooverflow\\faroman\\rin0\\lin2160\\itap0 \\rtlch\\fcs1 \\af2\\afs18\\alang1025 \\ltrch\\fcs0 \r\n\\f2\\fs18\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon66 \\snext88 prog indent first;}{\\s89\\ql \\li2160\\ri0\\sb40\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin2160\\itap0 \\rtlch\\fcs1 \\af2\\afs18\\alang1025 \\ltrch\\fcs0 \r\n\\f2\\fs18\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon67 \\snext89 prog indent last;}{\\s90\\ql \\li0\\ri0\\sb180\\keepn\\pagebb\\widctlpar\\brdrt\\brdrs\\brdrw30\\brsp120 \\tqr\\tx9893\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \r\n\\ab\\af1\\afs24\\alang1025 \\ltrch\\fcs0 \\b\\f1\\fs24\\cf9\\lang1024\\langfe1024\\cgrid\\noproof\\langnp1033\\langfenp1033 \\sbasedon77 \\snext0 ref heading;}{\\s91\\ql \\li720\\ri0\\sb360\\keepn\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \r\n\\ab\\af1\\afs20\\alang1025 \\ltrch\\fcs0 \\b\\f1\\fs20\\cf13\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon76 \\snext0 ref heading 2;}{\\s92\\ql \\li1440\\ri0\\sb120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \r\n\\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon41 \\snext93 ref list first;}{\\s93\\ql \\li1440\\ri0\\sb40\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \r\n\\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon31 \\snext93 ref list;}{\\s94\\ql \\fi-2160\\li3240\\ri0\\sb120\\widctlpar\\tx3240\\wrapdefault\\nooverflow\\faroman\\rin0\\lin3240\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \r\n\\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon43 \\snext94 ref subhead first;}{\\s95\\ql \\fi-2160\\li3240\\ri0\\sb40\\widctlpar\\tx3240\\wrapdefault\\nooverflow\\faroman\\rin0\\lin3240\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \r\n\\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext94 ref subhead last;}{\\s96\\ql \\li1440\\ri0\\sb180\\sa120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \r\n\\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext96 \\slink97 Body Text;}{\\*\\cs97 \\additive \\rtlch\\fcs1 \\af45\\afs20 \\ltrch\\fcs0 \\f45\\fs20 \\sbasedon10 \\slink96 \\slocked \\ssemihidden Body Text Char;}{\r\n\\s98\\ql \\li1080\\ri0\\sb120\\keepn\\widctlpar\\tqr\\tldot\\tx9893\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1080\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs20\\alang1025 \\ltrch\\fcs0 \\b\\f1\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \r\n\\sbasedon0 \\snext0 \\sautoupd \\spriority39 toc 1;}{\\s99\\ql \\li1440\\ri1440\\sb180\\sa120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin1440\\lin1440\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \r\n\\sbasedon0 \\snext99 Block Text;}{\\s100\\ql \\li360\\ri0\\sb180\\sa120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin360\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \r\n\\sbasedon0 \\snext100 \\slink101 Body Text 2;}{\\*\\cs101 \\additive \\rtlch\\fcs1 \\af45\\afs20 \\ltrch\\fcs0 \\f45\\fs20 \\sbasedon10 \\slink100 \\slocked \\ssemihidden Body Text 2 Char;}{\r\n\\s102\\ql \\li1440\\ri0\\sb180\\sa120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af45\\afs16\\alang1025 \\ltrch\\fcs0 \\f45\\fs16\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext102 \\slink103 Body Text 3;}{\\*\\cs103 \r\n\\additive \\rtlch\\fcs1 \\af45\\afs16 \\ltrch\\fcs0 \\f45\\fs16 \\sbasedon10 \\slink102 \\slocked \\ssemihidden Body Text 3 Char;}{\\s104\\ql \\fi210\\li1440\\ri0\\sb180\\sa120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \r\n\\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon96 \\snext104 \\slink105 Body Text First Indent;}{\\*\\cs105 \\additive \\rtlch\\fcs1 \\af45\\afs20 \\ltrch\\fcs0 \\f45\\fs20 \\sbasedon97 \\slink104 \\slocked \\ssemihidden \r\nBody Text First Indent Char;}{\\s106\\ql \\li283\\ri0\\sb180\\sa120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin283\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \r\n\\sbasedon0 \\snext106 \\slink107 Body Text Indent;}{\\*\\cs107 \\additive \\rtlch\\fcs1 \\af45\\afs20 \\ltrch\\fcs0 \\f45\\fs20 \\sbasedon10 \\slink106 \\slocked \\ssemihidden Body Text Indent Char;}{\r\n\\s108\\ql \\fi210\\li360\\ri0\\sb180\\sa120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin360\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon100 \\snext108 \\slink109 \r\nBody Text First Indent 2;}{\\*\\cs109 \\additive \\rtlch\\fcs1 \\af45\\afs20 \\ltrch\\fcs0 \\f45\\fs20 \\sbasedon107 \\slink108 \\slocked \\ssemihidden Body Text First Indent 2 Char;}{\\s110\\ql \\li360\\ri0\\sb180\\sa120\\sl480\\slmult1\r\n\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin360\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext110 \\slink111 Body Text Indent 2;}{\\*\\cs111 \\additive \\rtlch\\fcs1 \r\n\\af45\\afs20 \\ltrch\\fcs0 \\f45\\fs20 \\sbasedon10 \\slink110 \\slocked \\ssemihidden Body Text Indent 2 Char;}{\\s112\\ql \\li360\\ri0\\sb180\\sa120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin360\\itap0 \\rtlch\\fcs1 \\af45\\afs16\\alang1025 \\ltrch\\fcs0 \r\n\\f45\\fs16\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext112 \\slink113 Body Text Indent 3;}{\\*\\cs113 \\additive \\rtlch\\fcs1 \\af45\\afs16 \\ltrch\\fcs0 \\f45\\fs16 \\sbasedon10 \\slink112 \\slocked \\ssemihidden Body Text Indent 3 Char;}{\r\n\\s114\\ql \\li1440\\ri0\\sb120\\sa120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\ab\\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\b\\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\sqformat caption;}{\r\n\\s115\\ql \\li4320\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin4320\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext115 \\slink116 Closing;}{\\*\\cs116 \\additive \r\n\\rtlch\\fcs1 \\af45\\afs20 \\ltrch\\fcs0 \\f45\\fs20 \\sbasedon10 \\slink115 \\slocked \\ssemihidden Closing Char;}{\\s117\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \r\n\\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext117 \\slink118 \\ssemihidden annotation text;}{\\*\\cs118 \\additive \\rtlch\\fcs1 \\af45\\afs20 \\ltrch\\fcs0 \\f45\\fs20 \\sbasedon10 \\slink117 \\slocked \\ssemihidden Comment Text Char;}{\r\n\\s119\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\slink120 Date;}{\\*\\cs120 \\additive \r\n\\rtlch\\fcs1 \\af45\\afs20 \\ltrch\\fcs0 \\f45\\fs20 \\sbasedon10 \\slink119 \\slocked \\ssemihidden Date Char;}{\\s121\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\cbpat9 \\rtlch\\fcs1 \\af44\\afs20\\alang1025 \\ltrch\\fcs0 \r\n\\f44\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext121 \\slink122 \\ssemihidden Document Map;}{\\*\\cs122 \\additive \\rtlch\\fcs1 \\af44\\afs16 \\ltrch\\fcs0 \\f44\\fs16 \\sbasedon10 \\slink121 \\slocked \\ssemihidden Document Map Char;}{\r\n\\s123\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext123 \\slink124 \\ssemihidden endnote text;}{\\*\r\n\\cs124 \\additive \\rtlch\\fcs1 \\af45\\afs20 \\ltrch\\fcs0 \\f45\\fs20 \\sbasedon10 \\slink123 \\slocked \\ssemihidden Endnote Text Char;}{\r\n\\s125\\ql \\li2880\\ri0\\sb180\\widctlpar\\phpg\\posxc\\posyb\\absh-1980\\absw7920\\dxfrtext180\\dfrmtxtx180\\dfrmtxty0\\wrapdefault\\nooverflow\\faroman\\rin0\\lin2880\\itap0 \\rtlch\\fcs1 \\af1\\afs24\\alang1025 \\ltrch\\fcs0 \r\n\\f1\\fs24\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext125 envelope address;}{\\s126\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af1\\afs20\\alang1025 \\ltrch\\fcs0 \r\n\\f1\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext126 envelope return;}{\\s127\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \r\n\\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext127 \\slink128 \\ssemihidden footnote text;}{\\*\\cs128 \\additive \\rtlch\\fcs1 \\af45\\afs20 \\ltrch\\fcs0 \\f45\\fs20 \\sbasedon10 \\slink127 \\slocked \\ssemihidden Footnote Text Char;}{\r\n\\s129\\ql \\fi-200\\li200\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin200\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\sautoupd \\ssemihidden index 1;}{\r\n\\s130\\ql \\fi-200\\li400\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin400\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\sautoupd \\ssemihidden index 2;}{\r\n\\s131\\ql \\fi-200\\li600\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin600\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\sautoupd \\ssemihidden index 3;}{\r\n\\s132\\ql \\fi-200\\li800\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin800\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\sautoupd \\ssemihidden index 4;}{\r\n\\s133\\ql \\fi-200\\li1000\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1000\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\sautoupd \\ssemihidden index 5;}{\r\n\\s134\\ql \\fi-200\\li1200\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1200\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\sautoupd \\ssemihidden index 6;}{\r\n\\s135\\ql \\fi-200\\li1400\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1400\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\sautoupd \\ssemihidden index 7;}{\r\n\\s136\\ql \\fi-200\\li1600\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1600\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\sautoupd \\ssemihidden index 8;}{\r\n\\s137\\ql \\fi-200\\li1800\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1800\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\sautoupd \\ssemihidden index 9;}{\r\n\\s138\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs20\\alang1025 \\ltrch\\fcs0 \\b\\f1\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext129 \\ssemihidden index heading;}{\r\n\\s139\\ql \\fi-360\\li720\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext139 List 2;}{\r\n\\s140\\ql \\fi-360\\li1080\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1080\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext140 List 3;}{\r\n\\s141\\ql \\fi-360\\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext141 List 4;}{\r\n\\s142\\ql \\fi-360\\li1800\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1800\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext142 List 5;}{\r\n\\s143\\ql \\fi-360\\li360\\ri0\\sb180\\widctlpar\\jclisttab\\tx360\\wrapdefault{\\*\\pn \\pnlvlbody\\ilvl0\\ls1\\pnrnot0\\pndec }\\nooverflow\\faroman\\ls1\\rin0\\lin360\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \r\n\\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext143 \\sautoupd List Bullet;}{\\s144\\ql \\fi-360\\li720\\ri0\\sb180\\widctlpar\\jclisttab\\tx720\\wrapdefault{\\*\\pn \\pnlvlbody\\ilvl0\\ls2\\pnrnot0\\pndec }\r\n\\nooverflow\\faroman\\ls2\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext144 \\sautoupd List Bullet 2;}{\\s145\\ql \\fi-360\\li1080\\ri0\\sb180\\widctlpar\r\n\\jclisttab\\tx1080\\wrapdefault{\\*\\pn \\pnlvlbody\\ilvl0\\ls3\\pnrnot0\\pndec }\\nooverflow\\faroman\\ls3\\rin0\\lin1080\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext145 \\sautoupd \r\nList Bullet 3;}{\\s146\\ql \\fi-360\\li1440\\ri0\\sb180\\widctlpar\\jclisttab\\tx1440\\wrapdefault{\\*\\pn \\pnlvlbody\\ilvl0\\ls4\\pnrnot0\\pndec }\\nooverflow\\faroman\\ls4\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \r\n\\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext146 \\sautoupd List Bullet 4;}{\\s147\\ql \\fi-360\\li1800\\ri0\\sb180\\widctlpar\\jclisttab\\tx1800\\wrapdefault{\\*\\pn \\pnlvlbody\\ilvl0\\ls5\\pnrnot0\\pndec }\r\n\\nooverflow\\faroman\\ls5\\rin0\\lin1800\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext147 \\sautoupd List Bullet 5;}{\r\n\\s148\\ql \\li360\\ri0\\sb180\\sa120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin360\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext148 List Continue;}{\r\n\\s149\\ql \\li720\\ri0\\sb180\\sa120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext149 List Continue 2;}{\r\n\\s150\\ql \\li1080\\ri0\\sb180\\sa120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1080\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext150 List Continue 3;}{\r\n\\s151\\ql \\li1440\\ri0\\sb180\\sa120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext151 List Continue 4;}{\r\n\\s152\\ql \\li1800\\ri0\\sb180\\sa120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1800\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext152 List Continue 5;}{\r\n\\s153\\ql \\fi-360\\li720\\ri0\\sb180\\widctlpar\\jclisttab\\tx720\\wrapdefault{\\*\\pn \\pnlvlbody\\ilvl0\\ls6\\pnrnot0\\pndec }\\nooverflow\\faroman\\ls6\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \r\n\\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext153 List Number 2;}{\\s154\\ql \\fi-360\\li1080\\ri0\\sb180\\widctlpar\\jclisttab\\tx1080\\wrapdefault{\\*\\pn \\pnlvlbody\\ilvl0\\ls7\\pnrnot0\\pndec }\\nooverflow\\faroman\\ls7\\rin0\\lin1080\\itap0 \r\n\\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext154 List Number 3;}{\\s155\\ql \\fi-360\\li1440\\ri0\\sb180\\widctlpar\\jclisttab\\tx1440\\wrapdefault{\\*\\pn \\pnlvlbody\\ilvl0\\ls8\\pnrnot0\r\n\\pndec }\\nooverflow\\faroman\\ls8\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext155 List Number 4;}{\\s156\\ql \\fi-360\\li1800\\ri0\\sb180\\widctlpar\r\n\\jclisttab\\tx1800\\wrapdefault{\\*\\pn \\pnlvlbody\\ilvl0\\ls9\\pnrnot0\\pndec }\\nooverflow\\faroman\\ls9\\rin0\\lin1800\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext156 \r\nList Number 5;}{\\s157\\ql \\li1440\\ri0\\sb180\\widctlpar\\tx480\\tx960\\tx1440\\tx1920\\tx2400\\tx2880\\tx3360\\tx3840\\tx4320\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af2\\afs20\\alang1025 \\ltrch\\fcs0 \r\n\\f2\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\snext157 \\slink158 \\ssemihidden macro;}{\\*\\cs158 \\additive \\rtlch\\fcs1 \\af2\\afs20 \\ltrch\\fcs0 \\f2\\fs20 \\sbasedon10 \\slink157 \\slocked \\ssemihidden Macro Text Char;}{\r\n\\s159\\ql \\fi-1080\\li1080\\ri0\\sb180\\widctlpar\\brdrt\\brdrs\\brdrw15\\brsp20 \\brdrl\\brdrs\\brdrw15\\brsp20 \\brdrb\\brdrs\\brdrw15\\brsp20 \\brdrr\\brdrs\\brdrw15\\brsp20 \\wrapdefault\\nooverflow\\faroman\\rin0\\lin1080\\itap0 \\shading2000 \\rtlch\\fcs1 \\af1\\afs24\\alang1025 \r\n\\ltrch\\fcs0 \\f1\\fs24\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext159 \\slink160 Message Header;}{\\*\\cs160 \\additive \\rtlch\\fcs1 \\af0\\afs24 \\ltrch\\fcs0 \\f43\\fs24\\chshdng2000\\chcfpat0\\chcbpat0 \r\n\\sbasedon10 \\slink159 \\slocked \\ssemihidden Message Header Char;}{\\s161\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \r\n\\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\slink162 Note Heading;}{\\*\\cs162 \\additive \\rtlch\\fcs1 \\af45\\afs20 \\ltrch\\fcs0 \\f45\\fs20 \\sbasedon10 \\slink161 \\slocked \\ssemihidden Note Heading Char;}{\r\n\\s163\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af2\\afs20\\alang1025 \\ltrch\\fcs0 \\f2\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext163 \\slink164 Plain Text;}{\\*\\cs164 \\additive \r\n\\rtlch\\fcs1 \\af2\\afs20 \\ltrch\\fcs0 \\f2\\fs20 \\sbasedon10 \\slink163 \\slocked \\ssemihidden Plain Text Char;}{\\s165\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \r\n\\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\slink166 Salutation;}{\\*\\cs166 \\additive \\rtlch\\fcs1 \\af45\\afs20 \\ltrch\\fcs0 \\f45\\fs20 \\sbasedon10 \\slink165 \\slocked \\ssemihidden Salutation Char;}{\r\n\\s167\\ql \\li4320\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin4320\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext167 \\slink168 Signature;}{\\*\\cs168 \\additive \r\n\\rtlch\\fcs1 \\af45\\afs20 \\ltrch\\fcs0 \\f45\\fs20 \\sbasedon10 \\slink167 \\slocked \\ssemihidden Signature Char;}{\\s169\\qc \\li1440\\ri0\\sb180\\sa60\\widctlpar\\wrapdefault\\nooverflow\\faroman\\outlinelevel1\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af1\\afs24\\alang1025 \r\n\\ltrch\\fcs0 \\f1\\fs24\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext169 \\slink170 \\sqformat Subtitle;}{\\*\\cs170 \\additive \\rtlch\\fcs1 \\af0\\afs24 \\ltrch\\fcs0 \\f43\\fs24 \\sbasedon10 \\slink169 \\slocked Subtitle Char;}{\r\n\\s171\\ql \\fi-200\\li200\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin200\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\ssemihidden table of authorities;}{\r\n\\s172\\ql \\fi-400\\li400\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin400\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\ssemihidden table of figures;}{\r\n\\s173\\qc \\li1440\\ri0\\sb240\\sa60\\widctlpar\\wrapdefault\\nooverflow\\faroman\\outlinelevel0\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs32\\alang1025 \\ltrch\\fcs0 \\b\\f1\\fs32\\lang1033\\langfe1033\\kerning28\\cgrid\\langnp1033\\langfenp1033 \r\n\\sbasedon0 \\snext173 \\slink174 \\sqformat Title;}{\\*\\cs174 \\additive \\rtlch\\fcs1 \\ab\\af0\\afs32 \\ltrch\\fcs0 \\b\\f43\\fs32\\kerning28 \\sbasedon10 \\slink173 \\slocked Title Char;}{\r\n\\s175\\ql \\li1440\\ri0\\sb120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs24\\alang1025 \\ltrch\\fcs0 \\b\\f1\\fs24\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\ssemihidden toa heading;}{\r\n\\s176\\ql \\li1440\\ri0\\sb180\\widctlpar\\tqr\\tldot\\tx9883\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\sautoupd \\spriority39 \r\ntoc 2;}{\\s177\\ql \\li400\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin400\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\sautoupd \\ssemihidden toc 3;}{\r\n\\s178\\ql \\li600\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin600\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\sautoupd \\ssemihidden toc 4;}{\r\n\\s179\\ql \\li800\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin800\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\sautoupd \\ssemihidden toc 5;}{\r\n\\s180\\ql \\li1000\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1000\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\sautoupd \\ssemihidden toc 6;}{\r\n\\s181\\ql \\li1200\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1200\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\sautoupd \\ssemihidden toc 7;}{\r\n\\s182\\ql \\li1400\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1400\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\sautoupd \\ssemihidden toc 8;}{\r\n\\s183\\ql \\li1600\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1600\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext0 \\sautoupd \\ssemihidden toc 9;}{\r\n\\s184\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af44\\afs16\\alang1025 \\ltrch\\fcs0 \\f44\\fs16\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext184 \\slink185 \\ssemihidden Balloon Text;}{\\*\r\n\\cs185 \\additive \\rtlch\\fcs1 \\af44\\afs16 \\ltrch\\fcs0 \\f44\\fs16 \\sbasedon10 \\slink184 \\slocked \\ssemihidden Balloon Text Char;}{\\*\\ts186\\tsrowd\\trbrdrt\\brdrs\\brdrw10 \\trbrdrl\\brdrs\\brdrw10 \\trbrdrb\\brdrs\\brdrw10 \\trbrdrr\\brdrs\\brdrw10 \\trbrdrh\r\n\\brdrs\\brdrw10 \\trbrdrv\\brdrs\\brdrw10 \\trftsWidthB3\\trpaddl108\\trpaddr108\\trpaddfl3\\trpaddft3\\trpaddfb3\\trpaddfr3\\trcbpat1\\trcfpat1\\tblind0\\tblindtype3\\tsvertalt\\tsbrdrt\\tsbrdrl\\tsbrdrb\\tsbrdrr\\tsbrdrdgl\\tsbrdrdgr\\tsbrdrh\\tsbrdrv \r\n\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af0\\afs20\\alang1025 \\ltrch\\fcs0 \\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon11 \\snext186 Table Grid;}{\\*\\cs187 \\additive \\rtlch\\fcs1 \\af0 \r\n\\ltrch\\fcs0 \\ul\\cf2 \\sbasedon10 Hyperlink;}{\\*\\cs188 \\additive \\rtlch\\fcs1 \\af0\\afs19 \\ltrch\\fcs0 \\fs19 \\sbasedon10 postbody1;}{\\s189\\ql \\li0\\ri0\\keepn\\pagebb\\widctlpar\\brdrt\\brdrs\\brdrw30\\brsp120 \r\n\\wrapdefault\\nooverflow\\faroman\\outlinelevel0\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs24\\alang1025 \\ltrch\\fcs0 \\b\\f1\\fs24\\cf9\\lang1024\\langfe1024\\cgrid\\noproof\\langnp1033\\langfenp1033 \\sbasedon1 \\snext189 \\slink190 TWAIN Header;}{\\*\\cs190 \\additive \r\n\\rtlch\\fcs1 \\ab\\af1\\afs24 \\ltrch\\fcs0 \\b\\f1\\fs24\\cf9\\lang1024\\langfe1024\\kerning32\\noproof \\sbasedon15 \\slink189 \\slocked TWAIN Header Char;}{\\s191\\ql \\li720\\ri0\\sb360\\sl240\\slmult0\\widctlpar\\tx720\\wrapdefault\\hyphpar0\\faauto\\rin0\\lin720\\itap0 \r\n\\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\cf1\\lang1033\\langfe1033\\charscalex0\\cgrid\\langnp1033\\langfenp1033 \\snext191 body;}{\\s192\\ql \\li1440\\ri0\\sb120\\sl240\\slmult0\\widctlpar\r\n\\tx720\\tx1080\\tx1440\\tx1800\\tx2160\\tx2520\\tx2880\\tx3240\\tx3600\\tx3960\\tx4320\\tx4680\\tx5040\\tx5400\\tx5760\\tx6120\\tx6480\\tx6840\\tx7200\\tx7560\\tx7920\\tx8280\\tx8640\\tx9000\\wrapdefault\\hyphpar0\\faauto\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af49\\afs20\\alang1025 \r\n\\ltrch\\fcs0 \\f49\\fs20\\cf1\\lang1033\\langfe1033\\charscalex0\\cgrid\\langnp1033\\langfenp1033 \\snext0 Code;}{\\s193\\ql \\fi-3240\\li4680\\ri0\\sb120\\sl240\\slmult0\\widctlpar\\tx4680\\tx7400\\wrapdefault\\hyphpar0\\faauto\\rin0\\lin4680\\itap0 \\rtlch\\fcs1 \r\n\\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\cf1\\lang1033\\langfe1033\\charscalex0\\cgrid\\langnp1033\\langfenp1033 \\snext31 twocol;}{\\*\\cs194 \\additive \\f2 Code2;}{\\s195\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\faauto\\adjustright\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \r\n\\af0\\afs24\\alang1025 \\ltrch\\fcs0 \\fs24\\cf1\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext195 Default;}{\\*\\cs196 \\additive \\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\sbasedon10 \\spriority0 postbody;}{\\*\\cs197 \\additive \\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \r\n\\ul\\cf19 \\sbasedon10 \\slocked \\ssemihidden \\sunhideused FollowedHyperlink;}{\\s198\\ql \\li60\\ri60\\sb80\\sa80\\sl240\\slmult0\\widctlpar\\tx720\\tx2520\\wrapdefault\\hyphpar0\\faauto\\rin60\\lin60\\itap0 \\rtlch\\fcs1 \\af2\\afs20\\alang1025 \\ltrch\\fcs0 \r\n\\fs20\\cf1\\lang1033\\langfe2052\\loch\\f2\\hich\\af2\\dbch\\af31505\\charscalex0\\cgrid\\langnp1033\\langfenp2052 \\snext198 table_code;}{\\s199\\ql \\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \\af37\\afs22\\alang1025 \r\n\\ltrch\\fcs0 \\f37\\fs22\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \\sbasedon0 \\snext199 \\sqformat \\spriority34 List Paragraph;}{\\*\\cs200 \\additive \\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cf20\\chshdng0\\chcfpat0\\chcbpat21 \\sbasedon10 \\ssemihidden \\sunhideused \r\nUnresolved Mention;}}{\\*\\listtable{\\list\\listtemplateid-537102814\\listsimple{\\listlevel\\levelnfc0\\levelnfcn0\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace0\\levelindent0{\\leveltext\\'02\\'00.;}{\\levelnumbers\\'01;}\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \r\n\\fi-360\\li1440\\jclisttab\\tx1440\\lin1440 }{\\listname ;}\\listid-131}{\\list\\listtemplateid-241933882\\listsimple{\\listlevel\\levelnfc0\\levelnfcn0\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace0\\levelindent0{\\leveltext\\'02\\'00.;}{\\levelnumbers\\'01;}\r\n\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\fi-360\\li1080\\jclisttab\\tx1080\\lin1080 }{\\listname ;}\\listid-130}{\\list\\listtemplateid894471834\\listsimple{\\listlevel\\levelnfc0\\levelnfcn0\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace0\\levelindent0{\\leveltext\r\n\\'02\\'00.;}{\\levelnumbers\\'01;}\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\fi-360\\li720\\jclisttab\\tx720\\lin720 }{\\listname ;}\\listid-129}{\\list\\listtemplateid-1633241602\\listsimple{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\r\n\\levelspace0\\levelindent0{\\leveltext\\'01\\u-3913 ?;}{\\levelnumbers;}\\f3\\fbias0 \\fi-360\\li1800\\jclisttab\\tx1800\\lin1800 }{\\listname ;}\\listid-128}{\\list\\listtemplateid-203631750\\listsimple{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\r\n\\levelstartat1\\levelspace0\\levelindent0{\\leveltext\\'01\\u-3913 ?;}{\\levelnumbers;}\\f3\\fbias0 \\fi-360\\li1440\\jclisttab\\tx1440\\lin1440 }{\\listname ;}\\listid-127}{\\list\\listtemplateid360335964\\listsimple{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\r\n\\levelfollow0\\levelstartat1\\levelspace0\\levelindent0{\\leveltext\\'01\\u-3913 ?;}{\\levelnumbers;}\\f3\\fbias0 \\fi-360\\li1080\\jclisttab\\tx1080\\lin1080 }{\\listname ;}\\listid-126}{\\list\\listtemplateid627448582\\listsimple{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\r\n\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace0\\levelindent0{\\leveltext\\'01\\u-3913 ?;}{\\levelnumbers;}\\f3\\fbias0 \\fi-360\\li720\\jclisttab\\tx720\\lin720 }{\\listname ;}\\listid-125}{\\list\\listtemplateid507960418\\listsimple{\\listlevel\\levelnfc0\\levelnfcn0\r\n\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace0\\levelindent0{\\leveltext\\'02\\'00.;}{\\levelnumbers\\'01;}\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\fi-360\\li360\\jclisttab\\tx360\\lin360 }{\\listname ;}\\listid-120}{\\list\\listtemplateid-1407048446\\listsimple\r\n{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace0\\levelindent0{\\leveltext\\'01\\u-3913 ?;}{\\levelnumbers;}\\f3\\fbias0 \\fi-360\\li360\\jclisttab\\tx360\\lin360 }{\\listname ;}\\listid-119}{\\list\\listtemplateid-950138062\r\n\\listhybrid{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat0\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid-129700622\\'01-;}{\\levelnumbers;}\\loch\\af37\\hich\\af37\\dbch\\af0\\fbias0 \\fi-360\\li720\\lin720 }{\\listlevel\r\n\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\lvltentative\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid67698691\\'01o;}{\\levelnumbers;}\\f2\\fbias0 \\fi-360\\li1440\\lin1440 }{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\r\n\\levelfollow0\\levelstartat1\\lvltentative\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid67698693\\'01\\u-3929 ?;}{\\levelnumbers;}\\f10\\fbias0 \\fi-360\\li2160\\lin2160 }{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\r\n\\lvltentative\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid67698689\\'01\\u-3913 ?;}{\\levelnumbers;}\\f3\\fbias0 \\fi-360\\li2880\\lin2880 }{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\lvltentative\\levelspace0\r\n\\levelindent0{\\leveltext\\leveltemplateid67698691\\'01o;}{\\levelnumbers;}\\f2\\fbias0 \\fi-360\\li3600\\lin3600 }{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\lvltentative\\levelspace0\\levelindent0{\\leveltext\r\n\\leveltemplateid67698693\\'01\\u-3929 ?;}{\\levelnumbers;}\\f10\\fbias0 \\fi-360\\li4320\\lin4320 }{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\lvltentative\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid67698689\r\n\\'01\\u-3913 ?;}{\\levelnumbers;}\\f3\\fbias0 \\fi-360\\li5040\\lin5040 }{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\lvltentative\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid67698691\\'01o;}{\\levelnumbers;}\\f2\\fbias0 \r\n\\fi-360\\li5760\\lin5760 }{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\lvltentative\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid67698693\\'01\\u-3929 ?;}{\\levelnumbers;}\\f10\\fbias0 \\fi-360\\li6480\\lin6480 }{\\listname \r\n;}\\listid162478944}{\\list\\listtemplateid181715488\\listhybrid{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat0\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid1324631620\\'01-;}{\\levelnumbers;}\r\n\\loch\\af0\\hich\\af0\\dbch\\af0\\fbias0 \\fi-360\\li720\\lin720 }{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\lvltentative\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid67698691\\'01o;}{\\levelnumbers;}\\f2\\fbias0 \r\n\\fi-360\\li1440\\lin1440 }{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\lvltentative\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid67698693\\'01\\u-3929 ?;}{\\levelnumbers;}\\f10\\fbias0 \\fi-360\\li2160\\lin2160 }{\\listlevel\r\n\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\lvltentative\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid67698689\\'01\\u-3913 ?;}{\\levelnumbers;}\\f3\\fbias0 \\fi-360\\li2880\\lin2880 }{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\r\n\\leveljcn0\\levelfollow0\\levelstartat1\\lvltentative\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid67698691\\'01o;}{\\levelnumbers;}\\f2\\fbias0 \\fi-360\\li3600\\lin3600 }{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\r\n\\lvltentative\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid67698693\\'01\\u-3929 ?;}{\\levelnumbers;}\\f10\\fbias0 \\fi-360\\li4320\\lin4320 }{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\lvltentative\\levelspace0\r\n\\levelindent0{\\leveltext\\leveltemplateid67698689\\'01\\u-3913 ?;}{\\levelnumbers;}\\f3\\fbias0 \\fi-360\\li5040\\lin5040 }{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\lvltentative\\levelspace0\\levelindent0{\\leveltext\r\n\\leveltemplateid67698691\\'01o;}{\\levelnumbers;}\\f2\\fbias0 \\fi-360\\li5760\\lin5760 }{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\lvltentative\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid67698693\r\n\\'01\\u-3929 ?;}{\\levelnumbers;}\\f10\\fbias0 \\fi-360\\li6480\\lin6480 }{\\listname ;}\\listid984241419}{\\list\\listtemplateid81190112\\listhybrid{\\listlevel\\levelnfc0\\levelnfcn0\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace0\\levelindent0{\\leveltext\r\n\\leveltemplateid1970803460\\'02\\'00);}{\\levelnumbers\\'01;}\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\fs22\\cf22\\loch\\af37\\hich\\af37\\dbch\\af0\\fbias0 \\fi-360\\li720\\lin720 }{\\listlevel\\levelnfc4\\levelnfcn4\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace0\r\n\\levelindent0{\\leveltext\\leveltemplateid67698713\\'02\\'01.;}{\\levelnumbers\\'01;}\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\fi-360\\li1440\\lin1440 }{\\listlevel\\levelnfc2\\levelnfcn2\\leveljc2\\leveljcn2\\levelfollow0\\levelstartat1\\levelspace0\\levelindent0{\\leveltext\r\n\\leveltemplateid67698715\\'02\\'02.;}{\\levelnumbers\\'01;}\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\fi-180\\li2160\\lin2160 }{\\listlevel\\levelnfc0\\levelnfcn0\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid67698703\r\n\\'02\\'03.;}{\\levelnumbers\\'01;}\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\fi-360\\li2880\\lin2880 }{\\listlevel\\levelnfc4\\levelnfcn4\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid67698713\\'02\\'04.;}{\\levelnumbers\\'01;}\r\n\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\fi-360\\li3600\\lin3600 }{\\listlevel\\levelnfc2\\levelnfcn2\\leveljc2\\leveljcn2\\levelfollow0\\levelstartat1\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid67698715\\'02\\'05.;}{\\levelnumbers\\'01;}\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \r\n\\fi-180\\li4320\\lin4320 }{\\listlevel\\levelnfc0\\levelnfcn0\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid67698703\\'02\\'06.;}{\\levelnumbers\\'01;}\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\fi-360\\li5040\\lin5040 }\r\n{\\listlevel\\levelnfc4\\levelnfcn4\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid67698713\\'02\\'07.;}{\\levelnumbers\\'01;}\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\fi-360\\li5760\\lin5760 }{\\listlevel\\levelnfc2\\levelnfcn2\r\n\\leveljc2\\leveljcn2\\levelfollow0\\levelstartat1\\levelspace0\\levelindent0{\\leveltext\\leveltemplateid67698715\\'02\\'08.;}{\\levelnumbers\\'01;}\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\fi-180\\li6480\\lin6480 }{\\listname ;}\\listid2094470365}}{\\*\\listoverridetable\r\n{\\listoverride\\listid-120\\listoverridecount0\\ls1}{\\listoverride\\listid-119\\listoverridecount0\\ls2}{\\listoverride\\listid-125\\listoverridecount0\\ls3}{\\listoverride\\listid-126\\listoverridecount0\\ls4}{\\listoverride\\listid-127\\listoverridecount0\\ls5}\r\n{\\listoverride\\listid-128\\listoverridecount0\\ls6}{\\listoverride\\listid-129\\listoverridecount0\\ls7}{\\listoverride\\listid-130\\listoverridecount0\\ls8}{\\listoverride\\listid-131\\listoverridecount0\\ls9}{\\listoverride\\listid2094470365\r\n\\listoverridecount9{\\lfolevel\\listoverridestartat\\levelstartat1}{\\lfolevel\\listoverridestartat\\levelstartat1}{\\lfolevel\\listoverridestartat\\levelstartat1}{\\lfolevel\\listoverridestartat\\levelstartat1}{\\lfolevel\\listoverridestartat\\levelstartat1}{\\lfolevel\r\n\\listoverridestartat\\levelstartat1}{\\lfolevel\\listoverridestartat\\levelstartat1}{\\lfolevel\\listoverridestartat\\levelstartat1}{\\lfolevel\\listoverridestartat\\levelstartat1}\\ls10}{\\listoverride\\listid984241419\\listoverridecount0\\ls11}\r\n{\\listoverride\\listid162478944\\listoverridecount0\\ls12}}{\\*\\pgptbl {\\pgp\\ipgp0\\itap0\\li0\\ri0\\sb0\\sa0}{\\pgp\\ipgp0\\itap0\\li0\\ri0\\sb0\\sa0}{\\pgp\\ipgp0\\itap0\\li0\\ri0\\sb0\\sa0}{\\pgp\\ipgp0\\itap0\\li0\\ri0\\sb0\\sa0}{\\pgp\\ipgp0\\itap0\\li0\\ri0\\sb0\\sa0}{\\pgp\\ipgp0\\itap0\r\n\\li0\\ri0\\sb0\\sa0}{\\pgp\\ipgp0\\itap0\\li0\\ri0\\sb0\\sa0}{\\pgp\\ipgp0\\itap0\\li0\\ri0\\sb0\\sa0}{\\pgp\\ipgp0\\itap0\\li0\\ri0\\sb0\\sa0}{\\pgp\\ipgp0\\itap0\\li0\\ri0\\sb0\\sa0}{\\pgp\\ipgp0\\itap0\\li0\\ri0\\sb0\\sa0}{\\pgp\\ipgp0\\itap0\\li0\\ri0\\sb0\\sa0}{\\pgp\\ipgp0\\itap0\\li0\\ri0\\sb0\\sa0}\r\n{\\pgp\\ipgp0\\itap0\\li0\\ri0\\sb0\\sa0}{\\pgp\\ipgp0\\itap0\\li0\\ri0\\sb0\\sa0}}{\\*\\rsidtbl \\rsid472724\\rsid1196296\\rsid6441407\\rsid6555766\\rsid6896082\\rsid8668465}{\\mmathPr\\mmathFont34\\mbrkBin0\\mbrkBinSub0\\msmallFrac0\\mdispDef1\\mlMargin0\\mrMargin0\\mdefJc1\r\n\\mwrapIndent1440\\mintLim0\\mnaryLim1}{\\info{\\title Spec 1.9a - Title page}{\\author The TWAIN Working Group}{\\operator l252353}{\\creatim\\yr2013\\mo11\\dy4\\hr16\\min24}{\\revtim\\yr2021\\mo11\\dy8\\hr7\\min25}{\\printim\\yr2010\\mo7\\dy28\\hr8\\min8}{\\version45}\r\n{\\edmins182}{\\nofpages15}{\\nofwords5071}{\\nofchars28907}{\\*\\company JFL Peripheral Solutions Inc.}{\\nofcharsws33911}{\\vern21}}{\\*\\xmlnstbl {\\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}}\r\n\\paperw12240\\paperh15840\\margl1260\\margr1080\\margt1440\\margb1080\\gutter0\\ltrsect\\rtlgutter \r\n\\widowctrl\\ftnbj\\aenddoc\\trackmoves0\\trackformatting1\\donotembedsysfont0\\relyonvml0\\donotembedlingdata1\\grfdocevents0\\validatexml0\\showplaceholdtext0\\ignoremixedcontent0\\saveinvalidxml0\\showxmlerrors0\\margmirror\r\n\\noextrasprl\\cvmme\\sprsspbf\\brkfrm\\swpbdr\\noxlattoyen\\expshrtn\\noultrlspc\\dntblnsbdb\\nospaceforul\\lytprtmet\\hyphcaps0\\horzdoc\\fracwidth\\dghspace180\\dgvspace180\\dghorigin1701\\dgvorigin1984\\dghshow0\\dgvshow0\r\n\\jexpand\\viewkind1\\viewscale100\\pgbrdrhead\\pgbrdrfoot\\bdrrlswsix\\nolnhtadjtbl\\rsidroot8668465 \\fet0{\\*\\wgrffmtfilter 013f}\\ilfomacatclnup12{\\*\\ftnsep \\ltrpar \\pard\\plain \\ltrpar\r\n\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\insrsid6555766 \\chftnsep \r\n\\par }}{\\*\\ftnsepc \\ltrpar \\pard\\plain \\ltrpar\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af45 \r\n\\ltrch\\fcs0 \\insrsid6555766 \\chftnsepc \r\n\\par }}{\\*\\aftnsep \\ltrpar \\pard\\plain \\ltrpar\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af45 \r\n\\ltrch\\fcs0 \\insrsid6555766 \\chftnsep \r\n\\par }}{\\*\\aftnsepc \\ltrpar \\pard\\plain \\ltrpar\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af45 \r\n\\ltrch\\fcs0 \\insrsid6555766 \\chftnsepc \r\n\\par }}\\ltrpar \\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\footerr \\ltrpar \\pard\\plain \\ltrpar\\s25\\ql \\li0\\ri0\\widctlpar\\tqr\\tx9900\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \r\n\\ai\\af1\\afs16\\alang1025 \\ltrch\\fcs0 \\i\\f1\\fs16\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\insrsid6441407 TWAIN for C#\\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\cs32\\insrsid6441407  PAGE }}{\\fldrslt {\r\n\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\cs32\\lang1024\\langfe1024\\noproof\\insrsid6441407 11}}}\\sectd \\ltrsect\\linex0\\endnhere\\sectdefaultcl\\sftnbj {\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\cs32\\insrsid6441407 \r\n\\par Kodak Alaris Inc.}{\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\insrsid6441407 \r\n\\par }}{\\*\\pnseclvl1\\pnucrm\\pnstart1\\pnindent720\\pnhang {\\pntxta .}}{\\*\\pnseclvl2\\pnucltr\\pnstart1\\pnindent720\\pnhang {\\pntxta .}}{\\*\\pnseclvl3\\pndec\\pnstart1\\pnindent720\\pnhang {\\pntxta .}}{\\*\\pnseclvl4\\pnlcltr\\pnstart1\\pnindent720\\pnhang {\\pntxta )}}\r\n{\\*\\pnseclvl5\\pndec\\pnstart1\\pnindent720\\pnhang {\\pntxtb (}{\\pntxta )}}{\\*\\pnseclvl6\\pnlcltr\\pnstart1\\pnindent720\\pnhang {\\pntxtb (}{\\pntxta )}}{\\*\\pnseclvl7\\pnlcrm\\pnstart1\\pnindent720\\pnhang {\\pntxtb (}{\\pntxta )}}{\\*\\pnseclvl8\r\n\\pnlcltr\\pnstart1\\pnindent720\\pnhang {\\pntxtb (}{\\pntxta )}}{\\*\\pnseclvl9\\pnlcrm\\pnstart1\\pnindent720\\pnhang {\\pntxtb (}{\\pntxta )}}\\pard\\plain \\ltrpar\\ql \\li0\\ri0\\sb1440\\widctlpar\\brdrt\\brdrs\\brdrw60\\brsp20\\brdrcf13 \r\n\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\f31506\\insrsid6441407 \r\n\\par }\\pard \\ltrpar\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 {\\rtlch\\fcs1 \\af1\\afs56 \\ltrch\\fcs0 \\b\\f31506\\fs56\\cf9\\insrsid6441407 TWAIN for C#\r\n\\par }\\pard \\ltrpar\\ql \\li1440\\ri0\\sb120\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 {\\rtlch\\fcs1 \\ab\\af1\\afs28 \\ltrch\\fcs0 \\b\\f31506\\fs28\\cf13\\insrsid6441407 For Version 2.}{\\rtlch\\fcs1 \\ab\\af1\\afs28 \\ltrch\\fcs0 \r\n\\b\\f31506\\fs28\\cf13\\insrsid8668465 5}{\\rtlch\\fcs1 \\ab\\af1\\afs28 \\ltrch\\fcs0 \\b\\f31506\\fs28\\cf13\\insrsid6441407 .}{\\rtlch\\fcs1 \\ab\\af1\\afs28 \\ltrch\\fcs0 \\b\\f31506\\fs28\\cf13\\insrsid8668465 0}{\\rtlch\\fcs1 \\ab\\af1\\afs28 \\ltrch\\fcs0 \r\n\\b\\f31506\\fs28\\cf13\\insrsid6441407 .0\r\n\\par }\\pard \\ltrpar\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 {\\rtlch\\fcs1 \\ab\\af1\\afs28 \\ltrch\\fcs0 \\b\\f31506\\fs28\\insrsid8668465 November}{\\rtlch\\fcs1 \\ab\\af1\\afs28 \\ltrch\\fcs0 \\b\\f31506\\fs28\\insrsid6441407  8}{\r\n\\rtlch\\fcs1 \\ab\\af1\\afs28 \\ltrch\\fcs0 \\b\\f31506\\fs28\\super\\insrsid6441407 th}{\\rtlch\\fcs1 \\ab\\af1\\afs28 \\ltrch\\fcs0 \\b\\f31506\\fs28\\insrsid6441407 , 202}{\\rtlch\\fcs1 \\ab\\af1\\afs28 \\ltrch\\fcs0 \\b\\f31506\\fs28\\insrsid8668465 1}{\\rtlch\\fcs1 \\ab\\af1\\afs28 \r\n\\ltrch\\fcs0 \\b\\f31506\\fs28\\insrsid6441407 \r\n\\par }\\pard \\ltrpar\\ql \\li1440\\ri0\\sb360\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 {\\rtlch\\fcs1 \\af1\\afs28 \\ltrch\\fcs0 \\f31506\\fs28\\insrsid6441407 \r\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\sb120\\widctlpar\\brdrt\\brdrs\\brdrw60\\brsp20\\brdrcf13 \\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\f31506\\insrsid6441407 \r\n\\par }\\pard \\ltrpar\\ql \\li1440\\ri0\\sb240\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\f31506\\insrsid6441407 \r\n\\par }\\pard \\ltrpar\\ql \\li1440\\ri0\\sb360\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\f31506\\insrsid6441407 \r\n\\par \r\n\\par }\\pard \\ltrpar\\qc \\li0\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\f31506\\insrsid6441407 \r\n\\par }\\pard \\ltrpar\\ql \\li720\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \\af45\\afs40 \\ltrch\\fcs0 \\f31506\\fs40\\insrsid6441407 \\page }{\\rtlch\\fcs1 \\af1\\afs36 \\ltrch\\fcs0 \\b\\f31506\\fs36\\cf9\\insrsid6441407  \r\n\\par }\\pard \\ltrpar\\ql \\li720\\ri0\\sb180\\keep\\keepn\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \\af1\\afs36 \\ltrch\\fcs0 \\b\\f31506\\fs36\\cf9\\insrsid6441407 Contents\r\n\\par }\\pard\\plain \\ltrpar\\s98\\ql \\li1080\\ri0\\sb120\\keepn\\widctlpar\\tqr\\tldot\\tx9893\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1080\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs20\\alang1025 \\ltrch\\fcs0 \\b\\f1\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \r\n{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\b0\\f31506\\insrsid6441407  TOC \\\\o \"1-3\" \\\\h \\\\z \\\\u }}{\\fldrslt {\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }\r\n{\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\insrsid1196296 HYPERLINK \\\\l \"_Toc87248710\"}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \r\n\\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700310030000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \r\n\\cs187\\f37\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 Purpose}{\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296  PAGEREF _Toc87248710 \\\\h }{\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 {\\*\\datafield \r\n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700310030000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 4}}}\\sectd \\ltrsect\\rtlgutter\r\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\ab0\\af31507\\afs22 \\ltrch\\fcs0 \r\n\\b0\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof\\insrsid1196296 \r\n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\insrsid1196296 HYPERLINK \\\\l \"_Toc87248711\"}{\\rtlch\\fcs1 \\af0 \r\n\\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 {\\*\\datafield \r\n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700310031000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\f37\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 License}{\\rtlch\\fcs1 \r\n\\af1 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296  PAGEREF _Toc87248711 \\\\h }{\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700310031000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 4}}}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\r\n\\rtlch\\fcs1 \\ab0\\af31507\\afs22 \\ltrch\\fcs0 \\b0\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof\\insrsid1196296 \r\n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\insrsid1196296 HYPERLINK \\\\l \"_Toc87248712\"}{\\rtlch\\fcs1 \\af0 \r\n\\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 {\\*\\datafield \r\n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700310032000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 Project Repository}{\r\n\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296  PAGEREF _Toc87248712 \\\\h }{\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700310032000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 5}}}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\r\n\\rtlch\\fcs1 \\ab0\\af31507\\afs22 \\ltrch\\fcs0 \\b0\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof\\insrsid1196296 \r\n\\par }\\pard\\plain \\ltrpar\\s176\\ql \\li1440\\ri0\\sb180\\widctlpar\\tqr\\tldot\\tx9883\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \r\n{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\insrsid1196296 HYPERLINK \\\\l \"_Toc87248713\"}{\\rtlch\\fcs1 \\af0 \r\n\\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 {\\*\\datafield \r\n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700310033000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 Installation}{\\rtlch\\fcs1 \r\n\\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296  PAGEREF _Toc87248713 \\\\h }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700310033000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 5}}}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\r\n\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof\\insrsid1196296 \r\n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\insrsid1196296 HYPERLINK \\\\l \"_Toc87248714\"}{\\rtlch\\fcs1 \r\n\\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 {\\*\\datafield \r\n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700310034000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 Versioning}{\\rtlch\\fcs1 \r\n\\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296  PAGEREF _Toc87248714 \\\\h }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700310034000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 5}}}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\r\n\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof\\insrsid1196296 \r\n\\par }\\pard\\plain \\ltrpar\\s98\\ql \\li1080\\ri0\\sb120\\keepn\\widctlpar\\tqr\\tldot\\tx9893\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1080\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs20\\alang1025 \\ltrch\\fcs0 \\b\\f1\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \r\n{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\insrsid1196296 HYPERLINK \\\\l \"_Toc87248715\"}{\\rtlch\\fcs1 \\af0 \r\n\\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 {\\*\\datafield \r\n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700310035000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 Project Layout}{\\rtlch\\fcs1 \r\n\\af1 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296  PAGEREF _Toc87248715 \\\\h }{\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700310035000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 6}}}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\r\n\\rtlch\\fcs1 \\ab0\\af31507\\afs22 \\ltrch\\fcs0 \\b0\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof\\insrsid1196296 \r\n\\par }\\pard\\plain \\ltrpar\\s176\\ql \\li1440\\ri0\\sb180\\widctlpar\\tqr\\tldot\\tx9883\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \r\n{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\insrsid1196296 HYPERLINK \\\\l \"_Toc87248716\"}{\\rtlch\\fcs1 \\af0 \r\n\\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 {\\*\\datafield \r\n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700310036000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 \r\nBasic TWAIN C# Definitions and Helper Functions}{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296  PAGEREF \r\n_Toc87248716 \\\\h }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700310036000000}}}{\\fldrslt {\\rtlch\\fcs1 \r\n\\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 6}}}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\r\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof\\insrsid1196296 \r\n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\insrsid1196296 HYPERLINK \\\\l \"_Toc87248717\"}{\\rtlch\\fcs1 \r\n\\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 {\\*\\datafield \r\n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700310037000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 \r\nA TWAIN C# Diagnostic Application}{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296  PAGEREF _Toc87248717 \\\\h \r\n}{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700310037000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 6}}}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\r\n\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof\\insrsid1196296 \r\n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\insrsid1196296 HYPERLINK \\\\l \"_Toc87248718\"}{\\rtlch\\fcs1 \r\n\\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 {\\*\\datafield \r\n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700310038000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 \r\nA TWAIN C# Sample Application}{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296  PAGEREF _Toc87248718 \\\\h }{\r\n\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700310038000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 7}}}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\r\n\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof\\insrsid1196296 \r\n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\insrsid1196296 HYPERLINK \\\\l \"_Toc87248719\"}{\\rtlch\\fcs1 \r\n\\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 {\\*\\datafield \r\n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700310039000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 \r\nA TWAIN C# Self Certification Application}{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296  PAGEREF \r\n_Toc87248719 \\\\h }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700310039000000}}}{\\fldrslt {\\rtlch\\fcs1 \r\n\\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 7}}}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\r\n\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof\\insrsid1196296 \r\n\\par }\\pard\\plain \\ltrpar\\s98\\ql \\li1080\\ri0\\sb120\\keepn\\widctlpar\\tqr\\tldot\\tx9893\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1080\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs20\\alang1025 \\ltrch\\fcs0 \\b\\f1\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \r\n{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\insrsid1196296 HYPERLINK \\\\l \"_Toc87248720\"}{\\rtlch\\fcs1 \\af0 \r\n\\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 {\\*\\datafield \r\n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700320030000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 Release Notes}{\\rtlch\\fcs1 \r\n\\af1 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296  PAGEREF _Toc87248720 \\\\h }{\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700320030000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 8}}}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\r\n\\rtlch\\fcs1 \\ab0\\af31507\\afs22 \\ltrch\\fcs0 \\b0\\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof\\insrsid1196296 \r\n\\par }\\pard\\plain \\ltrpar\\s176\\ql \\li1440\\ri0\\sb180\\widctlpar\\tqr\\tldot\\tx9883\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \r\n{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\insrsid1196296 HYPERLINK \\\\l \"_Toc87248721\"}{\\rtlch\\fcs1 \\af0 \r\n\\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 {\\*\\datafield \r\n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700320031000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 V2.5.0.0 (08-Nov-2021)}{\r\n\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296  PAGEREF _Toc87248721 \\\\h }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700320031000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 8}}}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\r\n\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof\\insrsid1196296 \r\n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\insrsid1196296 HYPERLINK \\\\l \"_Toc87248722\"}{\\rtlch\\fcs1 \r\n\\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 {\\*\\datafield \r\n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700320032000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 V2.4.11.0 (08-Jul-2020)}{\r\n\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296  PAGEREF _Toc87248722 \\\\h }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700320032000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 8}}}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\r\n\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof\\insrsid1196296 \r\n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\insrsid1196296 HYPERLINK \\\\l \"_Toc87248723\"}{\\rtlch\\fcs1 \r\n\\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 {\\*\\datafield \r\n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700320033000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 V2.4.10.0 (06-Jun-2020)}{\r\n\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296  PAGEREF _Toc87248723 \\\\h }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700320033000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 8}}}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\r\n\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof\\insrsid1196296 \r\n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\insrsid1196296 HYPERLINK \\\\l \"_Toc87248724\"}{\\rtlch\\fcs1 \r\n\\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 {\\*\\datafield \r\n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700320034000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 V2.4.9.0 (30-Apr-2020)}{\r\n\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296  PAGEREF _Toc87248724 \\\\h }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700320034000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 8}}}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\r\n\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof\\insrsid1196296 \r\n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\insrsid1196296 HYPERLINK \\\\l \"_Toc87248725\"}{\\rtlch\\fcs1 \r\n\\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 {\\*\\datafield \r\n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700320035000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 V2.4.8.0 (30-Mar-2020)}{\r\n\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296  PAGEREF _Toc87248725 \\\\h }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700320035000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 9}}}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\r\n\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof\\insrsid1196296 \r\n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\insrsid1196296 HYPERLINK \\\\l \"_Toc87248726\"}{\\rtlch\\fcs1 \r\n\\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 {\\*\\datafield \r\n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700320036000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 V2.4.6.0 (26-Mar-2020)}{\r\n\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296  PAGEREF _Toc87248726 \\\\h }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700320036000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 9}}}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\r\n\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof\\insrsid1196296 \r\n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\insrsid1196296 HYPERLINK \\\\l \"_Toc87248727\"}{\\rtlch\\fcs1 \r\n\\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 {\\*\\datafield \r\n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700320037000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 V2.4.5.0 (24-Mar-2020)}{\r\n\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296  PAGEREF _Toc87248727 \\\\h }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700320037000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 9}}}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\r\n\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof\\insrsid1196296 \r\n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\insrsid1196296 HYPERLINK \\\\l \"_Toc87248728\"}{\\rtlch\\fcs1 \r\n\\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 {\\*\\datafield \r\n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700320038000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 V2.4.4.0 (24-Mar-2020)}{\r\n\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296  PAGEREF _Toc87248728 \\\\h }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700320038000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 9}}}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\r\n\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof\\insrsid1196296 \r\n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\insrsid1196296 HYPERLINK \\\\l \"_Toc87248729\"}{\\rtlch\\fcs1 \r\n\\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 {\\*\\datafield \r\n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700320039000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 V2.4.3.0 (20-Mar-2020)}{\r\n\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296  PAGEREF _Toc87248729 \\\\h }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700320039000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 10}}}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\r\n\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof\\insrsid1196296 \r\n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\insrsid1196296 HYPERLINK \\\\l \"_Toc87248730\"}{\\rtlch\\fcs1 \r\n\\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 {\\*\\datafield \r\n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700330030000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 V2.4.2.0 (13-Mar-2020)}{\r\n\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296  PAGEREF _Toc87248730 \\\\h }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700330030000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 10}}}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\r\n\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof\\insrsid1196296 \r\n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\insrsid1196296 HYPERLINK \\\\l \"_Toc87248731\"}{\\rtlch\\fcs1 \r\n\\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 {\\*\\datafield \r\n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700330031000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 V2.4.1.0 (30-Jan-2020)}{\r\n\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296  PAGEREF _Toc87248731 \\\\h }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700330031000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 10}}}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\r\n\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof\\insrsid1196296 \r\n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\insrsid1196296 HYPERLINK \\\\l \"_Toc87248732\"}{\\rtlch\\fcs1 \r\n\\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 {\\*\\datafield \r\n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700330032000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 V2.4.0.3 (13-Mar-2019)}{\r\n\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296  PAGEREF _Toc87248732 \\\\h }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700330032000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 10}}}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\r\n\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof\\insrsid1196296 \r\n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\insrsid1196296 HYPERLINK \\\\l \"_Toc87248733\"}{\\rtlch\\fcs1 \r\n\\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 {\\*\\datafield \r\n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700330033000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 V2.4.0.2 (25-Jan-2019)}{\r\n\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296  PAGEREF _Toc87248733 \\\\h }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700330033000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 11}}}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\r\n\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof\\insrsid1196296 \r\n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\insrsid1196296 HYPERLINK \\\\l \"_Toc87248734\"}{\\rtlch\\fcs1 \r\n\\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 {\\*\\datafield \r\n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700330034000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 V2.4.0.1 (19-Apr-2018)}{\r\n\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296  PAGEREF _Toc87248734 \\\\h }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700330034000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 11}}}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\r\n\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof\\insrsid1196296 \r\n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\insrsid1196296 HYPERLINK \\\\l \"_Toc87248735\"}{\\rtlch\\fcs1 \r\n\\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 {\\*\\datafield \r\n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700330035000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 \r\nV2.4.0.0 (darned if I know, 2017)}{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296  PAGEREF _Toc87248735 \\\\h \r\n}{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700330035000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 11}}}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\r\n\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof\\insrsid1196296 \r\n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\insrsid1196296 HYPERLINK \\\\l \"_Toc87248736\"}{\\rtlch\\fcs1 \r\n\\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 {\\*\\datafield \r\n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700330036000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 V2.3.2.0 (18-Oct-2015)}{\r\n\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296  PAGEREF _Toc87248736 \\\\h }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700330036000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 11}}}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\r\n\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof\\insrsid1196296 \r\n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\insrsid1196296 HYPERLINK \\\\l \"_Toc87248737\"}{\\rtlch\\fcs1 \r\n\\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 {\\*\\datafield \r\n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700330037000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 V2.3.1.2 (13-Sep-2015)}{\r\n\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296  PAGEREF _Toc87248737 \\\\h }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700330037000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 12}}}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\r\n\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof\\insrsid1196296 \r\n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\insrsid1196296 HYPERLINK \\\\l \"_Toc87248738\"}{\\rtlch\\fcs1 \r\n\\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 {\\*\\datafield \r\n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700330038000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 V2.3.1.1 (27-Aug-2015)}{\r\n\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296  PAGEREF _Toc87248738 \\\\h }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700330038000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 12}}}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\r\n\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof\\insrsid1196296 \r\n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\insrsid1196296 HYPERLINK \\\\l \"_Toc87248739\"}{\\rtlch\\fcs1 \r\n\\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 {\\*\\datafield \r\n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700330039000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 V2.3.1.0 (13-Mar-2015)}{\r\n\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296  PAGEREF _Toc87248739 \\\\h }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700330039000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 12}}}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\r\n\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof\\insrsid1196296 \r\n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\insrsid1196296 HYPERLINK \\\\l \"_Toc87248740\"}{\\rtlch\\fcs1 \r\n\\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 {\\*\\datafield \r\n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700340030000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 V2.3.0.6 (30-Oct-2014)}{\r\n\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296  PAGEREF _Toc87248740 \\\\h }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700340030000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 12}}}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\r\n\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof\\insrsid1196296 \r\n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\insrsid1196296 HYPERLINK \\\\l \"_Toc87248741\"}{\\rtlch\\fcs1 \r\n\\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 {\\*\\datafield \r\n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700340031000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 V2.3.0.5 (19-Oct-2014)}{\r\n\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296  PAGEREF _Toc87248741 \\\\h }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700340031000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 13}}}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\r\n\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof\\insrsid1196296 \r\n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\insrsid1196296 HYPERLINK \\\\l \"_Toc87248742\"}{\\rtlch\\fcs1 \r\n\\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 {\\*\\datafield \r\n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700340032000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 V2.3.0.4 (13-Oct-2014)}{\r\n\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296  PAGEREF _Toc87248742 \\\\h }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700340032000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 13}}}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\r\n\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof\\insrsid1196296 \r\n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\insrsid1196296 HYPERLINK \\\\l \"_Toc87248743\"}{\\rtlch\\fcs1 \r\n\\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 {\\*\\datafield \r\n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700340033000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 V2.2.0 (11-Jul-2014)}{\r\n\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296  PAGEREF _Toc87248743 \\\\h }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700340033000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 13}}}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\r\n\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof\\insrsid1196296 \r\n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\insrsid1196296 HYPERLINK \\\\l \"_Toc87248744\"}{\\rtlch\\fcs1 \r\n\\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 {\\*\\datafield \r\n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700340034000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 V2.1.0 (09-Jul-2014)}{\r\n\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296  PAGEREF _Toc87248744 \\\\h }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700340034000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 14}}}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\r\n\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof\\insrsid1196296 \r\n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\insrsid1196296 HYPERLINK \\\\l \"_Toc87248745\"}{\\rtlch\\fcs1 \r\n\\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 {\\*\\datafield \r\n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700340035000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 V2.0.0 (21-May-2014)}{\r\n\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296  PAGEREF _Toc87248745 \\\\h }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700340035000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 14}}}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\r\n\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof\\insrsid1196296 \r\n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\insrsid1196296 HYPERLINK \\\\l \"_Toc87248746\"}{\\rtlch\\fcs1 \r\n\\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 {\\*\\datafield \r\n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700340036000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 V1.1.0 (27-Feb-2014)}{\r\n\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296  PAGEREF _Toc87248746 \\\\h }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700340036000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 14}}}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\r\n\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof\\insrsid1196296 \r\n\\par }{\\field\\fldedit{\\*\\fldinst {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\insrsid1196296 HYPERLINK \\\\l \"_Toc87248747\"}{\\rtlch\\fcs1 \r\n\\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908  }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 {\\*\\datafield \r\n08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700340037000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\cs187\\b\\ul\\cf2\\lang1024\\langfe1024\\noproof\\insrsid1196296\\charrsid12086908 V1.0.0 (05-Nov-2013)}{\r\n\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 \\tab }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296  PAGEREF _Toc87248747 \\\\h }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 {\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380037003200340038003700340037000000}}}{\\fldrslt {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\lang1024\\langfe1024\\noproof\\webhidden\\insrsid1196296 15}}}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj }}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\r\n\\rtlch\\fcs1 \\af31507\\afs22 \\ltrch\\fcs0 \\fs22\\lang1024\\langfe1024\\loch\\af31506\\hich\\af31506\\dbch\\af31505\\noproof\\insrsid1196296 \r\n\\par }\\pard\\plain \\ltrpar\\s98\\ql \\li1440\\ri0\\sb120\\keep\\keepn\\widctlpar\\tqr\\tldot\\tx9893\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs20\\alang1025 \\ltrch\\fcs0 \\b\\f1\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 }}\r\n\\pard\\plain \\ltrpar\\s98\\ql \\li1440\\ri0\\sb120\\keep\\keepn\\widctlpar\\tqr\\tldot\\tx9893\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs20\\alang1025 \\ltrch\\fcs0 \\b\\f1\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 \r\n\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\f31506\\cf9\\insrsid6441407 {\\*\\bkmkstart _Toc234021027}\r\n\\par }\\pard\\plain \\ltrpar\\ql \\li720\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \r\n\\f31506\\insrsid6441407 \r\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af51 \\ltrch\\fcs0 \\f31506\\insrsid6441407 \r\n\\par }\\pard \\ltrpar\\ql \\li720\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \\af1\\afs36 \\ltrch\\fcs0 \\b\\f37\\fs36\\cf9\\insrsid6441407 \r\n\\par }\\pard\\plain \\ltrpar\\s1\\ql \\li90\\ri0\\sb720\\keepn\\widctlpar\\brdrt\\brdrs\\brdrw30\\brsp120 \\wrapdefault\\nooverflow\\faroman\\outlinelevel0\\rin0\\lin90\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs36\\alang1025 \\ltrch\\fcs0 \r\n\\b\\f1\\fs36\\cf9\\lang1024\\langfe1024\\cgrid\\noproof\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\b0\\f37\\insrsid6441407 \\page }{\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\f37\\noproof0\\insrsid6441407 {\\*\\bkmkstart _Toc87248710}Purpose{\\*\\bkmkend _Toc87248710}\r\n\r\n\\par }\\pard\\plain \\ltrpar\\ql \\li1440\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af45\\afs22 \\ltrch\\fcs0 \r\n\\f37\\fs22\\insrsid6441407 This document serves as a brief introduction to the TWAIN CS projects.  It assumes familiarity with the C# programming language, and a basic understanding of the TWAIN Specification.\r\n\\par The version number supplied in the title is a guide to when the document \r\nwas last modified.  TWAIN supports feature negotiated interoperability between all versions of TWAIN enabled applications, TWAIN drivers (data sources), and the TWAIN Data Source Manager.\r\n\\par }{\\rtlch\\fcs1 \\af45 \\ltrch\\fcs0 \\f37\\insrsid6441407 \r\n\\par }\\pard\\plain \\ltrpar\\s1\\ql \\li0\\ri0\\sb720\\keepn\\widctlpar\\brdrt\\brdrs\\brdrw30\\brsp120 \\wrapdefault\\nooverflow\\faroman\\outlinelevel0\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs36\\alang1025 \\ltrch\\fcs0 \r\n\\b\\f1\\fs36\\cf9\\lang1024\\langfe1024\\cgrid\\noproof\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\f37\\insrsid6441407 {\\*\\bkmkstart _Toc87248711}License{\\*\\bkmkend _Toc87248711}\r\n\\par }\\pard\\plain \\ltrpar\\ql \\li1440\\ri0\\widctlpar\\wrapdefault\\faauto\\rin0\\lin1440\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af50 \\ltrch\\fcs0 \\f37\\insrsid6441407 \r\n\\par }{\\rtlch\\fcs1 \\af50\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 Copyright (C) 2013-202}{\\rtlch\\fcs1 \\af50\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid8668465 1}{\\rtlch\\fcs1 \\af50\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407  Kodak Alaris Inc.\r\n\\par \r\n\\par Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to u\r\nse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\r\n\\par \r\n\\par The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\r\n\\par \r\n\\par THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND N\r\nONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALIN\r\nGS IN THE SOFTWARE.\r\n\\par }\\pard \\ltrpar\\ql \\li720\\ri0\\sb180\\keep\\keepn\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \\af1\\afs36 \\ltrch\\fcs0 \\b\\f37\\fs36\\cf9\\insrsid6441407 \r\n\\par }\\pard \\ltrpar\\ql \\li720\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \\af51 \\ltrch\\fcs0 \\f31506\\insrsid6441407 \r\n\\par }\\pard\\plain \\ltrpar\\s189\\ql \\li0\\ri0\\keepn\\pagebb\\widctlpar\\brdrt\\brdrs\\brdrw30\\brsp120 \\wrapdefault\\nooverflow\\faroman\\outlinelevel0\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs24\\alang1025 \\ltrch\\fcs0 \r\n\\b\\f1\\fs24\\cf9\\lang1024\\langfe1024\\cgrid\\noproof\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af1\\afs36 \\ltrch\\fcs0 \\f31506\\fs36\\noproof0\\insrsid6441407 {\\*\\bkmkstart _Toc87248712}Project Repository{\\*\\bkmkend _Toc87248712}\r\n\\par }\\pard\\plain \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506\\cf6\\insrsid6441407 \r\n\r\n\\par }\\pard\\plain \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af37\\afs22\\alang1025 \\ltrch\\fcs0 \\f37\\fs22\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \r\n\\v\\f31506\\cf6\\insrsid6441407 [Technical Notes]}{\\rtlch\\fcs1 \\af0\\afs20 \\ltrch\\fcs0 \\i\\v\\f31506\\fs20\\cf6\\insrsid6441407 \r\n\\par }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\v\\f31506\\cf6\\insrsid6441407 I think we made a mistake here.  All of the capabilities that use TW_ARRAY containers only show TW_ONEVALUE as the valid container for MSG_SET.  It should be TW_ONEVALUE and TW_ARRAY.\r\n\\par }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\f31506\\cf6\\insrsid6441407 \r\n\\par }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\f31506\\insrsid6441407 TWAIN for C-Sharp (C#) resides on GitHub at }{\\field{\\*\\fldinst {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407  HYPERLINK \"https://github.com/twain/twain-cs\" }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \r\n\\insrsid6441407 {\\*\\datafield \r\n00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b5c000000680074007400700073003a002f002f006700690074006800750062002e0063006f006d002f0074007700610069006e002f0074007700610069006e002d00630073000000795881f43b1d7f48af2c825dc485\r\n276300000000a5ab00030000001500ef000000ff}}}{\\fldrslt {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\cs187\\ul\\cf2\\insrsid6441407 https://github.com/twain/twain-cs}}}\\sectd \\ltrsect\\rtlgutter\\psz1\\linex0\\endnhere\\pgbrdropt32\\sectdefaultcl\\sectrsid6896082\\sftnbj {\r\n\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\f31506\\insrsid6441407 .\r\n\\par }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul\\insrsid6441407 {\\*\\bkmkstart _Toc87248713}Installation{\\*\\bkmkend _Toc87248713}\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 \r\n\\par There is a releases folder that contains release and debug copies of the binaries.  There is no installation kit, just run them as-is.  If running on Linux or macOS it may be necessary to install or upgrade Mono to v4.8 or higher.  The certification tool \r\nautomatically creates a \\lquote TWAIN Self Certification\\rquote  folder on the user\\rquote s desktop, which contains all the stuff needed for certification.\r\n\\par \r\n\\par \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul\\insrsid6441407 {\\*\\bkmkstart _Toc87248714}Versioning{\\*\\bkmkend _Toc87248714}\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\f31506\\insrsid6441407 \r\n\\par The versioning scheme takes the form: TWAIN-ProtocolMajor.TWAIN-ProtocolMinor.Interface.Build\r\n\\par \r\n\\par If the TWAIN Specification is at 2.3 then the version will be 2.3.i.b.  This is for notational purposes only, TWAIN interoperates at all versions of the protocol, so there is no requirement that a developer has to use any specific version, or i\r\nmmediately upgrade if there is a change to the TWAIN Specification.\r\n\\par \r\n\\par The interface number rises if there is a modification to the TWAINCS that requires a code change in TWAINCSTest or TWAINCSScan.  This lets a developer know that downloading the new versio\r\nn will most likely require some work in their code before they can use it.  This assumption always applies when the TWAIN Specification changes, so the interface number resets to 0 when they are modified.\r\n\\par \r\n\\par The build number tracks releases for a given version of the TWAIN Specification, and always rises until a new version of the spec is adopted.\r\n\\par \r\n\\par So, for example (fictitious sequence, just to show how it works):\r\n\\par \r\n\\par 2.3.0.0 \\endash  initial release to go with TWAIN 2.3\r\n\\par 2.3.0.1 \\endash  bug fix\r\n\\par 2.3.0.2 \\endash  bug fix\r\n\\par 2.3.1.3 \\endash  interface change\r\n\\par 2.3.1.4 \\endash  bug fix\r\n\\par 2.4.0.0 \\endash  initial release to go with TWAIN 2.4\r\n\\par \r\n\\par }\\pard\\plain \\ltrpar\\s189\\ql \\li0\\ri0\\keepn\\pagebb\\widctlpar\\brdrt\\brdrs\\brdrw30\\brsp120 \\wrapdefault\\nooverflow\\faroman\\outlinelevel0\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs24\\alang1025 \\ltrch\\fcs0 \r\n\\b\\f1\\fs24\\cf9\\lang1024\\langfe1024\\cgrid\\noproof\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af1\\afs36 \\ltrch\\fcs0 \\f31506\\fs36\\noproof0\\insrsid6441407 {\\*\\bkmkstart _Toc87248715}Project Layout{\\*\\bkmkend _Toc87248715}\r\n\\par }\\pard\\plain \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506\\cf6\\insrsid6441407 \r\n\r\n\\par }\\pard\\plain \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af37\\afs22\\alang1025 \\ltrch\\fcs0 \\f37\\fs22\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \r\n\\v\\f31506\\cf6\\insrsid6441407 [Technical Notes]}{\\rtlch\\fcs1 \\af0\\afs20 \\ltrch\\fcs0 \\i\\v\\f31506\\fs20\\cf6\\insrsid6441407 \r\n\\par }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\v\\f31506\\cf6\\insrsid6441407 I think we made a mistake here.  All of the capabilities that use TW_ARRAY containers only show TW_ONEVALUE as the valid container for MSG_SET.  It should be TW_ONEVALUE and TW_ARRAY.\r\n\\par }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\f31506\\cf6\\insrsid6441407 \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li360\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin360\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\f31506\\insrsid6441407 \r\nThere are five projects in the TWAIN CS repository, with a single solution file to access them all:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\f31506\\insrsid6441407 Basic TWAIN C# Definitions and Helper Functions\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}A TWAIN C# Diagnostic Application\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}A TWAIN C# Sample Application\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 A TWAIN C# Self Certification Application\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\f31506\\insrsid6441407 \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li360\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin360\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\f31506\\insrsid8668465 The}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\f31506\\insrsid6441407  }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \r\n\\f31506\\insrsid8668465 a}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\f31506\\insrsid6441407 pplications reference the }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\f31506\\insrsid8668465 basic definitions and helper function}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\f31506\\insrsid6441407 .  \r\n}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\f31506\\insrsid8668465 Previous versions used a toolkit layer, but this introduced more complexity than it removed}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\f31506\\insrsid1196296 , so it was deleted}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \r\n\\f31506\\insrsid6441407 .\r\n\\par \r\n\\par It\\rquote s assumed that application writers will opt t\r\no pull this source code into a single assembly, the most common selection being the basic definitions and the sample application.  Updates will be accomplished by pulling in newer versions of these files.  Updates will typically come from the basic defini\r\ntions.\r\n\\par \r\n\\par If you decide to keep the items as separate projects, then make a note of the <HintPath> inside of each of the .csproj files.  Replacing the platform\\\\configuration folder names with }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 $(Platform)\\\\\r\n$(Configuration) makes for a much better build experience, since the references correctly track to the current settings.\r\n\\par }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\f31506\\insrsid6441407 \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\f31506\\insrsid6441407 \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\f31506\\ul\\insrsid6441407 {\\*\\bkmkstart _Toc87248716}Basic TWAIN C# Definitions and Helper Functions\r\n{\\*\\bkmkend _Toc87248716}\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\f31506\\insrsid6441407 \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li360\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin360\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\f31506\\insrsid6441407 \r\nTWAINH.CS contains all of the C/C++ TWAIN.H definitions for the version of TWAIN referenced on the title page of this document.\r\n\\par \r\n\\par TWAIN.CS contains helper functions designed to hide platform specific details, and to promote best practices when interfacing with the TWAIN Data Source Manager and TWAIN drivers.  Best practices cover a few areas:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\f31506\\insrsid6441407 Funnel all commands through a single thread\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Automatically collect the condition code when TWRC.Failure is detected\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Automatically resynchronize the TWAIN state if a sequence error is detected\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid8668465 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\f31506\\insrsid8668465 Access}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\f31506\\insrsid6441407 \r\n the data through CSV strings\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li360\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin360\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\f31506\\insrsid6441407 \r\n\\par Both files expose their functionality through the TWAIN class in the TWAINWorkingGroup namespace.\r\n\\par \r\n\\par \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\f31506\\insrsid6441407 \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\f31506\\ul\\insrsid6441407 {\\*\\bkmkstart _Toc87248717}A TWAIN C# Diagnostic Application\r\n{\\*\\bkmkend _Toc87248717}\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\f31506\\insrsid6441407 \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li360\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin360\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\f31506\\insrsid6441407 The code is not intended as seed code for applications.  It is a comprehens\r\nive frontend to the TWAIN API.  It allows the selection of any combination of TWAIN triplets, including ones that are illegal or are out of sequence with the current TWAIN state.  It is best compared to the TWACKER application, which has long been the mai\r\nn way to exercise TWAIN drivers on Microsoft Windows systems.\r\n\\par \r\n\\par Data is presented and consumed in the form of CSV strings.  Familiarity with the various TWAIN structures is essential, since these strings do not include self-referential metadata, aside from t\r\nhe content described by the TWAIN Specification.  As mentioned above, }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\insrsid6441407 it helps to have access to a copy of TWAINH.CS handy when looking at the CSV data.}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\f31506\\insrsid6441407 \r\n\r\n\\par \r\n\\par The application tries to reduce mouse clicks for some common operations.  For instance, upon successfu\r\nl completion of the DG_CONTROL / DAT_PARENT / MSG_OPENDSM operation, the dropdown values are set to DG_CONTROL / DAT_IDENTITY / MSG_GETFIRST, to enumerate the first TWAIN driver in the list of drivers.  After a few uses it\\rquote \r\nll be apparent when the application is trying to help.\r\n\\par \r\n\\par A @-command system has been added.  It doesn\\rquote t do much at the moment, but it could be expanded to allow for more complex behavior.  For instance, some kind of scripting system that would allow the diagnostic tool to help with automat\r\ned tests.  It becomes available after opening a DSM.  Type @help in the text box and press the Send button to get the list of supported commands.\r\n\\par \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0\\pararsid8668465 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\f31506\\insrsid6441407 \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\f31506\\insrsid6441407 \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\f31506\\ul\\insrsid6441407 {\\*\\bkmkstart _Toc87248718}A TWAIN C# Sample Application\r\n{\\*\\bkmkend _Toc87248718}\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\f31506\\insrsid6441407 \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li360\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin360\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\f31506\\insrsid6441407 The code is intended as seed code for applications, \r\nand demonstrates the easiest way to access the full range of functionality present in TWAIN.\r\n\\par \r\n\\par For TWAIN drivers that support DG_CONTROL / DAT_USERINTERFACE / MSG_ENABLEDSUIONLY and DG_CONTROL / DAT_CUSTOMDSDATA / MSG_*, the application supports a \\'93snapshot\\'94\r\n system.  This allows a user to configure a TWAIN driver and save its setting under a descriptive name that can be used to restore those settings prior to scanning.\r\n\\par \r\n\\par For drivers that don\\rquote t support these operations the application defaults to the older }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\insrsid6441407 DG_CONTROL / DAT_USERINTERFACE / MSG_ENABLEDS system, with TW_USERINTERFACE.ShowUI set to TRUE.\r\n\\par \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li360\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin360\\itap0\\pararsid8668465 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\insrsid6441407 \r\nAn application writer also has the option to programmatically negotiate capabilities.  The sample app doesn\\rquote t show this path, but it\\rquote s relatively easy to add for a small number of configurable items.}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \r\n\\f31506\\insrsid6441407\\charrsid8668465 \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li360\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin360\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\insrsid6441407 \r\n\\par \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul\\insrsid6441407 {\\*\\bkmkstart _Toc87248719}A TWAIN C# Self Certification Application\r\n{\\*\\bkmkend _Toc87248719}\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\insrsid6441407 \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li360\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin360\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\insrsid6441407 This application serves three purposes.  I\r\nt shows a reasonably good way of interfacing with TWAIN from C#.  It allows a user to interact directly with a TWAIN driver (with the aid of scripts).  And it offers a way to certify that a TWAIN driver is compliant with the specification.\r\n\\par \r\n\\par Note that the correct binary must be run to interface with 32-bit or 64-bit drivers.  This code has been tested on Windows, Linux, and Mac (the last two using Mono 4.8 or later).\r\n\\par \r\n\\par The tool has help built into it.  It also comes with a large collection of scripts.  If you use the \\lquote runv\\rquote  command with the script, you\\rquote ll get some insight into what arguments are needed for the \\lquote dsmentry\\rquote  command.\r\n\r\n\\par \r\n\\par It should be a good tool for developers, allowing them to explore the kind of commands they\\rquote ll need to issue from other languages, like C++.\r\n\\par \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li360\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin360\\itap0\\pararsid8668465 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\insrsid6441407 If developing with the tool, it\\rquote \r\nll use the data folder located with the binary.  The release version normally defaults to the \\'93TWAIN Self Certification/data\\'94 folder on the desktop.}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\insrsid6441407\\charrsid8668465 \r\n\\par }\\pard\\plain \\ltrpar\\s189\\ql \\li0\\ri0\\keepn\\pagebb\\widctlpar\\brdrt\\brdrs\\brdrw30\\brsp120 \\wrapdefault\\nooverflow\\faroman\\outlinelevel0\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs24\\alang1025 \\ltrch\\fcs0 \r\n\\b\\f1\\fs24\\cf9\\lang1024\\langfe1024\\cgrid\\noproof\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af1\\afs36 \\ltrch\\fcs0 \\f31506\\fs36\\noproof0\\insrsid6441407 {\\*\\bkmkstart _Toc87248720}Release Notes{\\*\\bkmkend _Toc87248720}\r\n\\par }\\pard\\plain \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af37\\afs22\\alang1025 \\ltrch\\fcs0 \\f37\\fs22\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \r\n\\i\\cf6\\insrsid6441407 \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0\\pararsid8668465 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul\\insrsid8668465 {\\*\\bkmkstart _Toc87248721}V2.5.0.0 (}{\\rtlch\\fcs1 \\af37 \r\n\\ltrch\\fcs0 \\b\\ul\\insrsid472724 08}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul\\insrsid8668465 -Nov-2021)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid8668465 {\\*\\bkmkend _Toc87248721} \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0\\pararsid8668465 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid8668465 New Features:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid8668465 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid8668465 Updated to version 2.5 of the TWAIN Specification\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid472724 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid472724 Certification tests for barcode, image address, patch code, printer}{\r\n\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid8668465 \r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid472724 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid472724 Obsolete toolkit code removed\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0\\pararsid8668465 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid8668465 Bug Fixes:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid8668465 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid8668465 (none)\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0\\pararsid8668465 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid8668465 Known Issues:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid8668465 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid8668465 (none)\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0\\pararsid8668465 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid8668465 Wish List:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid472724 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid472724 Switch}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid8668465 \r\n to something other than WinForms\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul\\insrsid8668465 \r\n\\par }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul\\insrsid6441407 {\\*\\bkmkstart _Toc87248722}V2.4.11.0 (08-Jul-2020)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 {\\*\\bkmkend _Toc87248722} \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 New Features:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 (none)\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Bug Fixes:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Added deprecated }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid472724 capabilities}{\r\n\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407  to LookupTable.tc\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Fixed cert to skip deprecated }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid472724 capabilities}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \r\n\\insrsid6441407 \r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Fixed to better handle when a driver isn\\rquote t successfully opened (skip the tests)\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Known Issues:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 (none)\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Wish List:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Want to switch to something other than WinForms, especially for macOS\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Need to add some more certification tests, especially for things like printer, barcode, patch\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\cf6\\insrsid6441407 \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul\\insrsid6441407 {\\*\\bkmkstart _Toc87248723}V2.4.10.0 (06-Jun-2020)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \r\n\\insrsid6441407 {\\*\\bkmkend _Toc87248723} \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 New Features:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 (none)\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Bug Fixes:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Fixed twaincert.exe to run from the releases folder without thinking it\\rquote \r\ns a development path, so it correctly creates the \\lquote data\\rquote  folder in the \\lquote TWAIN Self Certification\\rquote  folder on the desktop.\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Known Issues:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 (none)\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Wish List:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Want to switch to something other than WinForms, especially for macOS\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Need to add some more certification tests, especially for things like printer, barcode, patch\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\cf6\\insrsid6441407 \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul\\insrsid6441407 {\\*\\bkmkstart _Toc87248724}V2.4.9.0 (30-Apr-2020)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \r\n\\insrsid6441407 {\\*\\bkmkend _Toc87248724} \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 New Features:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 (none)\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Bug Fixes:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 \r\nThe MSG_SET certification test was using the MSG_GET container, when the 2.4 spec states that it should only use TW_ONEVALUE or TW_ARRAY (the others being for MSG_SETCONTAINER), so that\\rquote s fixed now\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Fixed \r\nTWBP_* values to not return symbolic names, the support for symbolic names with TW_RANGE gets too weird too fast, staying with numbers offers fewer problems\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Known Issues:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 (none)\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Wish List:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Want to switch to something other than WinForms, especially for macOS\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Need to add some more certification tests, especially for things like printer, barcode, patch\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\cf6\\insrsid6441407 \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul\\insrsid6441407 {\\*\\bkmkstart _Toc87248725}V2.4.8.0 (30-Mar-2020)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \r\n\\insrsid6441407 {\\*\\bkmkend _Toc87248725} \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 New Features:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Switched almost all of the csv functions to static\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}(yah, skipped 2.4.7, kinda)\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Bug Fixes:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 (none)\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Known Issues:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 (none)\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Wish List:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Want to switch to something other than WinForms, especially for macOS\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Need to add some more certification tests, especially for things like printer, barcode, patch\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\cf6\\insrsid6441407 \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul\\insrsid6441407 {\\*\\bkmkstart _Toc87248726}V2.4.6.0 (26-Mar-2020)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \r\n\\insrsid6441407 {\\*\\bkmkend _Toc87248726} \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 New Features:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 (none)\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Bug Fixes:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 MSG_XFERREADY wasn\\rquote t being handled properly if ShowUI was TRUE\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Known Issues:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 (none)\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Wish List:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Want to switch to something other than WinForms, especially for macOS\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Need to add some more certification tests, especially for things like printer, barcode, patch\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul\\insrsid6441407 {\\*\\bkmkstart _Toc87248727}V2.4.5.0 (24-Mar-2020)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \r\n\\insrsid6441407 {\\*\\bkmkend _Toc87248727} \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 New Features:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 (none)\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Bug Fixes:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Stupid data folder wasn\\rquote t being properly created (grrr)\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Known Issues:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 (none)\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Wish List:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Want to switch to something other than WinForms, especially for macOS\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Need to add some more certification tests, especially for things like printer, barcode, patch\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\cf6\\insrsid6441407 \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul\\insrsid6441407 {\\*\\bkmkstart _Toc87248728}V2.4.4.0 (24-Mar-2020)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \r\n\\insrsid6441407 {\\*\\bkmkend _Toc87248728} \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 New Features:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Fixed issues related to TWAIN Direct support, and added it to certification\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Added makerelease.bat file\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Bug Fixes:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 (none)\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Known Issues:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 (none)\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Wish List:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Want to switch to something other than WinForms, especially for macOS\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Need to add some more certification tests, especially for things like printer, barcode, patch\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\cf6\\insrsid6441407 \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul\\insrsid6441407 {\\*\\bkmkstart _Toc87248729}V2.4.3.0 (20-Mar-2020)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \r\n\\insrsid6441407 {\\*\\bkmkend _Toc87248729} \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 New Features:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Switched twaincsscan and twaincstst to directly access TWAIN.CS\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}The toolkit is officially deprecated now, don\\rquote t use it\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Bug Fixes:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Fixed an issue where xferready during enableds could be missed\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Known Issues:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 (none)\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Wish List:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Want to switch to something other than WinForms, especially for macOS\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Need to add some more certification tests, especially for things like printer, barcode, patch\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\cf6\\insrsid6441407 \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul\\insrsid6441407 {\\*\\bkmkstart _Toc87248730}V2.4.2.0 (13-Mar-2020)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \r\n\\insrsid6441407 {\\*\\bkmkend _Toc87248730} \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 New Features:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Massive update to TWAIN.CS\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}twaincscert is pretty much done\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Bug Fixes:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Too many to count, twaincscert helped scrub the code\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Known Issues:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 (none)\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Wish List:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Want to switch to something other than WinForms, especially for macOS\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Need to add some more certification tests, especially for things like printer, barcode, patch\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\cf6\\insrsid6441407 \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul\\insrsid6441407 {\\*\\bkmkstart _Toc87248731}V2.4.1.0 (30-Jan-2020)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \r\n\\insrsid6441407 {\\*\\bkmkend _Toc87248731} \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 New Features:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Added twaincscert project (it\\rquote s not done yet, but it is useable)\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Fixed reflection to allow use of capability enumerations in the CSV (ex: TWPT_RGB)\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Expanded ability to use TWAIN.CS without the toolkit (needed for cert)\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Bug Fixes:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 (none)\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Known Issues:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Runs rather slowly on Mac OS X\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Setup Dialog sometimes freaks out on Mac OS X (appears to be a WinForms bug)\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Wish List:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 64-bit Mono support on Mac OS X (should just work, but needs building / testing)\r\n\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Want to switch to Xamarin\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\cf6\\insrsid6441407 \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul\\insrsid6441407 {\\*\\bkmkstart _Toc87248732}V2.4.0.3 (13-Mar-2019)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \r\n\\insrsid6441407 {\\*\\bkmkend _Toc87248732} \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 New Features:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 (none)\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Bug Fixes:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Fixed an encoding problem, TWAIN \r\non Windows requires strings in the encoding specified by the driver (either through it\\rquote \r\ns TW_IDENTITY.Version.Language or the last successful set of CAP_LANGUAGE).  Until this fix TWAIN CS was sending strings as UTF-8.  Note that on Linux and macOS UTF-8 is the encoding, that hasn\\rquote t changed.\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Known Issues:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Runs rather slowly on Mac OS X\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Setup Dialog sometimes freaks out on Mac OS X (appears to be a WinForms bug)\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Wish List:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 64-bit Mono support on Mac OS X (should just work, but needs building / testing)\r\n\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Want to switch to Xamarin\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul\\insrsid6441407 {\\*\\bkmkstart _Toc87248733}V2.4.0.2 (25-Jan-2019)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \r\n\\insrsid6441407 {\\*\\bkmkend _Toc87248733} \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 New Features:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 In sync with TWAIN Direct\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Updated to VS2017\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Bug Fixes:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Fixed problem with FIX32 in TW_RANGE\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Fixed problems with SendDat for custom DAT support\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Known Issues:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Runs rather slowly on Mac OS X\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Setup Dialog sometimes freaks out on Mac OS X (appears to be a WinForms bug)\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Wish List:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 64-bit Mono support on Mac OS X (should just work, but needs building / testing)\r\n\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Want to switch to Xamarin\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\cf6\\insrsid6441407 \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul\\insrsid6441407 {\\*\\bkmkstart _Toc87248734}V2.4.0.1 (19-Apr-2018)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \r\n\\insrsid6441407 {\\*\\bkmkend _Toc87248734} \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 New Features:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 In sync with TWAIN Direct\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Bug Fixes:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Code analysis with VS2015, fixed up everything, supressed some stuff\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Finally got the Linux 64-bit thing right (lots of edge cases)\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Known Issues:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Runs rather slowly on Mac OS X\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Setup Dialog sometimes freaks out on Mac OS X (appears to be a WinForms bug)\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Wish List:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 64-bit Mono support on Mac OS X (should just work, but needs building / testing)\r\n\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Want to switch to Xamarin, and VS2017\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\cf6\\insrsid6441407 \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul\\insrsid6441407 {\\*\\bkmkstart _Toc87248735}V2.4.0.0 (darned if I know, 2017)}{\\rtlch\\fcs1 \\af37 \r\n\\ltrch\\fcs0 \\insrsid6441407 {\\*\\bkmkend _Toc87248735} \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 New Features:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Linux 64-bit support, despite the TW_INT32/TW_UINT32 fiasco\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Switched to log file backup scheme\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}In sync with TWAIN Direct\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Known Issues:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Runs rather slowly on Mac OS X\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Setup Dialog sometimes freaks out on Mac OS X (appears to be a WinForms bug)\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Wish List:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 64-bit Mono support on Mac OS X (should just work, but needs building / testing)\r\n\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\cf6\\insrsid6441407 \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul\\insrsid6441407 {\\*\\bkmkstart _Toc87248736}V2.3.2.0 (18-Oct-2015)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \r\n\\insrsid6441407 {\\*\\bkmkend _Toc87248736} \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 New Features:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Override capability for logging\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Log files are now read shared, so they can be viewed while the code is running\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}RunInGuiThread scheme added to support Windows for bug listed below\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Added thread and state to the log lines, added OS to the title line\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Bug Fixes:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 \r\nDAT_USERINTERFACE and DAT_IMAGE*XFER run on the HWND thread on Windows, this fixes problems with a number of drivers that run their code in the message loop (addresses Ticket #11 and Ticket #14)\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}DsmMemLock on the native transfer handle (addresses Ticket #15)\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}I\\rquote m not closing the tickets until I get feedback, or if I hear nothing for a month or two\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Known Issues:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Runs rather slowly on Mac OS X\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Setup Dialog sometimes freaks out on Mac OS X (appears to be a WinForms bug)\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Wish List:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 64-bit Mono support on Mac OS X (should just work, but needs building / testing)\r\n\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\cf6\\insrsid6441407 \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul\\insrsid6441407 {\\*\\bkmkstart _Toc87248737}V2.3.1.2 (13-Sep-2015)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \r\n\\insrsid6441407 {\\*\\bkmkend _Toc87248737} \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 New Features:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 (none)\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Bug Fixes:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Solved issues with the DsmMem* functions\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Known Issues:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Runs rather slowly on Mac OS X\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Setup Dialog sometimes freaks out on Mac OS X (appears to be a WinForms bug)\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Wish List:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 64-bit Mono support on Mac OS X (should just work, but needs building / testing)\r\n\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul\\insrsid6441407 {\\*\\bkmkstart _Toc87248738}V2.3.1.1 (27-Aug-2015)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \r\n\\insrsid6441407 {\\*\\bkmkend _Toc87248738} \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 New Features:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 (none)\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Bug Fixes:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Log fix and sync with TWAIN Direct\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Known Issues:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Runs rather slowly on Mac OS X\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Setup Dialog sometimes freaks out on Mac OS X (appears to be a WinForms bug)\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Wish List:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 64-bit Mono support on Mac OS X (should just work, but needs building / testing)\r\n\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul\\insrsid6441407 {\\*\\bkmkstart _Toc87248739}V2.3.1.0 (13-Mar-2015)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \r\n\\insrsid6441407 {\\*\\bkmkend _Toc87248739} \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 New Features:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Additional arguments to the ReportImage callback\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Bug Fixes:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 \r\nTested building using MonoDevelop on Ubuntu 14.04 (32-bit) using Mono 3.12.1, fixed two problems\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Known Issues:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Runs rather slowly on Mac OS X\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Setup Dialog sometimes freaks out on Mac OS X (appears to be a WinForms bug)\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Wish List:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 64-bit Mono support on Mac OS X (should just work, but needs building / testing)\r\n\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul\\insrsid6441407 {\\*\\bkmkstart _Toc87248740}V2.3.0.6 (30-Oct-2014)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \r\n\\insrsid6441407 {\\*\\bkmkend _Toc87248740} \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 New Features:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 (none)\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Bug Fixes:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Closed Ticket #6: DsmMemFree - Validate\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Ticket #5 has been resisting, this time I got it right\\'85\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Removed embedded tabs\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Confirmed successful tests with other vendors\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Fixed code to better handle when TWAIN DSM isn\\rquote t installed\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Known Issues:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Runs rather slowly on Mac OS X\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Setup Dialog sometimes freaks out on Mac OS X (appears to be a WinForms bug)\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Wish List:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 64-bit Mono support on Mac OS X (should just work, but needs building / testing)\r\n\r\n\\par }\\pard\\plain \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f37\\cf6\\insrsid6441407 \r\n\r\n\\par }\\pard\\plain \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af37\\afs22\\alang1025 \\ltrch\\fcs0 \\f37\\fs22\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \r\n\\v\\cf6\\insrsid6441407 [Technical Notes]}{\\rtlch\\fcs1 \\af0\\afs20 \\ltrch\\fcs0 \\i\\v\\fs20\\cf6\\insrsid6441407 \r\n\\par }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\v\\cf6\\insrsid6441407 I think we made a mistake here.  All of the capabilities that use TW_ARRAY containers only show TW_ONEVALUE as the valid container for MSG_SET.  It should be TW_ONEVALUE and TW_ARRAY.\r\n\\par }\\pard\\plain \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f37\\cf6\\insrsid6441407 \r\n\r\n\\par }\\pard\\plain \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af37\\afs22\\alang1025 \\ltrch\\fcs0 \\f37\\fs22\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \r\n\\v\\cf6\\insrsid6441407 [Technical Notes]}{\\rtlch\\fcs1 \\af0\\afs20 \\ltrch\\fcs0 \\i\\v\\fs20\\cf6\\insrsid6441407 \r\n\\par }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\v\\cf6\\insrsid6441407 I think we made a mistake here.  All of the capabilities that use TW_ARRAY containers only show TW_ONEVALUE as the valid container for MSG_SET.  It should be TW_ONEVALUE and TW_ARRAY.\r\n\\par }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\cf6\\insrsid6441407 \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul\\insrsid6441407 {\\*\\bkmkstart _Toc87248741}V2.3.0.5 (19-Oct-2014)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \r\n\\insrsid6441407 {\\*\\bkmkend _Toc87248741} \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 New Features:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 (none)\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Bug Fixes:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Closed Ticket #3: can\\'b4t get capabilities; what can i get out of a_szMemref?\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Closed Ticket #4: Setup Scanner does not work in twancsscan (dialog freezes)\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Closed Ticket #5: Twain.DatParent - CloseDs should be CloseDsm\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Figured out the message pump issue\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Fixed SetImagePath to impact file transfers\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Known Issues:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Runs rather slowly on Mac OS X\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Setup Dialog sometimes freaks out on Mac OS X (looks like a race condition)\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Only tested on Kodak Alaris products and the TWAIN Sample Data Source\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Wish List:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Test with other vendors\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}64-bit Mono support on Mac OS X (should just work, but needs building / testing)\r\n\\par }\\pard\\plain \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f37\\cf6\\insrsid6441407 \r\n\r\n\\par }\\pard\\plain \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af37\\afs22\\alang1025 \\ltrch\\fcs0 \\f37\\fs22\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \r\n\\v\\cf6\\insrsid6441407 [Technical Notes]}{\\rtlch\\fcs1 \\af0\\afs20 \\ltrch\\fcs0 \\i\\v\\fs20\\cf6\\insrsid6441407 \r\n\\par }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\v\\cf6\\insrsid6441407 I think we made a mistake here.  All of the capabilities that use TW_ARRAY containers only show TW_ONEVALUE as the valid container for MSG_SET.  It should be TW_ONEVALUE and TW_ARRAY.\r\n\\par }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\cf6\\insrsid6441407 \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul\\insrsid6441407 {\\*\\bkmkstart _Toc87248742}V2.3.0.4 (13-Oct-2014)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \r\n\\insrsid6441407 {\\*\\bkmkend _Toc87248742} \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 New Features:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Trackin\r\ng the version number to the TWAIN Specification, so the major and minor will be the protocol value, the third number will call out major changes in the API within a version, and the fourth number will count minor changes to the API (like bug fixes)\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Added logging (still some work to do on this)\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Added auto JPEG/TIFF option for file  transfers\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Bug Fixes:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Fixed DAT_IMAGEMEMFILEXFER for Mac OS X\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Known Issues:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Runs rather slowly on Mac OS X\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Setup Dialog sometimes freaks out on Mac OS X (looks like a race condition)\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Only tested on Kodak Alaris products and the TWAIN Sample Data Source\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Wish List:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Test with other vendors\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}64-bit Mono support on Mac OS X (should just work, but needs testing)\r\n\\par }\\pard\\plain \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f37\\cf6\\insrsid6441407 \r\n\r\n\\par }\\pard\\plain \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af37\\afs22\\alang1025 \\ltrch\\fcs0 \\f37\\fs22\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \r\n\\v\\cf6\\insrsid6441407 [Technical Notes]}{\\rtlch\\fcs1 \\af0\\afs20 \\ltrch\\fcs0 \\i\\v\\fs20\\cf6\\insrsid6441407 \r\n\\par }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\v\\cf6\\insrsid6441407 I think we made a mistake here.  All of the capabilities that use TW_ARRAY containers only show TW_ONEVALUE as the valid container for MSG_SET.  It should be TW_ONEVALUE and TW_ARRAY.\r\n\\par }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\cf6\\insrsid6441407 \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul\\insrsid6441407 {\\*\\bkmkstart _Toc87248743}V2.2.0 (11-Jul-2014)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \r\n\\insrsid6441407 {\\*\\bkmkend _Toc87248743} \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 New Features:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 (none)\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Bug Fixes:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Fixed DAT_IMAGEMEMFILEXFER\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Known Issues:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Runs rather slowly on Mac OS X\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Setup Dialog sometimes freaks out on Mac OS X (looks like a race condition)\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Only tested on Kodak Alaris products and the TWAIN Sample Data Source\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Wish List:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Test with other vendors\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}64-bit Mono support on Mac OS X (should just work, but needs testing)\r\n\\par }\\pard\\plain \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506\\cf6\\insrsid6441407 \r\n\r\n\\par }\\pard\\plain \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af37\\afs22\\alang1025 \\ltrch\\fcs0 \\f37\\fs22\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \r\n\\v\\f31506\\cf6\\insrsid6441407 [Technical Notes]}{\\rtlch\\fcs1 \\af0\\afs20 \\ltrch\\fcs0 \\i\\v\\f31506\\fs20\\cf6\\insrsid6441407 \r\n\\par }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\v\\f31506\\cf6\\insrsid6441407 I think we made a mistake here.  All of the capabilities that use TW_ARRAY containers only show TW_ONEVALUE as the valid container for MSG_SET.  It should be TW_ONEVALUE and TW_ARRAY.\r\n\\par }{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\f31506\\cf6\\insrsid6441407 \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul\\insrsid6441407 {\\*\\bkmkstart _Toc87248744}V2.1.0 (09-Jul-2014)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \r\n\\insrsid6441407 {\\*\\bkmkend _Toc87248744} \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 New Features:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 ReportImage\\rquote s bitmap no long locks access to the file\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Bug Fixes:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Handles MSG_XFERREADY when issued from MSG_ENABLEDS\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Known Issues:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Runs rather slowly on Mac OS X\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Setup Dialog sometimes freaks out on Mac OS X (looks like a race condition)\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Only tested on Kodak Alaris products and the TWAIN Sample Data Source\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Wish List:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Test with other vendors\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}64-bit Mono support on Mac OS X (should just work, but needs testing)\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\f31506\\ul\\insrsid6441407 {\\*\\bkmkstart _Toc87248745}V2.0.0 (21-May-2014)}{\\rtlch\\fcs1 \\af37 \r\n\\ltrch\\fcs0 \\f31506\\insrsid6441407 {\\*\\bkmkend _Toc87248745} \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\f31506\\insrsid6441407 New Features:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\f31506\\insrsid6441407 Support for 64-bit Linux (native only, 32-bit on 64-bit is too nasty)\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}ShowImage renamed to ReportImage\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\f31506\\insrsid6441407 Known Issues:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\f31506\\insrsid6441407 Runs rather slowly on Mac OS X\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Setup Dialog sometimes freaks out on Mac OS X (looks like a race condition)\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Only tested on Kodak Alaris products\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\f31506\\insrsid6441407 Wish List:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\f31506\\insrsid6441407 Test with other vendors\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}64-bit Mono support on Mac OS X (should just work, but needs testing)\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\cf6\\insrsid6441407 \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul\\insrsid6441407 {\\*\\bkmkstart _Toc87248746}V1.1.0 (27-Feb-2014)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \r\n\\insrsid6441407 {\\*\\bkmkend _Toc87248746} \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 New Features:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Additional arguments in ShowImage\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Code example of CAP_INDICATORS in TWAINCSScan\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Fixed projects to handle conditional references\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Added AnyCPU support\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Known Issues:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Runs rather slowly on Mac OS X\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Setup Dialog sometimes freaks out on Mac OS X (looks like a race condition)\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Only tested on Kodak Alaris products\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Wish List:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Test with other vendors\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}64-bit Mono support on Linux and Mac OS X\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\i\\cf6\\insrsid6441407 \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\outlinelevel1\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\b\\ul\\insrsid6441407 {\\*\\bkmkstart _Toc87248747}V1.0.0 (05-Nov-2013)}{\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \r\n\\insrsid6441407 {\\*\\bkmkend _Toc87248747} \r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 New Features:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Initial release\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Known Issues:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Runs rather slowly on Mac OS X\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Setup Dialog sometimes freaks out on Mac OS X (looks like a race condition)\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}Only tested on Kodak Alaris products\r\n\\par }\\pard \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Wish List:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}}\\pard \\ltrpar\r\n\\s199\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls12\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \\insrsid6441407 Test with other vendors\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\s199 \\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\f37\\fs22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 -\\tab}64-bit Mono support on Linux and Mac OS X}{\\rtlch\\fcs1 \\af46 \\ltrch\\fcs0 \\f31506\\insrsid6441407 \r\n\\par }\\pard\\plain \\ltrpar\\s189\\ql \\li0\\ri0\\keepn\\widctlpar\\brdrt\\brdrs\\brdrw30\\brsp120 \\wrapdefault\\nooverflow\\faroman\\outlinelevel0\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\ab\\af1\\afs24\\alang1025 \\ltrch\\fcs0 \r\n\\b\\f1\\fs24\\cf9\\lang1024\\langfe1024\\cgrid\\noproof\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\v\\f31506\\noproof0\\insrsid6441407 {\\*\\bkmkend _Toc234021027}General Comments }{\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\v\\f31506\\cf6\\noproof0\\insrsid6441407 [DONE]\r\n}{\\rtlch\\fcs1 \\af1 \\ltrch\\fcs0 \\v\\f31506\\noproof0\\insrsid6441407 \r\n\\par }\\pard\\plain \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506\\cf6\\insrsid6441407 \r\n\r\n\\par }\\pard\\plain \\ltrpar\\s199\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af37\\afs22\\alang1025 \\ltrch\\fcs0 \\f37\\fs22\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \r\n\\v\\f31506\\cf6\\insrsid6441407 [Technical Notes]}{\\rtlch\\fcs1 \\af0\\afs20 \\ltrch\\fcs0 \\i\\v\\f31506\\fs20\\cf6\\insrsid6441407 \r\n\\par These are areas of discussion which may or may not lead to changes in the TWAIN Specification.  If changes do result, they\\rquote ll be moved into their own area.  There are no Update Instructions in this section.  When we\\rquote re done with it, it\r\n\\rquote ll be moved to the end of the document and given a status of \\'93DONE\\'94\\'85\r\n\\par }\\pard\\plain \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506\\insrsid6441407 \r\n\r\n\\par \r\n\\par }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506\\cf6\\insrsid6441407 [Note] \\endash  DONE\r\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\i\\v\\f31506\\fs22\\insrsid6441407 Does a Boolean enumeration have an expected order to the TRUE/FALSE values in the list?\r\n\r\n\\par 8-22 (hunt this down and fix it)\r\n\\par We don\\rquote t want the values ordered, except in the context where the order impacts the UI, but there is no way to know if this is happening or not\\'85\r\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\faauto\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af46 \\ltrch\\fcs0 \\v\\f31506\\insrsid6441407 Stores a group of individual values describing a capability. The values are ordered from lowest to\r\n\\par highest values, but the step size between each value is probably not uniform. Such a list would be\r\n\\par useful to describe the discreet resolutions of a capture device supporting, say, 75, 150, 300, 400,\r\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af46 \\ltrch\\fcs0 \\v\\f31506\\insrsid6441407 and 800 dots per inch.}{\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\i\\v\\f31506\\fs22\\insrsid6441407 \r\n\\par \r\n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\fs22\\insrsid6441407 \\hich\\af0\\dbch\\af0\\loch\\f0 -\\tab}}\\pard \\ltrpar\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls11\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\r\n\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\i\\v\\f31506\\fs22\\insrsid6441407 No, there is no required order for items in an enumeration or an array.  Ideally the Data Source would maintain t\r\nhe order of items send to it, and display the items in that order in the GUI, but I don\\rquote t believe there is anything in the Specification that even suggests that much.\r\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506\\insrsid6441407 \r\n\\par \r\n\\par }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506\\cf6\\insrsid6441407 [Note] \\endash  DONE\r\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\i\\v\\f31506\\fs22\\insrsid6441407 In particular, I was working on ICAP_BITDEPTH. If a Data Source only supp\r\norts a single bitdepth for each specific pixeltype, wouldn\\rquote t it make sense to respond that SET and RESET are not supported? There would be no reason to do a set of Bitdepth, since only a single value is supported at a time.\r\n\\par \r\n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\fs22\\insrsid6441407 \\hich\\af0\\dbch\\af0\\loch\\f0 -\\tab}}\\pard \\ltrpar\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls11\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\r\n\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\i\\v\\f31506\\fs22\\insrsid6441407 I wonder if there should be a paragraph on this matter.  Here\\rquote \r\ns my take on it.  Applications tend to do one of two things when confronted by an error: they ignore it or they fail (sometimes they crash).  With that in mind a driver should always avoid returning an error if it has a val\r\nid alternative that allows it to return success instead.  Therefore, MSG_RESET and MSG_SET should always be allowed for capabilities that support a single value, except in those  cases where the Specification makes it clear that the value is read only (li\r\nke CAP_DEVICEONLINE).\r\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506\\insrsid6441407 \r\n\\par \r\n\\par }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506\\cf6\\insrsid6441407 [Note] \\endash  DONE\r\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\i\\v\\f31506\\fs22\\insrsid6441407 \r\nAlso regarding ICAP_BITDEPTH, am I correct in understanding that a MSG_GET for this capability should only report the available values based on the current setting for PIXELTYPE? Ie. Don\\rquote \r\nt report all the bitdepths supported, only those supported for the current pixel type?\r\n\\par \r\n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\fs22\\insrsid6441407 \\hich\\af0\\dbch\\af0\\loch\\f0 -\\tab}}\\pard \\ltrpar\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls11\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\r\n\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\i\\v\\f31506\\fs22\\insrsid6441407 This is correct.  We know that some drivers show all of the bitdepth values for all of the supported pixeltypes.  It doesn\\rquote \r\nt look like we have a comment on this in the Legacy Issues section (3-39, PDF 71).\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\fs22\\insrsid6441407 \\hich\\af0\\dbch\\af0\\loch\\f0 -\\tab}Add a test to the self cert to watch out for this\\'85 (this has been added to the Proposed Changes doc)\r\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506\\insrsid6441407 \r\n\\par \r\n\\par }{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506\\cf6\\insrsid6441407 \\page [Note] \\endash  DONE\r\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\i\\v\\f31506\\fs22\\insrsid6441407 \r\nI have a question regarding the filename extension used in a File Transfer.  The filename is provided in the DG_CONTROL/DAT_SETUPFILEXFER/MSG_SET message.  Do I need\r\n to make sure the requested filename extension matches the type of the file I end up creating?\r\n\\par }{\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22\\insrsid6441407 \r\n\\par A couple of examples:\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f37\\fs22\\cf22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 1)\\tab}}\\pard \\ltrpar\r\n\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls10\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22\\insrsid6441407 Simple case: if \\'93filexfer.tmp\\'94 is requested, I\\rquote \r\nm guessing I should use the file extension as requested regardless of file type that I create. (ie. Even though I save a tiff/jpg/bmp etc. file, continue using the .tmp extention) Is this correct?\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f37\\fs22\\cf22\\insrsid6441407 \\hich\\af37\\dbch\\af0\\loch\\f37 2)\\tab}More complex case: Assume I\\rquote m doing auto color detect, and my non-color will be mapped to BW. If \\'93filexfer.jpg\r\n\\'94 is requested and I detect a non-color image, this will be an *}{\\rtlch\\fcs1 \\ab\\af0\\afs22 \\ltrch\\fcs0 \\b\\v\\f31506\\fs22\\insrsid6441407 incorrect}{\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22\\insrsid6441407 \r\n* name in the end since I cannot save a BW image as a JPG file. I will create a BMP file instead. Should I change the requested filename to \\'93filexfer.bmp\\'94 in this c\r\nase? Or still use the filename as requested even though it gives the wrong impression of filetype?\r\n\\par }\\pard \\ltrpar\\ql \\li360\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin360\\itap0 {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22\\insrsid6441407 \r\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22\\insrsid6441407 If I don\\rquote \r\nt use the filename exactly as requested, does the TWAIN app think the transfer failed? They really have no way to know what I saved it as if I make a change, so it seems the filename better not change, even in the case that it is incorrect.\r\n\\par \r\n\\par Do you know of some TWAIN apps that use FileXfer that I could try this with?\r\n\\par \r\n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\fs22\\insrsid6441407 \\hich\\af0\\dbch\\af0\\loch\\f0 -\\tab}}\\pard \\ltrpar\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls11\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\r\n\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22\\insrsid6441407 TWAIN doesn\\rquote t recommend or enforce filename extensions for TWFF_* file formats.  This means that someone could produce a ridiculous result (like image.bmp for a JPEG image), but that\r\n\\rquote s okay, because application writers are free to use whatever naming system they need.\r\n\\par }\\pard \\ltrpar\\ql \\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22\\insrsid6441407 \r\n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\fs22\\insrsid6441407 \\hich\\af0\\dbch\\af0\\loch\\f0 -\\tab}}\\pard \\ltrpar\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls11\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\r\n\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22\\insrsid6441407 The only time a file transfer should fail is in situations where the application\\rquote s request can\\rquote \r\nt be met.  For example, if TWFF_JFIF is requested for a TWPT_BW TWCP_GROUP4 compressed image.\r\n\\par }\\pard\\plain \\ltrpar\\s199\\ql \\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \\af37\\afs22\\alang1025 \\ltrch\\fcs0 \\f37\\fs22\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \r\n\\v\\f31506\\insrsid6441407 \r\n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\fs22\\insrsid6441407 \\hich\\af0\\dbch\\af0\\loch\\f0 -\\tab}}\\pard\\plain \\ltrpar\r\n\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls11\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0\\afs22 \r\n\\ltrch\\fcs0 \\v\\f31506\\fs22\\insrsid6441407 Note that DAT_IMAGEFILEXFER is still considered optional, so few\r\n drivers support it.  It was designed as a low memory transfer option, since the driver is able to transfer the image directly to disk.  Most application choose to do this themselves, and using DAT_IMAGEMEMXFER can achieve results that require little memo\r\nry, though an extra step is often needed to create the finished file, since the metadata that describes the image isn\\rquote t available until state 7.\r\n\\par }\\pard\\plain \\ltrpar\\s199\\ql \\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \\af37\\afs22\\alang1025 \\ltrch\\fcs0 \\f37\\fs22\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \r\n\\v\\f31506\\insrsid6441407 \r\n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\fs22\\insrsid6441407 \\hich\\af0\\dbch\\af0\\loch\\f0 -\\tab}}\\pard\\plain \\ltrpar\r\n\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls11\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0\\afs22 \r\n\\ltrch\\fcs0 \\v\\f31506\\fs22\\insrsid6441407 I don\\rquote t know of any commonly used TWAIN applications that use DAT_IMAGEFILEXFER.\r\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22\\cf22\\insrsid6441407 \r\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506\\insrsid6441407 \\page \r\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506\\cf6\\insrsid6441407 [Note] \\endash  DONE\r\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22\\insrsid6441407 For capabil\r\nities (ch.10 pages), if MSG_GET supports both TW_ONEVALUE and TW_ENUMERATION; should MSG_SET support both as well? Nowhere does the spec include TW_ ENUMERATION as a valid set container, but I think this is allowed.\r\n\\par \r\n\\par Oh....ICAP_HALFTONETYPES is the only cap I found that lists TW_ENUMERATION as a SET Container type.\r\n\\par \r\n\\par Do I correctly understand that you could replace MSG_SET with MSG_SETCONSTRAINT, and never use MSG_SET anymore? Ie. If sending a TW_ONEVALUE or TW_ARRAY via the MSG_SETCONSTRAINT, this is equivalent to the MSG_SET functionality.\r\n\\par \r\n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\fs22\\insrsid6441407 \\hich\\af0\\dbch\\af0\\loch\\f0 -\\tab}}\\pard \\ltrpar\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls11\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\r\n\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22\\insrsid6441407 I can say with confidence that this part of the Spec hasn\\rquote \r\nt exactly turned out as planned.  The intention was to separate setting values from setting constraints.  However, I would always expect that one can call MSG_G\r\nET, MSG_GETCURRENT and take the result and pass it into MSG_SET.  The difference is that if both the application and the driver report themselves as 2.2 or higher the driver only takes the value from MSG_SET.\r\n\\par }\\pard \\ltrpar\\ql \\li360\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin360\\itap0 {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22\\insrsid6441407 \r\n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\fs22\\insrsid6441407 \\hich\\af0\\dbch\\af0\\loch\\f0 -\\tab}}\\pard \\ltrpar\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls11\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\r\n\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22\\insrsid6441407 The situation as described means that MSG_GE\r\nT cannot be used as the input to MSG_SET.  I think that results in too much work for applications and drivers, given the radical departure from previous behavior.\r\n\\par }\\pard\\plain \\ltrpar\\s199\\ql \\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \\af37\\afs22\\alang1025 \\ltrch\\fcs0 \\f37\\fs22\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \r\n\\v\\f31506\\insrsid6441407 \r\n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\fs22\\insrsid6441407 \\hich\\af0\\dbch\\af0\\loch\\f0 -\\tab}}\\pard\\plain \\ltrpar\r\n\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls11\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0\\afs22 \r\n\\ltrch\\fcs0 \\v\\f31506\\fs22\\insrsid6441407 Using TW_ONEVALUE with MSG_SETCONTRAINT should constrain the capability to that one value.  Also, the value is always set with MSG_SETCONTRAINT.\r\n\\par }\\pard \\ltrpar\\ql \\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22\\insrsid6441407 \r\n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\fs22\\insrsid6441407 \\hich\\af0\\dbch\\af0\\loch\\f0 -\\tab}}\\pard \\ltrpar\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls11\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\r\n\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22\\insrsid6441407 Therefore, we need to make sure that t\r\nhe Spec clearly explains the difference between MSG_SET and MSG_SETCONTRAINT, and then make sure that for all capabilities the allowed containers for both MSG_SET and MSG_SETCONSTRAINT are identical.\r\n\\par }\\pard\\plain \\ltrpar\\s199\\ql \\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \\af37\\afs22\\alang1025 \\ltrch\\fcs0 \\f37\\fs22\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \r\n\\v\\f31506\\insrsid6441407 \r\n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\fs22\\insrsid6441407 \\hich\\af0\\dbch\\af0\\loch\\f0 -\\tab}}\\pard\\plain \\ltrpar\r\n\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls11\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0\\afs22 \r\n\\ltrch\\fcs0 \\v\\f31506\\fs22\\insrsid6441407 I\\rquote m pretty sure that Self-Cert will support this change (meaning that it assumes that a MSG_GET can always be followed by a MSG_SET).  I\\rquote \r\nd be very surprised if anybody changed the behavior of MSG_SET without asking us what we\\rquote re thinking...\r\n\\par }\\pard\\plain \\ltrpar\\s199\\ql \\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \\af37\\afs22\\alang1025 \\ltrch\\fcs0 \\f37\\fs22\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \r\n\\v\\f31506\\insrsid6441407 \r\n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\fs22\\insrsid6441407 \\hich\\af0\\dbch\\af0\\loch\\f0 -\\tab}}\\pard\\plain \\ltrpar\r\n\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls11\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0\\afs22 \r\n\\ltrch\\fcs0 \\v\\f31506\\fs22\\insrsid6441407 MSG_SET will only impact the current value\\'85\r\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506\\insrsid6441407 \r\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506\\cf6\\insrsid6441407 \\page [Note] \\endash  DONE\r\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22\\insrsid6441407 ICAP_XFERMECH (ch. 10, pg. 10-197): under Application section it reads, \\'93\r\nThe current value of ICAP_XFERMECH must match the data argument type when starting the transfer using the triplet: DG_IMAGE / DAT_IMAGExxxxXFER / MSG_GET.\\'94 If it does not match, what should happen?\r\n\\par (NOTE: already discussed in the working group meeting on 17 July 2012)\r\n\\par \r\n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\fs22\\insrsid6441407 \\hich\\af0\\dbch\\af0\\loch\\f0 -\\tab}}\\pard \\ltrpar\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls11\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\r\n\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22\\insrsid6441407 My recollection from the meeting is as follows:\r\n\\par }\\pard \\ltrpar\\ql \\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin720\\itap0 {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22\\insrsid6441407 \r\n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\fs22\\insrsid6441407 \\hich\\af0\\dbch\\af0\\loch\\f0 -\\tab}}\\pard \\ltrpar\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls11\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 {\r\n\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22\\insrsid6441407 The TWAIN Spec says that apps need to set ICAP_XFERMECH in state 4 to the transfer mechanism that\\rquote ll be used in state 6 and 7.  However, some apps don\\rquote t bother to do this.\r\n\r\n\\par }\\pard\\plain \\ltrpar\\s199\\ql \\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \\af37\\afs22\\alang1025 \\ltrch\\fcs0 \\f37\\fs22\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \r\n\\v\\f31506\\insrsid6441407 \r\n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\fs22\\insrsid6441407 \\hich\\af0\\dbch\\af0\\loch\\f0 -\\tab}}\\pard\\plain \\ltrpar\r\n\\ql \\fi-360\\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\ls11\\adjustright\\rin0\\lin720\\itap0\\pararsid6555766 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af0\\afs22 \r\n\\ltrch\\fcs0 \\v\\f31506\\fs22\\insrsid6441407 The thought is to leave the requirement intact, but add a bit to the Legacy Issues section warning driver writers not to assume this will happen.\r\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506\\insrsid6441407 \r\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506\\cf6\\insrsid6441407 [Note] \\endash  DONE\r\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22\\insrsid6441407 (ch. 2, pg. 2-16) I think a couple of string types are missing. It says: \\'93There are }{\r\n\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22\\ul\\insrsid6441407 four}{\\rtlch\\fcs1 \\af0\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22\\insrsid6441407  types of TWAIN strings defined for developer use:\\'94\r\n, and then lists TW_STR32, TW_STR64, TW_STR128, and TW_STR256. But in twain.h, there are now TW_STR1024 and a TW_UNI512 types defined. Should these be added, for a total of 6?\r\n\\par {\\listtext\\pard\\plain\\ltrpar \\rtlch\\fcs1 \\af0\\afs20 \\ltrch\\fcs0 \\v\\fs20\\insrsid6441407 \\hich\\af0\\dbch\\af0\\loch\\f0 -\\tab}}\\pard \\ltrpar\\ql \\fi-360\\li720\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\ls11\\rin0\\lin720\\itap0\\pararsid6555766 {\\rtlch\\fcs1 \r\n\\af0 \\ltrch\\fcs0 \\v\\f31506\\insrsid6441407 TW_STR1024 and TW_UNI512 have been deprecated, so the number \\lquote four\\rquote  is right.}{\\rtlch\\fcs1 \\ab\\af0\\afs22 \\ltrch\\fcs0 \\b\\v\\f31506\\fs22\\insrsid6441407 \r\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506\\insrsid6441407 \r\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506\\cf6\\insrsid6441407 [Note] \\endash  DONE\r\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22\\insrsid6441407 Do I understand correctly that MSG_GETDEFAULT should return the Source\\rquote s *}{\r\n\\rtlch\\fcs1 \\ab\\af37\\afs22 \\ltrch\\fcs0 \\b\\v\\f31506\\fs22\\insrsid6441407 Preferred}{\\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22\\insrsid6441407 * default. But this may *}{\\rtlch\\fcs1 \\ab\\af37\\afs22 \\ltrch\\fcs0 \\b\\v\\f31506\\fs22\\insrsid6441407 not}{\r\n\\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22\\insrsid6441407 * be the value set when calling MSG_RESET, since MSG_RESET resets to the TWAIN default? If there is a Mandatory default, does MSG_GETDEFAULT need to return the mandatory default?\r\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\sb180\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506\\insrsid6441407 \r\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\nooverflow\\faroman\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\v\\f31506\\cf6\\insrsid6441407 [Note] \\endash  DONE\r\n\\par }\\pard \\ltrpar\\ql \\li0\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin0\\itap0 {\\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \\v\\f31506\\fs22\\insrsid6441407 So is MSG_RESET meant to reset to the value listed in Ch. 10 a\r\nlways? (whether or not this is a mandatory default) Only if Ch. 10 says \\'93no default\\'94 can the source reset it to a preferred or user value?\r\n\\par }\\pard\\plain \\ltrpar\\s199\\ql \\li360\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin360\\itap0 \\rtlch\\fcs1 \\af37\\afs22\\alang1025 \\ltrch\\fcs0 \\f37\\fs22\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af37 \\ltrch\\fcs0 \r\n\\i\\v\\f31506\\cf6\\insrsid6441407 \r\n\\par }\\pard\\plain \\ltrpar\\ql \\li720\\ri0\\widctlpar\\wrapdefault\\aspalpha\\aspnum\\faauto\\adjustright\\rin0\\lin720\\itap0 \\rtlch\\fcs1 \\af45\\afs20\\alang1025 \\ltrch\\fcs0 \\f45\\fs20\\lang1033\\langfe1033\\cgrid\\langnp1033\\langfenp1033 {\\rtlch\\fcs1 \\af37\\afs22 \\ltrch\\fcs0 \r\n\\v\\f31506\\fs22\\cf23\\insrsid6441407 \r\n\\par }{\\*\\themedata 504b030414000600080000002100e9de0fbfff0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb4ec3301045f748fc83e52d4a\r\n9cb2400825e982c78ec7a27cc0c8992416c9d8b2a755fbf74cd25442a820166c2cd933f79e3be372bd1f07b5c3989ca74aaff2422b24eb1b475da5df374fd9ad\r\n5689811a183c61a50f98f4babebc2837878049899a52a57be670674cb23d8e90721f90a4d2fa3802cb35762680fd800ecd7551dc18eb899138e3c943d7e503b6\r\nb01d583deee5f99824e290b4ba3f364eac4a430883b3c092d4eca8f946c916422ecab927f52ea42b89a1cd59c254f919b0e85e6535d135a8de20f20b8c12c3b0\r\n0c895fcf6720192de6bf3b9e89ecdbd6596cbcdd8eb28e7c365ecc4ec1ff1460f53fe813d3cc7f5b7f020000ffff0300504b030414000600080000002100a5d6\r\na7e7c0000000360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4f\r\nc7060abb0884a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b6309512\r\n0f88d94fbc52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462\r\na1a82fe353bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f746865\r\n6d652f7468656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b\r\n4b0d592c9c070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b\r\n4757e8d3f729e245eb2b260a0238fd010000ffff0300504b03041400060008000000210096b5ade296060000501b0000160000007468656d652f7468656d652f\r\n7468656d65312e786d6cec594f6fdb3614bf0fd87720746f6327761a07758ad8b19b2d4d1bc46e871e698996d850a240d2497d1bdae38001c3ba618715d86d87\r\n615b8116d8a5fb34d93a6c1dd0afb0475292c5585e9236d88aad3e2412f9e3fbff1e1fa9abd7eec70c1d1221294fda5efd72cd4324f1794093b0eddd1ef62fad\r\n79482a9c0498f184b4bd2991deb58df7dfbb8ad755446282607d22d771db8b944ad79796a40fc3585ee62949606ecc458c15bc8a702910f808e8c66c69b9565b\r\n5d8a314d3c94e018c8de1a8fa94fd05093f43672e23d06af89927ac06762a049136785c10607758d9053d965021d62d6f6804fc08f86e4bef210c352c144dbab\r\n999fb7b4717509af678b985ab0b6b4ae6f7ed9ba6c4170b06c788a705430adf71bad2b5b057d03606a1ed7ebf5babd7a41cf00b0ef83a6569632cd467faddec9\r\n699640f6719e76b7d6ac355c7c89feca9cccad4ea7d36c65b258a206641f1b73f8b5da6a6373d9c11b90c537e7f08dce66b7bbeae00dc8e257e7f0fd2badd586\r\n8b37a088d1e4600ead1ddaef67d40bc898b3ed4af81ac0d76a197c86826828a24bb318f3442d8ab518dfe3a20f000d6458d104a9694ac6d88728eee2782428d6\r\n0cf03ac1a5193be4cbb921cd0b495fd054b5bd0f530c1931a3f7eaf9f7af9e3f45c70f9e1d3ff8e9f8e1c3e3073f5a42ceaa6d9c84e5552fbffdeccfc71fa33f\r\n9e7ef3f2d117d57859c6fffac327bffcfc793510d26726ce8b2f9ffcf6ecc98baf3efdfdbb4715f04d814765f890c644a29be408edf3181433567125272371be\r\n15c308d3f28acd249438c19a4b05fd9e8a1cf4cd296699771c393ac4b5e01d01e5a30a787d72cf1178108989a2159c77a2d801ee72ce3a5c545a6147f32a9979\r\n3849c26ae66252c6ed637c58c5bb8b13c7bfbd490a75330f4b47f16e441c31f7184e140e494214d273fc80900aedee52ead87597fa824b3e56e82e451d4c2b4d\r\n32a423279a668bb6690c7e9956e90cfe766cb37b077538abd27a8b1cba48c80acc2a841f12e698f13a9e281c57911ce298950d7e03aba84ac8c154f8655c4f2a\r\nf074481847bd804859b5e696007d4b4edfc150b12addbecba6b18b148a1e54d1bc81392f23b7f84137c2715a851dd0242a633f900710a218ed715505dfe56e86\r\ne877f0034e16bafb0e258ebb4faf06b769e888340b103d3311da9750aa9d0a1cd3e4efca31a3508f6d0c5c5c398602f8e2ebc71591f5b616e24dd893aa3261fb\r\n44f95d843b5974bb5c04f4edafb95b7892ec1108f3f98de75dc97d5772bdff7cc95d94cf672db4b3da0a6557f70db629362d72bcb0431e53c6066acac80d699a\r\n6409fb44d08741bdce9c0e4971624a2378cceaba830b05366b90e0ea23aaa241845368b0eb9e2612ca8c742851ca251ceccc70256d8d87265dd96361531f186c\r\n3d9058edf2c00eafe8e1fc5c509031bb4d680e9f39a3154de0accc56ae644441edd76156d7429d995bdd88664a9dc3ad50197c38af1a0c16d684060441db0256\r\n5e85f3b9660d0713cc48a0ed6ef7dedc2dc60b17e92219e180643ed27acffba86e9c94c78ab90980d8a9f0913ee49d62b512b79626fb06dccee2a432bbc60276\r\nb9f7dec44b7904cfbca4f3f6443ab2a49c9c2c41476dafd55c6e7ac8c769db1bc399161ee314bc2e75cf8759081743be1236ec4f4d6693e5336fb672c5dc24a8\r\nc33585b5fb9cc24e1d4885545b58463634cc5416022cd19cacfccb4d30eb45296023fd35a458598360f8d7a4003bbaae25e331f155d9d9a5116d3bfb9a95523e\r\n51440ca2e0088dd844ec6370bf0e55d027a012ae264c45d02f708fa6ad6da6dce29c255df9f6cae0ec38666984b372ab5334cf640b37795cc860de4ae2816e95\r\nb21be5ceaf8a49f90b52a51cc6ff3355f47e0237052b81f6800fd7b802239daf6d8f0b1571a8426944fdbe80c6c1d40e8816b88b8569082ab84c36ff0539d4ff\r\n6dce591a26ade1c0a7f669880485fd484582903d284b26fa4e2156cff62e4b9265844c4495c495a9157b440e091bea1ab8aaf7760f4510eaa69a6465c0e04ec6\r\n9ffb9e65d028d44d4e39df9c1a52ecbd3607fee9cec7263328e5d661d3d0e4f62f44acd855ed7ab33cdf7bcb8ae889599bd5c8b3029895b6825696f6af29c239\r\nb75a5bb1e6345e6ee6c28117e73586c1a2214ae1be07e93fb0ff51e133fb65426fa843be0fb515c187064d0cc206a2fa926d3c902e907670048d931db4c1a449\r\n59d366ad93b65abe595f70a75bf03d616c2dd959fc7d4e6317cd99cbcec9c58b34766661c7d6766ca1a9c1b327531486c6f941c638c67cd22a7f75e2a37be0e8\r\n2db8df9f30254d30c1372581a1f51c983c80e4b71ccdd28dbf000000ffff0300504b0304140006000800000021000dd1909fb60000001b010000270000007468\r\n656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f78277086f6fd3ba109126dd88d0add40384e4\r\n350d363f2451eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89d93b64b060828e6f37ed1567914b284d2624\r\n52282e3198720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd5001996509affb3fd381a89672f1f165dfe5141\r\n73d9850528a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100e9de0fbfff0000001c020000130000000000000000\r\n0000000000000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6a7e7c0000000360100000b00000000000000\r\n000000000000300100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a0000001c0000000000000000000000000019\r\n0200007468656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d001400060008000000210096b5ade296060000501b00001600000000\r\n000000000000000000d60200007468656d652f7468656d652f7468656d65312e786d6c504b01022d00140006000800000021000dd1909fb60000001b01000027\r\n00000000000000000000000000a00900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d0100009b0a00000000}\r\n{\\*\\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d\r\n617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169\r\n6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363\r\n656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e}\r\n{\\*\\latentstyles\\lsdstimax376\\lsdlockeddef0\\lsdsemihiddendef0\\lsdunhideuseddef0\\lsdqformatdef0\\lsdprioritydef99{\\lsdlockedexcept \\lsdqformat1 \\lsdpriority0 \\lsdlocked0 Normal;\\lsdqformat1 \\lsdpriority0 \\lsdlocked0 heading 1;\r\n\\lsdqformat1 \\lsdpriority0 \\lsdlocked0 heading 2;\\lsdqformat1 \\lsdpriority0 \\lsdlocked0 heading 3;\\lsdqformat1 \\lsdpriority0 \\lsdlocked0 heading 4;\\lsdqformat1 \\lsdpriority0 \\lsdlocked0 heading 5;\\lsdqformat1 \\lsdpriority0 \\lsdlocked0 heading 6;\r\n\\lsdqformat1 \\lsdpriority0 \\lsdlocked0 heading 7;\\lsdqformat1 \\lsdpriority0 \\lsdlocked0 heading 8;\\lsdqformat1 \\lsdpriority0 \\lsdlocked0 heading 9;\\lsdsemihidden1 \\lsdunhideused1 index 1;\\lsdsemihidden1 \\lsdunhideused1 index 2;\r\n\\lsdsemihidden1 \\lsdunhideused1 index 3;\\lsdsemihidden1 \\lsdunhideused1 index 4;\\lsdsemihidden1 \\lsdunhideused1 index 5;\\lsdsemihidden1 \\lsdunhideused1 index 6;\\lsdsemihidden1 \\lsdunhideused1 index 7;\\lsdsemihidden1 \\lsdunhideused1 index 8;\r\n\\lsdsemihidden1 \\lsdunhideused1 index 9;\\lsdpriority39 \\lsdlocked0 toc 1;\\lsdpriority39 \\lsdlocked0 toc 2;\\lsdpriority0 \\lsdlocked0 toc 3;\\lsdpriority0 \\lsdlocked0 toc 4;\\lsdpriority0 \\lsdlocked0 toc 5;\\lsdpriority0 \\lsdlocked0 toc 6;\r\n\\lsdpriority0 \\lsdlocked0 toc 7;\\lsdpriority0 \\lsdlocked0 toc 8;\\lsdpriority0 \\lsdlocked0 toc 9;\\lsdsemihidden1 \\lsdunhideused1 Normal Indent;\\lsdsemihidden1 \\lsdunhideused1 footnote text;\\lsdsemihidden1 \\lsdunhideused1 annotation text;\r\n\\lsdsemihidden1 \\lsdunhideused1 header;\\lsdsemihidden1 \\lsdunhideused1 footer;\\lsdsemihidden1 \\lsdunhideused1 index heading;\\lsdqformat1 \\lsdpriority0 \\lsdlocked0 caption;\\lsdsemihidden1 \\lsdunhideused1 table of figures;\r\n\\lsdsemihidden1 \\lsdunhideused1 envelope address;\\lsdsemihidden1 \\lsdunhideused1 envelope return;\\lsdsemihidden1 \\lsdunhideused1 footnote reference;\\lsdsemihidden1 \\lsdunhideused1 annotation reference;\\lsdsemihidden1 \\lsdunhideused1 line number;\r\n\\lsdsemihidden1 \\lsdunhideused1 page number;\\lsdsemihidden1 \\lsdunhideused1 endnote reference;\\lsdsemihidden1 \\lsdunhideused1 endnote text;\\lsdsemihidden1 \\lsdunhideused1 table of authorities;\\lsdsemihidden1 \\lsdunhideused1 macro;\r\n\\lsdsemihidden1 \\lsdunhideused1 toa heading;\\lsdsemihidden1 \\lsdunhideused1 List;\\lsdsemihidden1 \\lsdunhideused1 List Bullet;\\lsdsemihidden1 \\lsdunhideused1 List Number;\\lsdsemihidden1 \\lsdunhideused1 List 2;\\lsdsemihidden1 \\lsdunhideused1 List 3;\r\n\\lsdsemihidden1 \\lsdunhideused1 List 4;\\lsdsemihidden1 \\lsdunhideused1 List 5;\\lsdsemihidden1 \\lsdunhideused1 List Bullet 2;\\lsdsemihidden1 \\lsdunhideused1 List Bullet 3;\\lsdsemihidden1 \\lsdunhideused1 List Bullet 4;\r\n\\lsdsemihidden1 \\lsdunhideused1 List Bullet 5;\\lsdsemihidden1 \\lsdunhideused1 List Number 2;\\lsdsemihidden1 \\lsdunhideused1 List Number 3;\\lsdsemihidden1 \\lsdunhideused1 List Number 4;\\lsdsemihidden1 \\lsdunhideused1 List Number 5;\r\n\\lsdqformat1 \\lsdpriority0 \\lsdlocked0 Title;\\lsdsemihidden1 \\lsdunhideused1 Closing;\\lsdsemihidden1 \\lsdunhideused1 Signature;\\lsdpriority0 \\lsdlocked0 Default Paragraph Font;\\lsdsemihidden1 \\lsdunhideused1 Body Text;\r\n\\lsdsemihidden1 \\lsdunhideused1 Body Text Indent;\\lsdsemihidden1 \\lsdunhideused1 List Continue;\\lsdsemihidden1 \\lsdunhideused1 List Continue 2;\\lsdsemihidden1 \\lsdunhideused1 List Continue 3;\\lsdsemihidden1 \\lsdunhideused1 List Continue 4;\r\n\\lsdsemihidden1 \\lsdunhideused1 List Continue 5;\\lsdsemihidden1 \\lsdunhideused1 Message Header;\\lsdqformat1 \\lsdpriority0 \\lsdlocked0 Subtitle;\\lsdsemihidden1 \\lsdunhideused1 Salutation;\\lsdsemihidden1 \\lsdunhideused1 Date;\r\n\\lsdsemihidden1 \\lsdunhideused1 Body Text First Indent;\\lsdsemihidden1 \\lsdunhideused1 Body Text First Indent 2;\\lsdsemihidden1 \\lsdunhideused1 Note Heading;\\lsdsemihidden1 \\lsdunhideused1 Body Text 2;\\lsdsemihidden1 \\lsdunhideused1 Body Text 3;\r\n\\lsdsemihidden1 \\lsdunhideused1 Body Text Indent 2;\\lsdsemihidden1 \\lsdunhideused1 Body Text Indent 3;\\lsdsemihidden1 \\lsdunhideused1 Block Text;\\lsdsemihidden1 \\lsdunhideused1 Hyperlink;\\lsdsemihidden1 \\lsdunhideused1 FollowedHyperlink;\r\n\\lsdqformat1 \\lsdpriority0 \\lsdlocked0 Strong;\\lsdqformat1 \\lsdpriority0 \\lsdlocked0 Emphasis;\\lsdsemihidden1 \\lsdunhideused1 Document Map;\\lsdsemihidden1 \\lsdunhideused1 Plain Text;\\lsdsemihidden1 \\lsdunhideused1 E-mail Signature;\r\n\\lsdsemihidden1 \\lsdunhideused1 HTML Top of Form;\\lsdsemihidden1 \\lsdunhideused1 HTML Bottom of Form;\\lsdsemihidden1 \\lsdunhideused1 Normal (Web);\\lsdsemihidden1 \\lsdunhideused1 HTML Acronym;\\lsdsemihidden1 \\lsdunhideused1 HTML Address;\r\n\\lsdsemihidden1 \\lsdunhideused1 HTML Cite;\\lsdsemihidden1 \\lsdunhideused1 HTML Code;\\lsdsemihidden1 \\lsdunhideused1 HTML Definition;\\lsdsemihidden1 \\lsdunhideused1 HTML Keyboard;\\lsdsemihidden1 \\lsdunhideused1 HTML Preformatted;\r\n\\lsdsemihidden1 \\lsdunhideused1 HTML Sample;\\lsdsemihidden1 \\lsdunhideused1 HTML Typewriter;\\lsdsemihidden1 \\lsdunhideused1 HTML Variable;Normal Table;\\lsdsemihidden1 \\lsdunhideused1 annotation subject;\\lsdsemihidden1 \\lsdunhideused1 No List;\r\n\\lsdsemihidden1 \\lsdunhideused1 Outline List 1;\\lsdsemihidden1 \\lsdunhideused1 Outline List 2;\\lsdsemihidden1 \\lsdunhideused1 Outline List 3;Table Simple 1;Table Simple 2;Table Simple 3;Table Classic 1;Table Classic 2;Table Classic 3;Table Classic 4;\r\nTable Colorful 1;Table Colorful 2;Table Colorful 3;Table Columns 1;Table Columns 2;Table Columns 3;Table Columns 4;Table Columns 5;Table Grid 1;Table Grid 2;Table Grid 3;Table Grid 4;Table Grid 5;Table Grid 6;Table Grid 7;Table Grid 8;Table List 1;\r\nTable List 2;Table List 3;Table List 4;Table List 5;Table List 6;Table List 7;Table List 8;Table 3D effects 1;Table 3D effects 2;Table 3D effects 3;Table Contemporary;Table Elegant;Table Professional;Table Subtle 1;Table Subtle 2;Table Web 1;Table Web 2;\r\nTable Web 3;\\lsdsemihidden1 \\lsdunhideused1 Balloon Text;\\lsdpriority0 \\lsdlocked0 Table Grid;Table Theme;\\lsdsemihidden1 \\lsdlocked0 Placeholder Text;\\lsdqformat1 \\lsdpriority1 \\lsdlocked0 No Spacing;\\lsdpriority60 \\lsdlocked0 Light Shading;\r\n\\lsdpriority61 \\lsdlocked0 Light List;\\lsdpriority62 \\lsdlocked0 Light Grid;\\lsdpriority63 \\lsdlocked0 Medium Shading 1;\\lsdpriority64 \\lsdlocked0 Medium Shading 2;\\lsdpriority65 \\lsdlocked0 Medium List 1;\\lsdpriority66 \\lsdlocked0 Medium List 2;\r\n\\lsdpriority67 \\lsdlocked0 Medium Grid 1;\\lsdpriority68 \\lsdlocked0 Medium Grid 2;\\lsdpriority69 \\lsdlocked0 Medium Grid 3;\\lsdpriority70 \\lsdlocked0 Dark List;\\lsdpriority71 \\lsdlocked0 Colorful Shading;\\lsdpriority72 \\lsdlocked0 Colorful List;\r\n\\lsdpriority73 \\lsdlocked0 Colorful Grid;\\lsdpriority60 \\lsdlocked0 Light Shading Accent 1;\\lsdpriority61 \\lsdlocked0 Light List Accent 1;\\lsdpriority62 \\lsdlocked0 Light Grid Accent 1;\\lsdpriority63 \\lsdlocked0 Medium Shading 1 Accent 1;\r\n\\lsdpriority64 \\lsdlocked0 Medium Shading 2 Accent 1;\\lsdpriority65 \\lsdlocked0 Medium List 1 Accent 1;\\lsdqformat1 \\lsdpriority34 \\lsdlocked0 List Paragraph;\\lsdqformat1 \\lsdpriority29 \\lsdlocked0 Quote;\r\n\\lsdqformat1 \\lsdpriority30 \\lsdlocked0 Intense Quote;\\lsdpriority66 \\lsdlocked0 Medium List 2 Accent 1;\\lsdpriority67 \\lsdlocked0 Medium Grid 1 Accent 1;\\lsdpriority68 \\lsdlocked0 Medium Grid 2 Accent 1;\\lsdpriority69 \\lsdlocked0 Medium Grid 3 Accent 1;\r\n\\lsdpriority70 \\lsdlocked0 Dark List Accent 1;\\lsdpriority71 \\lsdlocked0 Colorful Shading Accent 1;\\lsdpriority72 \\lsdlocked0 Colorful List Accent 1;\\lsdpriority73 \\lsdlocked0 Colorful Grid Accent 1;\\lsdpriority60 \\lsdlocked0 Light Shading Accent 2;\r\n\\lsdpriority61 \\lsdlocked0 Light List Accent 2;\\lsdpriority62 \\lsdlocked0 Light Grid Accent 2;\\lsdpriority63 \\lsdlocked0 Medium Shading 1 Accent 2;\\lsdpriority64 \\lsdlocked0 Medium Shading 2 Accent 2;\\lsdpriority65 \\lsdlocked0 Medium List 1 Accent 2;\r\n\\lsdpriority66 \\lsdlocked0 Medium List 2 Accent 2;\\lsdpriority67 \\lsdlocked0 Medium Grid 1 Accent 2;\\lsdpriority68 \\lsdlocked0 Medium Grid 2 Accent 2;\\lsdpriority69 \\lsdlocked0 Medium Grid 3 Accent 2;\\lsdpriority70 \\lsdlocked0 Dark List Accent 2;\r\n\\lsdpriority71 \\lsdlocked0 Colorful Shading Accent 2;\\lsdpriority72 \\lsdlocked0 Colorful List Accent 2;\\lsdpriority73 \\lsdlocked0 Colorful Grid Accent 2;\\lsdpriority60 \\lsdlocked0 Light Shading Accent 3;\\lsdpriority61 \\lsdlocked0 Light List Accent 3;\r\n\\lsdpriority62 \\lsdlocked0 Light Grid Accent 3;\\lsdpriority63 \\lsdlocked0 Medium Shading 1 Accent 3;\\lsdpriority64 \\lsdlocked0 Medium Shading 2 Accent 3;\\lsdpriority65 \\lsdlocked0 Medium List 1 Accent 3;\\lsdpriority66 \\lsdlocked0 Medium List 2 Accent 3;\r\n\\lsdpriority67 \\lsdlocked0 Medium Grid 1 Accent 3;\\lsdpriority68 \\lsdlocked0 Medium Grid 2 Accent 3;\\lsdpriority69 \\lsdlocked0 Medium Grid 3 Accent 3;\\lsdpriority70 \\lsdlocked0 Dark List Accent 3;\\lsdpriority71 \\lsdlocked0 Colorful Shading Accent 3;\r\n\\lsdpriority72 \\lsdlocked0 Colorful List Accent 3;\\lsdpriority73 \\lsdlocked0 Colorful Grid Accent 3;\\lsdpriority60 \\lsdlocked0 Light Shading Accent 4;\\lsdpriority61 \\lsdlocked0 Light List Accent 4;\\lsdpriority62 \\lsdlocked0 Light Grid Accent 4;\r\n\\lsdpriority63 \\lsdlocked0 Medium Shading 1 Accent 4;\\lsdpriority64 \\lsdlocked0 Medium Shading 2 Accent 4;\\lsdpriority65 \\lsdlocked0 Medium List 1 Accent 4;\\lsdpriority66 \\lsdlocked0 Medium List 2 Accent 4;\r\n\\lsdpriority67 \\lsdlocked0 Medium Grid 1 Accent 4;\\lsdpriority68 \\lsdlocked0 Medium Grid 2 Accent 4;\\lsdpriority69 \\lsdlocked0 Medium Grid 3 Accent 4;\\lsdpriority70 \\lsdlocked0 Dark List Accent 4;\\lsdpriority71 \\lsdlocked0 Colorful Shading Accent 4;\r\n\\lsdpriority72 \\lsdlocked0 Colorful List Accent 4;\\lsdpriority73 \\lsdlocked0 Colorful Grid Accent 4;\\lsdpriority60 \\lsdlocked0 Light Shading Accent 5;\\lsdpriority61 \\lsdlocked0 Light List Accent 5;\\lsdpriority62 \\lsdlocked0 Light Grid Accent 5;\r\n\\lsdpriority63 \\lsdlocked0 Medium Shading 1 Accent 5;\\lsdpriority64 \\lsdlocked0 Medium Shading 2 Accent 5;\\lsdpriority65 \\lsdlocked0 Medium List 1 Accent 5;\\lsdpriority66 \\lsdlocked0 Medium List 2 Accent 5;\r\n\\lsdpriority67 \\lsdlocked0 Medium Grid 1 Accent 5;\\lsdpriority68 \\lsdlocked0 Medium Grid 2 Accent 5;\\lsdpriority69 \\lsdlocked0 Medium Grid 3 Accent 5;\\lsdpriority70 \\lsdlocked0 Dark List Accent 5;\\lsdpriority71 \\lsdlocked0 Colorful Shading Accent 5;\r\n\\lsdpriority72 \\lsdlocked0 Colorful List Accent 5;\\lsdpriority73 \\lsdlocked0 Colorful Grid Accent 5;\\lsdpriority60 \\lsdlocked0 Light Shading Accent 6;\\lsdpriority61 \\lsdlocked0 Light List Accent 6;\\lsdpriority62 \\lsdlocked0 Light Grid Accent 6;\r\n\\lsdpriority63 \\lsdlocked0 Medium Shading 1 Accent 6;\\lsdpriority64 \\lsdlocked0 Medium Shading 2 Accent 6;\\lsdpriority65 \\lsdlocked0 Medium List 1 Accent 6;\\lsdpriority66 \\lsdlocked0 Medium List 2 Accent 6;\r\n\\lsdpriority67 \\lsdlocked0 Medium Grid 1 Accent 6;\\lsdpriority68 \\lsdlocked0 Medium Grid 2 Accent 6;\\lsdpriority69 \\lsdlocked0 Medium Grid 3 Accent 6;\\lsdpriority70 \\lsdlocked0 Dark List Accent 6;\\lsdpriority71 \\lsdlocked0 Colorful Shading Accent 6;\r\n\\lsdpriority72 \\lsdlocked0 Colorful List Accent 6;\\lsdpriority73 \\lsdlocked0 Colorful Grid Accent 6;\\lsdqformat1 \\lsdpriority19 \\lsdlocked0 Subtle Emphasis;\\lsdqformat1 \\lsdpriority21 \\lsdlocked0 Intense Emphasis;\r\n\\lsdqformat1 \\lsdpriority31 \\lsdlocked0 Subtle Reference;\\lsdqformat1 \\lsdpriority32 \\lsdlocked0 Intense Reference;\\lsdqformat1 \\lsdpriority33 \\lsdlocked0 Book Title;\\lsdsemihidden1 \\lsdunhideused1 \\lsdpriority37 \\lsdlocked0 Bibliography;\r\n\\lsdsemihidden1 \\lsdunhideused1 \\lsdqformat1 \\lsdpriority39 \\lsdlocked0 TOC Heading;\\lsdpriority41 \\lsdlocked0 Plain Table 1;\\lsdpriority42 \\lsdlocked0 Plain Table 2;\\lsdpriority43 \\lsdlocked0 Plain Table 3;\\lsdpriority44 \\lsdlocked0 Plain Table 4;\r\n\\lsdpriority45 \\lsdlocked0 Plain Table 5;\\lsdpriority40 \\lsdlocked0 Grid Table Light;\\lsdpriority46 \\lsdlocked0 Grid Table 1 Light;\\lsdpriority47 \\lsdlocked0 Grid Table 2;\\lsdpriority48 \\lsdlocked0 Grid Table 3;\\lsdpriority49 \\lsdlocked0 Grid Table 4;\r\n\\lsdpriority50 \\lsdlocked0 Grid Table 5 Dark;\\lsdpriority51 \\lsdlocked0 Grid Table 6 Colorful;\\lsdpriority52 \\lsdlocked0 Grid Table 7 Colorful;\\lsdpriority46 \\lsdlocked0 Grid Table 1 Light Accent 1;\\lsdpriority47 \\lsdlocked0 Grid Table 2 Accent 1;\r\n\\lsdpriority48 \\lsdlocked0 Grid Table 3 Accent 1;\\lsdpriority49 \\lsdlocked0 Grid Table 4 Accent 1;\\lsdpriority50 \\lsdlocked0 Grid Table 5 Dark Accent 1;\\lsdpriority51 \\lsdlocked0 Grid Table 6 Colorful Accent 1;\r\n\\lsdpriority52 \\lsdlocked0 Grid Table 7 Colorful Accent 1;\\lsdpriority46 \\lsdlocked0 Grid Table 1 Light Accent 2;\\lsdpriority47 \\lsdlocked0 Grid Table 2 Accent 2;\\lsdpriority48 \\lsdlocked0 Grid Table 3 Accent 2;\r\n\\lsdpriority49 \\lsdlocked0 Grid Table 4 Accent 2;\\lsdpriority50 \\lsdlocked0 Grid Table 5 Dark Accent 2;\\lsdpriority51 \\lsdlocked0 Grid Table 6 Colorful Accent 2;\\lsdpriority52 \\lsdlocked0 Grid Table 7 Colorful Accent 2;\r\n\\lsdpriority46 \\lsdlocked0 Grid Table 1 Light Accent 3;\\lsdpriority47 \\lsdlocked0 Grid Table 2 Accent 3;\\lsdpriority48 \\lsdlocked0 Grid Table 3 Accent 3;\\lsdpriority49 \\lsdlocked0 Grid Table 4 Accent 3;\r\n\\lsdpriority50 \\lsdlocked0 Grid Table 5 Dark Accent 3;\\lsdpriority51 \\lsdlocked0 Grid Table 6 Colorful Accent 3;\\lsdpriority52 \\lsdlocked0 Grid Table 7 Colorful Accent 3;\\lsdpriority46 \\lsdlocked0 Grid Table 1 Light Accent 4;\r\n\\lsdpriority47 \\lsdlocked0 Grid Table 2 Accent 4;\\lsdpriority48 \\lsdlocked0 Grid Table 3 Accent 4;\\lsdpriority49 \\lsdlocked0 Grid Table 4 Accent 4;\\lsdpriority50 \\lsdlocked0 Grid Table 5 Dark Accent 4;\r\n\\lsdpriority51 \\lsdlocked0 Grid Table 6 Colorful Accent 4;\\lsdpriority52 \\lsdlocked0 Grid Table 7 Colorful Accent 4;\\lsdpriority46 \\lsdlocked0 Grid Table 1 Light Accent 5;\\lsdpriority47 \\lsdlocked0 Grid Table 2 Accent 5;\r\n\\lsdpriority48 \\lsdlocked0 Grid Table 3 Accent 5;\\lsdpriority49 \\lsdlocked0 Grid Table 4 Accent 5;\\lsdpriority50 \\lsdlocked0 Grid Table 5 Dark Accent 5;\\lsdpriority51 \\lsdlocked0 Grid Table 6 Colorful Accent 5;\r\n\\lsdpriority52 \\lsdlocked0 Grid Table 7 Colorful Accent 5;\\lsdpriority46 \\lsdlocked0 Grid Table 1 Light Accent 6;\\lsdpriority47 \\lsdlocked0 Grid Table 2 Accent 6;\\lsdpriority48 \\lsdlocked0 Grid Table 3 Accent 6;\r\n\\lsdpriority49 \\lsdlocked0 Grid Table 4 Accent 6;\\lsdpriority50 \\lsdlocked0 Grid Table 5 Dark Accent 6;\\lsdpriority51 \\lsdlocked0 Grid Table 6 Colorful Accent 6;\\lsdpriority52 \\lsdlocked0 Grid Table 7 Colorful Accent 6;\r\n\\lsdpriority46 \\lsdlocked0 List Table 1 Light;\\lsdpriority47 \\lsdlocked0 List Table 2;\\lsdpriority48 \\lsdlocked0 List Table 3;\\lsdpriority49 \\lsdlocked0 List Table 4;\\lsdpriority50 \\lsdlocked0 List Table 5 Dark;\r\n\\lsdpriority51 \\lsdlocked0 List Table 6 Colorful;\\lsdpriority52 \\lsdlocked0 List Table 7 Colorful;\\lsdpriority46 \\lsdlocked0 List Table 1 Light Accent 1;\\lsdpriority47 \\lsdlocked0 List Table 2 Accent 1;\\lsdpriority48 \\lsdlocked0 List Table 3 Accent 1;\r\n\\lsdpriority49 \\lsdlocked0 List Table 4 Accent 1;\\lsdpriority50 \\lsdlocked0 List Table 5 Dark Accent 1;\\lsdpriority51 \\lsdlocked0 List Table 6 Colorful Accent 1;\\lsdpriority52 \\lsdlocked0 List Table 7 Colorful Accent 1;\r\n\\lsdpriority46 \\lsdlocked0 List Table 1 Light Accent 2;\\lsdpriority47 \\lsdlocked0 List Table 2 Accent 2;\\lsdpriority48 \\lsdlocked0 List Table 3 Accent 2;\\lsdpriority49 \\lsdlocked0 List Table 4 Accent 2;\r\n\\lsdpriority50 \\lsdlocked0 List Table 5 Dark Accent 2;\\lsdpriority51 \\lsdlocked0 List Table 6 Colorful Accent 2;\\lsdpriority52 \\lsdlocked0 List Table 7 Colorful Accent 2;\\lsdpriority46 \\lsdlocked0 List Table 1 Light Accent 3;\r\n\\lsdpriority47 \\lsdlocked0 List Table 2 Accent 3;\\lsdpriority48 \\lsdlocked0 List Table 3 Accent 3;\\lsdpriority49 \\lsdlocked0 List Table 4 Accent 3;\\lsdpriority50 \\lsdlocked0 List Table 5 Dark Accent 3;\r\n\\lsdpriority51 \\lsdlocked0 List Table 6 Colorful Accent 3;\\lsdpriority52 \\lsdlocked0 List Table 7 Colorful Accent 3;\\lsdpriority46 \\lsdlocked0 List Table 1 Light Accent 4;\\lsdpriority47 \\lsdlocked0 List Table 2 Accent 4;\r\n\\lsdpriority48 \\lsdlocked0 List Table 3 Accent 4;\\lsdpriority49 \\lsdlocked0 List Table 4 Accent 4;\\lsdpriority50 \\lsdlocked0 List Table 5 Dark Accent 4;\\lsdpriority51 \\lsdlocked0 List Table 6 Colorful Accent 4;\r\n\\lsdpriority52 \\lsdlocked0 List Table 7 Colorful Accent 4;\\lsdpriority46 \\lsdlocked0 List Table 1 Light Accent 5;\\lsdpriority47 \\lsdlocked0 List Table 2 Accent 5;\\lsdpriority48 \\lsdlocked0 List Table 3 Accent 5;\r\n\\lsdpriority49 \\lsdlocked0 List Table 4 Accent 5;\\lsdpriority50 \\lsdlocked0 List Table 5 Dark Accent 5;\\lsdpriority51 \\lsdlocked0 List Table 6 Colorful Accent 5;\\lsdpriority52 \\lsdlocked0 List Table 7 Colorful Accent 5;\r\n\\lsdpriority46 \\lsdlocked0 List Table 1 Light Accent 6;\\lsdpriority47 \\lsdlocked0 List Table 2 Accent 6;\\lsdpriority48 \\lsdlocked0 List Table 3 Accent 6;\\lsdpriority49 \\lsdlocked0 List Table 4 Accent 6;\r\n\\lsdpriority50 \\lsdlocked0 List Table 5 Dark Accent 6;\\lsdpriority51 \\lsdlocked0 List Table 6 Colorful Accent 6;\\lsdpriority52 \\lsdlocked0 List Table 7 Colorful Accent 6;\\lsdsemihidden1 \\lsdunhideused1 \\lsdlocked0 Mention;\r\n\\lsdsemihidden1 \\lsdunhideused1 \\lsdlocked0 Smart Hyperlink;\\lsdsemihidden1 \\lsdunhideused1 \\lsdlocked0 Hashtag;\\lsdsemihidden1 \\lsdunhideused1 \\lsdlocked0 Unresolved Mention;\\lsdsemihidden1 \\lsdunhideused1 \\lsdlocked0 Smart Link;}}{\\*\\datastore 01050000\r\n02000000180000004d73786d6c322e534158584d4c5265616465722e362e30000000000000000000000e0000\r\nd0cf11e0a1b11ae1000000000000000000000000000000003e000300feff0900060000000000000000000000010000000100000000000000001000000200000001000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\r\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\r\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\r\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\r\nfffffffffffffffffdffffff04000000feffffff05000000fefffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\r\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\r\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\r\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\r\nffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffff010000000c6ad98892f1d411a65f0040963251e500000000000000000000000010b7\r\n95c29bd4d70103000000c0020000000000004d0073006f004400610074006100530074006f0072006500000000000000000000000000000000000000000000000000000000000000000000000000000000001a000101ffffffffffffffff02000000000000000000000000000000000000000000000010b795c29bd4d701\r\n10b795c29bd4d70100000000000000000000000056003500d00049004400d00043003000ce00c400da0045004f004b0057004c004f0051004400d7003300c0003d003d000000000000000000000000000000000032000101ffffffffffffffff03000000000000000000000000000000000000000000000010b795c29bd4\r\nd70110b795c29bd4d7010000000000000000000000004900740065006d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000201ffffffff04000000ffffffff000000000000000000000000000000000000000000000000\r\n000000000000000000000000000000000e0100000000000001000000020000000300000004000000feffffff060000000700000008000000090000000a000000feffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\r\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\r\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\r\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\r\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d226e6f223f3e3c623a536f75726365732053656c65637465645374796c653d225c4150412e58534c22205374796c\r\n654e616d653d224150412220786d6c6e733a623d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f6269626c696f6772617068792220786d6c6e733d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e\r\n6f72672f6f6666696365446f63756d656e742f323030362f6269626c696f677261706879223e3c2f623a536f75726365733e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003c3f786d6c2076657273696f6e3d22312e302220656e636f6469\r\n6e673d225554462d3822207374616e64616c6f6e653d226e6f223f3e0d0a3c64733a6461746173746f72654974656d2064733a6974656d49443d227b30463038464335352d394130302d344542412d383433382d4135384233393030463737367d2220786d6c6e733a64733d22687474703a2f2f736368656d61732e6f70\r\n656e786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f637573500072006f007000650072007400690065007300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000200ffffffffffffffffffffffff000000000000\r\n0000000000000000000000000000000000000000000000000000000000000500000055010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000\r\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000\r\n000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff\r\n000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000746f6d586d6c223e3c64733a736368656d61526566733e3c64733a736368656d615265662064733a7572693d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f7267\r\n2f6f6666696365446f63756d656e742f323030362f6269626c696f677261706879222f3e3c2f64733a736368656d61526566733e3c2f64733a6461746173746f72654974656d3e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\r\n000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\r\n000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\r\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000105000000000000}}"
  },
  {
    "path": "twaincs/source/TWAIN.cs",
    "content": "﻿///////////////////////////////////////////////////////////////////////////////////////\r\n//\r\n//  TwainWorkingGroup.TWAIN\r\n//\r\n//  This is a wrapper class for basic TWAIN functionality.  It establishes\r\n//  behavior that every application should adhere to.  It also hides OS\r\n//  specific details, so that toolkits or applications can use one unified\r\n//  interface to TWAIN.\r\n//\r\n///////////////////////////////////////////////////////////////////////////////////////\r\n//  Author          Date            TWAIN       Comment\r\n//  M.McLaughlin    17-May-2021     2.5.0.0     Updated to latest spec\r\n//  M.McLaughlin    13-Mar-2019     2.4.0.3     Add language code page support for strings\r\n//  M.McLaughlin    13-Nov-2015     2.4.0.0     Updated to latest spec\r\n//  M.McLaughlin    13-Sep-2015     2.3.1.2     DsmMem bug fixes\r\n//  M.McLaughlin    26-Aug-2015     2.3.1.1     Log fix and sync with TWAIN Direct\r\n//  M.McLaughlin    13-Mar-2015     2.3.1.0     Numerous fixes\r\n//  M.McLaughlin    13-Oct-2014     2.3.0.4     Added logging\r\n//  M.McLaughlin    24-Jun-2014     2.3.0.3     Stability fixes\r\n//  M.McLaughlin    21-May-2014     2.3.0.2     64-Bit Linux\r\n//  M.McLaughlin    27-Feb-2014     2.3.0.1     AnyCPU support\r\n//  M.McLaughlin    21-Oct-2013     2.3.0.0     Initial Release\r\n///////////////////////////////////////////////////////////////////////////////////////\r\n//  Copyright (C) 2013-2021 Kodak Alaris Inc.\r\n//\r\n//  Permission is hereby granted, free of charge, to any person obtaining a\r\n//  copy of this software and associated documentation files (the \"Software\"),\r\n//  to deal in the Software without restriction, including without limitation\r\n//  the rights to use, copy, modify, merge, publish, distribute, sublicense,\r\n//  and/or sell copies of the Software, and to permit persons to whom the\r\n//  Software is furnished to do so, subject to the following conditions:\r\n//\r\n//  The above copyright notice and this permission notice shall be included in\r\n//  all copies or substantial portions of the Software.\r\n//\r\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\r\n//  THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\r\n//  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\r\n//  DEALINGS IN THE SOFTWARE.\r\n///////////////////////////////////////////////////////////////////////////////////////\r\n\r\nusing System;\r\nusing System.Diagnostics;\r\nusing System.Diagnostics.CodeAnalysis;\r\nusing System.Drawing;\r\nusing System.Globalization;\r\nusing System.IO;\r\nusing System.Runtime.InteropServices;\r\nusing System.Security.Permissions;\r\nusing System.Threading;\r\n\r\nnamespace TWAINWorkingGroup\r\n{\r\n    /// <summary>\r\n    /// This is the base TWAIN class.  It's versioned so that developers can\r\n    /// safely make a reference to it, if they don't want to actually include\r\n    /// the TWAIN modules in their project.\r\n    /// \r\n    /// Here are the goals of this class:\r\n    ///\r\n    /// - Make the interface better than raw TWAIN (like with C/C++), but don't\r\n    ///   go as far as making a toolkit.  Expose as much of TWAIN as possible.\r\n    ///   Part of this involves making a CSV interface to abstract away some of\r\n    ///   the pain of the C/C++ structures, especially TW_CAPABILITY.\r\n    ///   \r\n    /// - Use type checking wherever possible.  This is why the TWAIN contants\r\n    ///   tend to be enumerations and why there are multiple entry points into\r\n    ///   the DSM_Entry function.\r\n    ///   \r\n    /// - Avoid unsafe code.  We use marshalling, and we're forced to use some\r\n    ///   unmanaged memory, but that's it.\r\n    ///   \r\n    /// - Run thread safe.  Force as many TWAIN calls into a single thread as\r\n    ///   possible.  The main exceptions are MSG_PROCESSEVENT and any of the\r\n    ///   calls that unwind the state machine (ex: MSG_DISABLEDS).  Otherwise\r\n    ///   all of the calls are serialized through a single thread.\r\n    ///   \r\n    /// - Avoid use of System.Windows content, so that the TWAIN assembly can be\r\n    ///   used as broadly as possible (specifically with Mono).\r\n    ///   \r\n    /// - Support all platforms.  The code currently works on 32-bit and 64-bit\r\n    ///   Windows.  It's been tested on 32-bit Linux and Mac OS X (using Mono).\r\n    ///   It should work as 64-bit on those platforms.  We're also supporting\r\n    ///   both TWAIN_32.DLL and TWAINDSM.DLL on Windows, and we'll support both\r\n    ///   TWAIN.framework and a TWAINDSM.framework (whenever it gets created).\r\n    ///   \r\n    /// - Virtualiaze all public functions so that developers can extended the\r\n    ///   class with a minimum of fuss.\r\n    /// </summary>\r\n    public partial class TWAIN : IDisposable\r\n    {\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        // Public Functions, these are the essentials...\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        #region Public Functions...\r\n\r\n        /// <summary>\r\n        /// Our constructor...\r\n        /// </summary>\r\n        /// <param name=\"a_szManufacturer\">Application manufacturer</param>\r\n        /// <param name=\"a_szProductFamily\">Application product family</param>\r\n        /// <param name=\"a_szProductName\">Name of the application</param>\r\n        /// <param name=\"a_u16ProtocolMajor\">TWAIN protocol major (doesn't have to match TWAINH.CS)</param>\r\n        /// <param name=\"a_u16ProtocolMinor\">TWAIN protocol minor (doesn't have to match TWAINH.CS)</param>\r\n        /// <param name=\"a_u32SupportedGroups\">Bitmask of DG_ flags</param>\r\n        /// <param name=\"a_twcy\">Country code for the application</param>\r\n        /// <param name=\"a_szInfo\">Info about the application</param>\r\n        /// <param name=\"a_twlg\">Language code for the application</param>\r\n        /// <param name=\"a_u16MajorNum\">Application's major version</param>\r\n        /// <param name=\"a_u16MinorNum\">Application's minor version</param>\r\n        /// <param name=\"a_blUseLegacyDSM\">Use the legacy DSM (like TWAIN_32.DLL)</param>\r\n        /// <param name=\"a_blUseCallbacks\">Use callbacks instead of Windows post message</param>\r\n        /// <param name=\"a_deviceeventback\">Function to receive device events</param>\r\n        /// <param name=\"a_scancallback\">Function to handle scanning</param>\r\n        /// <param name=\"a_runinuithreaddelegate\">Help us run in the GUI thread on Windows</param>\r\n        /// <param name=\"a_intptrHwnd\">window handle</param>\r\n        [PermissionSet(SecurityAction.LinkDemand, Name = \"FullTrust\", Unrestricted = false)]\r\n        public TWAIN\r\n        (\r\n            string a_szManufacturer,\r\n            string a_szProductFamily,\r\n            string a_szProductName,\r\n            ushort a_u16ProtocolMajor,\r\n            ushort a_u16ProtocolMinor,\r\n            uint a_u32SupportedGroups,\r\n            TWCY a_twcy,\r\n            string a_szInfo,\r\n            TWLG a_twlg,\r\n            ushort a_u16MajorNum,\r\n            ushort a_u16MinorNum,\r\n            bool a_blUseLegacyDSM,\r\n            bool a_blUseCallbacks,\r\n            DeviceEventCallback a_deviceeventback,\r\n            ScanCallback a_scancallback,\r\n            RunInUiThreadDelegate a_runinuithreaddelegate,\r\n            IntPtr a_intptrHwnd\r\n        )\r\n        {\r\n            TW_IDENTITY twidentity;\r\n\r\n            // Since we're using P/Invoke in this sample, the DLL\r\n            // is implicitly loaded as we access it, so we can\r\n            // never go lower than state 2...\r\n            m_state = STATE.S2;\r\n\r\n            // Register the caller's info...\r\n            twidentity = default(TW_IDENTITY);\r\n            twidentity.Manufacturer.Set(a_szManufacturer);\r\n            twidentity.ProductFamily.Set(a_szProductFamily);\r\n            twidentity.ProductName.Set(a_szProductName);\r\n            twidentity.ProtocolMajor = a_u16ProtocolMajor;\r\n            twidentity.ProtocolMinor = a_u16ProtocolMinor;\r\n            twidentity.SupportedGroups = a_u32SupportedGroups;\r\n            twidentity.Version.Country = a_twcy;\r\n            twidentity.Version.Info.Set(a_szInfo);\r\n            twidentity.Version.Language = a_twlg;\r\n            twidentity.Version.MajorNum = a_u16MajorNum;\r\n            twidentity.Version.MinorNum = a_u16MinorNum;\r\n            m_twidentityApp = twidentity;\r\n            m_twidentitylegacyApp = TwidentityToTwidentitylegacy(twidentity);\r\n            m_twidentitymacosxApp = TwidentityToTwidentitymacosx(twidentity);\r\n            m_deviceeventcallback = a_deviceeventback;\r\n            m_scancallback = a_scancallback;\r\n            m_runinuithreaddelegate = a_runinuithreaddelegate;\r\n            m_intptrHwnd = a_intptrHwnd;\r\n\r\n            // Help for RunInUiThread...\r\n            m_threaddataDatAudiofilexfer = default(ThreadData);\r\n            m_threaddataDatAudionativexfer = default(ThreadData);\r\n            m_threaddataDatCapability = default(ThreadData);\r\n            m_threaddataDatEvent = default(ThreadData);\r\n            m_threaddataDatExtimageinfo = default(ThreadData);\r\n            m_threaddataDatIdentity = default(ThreadData);\r\n            m_threaddataDatImagefilexfer = default(ThreadData);\r\n            m_threaddataDatImageinfo = default(ThreadData);\r\n            m_threaddataDatImagelayout = default(ThreadData);\r\n            m_threaddataDatImagememfilexfer = default(ThreadData);\r\n            m_threaddataDatImagememxfer = default(ThreadData);\r\n            m_threaddataDatImagenativexfer = default(ThreadData);\r\n            m_threaddataDatParent = default(ThreadData);\r\n            m_threaddataDatPendingxfers = default(ThreadData);\r\n            m_threaddataDatSetupfilexfer = default(ThreadData);\r\n            m_threaddataDatSetupmemxfer = default(ThreadData);\r\n            m_threaddataDatStatus = default(ThreadData);\r\n            m_threaddataDatUserinterface = default(ThreadData);\r\n\r\n            // We always go through a discovery process, even on 32-bit...\r\n            m_linuxdsm = LinuxDsm.Unknown;\r\n\r\n            // Placeholder for our DS identity...\r\n            m_twidentityDs = default(TW_IDENTITY);\r\n            m_twidentitylegacyDs = default(TW_IDENTITY_LEGACY);\r\n            m_twidentitymacosxDs = default(TW_IDENTITY_MACOSX);\r\n\r\n            // We'll normally do an automatic get of DAT.STATUS, but if we'd\r\n            // like to turn it off, this is the variable to hit...\r\n            m_blAutoDatStatus = true;\r\n\r\n            // Our helper functions from the DSM...\r\n            m_twentrypointdelegates = default(TW_ENTRYPOINT_DELEGATES);\r\n\r\n            // Our events...\r\n            m_autoreseteventCaller = new AutoResetEvent(false);\r\n            m_autoreseteventThread = new AutoResetEvent(false);\r\n            m_autoreseteventRollback = new AutoResetEvent(false);\r\n            m_autoreseteventThreadStarted = new AutoResetEvent(false);\r\n            m_lockTwain = new Object();\r\n\r\n            // Windows only...\r\n            if (ms_platform == Platform.WINDOWS)\r\n            {\r\n                m_blUseLegacyDSM = a_blUseLegacyDSM;\r\n                m_blUseCallbacks = a_blUseCallbacks;\r\n                m_windowsdsmentrycontrolcallbackdelegate = WindowsDsmEntryCallbackProxy;\r\n            }\r\n\r\n            // Linux only...\r\n            else if (ms_platform == Platform.LINUX)\r\n            {\r\n                // The user can't set these value, we have to decide automatically\r\n                // which DSM to use, and only callbacks are supported...\r\n                m_blUseLegacyDSM = false;\r\n                m_blUseCallbacks = true;\r\n                m_linuxdsmentrycontrolcallbackdelegate = LinuxDsmEntryCallbackProxy;\r\n\r\n                // We assume the new DSM for 32-bit systems...\r\n                if (GetMachineWordBitSize() == 32)\r\n                {\r\n                    m_blFound020302Dsm64bit = false;\r\n                    if (File.Exists(\"/usr/local/lib64/libtwaindsm.so\"))\r\n                    {\r\n                        m_blFoundLatestDsm64 = true;\r\n                    }\r\n                    if (File.Exists(\"/usr/local/lib/libtwaindsm.so\"))\r\n                    {\r\n                        m_blFoundLatestDsm = true;\r\n                    }\r\n                }\r\n\r\n                // Check for the old DSM, but only on 64-bit systems...\r\n                if ((GetMachineWordBitSize() == 64) && File.Exists(\"/usr/local/lib/libtwaindsm.so.2.3.2\"))\r\n                {\r\n                    m_blFound020302Dsm64bit = true;\r\n                }\r\n\r\n                // Check for any newer DSM, but only on 64-bit systems...\r\n                if ((GetMachineWordBitSize() == 64) && (File.Exists(\"/usr/local/lib/libtwaindsm.so\") || File.Exists(\"/usr/local/lib64/libtwaindsm.so\")))\r\n                {\r\n                    bool blCheckForNewDsm = true;\r\n\r\n                    // Get the DSMs by their fully decorated names...\r\n                    string[] aszDsm = Directory.GetFiles(\"/usr/local/lib64\", \"libtwaindsm.so.*.*.*\");\r\n                    if (aszDsm.Length == 0)\r\n                    {\r\n                        aszDsm = Directory.GetFiles(\"/usr/local/lib\", \"libtwaindsm.so.*.*.*\");\r\n                    }\r\n                    if ((aszDsm != null) && (aszDsm.Length > 0))\r\n                    {\r\n                        // Check each name, we only want to launch the process if\r\n                        // we find an old DSM...\r\n                        foreach (string szDsm in aszDsm)\r\n                        {\r\n                            if (    szDsm.EndsWith(\"so.2.0\") || szDsm.Contains(\".so.2.0.\")\r\n                                ||  szDsm.EndsWith(\"so.2.1\") || szDsm.Contains(\".so.2.1.\")\r\n                                ||  szDsm.EndsWith(\"so.2.2\") || szDsm.Contains(\".so.2.2.\")\r\n                                ||  szDsm.EndsWith(\"so.2.3\") || szDsm.Contains(\".so.2.3.\"))\r\n                            {\r\n                                // If we get a match, see if the symbolic link is\r\n                                // pointing to old junk...\r\n                                Process p = new Process();\r\n                                p.StartInfo.UseShellExecute = false;\r\n                                p.StartInfo.RedirectStandardOutput = true;\r\n                                p.StartInfo.FileName = \"readlink\";\r\n                                p.StartInfo.Arguments = \"-e /usr/local/lib/libtwaindsm.so\";\r\n                                p.Start();\r\n                                string szOutput = p.StandardOutput.ReadToEnd();\r\n                                p.WaitForExit();\r\n                                p.Dispose();\r\n                                // We never did any 1.x stuff...\r\n                                if (    (szOutput != null)\r\n                                    &&  (szOutput.EndsWith(\".so.2.0\") || szOutput.Contains(\".so.2.0.\")\r\n                                    ||   szOutput.EndsWith(\".so.2.1\") || szOutput.Contains(\".so.2.1.\")\r\n                                    ||   szOutput.EndsWith(\".so.2.2\") || szOutput.Contains(\".so.2.2.\")\r\n                                    ||   szOutput.EndsWith(\".so.2.3\") || szOutput.Contains(\".so.2.3.\")))\r\n                                {\r\n                                    // libtwaindsm.so is pointing to an old DSM...\r\n                                    blCheckForNewDsm = false;\r\n                                }\r\n                                break;\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    // Is the symbolic link pointing to a new DSM?\r\n                    if (blCheckForNewDsm && (aszDsm != null) && (aszDsm.Length > 0))\r\n                    {\r\n                        foreach (string szDsm in aszDsm)\r\n                        {\r\n                            // I guess this is reasonably future-proof...\r\n                            if (    szDsm.Contains(\"so.2.4\")\r\n                                ||  szDsm.Contains(\"so.2.5\")\r\n                                ||  szDsm.Contains(\"so.2.6\")\r\n                                ||  szDsm.Contains(\"so.2.7\")\r\n                                ||  szDsm.Contains(\"so.2.8\")\r\n                                ||  szDsm.Contains(\"so.2.9\")\r\n                                ||  szDsm.Contains(\"so.2.10\")\r\n                                ||  szDsm.Contains(\"so.2.11\")\r\n                                ||  szDsm.Contains(\"so.2.12\")\r\n                                ||  szDsm.Contains(\"so.2.13\")\r\n                                ||  szDsm.Contains(\"so.2.14\")\r\n                                ||  szDsm.Contains(\"so.3\")\r\n                                ||  szDsm.Contains(\"so.4\"))\r\n                            {\r\n                                // libtwaindsm.so is pointing to a new DSM...\r\n                                if (szDsm.Contains(\"lib64\"))\r\n                                {\r\n                                    m_blFoundLatestDsm64 = true;\r\n                                }\r\n                                else\r\n                                {\r\n                                    m_blFoundLatestDsm = true;\r\n                                }\r\n                                break;\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            // Mac OS X only...\r\n            else if (ms_platform == Platform.MACOSX)\r\n            {\r\n                m_blUseLegacyDSM = a_blUseLegacyDSM;\r\n                m_blUseCallbacks = true;\r\n                m_macosxdsmentrycontrolcallbackdelegate = MacosxDsmEntryCallbackProxy;\r\n            }\r\n\r\n            // Uh-oh, Log will throw an exception for us...\r\n            else\r\n            {\r\n                TWAINWorkingGroup.Log.Assert(\"Unsupported platform...\" + ms_platform);\r\n            }\r\n\r\n            // Activate our thread...\r\n            /*\r\n            if (m_threadTwain == null)\r\n            {\r\n                m_twaincommand = new TwainCommand();\r\n                m_threadTwain = new Thread(Main);\r\n                m_threadTwain.Start();\r\n                if (!m_autoreseteventThreadStarted.WaitOne(5000))\r\n                {\r\n                    try\r\n                    {\r\n                        m_threadTwain.Abort();\r\n                        m_threadTwain = null;\r\n                    }\r\n                    catch (Exception exception)\r\n                    {\r\n                        // Log will throw an exception for us...\r\n                        TWAINWorkingGroup.Log.Assert(\"Failed to start the TWAIN background thread - \" + exception.Message);\r\n                    }\r\n                }\r\n            }\r\n            */\r\n        }\r\n\r\n        /// <summary>\r\n        /// Cleanup...\r\n        /// </summary>\r\n        [SuppressMessage(\"Microsoft.Security\", \"CA2123:OverrideLinkDemandsShouldBeIdenticalToBase\")]\r\n        [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]\r\n        public void Dispose()\r\n        {\r\n            Dispose(true);\r\n            GC.SuppressFinalize(this);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Report the path to the DSM we're using...\r\n        /// </summary>\r\n        /// <returns>full path to the DSM</returns>\r\n        public string GetDsmPath()\r\n        {\r\n            string szDsmPath = \"\";\r\n\r\n            // Windows...\r\n            if (ms_platform == Platform.WINDOWS)\r\n            {\r\n                if (m_blUseLegacyDSM)\r\n                {\r\n                    szDsmPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows), \"twain_32.dll\");\r\n                }\r\n                else\r\n                {\r\n                    szDsmPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), \"twaindsm.dll\");\r\n                }\r\n            }\r\n\r\n            // Linux...\r\n            else if (ms_platform == Platform.LINUX)\r\n            {\r\n                if (m_blFoundLatestDsm64 && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                {\r\n                    szDsmPath = \"/usr/local/lib64/libtwaindsm.so\";\r\n                }\r\n                else if (m_blFoundLatestDsm && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                {\r\n                    szDsmPath = \"/usr/local/lib/libtwaindsm.so\";\r\n                }\r\n                else if (m_blFound020302Dsm64bit && (m_linuxdsm == LinuxDsm.Is020302Dsm64bit))\r\n                {\r\n                    szDsmPath = \"/usr/local/lib/libtwaindsm.so.2.3.2\";\r\n                }\r\n            }\r\n\r\n            // Mac OS X, which has to be different...\r\n            else if (ms_platform == Platform.MACOSX)\r\n            {\r\n                if (m_blUseLegacyDSM)\r\n                {\r\n                    szDsmPath = \"/System/Library/Frameworks/TWAIN.framework/TWAIN\";\r\n                }\r\n                else\r\n                {\r\n                    szDsmPath = \"/Library/Frameworks/TWAIN.framework/TWAIN\";\r\n                }\r\n            }\r\n\r\n            // If found...\r\n            if (File.Exists(szDsmPath))\r\n            {\r\n                return (szDsmPath);\r\n            }\r\n\r\n            // Ruh-roh...\r\n            if (string.IsNullOrEmpty(szDsmPath))\r\n            {\r\n                return (\"(could not identify a DSM candidate for this platform - '\" + ms_platform + \"')\");\r\n            }\r\n\r\n            // Hmmm...\r\n            return (\"(could not find '\" + szDsmPath + \"')\");\r\n        }\r\n\r\n        /// <summary>\r\n        /// Get the identity of the current application...\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public string GetAppIdentity()\r\n        {\r\n            return (IdentityToCsv(m_twidentityApp));\r\n        }\r\n\r\n        /// <summary>\r\n        /// Get the identity of the current driver, if we have one...\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public string GetDsIdentity()\r\n        {\r\n            if (m_state < STATE.S4)\r\n            {\r\n                return (IdentityToCsv(default(TW_IDENTITY)));\r\n            }\r\n            return (IdentityToCsv(m_twidentityDs));\r\n        }\r\n\r\n        /// <summary>\r\n        /// Alloc memory used with the data source.\r\n        /// </summary>\r\n        /// <param name=\"a_u32Size\">Number of bytes to allocate</param>\r\n        /// <returns>Point to memory</returns>\r\n        [PermissionSet(SecurityAction.LinkDemand, Name = \"FullTrust\", Unrestricted = false)]\r\n        public IntPtr DsmMemAlloc(uint a_u32Size, bool a_blForcePointer = false)\r\n        {\r\n            IntPtr intptr;\r\n\r\n            // Use the DSM...\r\n            if ((m_twentrypointdelegates.DSM_MemAllocate != null) && !a_blForcePointer)\r\n            {\r\n                intptr = m_twentrypointdelegates.DSM_MemAllocate(a_u32Size);\r\n                if (intptr == IntPtr.Zero)\r\n                {\r\n                    TWAINWorkingGroup.Log.Error(\"DSM_MemAllocate failed...\");\r\n                }\r\n                return (intptr);\r\n            }\r\n\r\n            // Do it ourselves, Windows...\r\n            if (ms_platform == Platform.WINDOWS)\r\n            {\r\n                intptr = (IntPtr)NativeMethods.GlobalAlloc((uint)(a_blForcePointer ? 0x0040 /* GPTR */ : 0x0042 /* GHND */), (UIntPtr)a_u32Size);\r\n                if (intptr == IntPtr.Zero)\r\n                {\r\n                    TWAINWorkingGroup.Log.Error(\"GlobalAlloc failed...\");\r\n                }\r\n                return (intptr);\r\n            }\r\n\r\n            // Do it ourselves, Linux...\r\n            if (ms_platform == Platform.LINUX)\r\n            {\r\n                intptr = Marshal.AllocHGlobal((int)a_u32Size);\r\n                if (intptr == IntPtr.Zero)\r\n                {\r\n                    TWAINWorkingGroup.Log.Error(\"AllocHGlobal failed...\");\r\n                }\r\n                return (intptr);\r\n            }\r\n\r\n            // Do it ourselves, Mac OS X...\r\n            if (ms_platform == Platform.MACOSX)\r\n            {\r\n                IntPtr intptrIndirect = Marshal.AllocHGlobal((int)a_u32Size);\r\n                if (intptrIndirect == IntPtr.Zero)\r\n                {\r\n                    TWAINWorkingGroup.Log.Error(\"AllocHGlobal(indirect) failed...\");\r\n                    return (intptrIndirect);\r\n                }\r\n                IntPtr intptrDirect = Marshal.AllocHGlobal(Marshal.SizeOf(intptrIndirect));\r\n                if (intptrDirect == IntPtr.Zero)\r\n                {\r\n                    TWAINWorkingGroup.Log.Error(\"AllocHGlobal(direct) failed...\");\r\n                    return (intptrDirect);\r\n                }\r\n                Marshal.StructureToPtr(intptrIndirect, intptrDirect, true);\r\n                return (intptrDirect);\r\n            }\r\n\r\n            // Trouble, Log will throw an exception for us...\r\n            TWAINWorkingGroup.Log.Assert(\"Unsupported platform...\" + ms_platform);\r\n            return (IntPtr.Zero);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Free memory used with the data source...\r\n        /// </summary>\r\n        /// <param name=\"a_intptrHandle\">Pointer to free</param>\r\n        [PermissionSet(SecurityAction.LinkDemand, Name = \"FullTrust\", Unrestricted = false)]\r\n        public void DsmMemFree(ref IntPtr a_intptrHandle, bool a_blForcePointer = false)\r\n        {\r\n            // Validate...\r\n            if (a_intptrHandle == IntPtr.Zero)\r\n            {\r\n                return;\r\n            }\r\n\r\n            // Use the DSM...\r\n            if ((m_twentrypointdelegates.DSM_MemAllocate != null) && !a_blForcePointer)\r\n            {\r\n                m_twentrypointdelegates.DSM_MemFree(a_intptrHandle);\r\n            }\r\n\r\n            // Do it ourselves, Windows...\r\n            else if (ms_platform == Platform.WINDOWS)\r\n            {\r\n                NativeMethods.GlobalFree(a_intptrHandle);\r\n            }\r\n\r\n            // Do it ourselves, Linux...\r\n            else if (ms_platform == Platform.LINUX)\r\n            {\r\n                Marshal.FreeHGlobal(a_intptrHandle);\r\n            }\r\n\r\n            // Do it ourselves, Mac OS X...\r\n            else if (ms_platform == Platform.MACOSX)\r\n            {\r\n                // Free the indirect pointer...\r\n                IntPtr intptr = (IntPtr)Marshal.PtrToStructure(a_intptrHandle, typeof(IntPtr));\r\n                if (intptr != IntPtr.Zero)\r\n                {\r\n                    Marshal.FreeHGlobal(intptr);\r\n                }\r\n\r\n                // If we free the direct pointer the CLR tells us that we're\r\n                // freeing something that was never allocated.  We're going\r\n                // to believe it and not do a free.  But I'm also leaving this\r\n                // here as a record of the decision...\r\n                //Marshal.FreeHGlobal(a_twcapability.hContainer);\r\n            }\r\n\r\n            // Make sure the variable is cleared...\r\n            a_intptrHandle = IntPtr.Zero;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Lock memory used with the data source...\r\n        /// </summary>\r\n        /// <param name=\"a_intptrHandle\">Handle to lock</param>\r\n        /// <returns>Locked pointer</returns>\r\n        [PermissionSet(SecurityAction.LinkDemand, Name = \"FullTrust\", Unrestricted = false)]\r\n        public IntPtr DsmMemLock(IntPtr a_intptrHandle)\r\n        {\r\n            // Validate...\r\n            if (a_intptrHandle == IntPtr.Zero)\r\n            {\r\n                return (a_intptrHandle);\r\n            }\r\n\r\n            // Use the DSM...\r\n            if (m_twentrypointdelegates.DSM_MemLock != null)\r\n            {\r\n                return (m_twentrypointdelegates.DSM_MemLock(a_intptrHandle));\r\n            }\r\n\r\n            // Do it ourselves, Windows...\r\n            if (ms_platform == Platform.WINDOWS)\r\n            {\r\n                return (NativeMethods.GlobalLock(a_intptrHandle));\r\n            }\r\n\r\n            // Do it ourselves, Linux...\r\n            if (ms_platform == Platform.LINUX)\r\n            {\r\n                return (a_intptrHandle);\r\n            }\r\n\r\n            // Do it ourselves, Mac OS X...\r\n            if (ms_platform == Platform.MACOSX)\r\n            {\r\n                IntPtr intptr = (IntPtr)Marshal.PtrToStructure(a_intptrHandle, typeof(IntPtr));\r\n                return (intptr);\r\n            }\r\n\r\n            // Trouble, Log will throw an exception for us...\r\n            TWAINWorkingGroup.Log.Assert(\"Unsupported platform...\" + ms_platform);\r\n            return (IntPtr.Zero);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Unlock memory used with the data source...\r\n        /// </summary>\r\n        /// <param name=\"a_intptrHandle\">Handle to unlock</param>\r\n        [PermissionSet(SecurityAction.LinkDemand, Name = \"FullTrust\", Unrestricted = false)]\r\n        public void DsmMemUnlock(IntPtr a_intptrHandle)\r\n        {\r\n            // Validate...\r\n            if (a_intptrHandle == IntPtr.Zero)\r\n            {\r\n                return;\r\n            }\r\n\r\n            // Use the DSM...\r\n            if (m_twentrypointdelegates.DSM_MemUnlock != null)\r\n            {\r\n                m_twentrypointdelegates.DSM_MemUnlock(a_intptrHandle);\r\n                return;\r\n            }\r\n\r\n            // Do it ourselves, Windows...\r\n            if (ms_platform == Platform.WINDOWS)\r\n            {\r\n                NativeMethods.GlobalUnlock(a_intptrHandle);\r\n                return;\r\n            }\r\n\r\n            // Do it ourselves, Linux...\r\n            if (ms_platform == Platform.LINUX)\r\n            {\r\n                return;\r\n            }\r\n\r\n            // Do it ourselves, Mac OS X...\r\n            if (ms_platform == Platform.MACOSX)\r\n            {\r\n                return;\r\n            }\r\n\r\n            // Trouble, Log will throw an exception for us...\r\n            TWAINWorkingGroup.Log.Assert(\"Unsupported platform...\" + ms_platform);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Report the current TWAIN state as we understand it...\r\n        /// </summary>\r\n        /// <returns>The current TWAIN state for the application</returns>\r\n        public STATE GetState()\r\n        {\r\n            return (m_state);\r\n        }\r\n\r\n        /// <summary>\r\n        /// True if the DSM has the DSM2 flag set...\r\n        /// </summary>\r\n        /// <returns>True if we detect the TWAIN Working Group open source DSM</returns>\r\n        public bool IsDsm2()\r\n        {\r\n            // Windows...\r\n            if (ms_platform == Platform.WINDOWS)\r\n            {\r\n                return ((m_twidentitylegacyApp.SupportedGroups & (uint)DG.DSM2) != 0);\r\n            }\r\n\r\n            // Linux...\r\n            if (ms_platform == Platform.LINUX)\r\n            {\r\n                return ((m_twidentitylegacyApp.SupportedGroups & (uint)DG.DSM2) != 0);\r\n            }\r\n\r\n            // Mac OS X...\r\n            if (ms_platform == Platform.MACOSX)\r\n            {\r\n                return ((m_twidentitymacosxApp.SupportedGroups & (uint)DG.DSM2) != 0);\r\n            }\r\n\r\n            // Trouble, Log will throw an exception for us...\r\n            TWAINWorkingGroup.Log.Assert(\"Unsupported platform...\" + ms_platform);\r\n            return (false);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Have we seen the first image since MSG.ENABLEDS?\r\n        /// </summary>\r\n        /// <returns>True if the driver is ready to transfer images</returns>\r\n        public bool IsMsgXferReady()\r\n        {\r\n            return (m_blIsMsgxferready);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Has the cancel button been pressed since the last MSG.ENABLEDS?\r\n        /// </summary>\r\n        /// <returns>True if the cancel button was pressed</returns>\r\n        public bool IsMsgCloseDsReq()\r\n        {\r\n            return (m_blIsMsgclosedsreq);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Has the OK button been pressed since the last MSG.ENABLEDS?\r\n        /// </summary>\r\n        /// <returns>True if the OK button was pressed</returns>\r\n        public bool IsMsgCloseDsOk()\r\n        {\r\n            return (m_blIsMsgclosedsok);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Monitor for DAT.NULL / MSG.* stuff...\r\n        /// </summary>\r\n        /// <param name=\"a_intptrHwnd\">Window handle that we're monitoring</param>\r\n        /// <param name=\"a_iMsg\">A message</param>\r\n        /// <param name=\"a_intptrWparam\">a parameter for the message</param>\r\n        /// <param name=\"a_intptrLparam\">another parameter for the message</param>\r\n        /// <returns></returns>\r\n        [PermissionSet(SecurityAction.LinkDemand, Name = \"FullTrust\", Unrestricted = false)]\r\n        public bool PreFilterMessage\r\n        (\r\n            IntPtr a_intptrHwnd,\r\n            int a_iMsg,\r\n            IntPtr a_intptrWparam,\r\n            IntPtr a_intptrLparam\r\n        )\r\n        {\r\n            STS sts;\r\n            MESSAGE msg;\r\n\r\n            // This is only in effect after MSG.ENABLEDS*, or if we are in\r\n            // the middle of processing DAT_USERINTERFACE.  We don't want to\r\n            // bump to state 5 before processing DAT_USERINTERFACE, but some\r\n            // drivers are really eager to get going, and throw MSG_XFERREADY\r\n            // before even get a chance to finish the command...\r\n            if ((m_state < STATE.S5) && !m_blRunningDatUserinterface)\r\n            {\r\n                return (false);\r\n            }\r\n\r\n            // Convert the data...\r\n            msg = new MESSAGE();\r\n            msg.hwnd = a_intptrHwnd;\r\n            msg.message = (uint)a_iMsg;\r\n            msg.wParam = a_intptrWparam;\r\n            msg.lParam = a_intptrLparam;\r\n\r\n            // Allocate memory that we can give to the driver...\r\n            if (m_tweventPreFilterMessage.pEvent == IntPtr.Zero)\r\n            {\r\n                m_tweventPreFilterMessage.pEvent = Marshal.AllocHGlobal(Marshal.SizeOf(msg) + 65536);\r\n            }\r\n            Marshal.StructureToPtr(msg, m_tweventPreFilterMessage.pEvent, true);\r\n\r\n            // See if the driver wants the event...\r\n            m_tweventPreFilterMessage.TWMessage = 0;\r\n            sts = DatEvent(DG.CONTROL, MSG.PROCESSEVENT, ref m_tweventPreFilterMessage, true);\r\n            if ((sts != STS.DSEVENT) && (sts != STS.NOTDSEVENT))\r\n            {\r\n                return (false);\r\n            }\r\n\r\n            // All done, tell the app we consumed the event if we\r\n            // got back a status telling us that...\r\n            return (sts == STS.DSEVENT);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Rollback the TWAIN state machine to the specified value, with an\r\n        /// automatic resync if it detects a sequence error...\r\n        /// </summary>\r\n        /// <param name=\"a_stateTarget\">The TWAIN state that we want to end up at</param>\r\n        /// <param name=\"a_blUseThread\">Use the thread (most cases)</param>\r\n        static int s_iCloseDsmDelay = 0;\r\n        [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]\r\n        public TWAIN.STATE Rollback(STATE a_stateTarget, bool a_blUseThread = true)\r\n        {\r\n            int iRetry;\r\n            STS sts;\r\n            STATE stateStart;\r\n\r\n            // Nothing to do here...\r\n            if (m_state <= STATE.S2)\r\n            {\r\n                return (m_state);\r\n            }\r\n\r\n            // Submit the work to the TWAIN thread...\r\n            if (a_blUseThread)\r\n            {\r\n                if (m_runinuithreaddelegate != null)\r\n                {\r\n                    lock (m_lockTwain)\r\n                    {\r\n                        // No point in continuing...\r\n                        if (m_twaincommand == null)\r\n                        {\r\n                            return (m_state);\r\n                        }\r\n\r\n                        // Set the command variables...\r\n                        ThreadData threaddata = default(ThreadData);\r\n                        threaddata.blExitThread = true;\r\n                        long lIndex = m_twaincommand.Submit(threaddata);\r\n\r\n                        // Submit the command and wait for the reply, the delay\r\n                        // is needed because Mac OS X doesn't gracefully handle\r\n                        // the loss of a mutex...\r\n                        s_iCloseDsmDelay = 0;\r\n                        CallerToThreadSet();\r\n                        ThreadToRollbackWaitOne();\r\n                        Thread.Sleep(s_iCloseDsmDelay);\r\n\r\n                        // Clear the command variables...\r\n                        m_twaincommand.Delete(lIndex);\r\n                    }\r\n                }\r\n                else if ((m_threadTwain != null) && (m_threadTwain.ManagedThreadId != Thread.CurrentThread.ManagedThreadId))\r\n                {\r\n                    lock (m_lockTwain)\r\n                    {\r\n                        // No point in continuing...\r\n                        if (m_twaincommand == null)\r\n                        {\r\n                            return (m_state);\r\n                        }\r\n\r\n                        // Set the command variables...\r\n                        ThreadData threaddata = default(ThreadData);\r\n                        threaddata.stateRollback = a_stateTarget;\r\n                        threaddata.blRollback = true;\r\n                        long lIndex = m_twaincommand.Submit(threaddata);\r\n\r\n                        // Submit the command and wait for the reply, the delay\r\n                        // is needed because Mac OS X doesn't gracefully handle\r\n                        // the loss of a mutex...\r\n                        s_iCloseDsmDelay = 0;\r\n                        CallerToThreadSet();\r\n                        ThreadToRollbackWaitOne();\r\n                        Thread.Sleep(s_iCloseDsmDelay);\r\n\r\n                        // Clear the command variables...\r\n                        m_twaincommand.Delete(lIndex);\r\n                    }\r\n                    return (m_state);\r\n                }\r\n            }\r\n\r\n            // If we get a sequence error, then we'll repeat the loop from\r\n            // the highest possible state to see if we can fix the problem...\r\n            iRetry = 2;\r\n            stateStart = GetState();\r\n            while (iRetry-- > 0)\r\n            {\r\n                // State 7 --> State 6...\r\n                if ((stateStart >= STATE.S7) && (a_stateTarget < STATE.S7))\r\n                {\r\n                    TW_PENDINGXFERS twpendingxfers = default(TW_PENDINGXFERS);\r\n                    sts = DatPendingxfers(DG.CONTROL, MSG.ENDXFER, ref twpendingxfers);\r\n                    if (sts == STS.SEQERROR)\r\n                    {\r\n                        stateStart = STATE.S7;\r\n                        continue;\r\n                    }\r\n                    stateStart = STATE.S6;\r\n                }\r\n\r\n                // State 6 --> State 5...\r\n                if ((stateStart >= STATE.S6) && (a_stateTarget < STATE.S6))\r\n                {\r\n                    TW_PENDINGXFERS twpendingxfers = default(TW_PENDINGXFERS);\r\n                    sts = DatPendingxfers(DG.CONTROL, MSG.RESET, ref twpendingxfers);\r\n                    if (sts == STS.SEQERROR)\r\n                    {\r\n                        stateStart = STATE.S7;\r\n                        continue;\r\n                    }\r\n                    stateStart = STATE.S5;\r\n                }\r\n\r\n                // State 5 --> State 4...\r\n                if ((stateStart >= STATE.S5) && (a_stateTarget < STATE.S5))\r\n                {\r\n                    TW_USERINTERFACE twuserinterface = default(TW_USERINTERFACE);\r\n                    sts = DatUserinterface(DG.CONTROL, MSG.DISABLEDS, ref twuserinterface);\r\n                    if (sts == STS.SEQERROR)\r\n                    {\r\n                        stateStart = STATE.S7;\r\n                        continue;\r\n                    }\r\n                    if (m_tweventPreFilterMessage.pEvent != IntPtr.Zero)\r\n                    {\r\n                        Marshal.FreeHGlobal(m_tweventPreFilterMessage.pEvent);\r\n                        m_tweventPreFilterMessage.pEvent = IntPtr.Zero;\r\n                    }\r\n                    stateStart = STATE.S4;\r\n                    m_blAcceptXferReady = false;\r\n                    m_blIsMsgclosedsok = false;\r\n                    m_blIsMsgclosedsreq = false;\r\n                    m_blIsMsgxferready = false; \r\n                }\r\n\r\n                // State 4 --> State 3...\r\n                if ((stateStart >= STATE.S4) && (a_stateTarget < STATE.S4))\r\n                {\r\n                    sts = DatIdentity(DG.CONTROL, MSG.CLOSEDS, ref m_twidentityDs);\r\n                    if (sts == STS.SEQERROR)\r\n                    {\r\n                        stateStart = STATE.S7;\r\n                        continue;\r\n                    }\r\n                    stateStart = STATE.S3;\r\n                }\r\n\r\n                // State 3 --> State 2...\r\n                if ((stateStart >= STATE.S3) && (a_stateTarget < STATE.S3))\r\n                {\r\n                    // Do this to prevent a deadlock on Mac OS X, two seconds\r\n                    // better be enough to finish up...\r\n                    if (GetPlatform() == Platform.MACOSX)\r\n                    {\r\n                        ThreadToRollbackSet();\r\n                        s_iCloseDsmDelay = 2000;\r\n                    }\r\n\r\n                    // Now do the rest of it...\r\n                    sts = DatParent(DG.CONTROL, MSG.CLOSEDSM, ref m_intptrHwnd);\r\n                    if (sts == STS.SEQERROR)\r\n                    {\r\n                        stateStart = STATE.S7;\r\n                        continue;\r\n                    }\r\n                    stateStart = STATE.S2;\r\n                }\r\n\r\n                // All done...\r\n                break;\r\n            }\r\n\r\n            // How did we do?\r\n            return (m_state);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Send a command to the currently loaded DSM...\r\n        /// </summary>\r\n        /// <param name=\"a_functionarguments\">tokenized command and anything needed</param>\r\n        /// <returns>true to quit</returns>\r\n        public TWAIN.STS Send(string a_szDg, string a_szDat, string a_szMsg, ref string a_szTwmemref, ref string a_szResult)\r\n        {\r\n            int iDg;\r\n            int iDat;\r\n            int iMsg;\r\n            TWAIN.STS sts;\r\n            TWAIN.DG dg = TWAIN.DG.MASK;\r\n            TWAIN.DAT dat = TWAIN.DAT.NULL;\r\n            TWAIN.MSG msg = TWAIN.MSG.NULL;\r\n\r\n            // Init stuff...\r\n            iDg = 0;\r\n            iDat = 0;\r\n            iMsg = 0;\r\n            sts = TWAIN.STS.BADPROTOCOL;\r\n            a_szResult = \"\";\r\n\r\n            // Look for DG...\r\n            if (!a_szDg.ToLowerInvariant().StartsWith(\"dg_\"))\r\n            {\r\n                TWAINWorkingGroup.Log.Error(\"Unrecognized dg - <\" + a_szDg + \">\");\r\n                return (TWAIN.STS.BADPROTOCOL);\r\n            }\r\n            else\r\n            {\r\n                // Look for hex number (take anything)...\r\n                if (a_szDg.ToLowerInvariant().StartsWith(\"dg_0x\"))\r\n                {\r\n                    if (!int.TryParse(a_szDg.ToLowerInvariant().Substring(5), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out iDg))\r\n                    {\r\n                        TWAINWorkingGroup.Log.Error(\"Badly constructed dg - <\" + a_szDg + \">\");\r\n                        return (TWAIN.STS.BADPROTOCOL);\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    if (!TWAIN.Enum_TryParse(a_szDg.ToUpperInvariant().Substring(3), out dg))\r\n                    {\r\n                        TWAINWorkingGroup.Log.Error(\"Unrecognized dg - <\" + a_szDg + \">\");\r\n                        return (TWAIN.STS.BADPROTOCOL);\r\n                    }\r\n                    iDg = (int)dg;\r\n                }\r\n            }\r\n\r\n            // Look for DAT...\r\n            if (!a_szDat.ToLowerInvariant().StartsWith(\"dat_\"))\r\n            {\r\n                TWAINWorkingGroup.Log.Error(\"Unrecognized dat - <\" + a_szDat + \">\");\r\n                return (TWAIN.STS.BADPROTOCOL);\r\n            }\r\n            else\r\n            {\r\n                // Look for hex number (take anything)...\r\n                if (a_szDat.ToLowerInvariant().StartsWith(\"dat_0x\"))\r\n                {\r\n                    if (!int.TryParse(a_szDat.ToLowerInvariant().Substring(6), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out iDat))\r\n                    {\r\n                        TWAINWorkingGroup.Log.Error(\"Badly constructed dat - <\" + a_szDat + \">\");\r\n                        return (TWAIN.STS.BADPROTOCOL);\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    if (!TWAIN.Enum_TryParse(a_szDat.ToUpperInvariant().Substring(4), out dat))\r\n                    {\r\n                        TWAINWorkingGroup.Log.Error(\"Unrecognized dat - <\" + a_szDat + \">\");\r\n                        return (TWAIN.STS.BADPROTOCOL);\r\n                    }\r\n                    iDat = (int)dat;\r\n                }\r\n            }\r\n\r\n            // Look for MSG...\r\n            if (!a_szMsg.ToLowerInvariant().StartsWith(\"msg_\"))\r\n            {\r\n                TWAINWorkingGroup.Log.Error(\"Unrecognized msg - <\" + a_szMsg + \">\");\r\n                return (TWAIN.STS.BADPROTOCOL);\r\n            }\r\n            else\r\n            {\r\n                // Look for hex number (take anything)...\r\n                if (a_szMsg.ToLowerInvariant().StartsWith(\"msg_0x\"))\r\n                {\r\n                    if (!int.TryParse(a_szMsg.ToLowerInvariant().Substring(6), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out iMsg))\r\n                    {\r\n                        TWAINWorkingGroup.Log.Error(\"Badly constructed dat - <\" + a_szMsg + \">\");\r\n                        return (TWAIN.STS.BADPROTOCOL);\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    if (!TWAIN.Enum_TryParse(a_szMsg.ToUpperInvariant().Substring(4), out msg))\r\n                    {\r\n                        TWAINWorkingGroup.Log.Error(\"Unrecognized msg - <\" + a_szMsg + \">\");\r\n                        return (TWAIN.STS.BADPROTOCOL);\r\n                    }\r\n                    iMsg = (int)msg;\r\n                }\r\n            }\r\n\r\n            // Send the command...\r\n            switch (iDat)\r\n            {\r\n                // Ruh-roh, since we can't marshal it, we have to return an error,\r\n                // it would be nice to have a solution for this, but that will need\r\n                // a dynamic marshalling system...\r\n                default:\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tInt64 i64Memref;\r\n\t\t\t\t\t\tif (!Int64.TryParse(a_szTwmemref, out i64Memref))\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tsts = STS.BADPROTOCOL;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tIntPtr intptrTwmemref = (IntPtr)i64Memref;\r\n\t\t\t\t\t\t\tsts = DsmEntry((DG)iDg, (DAT)iDat, (MSG)iMsg, intptrTwmemref);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n                    break;\r\n\r\n                // DAT_AUDIOFILEXFER...\r\n                case (int)TWAIN.DAT.AUDIOFILEXFER:\r\n                    {\r\n                        sts = DatAudiofilexfer((TWAIN.DG)iDg, (TWAIN.MSG)iMsg);\r\n                        a_szTwmemref = \"\";\r\n                    }\r\n                    break;\r\n\r\n                // DAT_AUDIOINFO..\r\n                case (int)TWAIN.DAT.AUDIOINFO:\r\n                    {\r\n                        TWAIN.TW_AUDIOINFO twaudioinfo = default(TWAIN.TW_AUDIOINFO);\r\n                        sts = DatAudioinfo((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twaudioinfo);\r\n                        a_szTwmemref = AudioinfoToCsv(twaudioinfo);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_AUDIONATIVEXFER..\r\n                case (int)TWAIN.DAT.AUDIONATIVEXFER:\r\n                    {\r\n                        IntPtr intptr = IntPtr.Zero;\r\n                        sts = DatAudionativexfer((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref intptr);\r\n                        a_szTwmemref = intptr.ToString();\r\n                    }\r\n                    break;\r\n\r\n                // DAT_CALLBACK...\r\n                case (int)TWAIN.DAT.CALLBACK:\r\n                    {\r\n                        TWAIN.TW_CALLBACK twcallback = default(TWAIN.TW_CALLBACK);\r\n                        CsvToCallback(ref twcallback, a_szTwmemref);\r\n                        sts = DatCallback((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twcallback);\r\n                        a_szTwmemref = CallbackToCsv(twcallback);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_CALLBACK2...\r\n                case (int)TWAIN.DAT.CALLBACK2:\r\n                    {\r\n                        TWAIN.TW_CALLBACK2 twcallback2 = default(TWAIN.TW_CALLBACK2);\r\n                        CsvToCallback2(ref twcallback2, a_szTwmemref);\r\n                        sts = DatCallback2((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twcallback2);\r\n                        a_szTwmemref = Callback2ToCsv(twcallback2);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_CAPABILITY...\r\n                case (int)TWAIN.DAT.CAPABILITY:\r\n                    {\r\n                        // Skip symbols for msg_querysupport, otherwise 0 gets turned into false, also\r\n                        // if the command fails the return value is whatever was sent into us, which\r\n                        // matches the experience one should get with C/C++...\r\n                        string szStatus = \"\";\r\n                        TWAIN.TW_CAPABILITY twcapability = default(TWAIN.TW_CAPABILITY);\r\n                        CsvToCapability(ref twcapability, ref szStatus, a_szTwmemref);\r\n                        sts = DatCapability((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twcapability);\r\n                        if ((sts == TWAIN.STS.SUCCESS) || (sts == TWAIN.STS.CHECKSTATUS))\r\n                        {\r\n                            // Convert the data to CSV...\r\n                            a_szTwmemref = CapabilityToCsv(twcapability, ((TWAIN.MSG)iMsg != TWAIN.MSG.QUERYSUPPORT));\r\n                            // Free the handle if the driver created it...\r\n                            switch ((TWAIN.MSG)iMsg)\r\n                            {\r\n                                default: break;\r\n                                case TWAIN.MSG.GET:\r\n                                case TWAIN.MSG.GETCURRENT:\r\n                                case TWAIN.MSG.GETDEFAULT:\r\n                                case TWAIN.MSG.QUERYSUPPORT:\r\n                                case TWAIN.MSG.RESET:\r\n                                    DsmMemFree(ref twcapability.hContainer);\r\n                                    break;\r\n                            }\r\n                        }\r\n                    }\r\n                    break;\r\n\r\n                // DAT_CIECOLOR..\r\n                case (int)TWAIN.DAT.CIECOLOR:\r\n                    {\r\n                        //TWAIN.TW_CIECOLOR twciecolor = default(TWAIN.TW_CIECOLOR);\r\n                        //sts = m_twain.DatCiecolor((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twciecolor);\r\n                        //a_szTwmemref = m_twain.CiecolorToCsv(twciecolor);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_CUSTOMDSDATA...\r\n                case (int)TWAIN.DAT.CUSTOMDSDATA:\r\n                    {\r\n                        TWAIN.TW_CUSTOMDSDATA twcustomdsdata = default(TWAIN.TW_CUSTOMDSDATA);\r\n                        CsvToCustomdsdata(ref twcustomdsdata, a_szTwmemref);\r\n                        sts = DatCustomdsdata((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twcustomdsdata);\r\n                        a_szTwmemref = CustomdsdataToCsv(twcustomdsdata);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_DEVICEEVENT...\r\n                case (int)TWAIN.DAT.DEVICEEVENT:\r\n                    {\r\n                        TWAIN.TW_DEVICEEVENT twdeviceevent = default(TWAIN.TW_DEVICEEVENT);\r\n                        sts = DatDeviceevent((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twdeviceevent);\r\n                        a_szTwmemref = DeviceeventToCsv(twdeviceevent);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_ENTRYPOINT...\r\n                case (int)TWAIN.DAT.ENTRYPOINT:\r\n                    {\r\n                        TWAIN.TW_ENTRYPOINT twentrypoint = default(TWAIN.TW_ENTRYPOINT);\r\n                        twentrypoint.Size = (uint)Marshal.SizeOf(twentrypoint);\r\n                        sts = DatEntrypoint((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twentrypoint);\r\n                        a_szTwmemref = EntrypointToCsv(twentrypoint);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_EVENT...\r\n                case (int)TWAIN.DAT.EVENT:\r\n                    {\r\n                        TWAIN.TW_EVENT twevent = default(TWAIN.TW_EVENT);\r\n                        sts = DatEvent((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twevent);\r\n                        a_szTwmemref = EventToCsv(twevent);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_EXTIMAGEINFO...\r\n                case (int)TWAIN.DAT.EXTIMAGEINFO:\r\n                    {\r\n                        TWAIN.TW_EXTIMAGEINFO twextimageinfo = default(TWAIN.TW_EXTIMAGEINFO);\r\n                        CsvToExtimageinfo(ref twextimageinfo, a_szTwmemref);\r\n                        sts = DatExtimageinfo((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twextimageinfo);\r\n                        a_szTwmemref = ExtimageinfoToCsv(twextimageinfo);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_FILESYSTEM...\r\n                case (int)TWAIN.DAT.FILESYSTEM:\r\n                    {\r\n                        TWAIN.TW_FILESYSTEM twfilesystem = default(TWAIN.TW_FILESYSTEM);\r\n                        CsvToFilesystem(ref twfilesystem, a_szTwmemref);\r\n                        sts = DatFilesystem((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twfilesystem);\r\n                        a_szTwmemref = FilesystemToCsv(twfilesystem);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_FILTER...\r\n                case (int)TWAIN.DAT.FILTER:\r\n                    {\r\n                        //TWAIN.TW_FILTER twfilter = default(TWAIN.TW_FILTER);\r\n                        //m_twain.CsvToFilter(ref twfilter, a_szTwmemref);\r\n                        //sts = m_twain.DatFilter((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twfilter);\r\n                        //a_szTwmemref = m_twain.FilterToCsv(twfilter);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_GRAYRESPONSE...\r\n                case (int)TWAIN.DAT.GRAYRESPONSE:\r\n                    {\r\n                        //TWAIN.TW_GRAYRESPONSE twgrayresponse = default(TWAIN.TW_GRAYRESPONSE);\r\n                        //m_twain.CsvToGrayresponse(ref twgrayresponse, a_szTwmemref);\r\n                        //sts = m_twain.DatGrayresponse((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twgrayresponse);\r\n                        //a_szTwmemref = m_twain.GrayresponseToCsv(twgrayresponse);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_ICCPROFILE...\r\n                case (int)TWAIN.DAT.ICCPROFILE:\r\n                    {\r\n                        TWAIN.TW_MEMORY twmemory = default(TWAIN.TW_MEMORY);\r\n                        sts = DatIccprofile((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twmemory);\r\n                        a_szTwmemref = IccprofileToCsv(twmemory);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_IDENTITY...\r\n                case (int)TWAIN.DAT.IDENTITY:\r\n                    {\r\n                        TWAIN.TW_IDENTITY twidentity = default(TWAIN.TW_IDENTITY);\r\n                        switch (iMsg)\r\n                        {\r\n                            default:\r\n                                break;\r\n                            case (int)TWAIN.MSG.SET:\r\n                            case (int)TWAIN.MSG.OPENDS:\r\n                                CsvToIdentity(ref twidentity, a_szTwmemref);\r\n                                break;\r\n                        }\r\n                        sts = DatIdentity((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twidentity);\r\n                        a_szTwmemref = IdentityToCsv(twidentity);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_IMAGEFILEXFER...\r\n                case (int)TWAIN.DAT.IMAGEFILEXFER:\r\n                    {\r\n                        sts = DatImagefilexfer((TWAIN.DG)iDg, (TWAIN.MSG)iMsg);\r\n                        a_szTwmemref = \"\";\r\n                    }\r\n                    break;\r\n\r\n                // DAT_IMAGEINFO...\r\n                case (int)TWAIN.DAT.IMAGEINFO:\r\n                    {\r\n                        TWAIN.TW_IMAGEINFO twimageinfo = default(TWAIN.TW_IMAGEINFO);\r\n                        CsvToImageinfo(ref twimageinfo, a_szTwmemref);\r\n                        sts = DatImageinfo((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twimageinfo);\r\n                        a_szTwmemref = ImageinfoToCsv(twimageinfo);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_IMAGELAYOUT...\r\n                case (int)TWAIN.DAT.IMAGELAYOUT:\r\n                    {\r\n                        TWAIN.TW_IMAGELAYOUT twimagelayout = default(TWAIN.TW_IMAGELAYOUT);\r\n                        CsvToImagelayout(ref twimagelayout, a_szTwmemref);\r\n                        sts = DatImagelayout((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twimagelayout);\r\n                        a_szTwmemref = ImagelayoutToCsv(twimagelayout);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_IMAGEMEMFILEXFER...\r\n                case (int)TWAIN.DAT.IMAGEMEMFILEXFER:\r\n                    {\r\n                        TWAIN.TW_IMAGEMEMXFER twimagememxfer = default(TWAIN.TW_IMAGEMEMXFER);\r\n                        CsvToImagememxfer(ref twimagememxfer, a_szTwmemref);\r\n                        sts = DatImagememfilexfer((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twimagememxfer);\r\n                        a_szTwmemref = ImagememxferToCsv(twimagememxfer);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_IMAGEMEMXFER...\r\n                case (int)TWAIN.DAT.IMAGEMEMXFER:\r\n                    {\r\n                        TWAIN.TW_IMAGEMEMXFER twimagememxfer = default(TWAIN.TW_IMAGEMEMXFER);\r\n                        CsvToImagememxfer(ref twimagememxfer, a_szTwmemref);\r\n                        sts = DatImagememxfer((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twimagememxfer);\r\n                        a_szTwmemref = ImagememxferToCsv(twimagememxfer);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_IMAGENATIVEXFER...\r\n                case (int)TWAIN.DAT.IMAGENATIVEXFER:\r\n                    {\r\n                        IntPtr intptrBitmapHandle = IntPtr.Zero;\r\n                        sts = DatImagenativexferHandle((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref intptrBitmapHandle);\r\n                        a_szTwmemref = intptrBitmapHandle.ToString();\r\n                    }\r\n                    break;\r\n\r\n                // DAT_JPEGCOMPRESSION...\r\n                case (int)TWAIN.DAT.JPEGCOMPRESSION:\r\n                    {\r\n                        //TWAIN.TW_JPEGCOMPRESSION twjpegcompression = default(TWAIN.TW_JPEGCOMPRESSION);\r\n                        //m_twain.CsvToJpegcompression(ref twjpegcompression, a_szTwmemref);\r\n                        //sts = m_twain.DatJpegcompression((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twjpegcompression);\r\n                        //a_szTwmemref = m_twain.JpegcompressionToCsv(twjpegcompression);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_METRICS...\r\n                case (int)TWAIN.DAT.METRICS:\r\n                    {\r\n                        TWAIN.TW_METRICS twmetrics = default(TWAIN.TW_METRICS);\r\n                        twmetrics.SizeOf = (uint)Marshal.SizeOf(twmetrics);\r\n                        sts = DatMetrics((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twmetrics);\r\n                        a_szTwmemref = MetricsToCsv(twmetrics);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_PALETTE8...\r\n                case (int)TWAIN.DAT.PALETTE8:\r\n                    {\r\n                        //TWAIN.TW_PALETTE8 twpalette8 = default(TWAIN.TW_PALETTE8);\r\n                        //m_twain.CsvToPalette8(ref twpalette8, a_szTwmemref);\r\n                        //sts = m_twain.DatPalette8((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twpalette8);\r\n                        //a_szTwmemref = m_twain.Palette8ToCsv(twpalette8);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_PARENT...\r\n                case (int)TWAIN.DAT.PARENT:\r\n                    {\r\n                        sts = DatParent((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref m_intptrHwnd);\r\n                        a_szTwmemref = \"\";\r\n                    }\r\n                    break;\r\n\r\n                // DAT_PASSTHRU...\r\n                case (int)TWAIN.DAT.PASSTHRU:\r\n                    {\r\n                        TWAIN.TW_PASSTHRU twpassthru = default(TWAIN.TW_PASSTHRU);\r\n                        CsvToPassthru(ref twpassthru, a_szTwmemref);\r\n                        sts = DatPassthru((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twpassthru);\r\n                        a_szTwmemref = PassthruToCsv(twpassthru);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_PENDINGXFERS...\r\n                case (int)TWAIN.DAT.PENDINGXFERS:\r\n                    {\r\n                        TWAIN.TW_PENDINGXFERS twpendingxfers = default(TWAIN.TW_PENDINGXFERS);\r\n                        sts = DatPendingxfers((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twpendingxfers);\r\n                        a_szTwmemref = PendingxfersToCsv(twpendingxfers);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_RGBRESPONSE...\r\n                case (int)TWAIN.DAT.RGBRESPONSE:\r\n                    {\r\n                        //TWAIN.TW_RGBRESPONSE twrgbresponse = default(TWAIN.TW_RGBRESPONSE);\r\n                        //m_twain.CsvToRgbresponse(ref twrgbresponse, a_szTwmemref);\r\n                        //sts = m_twain.DatRgbresponse((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twrgbresponse);\r\n                        //a_szTwmemref = m_twain.RgbresponseToCsv(twrgbresponse);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_SETUPFILEXFER...\r\n                case (int)TWAIN.DAT.SETUPFILEXFER:\r\n                    {\r\n                        TWAIN.TW_SETUPFILEXFER twsetupfilexfer = default(TWAIN.TW_SETUPFILEXFER);\r\n                        CsvToSetupfilexfer(ref twsetupfilexfer, a_szTwmemref);\r\n                        sts = DatSetupfilexfer((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twsetupfilexfer);\r\n                        a_szTwmemref = SetupfilexferToCsv(twsetupfilexfer);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_SETUPMEMXFER...\r\n                case (int)TWAIN.DAT.SETUPMEMXFER:\r\n                    {\r\n                        TWAIN.TW_SETUPMEMXFER twsetupmemxfer = default(TWAIN.TW_SETUPMEMXFER);\r\n                        sts = DatSetupmemxfer((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twsetupmemxfer);\r\n                        a_szTwmemref = SetupmemxferToCsv(twsetupmemxfer);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_STATUS...\r\n                case (int)TWAIN.DAT.STATUS:\r\n                    {\r\n                        TWAIN.TW_STATUS twstatus = default(TWAIN.TW_STATUS);\r\n                        sts = DatStatus((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twstatus);\r\n                        a_szTwmemref = StatusToCsv(twstatus);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_STATUSUTF8...\r\n                case (int)TWAIN.DAT.STATUSUTF8:\r\n                    {\r\n                        TWAIN.TW_STATUSUTF8 twstatusutf8 = default(TWAIN.TW_STATUSUTF8);\r\n                        sts = DatStatusutf8((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twstatusutf8);\r\n                        a_szTwmemref = Statusutf8ToCsv(twstatusutf8);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_TWAINDIRECT...\r\n                case (int)TWAIN.DAT.TWAINDIRECT:\r\n                    {\r\n                        TWAIN.TW_TWAINDIRECT twtwaindirect = default(TWAIN.TW_TWAINDIRECT);\r\n                        CsvToTwaindirect(ref twtwaindirect, a_szTwmemref);\r\n                        sts = DatTwaindirect((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twtwaindirect);\r\n                        a_szTwmemref = TwaindirectToCsv(twtwaindirect);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_USERINTERFACE...\r\n                case (int)TWAIN.DAT.USERINTERFACE:\r\n                    {\r\n                        TWAIN.TW_USERINTERFACE twuserinterface = default(TWAIN.TW_USERINTERFACE);\r\n                        CsvToUserinterface(ref twuserinterface, a_szTwmemref);\r\n                        sts = DatUserinterface((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twuserinterface);\r\n                        a_szTwmemref = UserinterfaceToCsv(twuserinterface);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_XFERGROUP...\r\n                case (int)TWAIN.DAT.XFERGROUP:\r\n                    {\r\n                        uint uXferGroup = 0;\r\n                        sts = DatXferGroup((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref uXferGroup);\r\n                        a_szTwmemref = string.Format(\"0x{0:X}\", uXferGroup);\r\n                    }\r\n                    break;\r\n            }\r\n\r\n            // All done...\r\n            return (sts);\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        // Public Helper Functions, we're mapping TWAIN structures to strings to\r\n        // make it easier for the application to work with the data.  All of the\r\n        // functions that do that are located here...\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        #region Public Helper Functions...\r\n\r\n        /// <summary>\r\n        /// Copy intptr to intptr...\r\n        /// </summary>\r\n        /// <param name=\"dest\"></param>\r\n        /// <param name=\"src\"></param>\r\n        /// <param name=\"count\"></param>\r\n        public static void MemCpy(IntPtr dest, IntPtr src, int count)\r\n        {\r\n            if (TWAIN.GetPlatform() == TWAIN.Platform.WINDOWS)\r\n            {\r\n                NativeMethods.CopyMemory(dest, src, (uint)count);\r\n            }\r\n            else\r\n            {\r\n                NativeMethods.memcpy(dest, src, (IntPtr)count);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Safely move intptr to intptr...\r\n        /// </summary>\r\n        /// <param name=\"dest\"></param>\r\n        /// <param name=\"src\"></param>\r\n        /// <param name=\"count\"></param>\r\n        public static void MemMove(IntPtr dest, IntPtr src, int count)\r\n        {\r\n            if (TWAIN.GetPlatform() == TWAIN.Platform.WINDOWS)\r\n            {\r\n                NativeMethods.MoveMemory(dest, src, (uint)count);\r\n            }\r\n            else\r\n            {\r\n                NativeMethods.memmove(dest, src, (IntPtr)count);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Write stuff to a file without having to rebuffer it...\r\n        /// </summary>\r\n        /// <param name=\"a_szFilename\"></param>\r\n        /// <param name=\"a_intptrPtr\"></param>\r\n        /// <param name=\"a_iBytes\"></param>\r\n        /// <returns></returns>\r\n        public static int WriteImageFile(string a_szFilename, IntPtr a_intptrPtr, int a_iBytes, out string a_szFinalFilename)\r\n        {\r\n            // Init stuff...\r\n            a_szFinalFilename = \"\";\r\n\r\n            // Try to write our file...\r\n            try\r\n            {\r\n                // If we don't have an extension, try to add one...\r\n                if (!Path.GetFileName(a_szFilename).Contains(\".\") && (a_iBytes >= 2))\r\n                {\r\n                    byte[] abData = new byte[2];\r\n                    Marshal.Copy(a_intptrPtr, abData, 0, 2);\r\n                    // BMP\r\n                    if ((abData[0] == 0x42) && (abData[1] == 0x4D)) // BM\r\n                    {\r\n                        a_szFilename += \".bmp\";\r\n                    }\r\n                    else if ((abData[0] == 0x49) && (abData[1] == 0x49)) // II\r\n                    {\r\n                        a_szFilename += \".tif\";\r\n                    }\r\n                    else if ((abData[0] == 0xFF) && (abData[1] == 0xD8))\r\n                    {\r\n                        a_szFilename += \".jpg\";\r\n                    }\r\n                    else if ((abData[0] == 0x25) && (abData[1] == 0x50)) // %P\r\n                    {\r\n                        a_szFilename += \".pdf\";\r\n                    }\r\n                }\r\n\r\n                // For the caller...\r\n                a_szFinalFilename = a_szFilename;\r\n\r\n                // Handle Windows...\r\n                if (TWAIN.GetPlatform() == TWAIN.Platform.WINDOWS)\r\n                {\r\n                    IntPtr intptrFile;\r\n                    IntPtr intptrBytes = (IntPtr)a_iBytes;\r\n                    IntPtr intptrCount = (IntPtr)1;\r\n                    if (NativeMethods._wfopen_s(out intptrFile, a_szFilename, \"wb\") != 0)\r\n                    {\r\n                        return (-1);\r\n                    }\r\n                    intptrBytes = NativeMethods.fwriteWin(a_intptrPtr, intptrCount, intptrBytes, intptrFile);\r\n                    NativeMethods.fcloseWin(intptrFile);\r\n                    return ((int)intptrBytes);\r\n                }\r\n\r\n                // Handle everybody else...\r\n                else\r\n                {\r\n                    IntPtr intptrFile;\r\n                    IntPtr intptrBytes;\r\n                    intptrFile = NativeMethods.fopen(a_szFilename, \"w\");\r\n                    if (intptrFile == IntPtr.Zero)\r\n                    {\r\n                        return (-1);\r\n                    }\r\n                    intptrBytes = NativeMethods.fwrite(a_intptrPtr, (IntPtr)1, (IntPtr)a_iBytes, intptrFile);\r\n                    NativeMethods.fclose(intptrFile);\r\n                    return ((int)intptrBytes);\r\n                }\r\n            }\r\n            catch (Exception exception)\r\n            {\r\n                Log.Error(\"Write file failed <\" + a_szFilename + \"> - \" + exception.Message);\r\n                return (-1);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert the contents of an audio info to a string that we can show in\r\n        /// our simple GUI...\r\n        /// </summary>\r\n        /// <param name=\"a_twaudioinfo\">A TWAIN structure</param>\r\n        /// <returns>A CSV string of the TWAIN structure</returns>\r\n        public static string AudioinfoToCsv(TW_AUDIOINFO a_twaudioinfo)\r\n        {\r\n            try\r\n            {\r\n                CSV csv = new CSV();\r\n                csv.Add(a_twaudioinfo.Name.Get());\r\n                csv.Add(a_twaudioinfo.Reserved.ToString());\r\n                return (csv.Get());\r\n            }\r\n            catch (Exception exception)\r\n            {\r\n                Log.Error(\"***error*** - \" + exception.Message);\r\n                return (\"***error***\");\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert the contents of a callback to a string that we can show in\r\n        /// our simple GUI...\r\n        /// </summary>\r\n        /// <param name=\"a_twcallback\">A TWAIN structure</param>\r\n        /// <returns>A CSV string of the TWAIN structure</returns>\r\n        public static string CallbackToCsv(TW_CALLBACK a_twcallback)\r\n        {\r\n            try\r\n            {\r\n                CSV csv = new CSV();\r\n                csv.Add(a_twcallback.CallBackProc.ToString());\r\n                csv.Add(a_twcallback.RefCon.ToString());\r\n                csv.Add(a_twcallback.Message.ToString());\r\n                return (csv.Get());\r\n            }\r\n            catch (Exception exception)\r\n            {\r\n                Log.Error(\"***error*** - \" + exception.Message);\r\n                return (\"***error***\");\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert the contents of a string to an callback structure...\r\n        /// </summary>\r\n        /// <param name=\"a_twcallback\">A TWAIN structure</param>\r\n        /// <param name=\"a_szCallback\">A CSV string of the TWAIN structure</param>\r\n        /// <returns>True if the conversion is successful</returns>\r\n        public static bool CsvToCallback(ref TW_CALLBACK a_twcallback, string a_szCallback)\r\n        {\r\n            // Init stuff...\r\n            a_twcallback = default(TW_CALLBACK);\r\n\r\n            // Build the string...\r\n            try\r\n            {\r\n                string[] asz = CSV.Parse(a_szCallback);\r\n\r\n                // Grab the values...\r\n                a_twcallback.CallBackProc = (IntPtr)UInt64.Parse(asz[0]);\r\n                a_twcallback.RefCon = uint.Parse(asz[1]);\r\n                a_twcallback.Message = ushort.Parse(asz[2]);\r\n            }\r\n            catch (Exception exception)\r\n            {\r\n                Log.Error(\"***error*** - \" + exception.Message);\r\n                return (false);\r\n            }\r\n\r\n            // All done...\r\n            return (true);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert the contents of a callback2 to a string that we can show in\r\n        /// our simple GUI...\r\n        /// </summary>\r\n        /// <param name=\"a_twcallback2\">A TWAIN structure</param>\r\n        /// <returns>A CSV string of the TWAIN structure</returns>\r\n        public static string Callback2ToCsv(TW_CALLBACK2 a_twcallback2)\r\n        {\r\n            try\r\n            {\r\n                CSV csv = new CSV();\r\n                csv.Add(a_twcallback2.CallBackProc.ToString());\r\n                csv.Add(a_twcallback2.RefCon.ToString());\r\n                csv.Add(a_twcallback2.Message.ToString());\r\n                return (csv.Get());\r\n            }\r\n            catch (Exception exception)\r\n            {\r\n                Log.Error(\"***error*** - \" + exception.Message);\r\n                return (\"***error***\");\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert the contents of a string to an callback2 structure...\r\n        /// </summary>\r\n        /// <param name=\"a_twcallback2\">A TWAIN structure</param>\r\n        /// <param name=\"a_szCallback2\">A CSV string of the TWAIN structure</param>\r\n        /// <returns>True if the conversion is successful</returns>\r\n        public static bool CsvToCallback2(ref TW_CALLBACK2 a_twcallback2, string a_szCallback2)\r\n        {\r\n            // Init stuff...\r\n            a_twcallback2 = default(TW_CALLBACK2);\r\n\r\n            // Build the string...\r\n            try\r\n            {\r\n                string[] asz = CSV.Parse(a_szCallback2);\r\n\r\n                // Grab the values...\r\n                a_twcallback2.CallBackProc = (IntPtr)UInt64.Parse(asz[0]);\r\n                a_twcallback2.RefCon = (UIntPtr)UInt64.Parse(asz[1]);\r\n                a_twcallback2.Message = ushort.Parse(asz[2]);\r\n            }\r\n            catch (Exception exception)\r\n            {\r\n                Log.Error(\"***error*** - \" + exception.Message);\r\n                return (false);\r\n            }\r\n\r\n            // All done...\r\n            return (true);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert the contents of a capability to a string that we can show in\r\n        /// our simple GUI....\r\n        /// </summary>\r\n        /// <param name=\"a_twcapability\">A TWAIN structure</param>\r\n        /// <returns>A CSV string of the TWAIN structure</returns>\r\n        [PermissionSet(SecurityAction.LinkDemand, Name = \"FullTrust\", Unrestricted = false)]\r\n        public string CapabilityToCsv(TW_CAPABILITY a_twcapability, bool a_blUseSymbols)\r\n        {\r\n            IntPtr intptr;\r\n            IntPtr intptrLocked;\r\n            TWTY ItemType;\r\n            uint NumItems;\r\n\r\n            // Handle the container...\r\n            switch (a_twcapability.ConType)\r\n            {\r\n                default:\r\n                    return (\"(unrecognized container)\");\r\n\r\n                case TWON.ARRAY:\r\n                    {\r\n                        uint uu;\r\n                        CSV csvArray;\r\n\r\n                        // Mac has a level of indirection and a different structure (ick)...\r\n                        if (ms_platform == Platform.MACOSX)\r\n                        {\r\n                            // Crack the container...\r\n                            TW_ARRAY_MACOSX twarraymacosx = default(TW_ARRAY_MACOSX);\r\n                            intptrLocked = DsmMemLock(a_twcapability.hContainer);\r\n                            twarraymacosx = (TW_ARRAY_MACOSX)Marshal.PtrToStructure(intptrLocked, typeof(TW_ARRAY_MACOSX));\r\n                            ItemType = (TWTY)twarraymacosx.ItemType;\r\n                            NumItems = twarraymacosx.NumItems;\r\n                            intptr = (IntPtr)((UInt64)intptrLocked + (UInt64)Marshal.SizeOf(twarraymacosx));\r\n                        }\r\n                        else\r\n                        {\r\n                            // Crack the container...\r\n                            TW_ARRAY twarray = default(TW_ARRAY);\r\n                            intptrLocked = DsmMemLock(a_twcapability.hContainer);\r\n                            twarray = (TW_ARRAY)Marshal.PtrToStructure(intptrLocked, typeof(TW_ARRAY));\r\n                            ItemType = twarray.ItemType;\r\n                            NumItems = twarray.NumItems;\r\n                            intptr = (IntPtr)((UInt64)intptrLocked + (UInt64)Marshal.SizeOf(twarray));\r\n                        }\r\n\r\n                        // Start building the string...\r\n                        csvArray = Common(a_twcapability.Cap, a_twcapability.ConType, ItemType);\r\n                        csvArray.Add(NumItems.ToString());\r\n\r\n                        // Tack on the stuff from the ItemList...\r\n                        if (a_blUseSymbols)\r\n                        {\r\n                            string szValue;\r\n                            for (uu = 0; uu < NumItems; uu++)\r\n                            {\r\n                                string szItem = GetIndexedItem(a_twcapability, ItemType, intptr, (int)uu);\r\n                                szValue = CvtCapValueToEnum(a_twcapability.Cap, szItem);\r\n                                csvArray.Add(szValue);\r\n                            }\r\n                        }\r\n                        else\r\n                        {\r\n                            for (uu = 0; uu < NumItems; uu++)\r\n                            {\r\n                                csvArray.Add(GetIndexedItem(a_twcapability, ItemType, intptr, (int)uu));\r\n                            }\r\n                        }\r\n\r\n                        // All done...\r\n                        DsmMemUnlock(a_twcapability.hContainer);\r\n                        return (csvArray.Get());\r\n                    }\r\n\r\n                case TWON.ENUMERATION:\r\n                    {\r\n                        uint uu;\r\n                        CSV csvEnum;\r\n\r\n                        // Mac has a level of indirection and a different structure (ick)...\r\n                        if (ms_platform == Platform.MACOSX)\r\n                        {\r\n                            // Crack the container...\r\n                            TW_ENUMERATION_MACOSX twenumerationmacosx = default(TW_ENUMERATION_MACOSX);\r\n                            intptrLocked = DsmMemLock(a_twcapability.hContainer);\r\n                            twenumerationmacosx = (TW_ENUMERATION_MACOSX)Marshal.PtrToStructure(intptrLocked, typeof(TW_ENUMERATION_MACOSX));\r\n                            ItemType = (TWTY)twenumerationmacosx.ItemType;\r\n                            NumItems = twenumerationmacosx.NumItems;\r\n                            intptr = (IntPtr)((UInt64)intptrLocked + (UInt64)Marshal.SizeOf(twenumerationmacosx));\r\n\r\n                            // Start building the string...\r\n                            csvEnum = Common(a_twcapability.Cap, a_twcapability.ConType, ItemType);\r\n                            csvEnum.Add(NumItems.ToString());\r\n                            csvEnum.Add(twenumerationmacosx.CurrentIndex.ToString());\r\n                            csvEnum.Add(twenumerationmacosx.DefaultIndex.ToString());\r\n                        }\r\n                        // Windows or the 2.4+ Linux DSM...\r\n                        else if ((ms_platform == Platform.WINDOWS) || ((m_blFoundLatestDsm || m_blFoundLatestDsm64) && (m_linuxdsm == LinuxDsm.IsLatestDsm)))\r\n                        {\r\n                            // Crack the container...\r\n                            TW_ENUMERATION twenumeration = default(TW_ENUMERATION);\r\n                            intptrLocked = DsmMemLock(a_twcapability.hContainer);\r\n                            twenumeration = (TW_ENUMERATION)Marshal.PtrToStructure(intptrLocked, typeof(TW_ENUMERATION));\r\n                            ItemType = twenumeration.ItemType;\r\n                            NumItems = twenumeration.NumItems;\r\n                            intptr = (IntPtr)((UInt64)intptrLocked + (UInt64)Marshal.SizeOf(twenumeration));\r\n\r\n                            // Start building the string...\r\n                            csvEnum = Common(a_twcapability.Cap, a_twcapability.ConType, ItemType);\r\n                            csvEnum.Add(NumItems.ToString());\r\n                            csvEnum.Add(twenumeration.CurrentIndex.ToString());\r\n                            csvEnum.Add(twenumeration.DefaultIndex.ToString());\r\n                        }\r\n                        // The -2.3 Linux DSM...\r\n                        else if (m_blFound020302Dsm64bit && (m_linuxdsm == LinuxDsm.Is020302Dsm64bit))\r\n                        {\r\n                            // Crack the container...\r\n                            TW_ENUMERATION_LINUX64 twenumerationlinux64 = default(TW_ENUMERATION_LINUX64);\r\n                            intptrLocked = DsmMemLock(a_twcapability.hContainer);\r\n                            twenumerationlinux64 = (TW_ENUMERATION_LINUX64)Marshal.PtrToStructure(intptrLocked, typeof(TW_ENUMERATION_LINUX64));\r\n                            ItemType = twenumerationlinux64.ItemType;\r\n                            NumItems = (uint)twenumerationlinux64.NumItems;\r\n                            intptr = (IntPtr)((UInt64)intptrLocked + (UInt64)Marshal.SizeOf(twenumerationlinux64));\r\n\r\n                            // Start building the string...\r\n                            csvEnum = Common(a_twcapability.Cap, a_twcapability.ConType, ItemType);\r\n                            csvEnum.Add(NumItems.ToString());\r\n                            csvEnum.Add(twenumerationlinux64.CurrentIndex.ToString());\r\n                            csvEnum.Add(twenumerationlinux64.DefaultIndex.ToString());\r\n                        }\r\n                        // This shouldn't be possible, but what the hey...\r\n                        else\r\n                        {\r\n                            Log.Error(\"This is serious, you win a cookie for getting here...\");\r\n                            DsmMemUnlock(a_twcapability.hContainer);\r\n                            return (\"\");\r\n                        }\r\n\r\n                        // Tack on the stuff from the ItemList...\r\n                        if (a_blUseSymbols)\r\n                        {\r\n                            string szValue;\r\n                            for (uu = 0; uu < NumItems; uu++)\r\n                            {\r\n                                string szItem = GetIndexedItem(a_twcapability, ItemType, intptr, (int)uu);\r\n                                szValue = CvtCapValueToEnum(a_twcapability.Cap, szItem);\r\n                                csvEnum.Add(szValue);\r\n                            }\r\n                        }\r\n                        else\r\n                        {\r\n                            for (uu = 0; uu < NumItems; uu++)\r\n                            {\r\n                                csvEnum.Add(GetIndexedItem(a_twcapability, ItemType, intptr, (int)uu));\r\n                            }\r\n                        }\r\n\r\n                        // All done...\r\n                        DsmMemUnlock(a_twcapability.hContainer);\r\n                        return (csvEnum.Get());\r\n                    }\r\n\r\n                case TWON.ONEVALUE:\r\n                    {\r\n                        CSV csvOnevalue;\r\n\r\n                        // Mac has a level of indirection and a different structure (ick)...\r\n                        if (ms_platform == Platform.MACOSX)\r\n                        {\r\n                            // Crack the container...\r\n                            TW_ONEVALUE_MACOSX twonevaluemacosx = default(TW_ONEVALUE_MACOSX);\r\n                            intptrLocked = DsmMemLock(a_twcapability.hContainer);\r\n                            twonevaluemacosx = (TW_ONEVALUE_MACOSX)Marshal.PtrToStructure(intptrLocked, typeof(TW_ONEVALUE_MACOSX));\r\n                            ItemType = (TWTY)twonevaluemacosx.ItemType;\r\n                            intptr = (IntPtr)((UInt64)intptrLocked + (UInt64)Marshal.SizeOf(twonevaluemacosx));\r\n                        }\r\n                        else\r\n                        {\r\n                            // Crack the container...\r\n                            TW_ONEVALUE twonevalue = default(TW_ONEVALUE);\r\n                            intptrLocked = DsmMemLock(a_twcapability.hContainer);\r\n                            twonevalue = (TW_ONEVALUE)Marshal.PtrToStructure(intptrLocked, typeof(TW_ONEVALUE));\r\n                            ItemType = (TWTY)twonevalue.ItemType;\r\n                            intptr = (IntPtr)((UInt64)intptrLocked + (UInt64)Marshal.SizeOf(twonevalue));\r\n                        }\r\n\r\n                        // Start building the string...\r\n                        csvOnevalue = Common(a_twcapability.Cap, a_twcapability.ConType, ItemType);\r\n\r\n                        // Tack on the stuff from the Item...\r\n                        if (a_blUseSymbols)\r\n                        {\r\n                            string szValue;\r\n                            string szItem = GetIndexedItem(a_twcapability, ItemType, intptr, 0);\r\n                            szValue = CvtCapValueToEnum(a_twcapability.Cap, szItem);\r\n                            csvOnevalue.Add(szValue);\r\n                        }\r\n                        else\r\n                        {\r\n                            csvOnevalue.Add(GetIndexedItem(a_twcapability, ItemType, intptr, 0));\r\n                        }\r\n\r\n                        // All done...\r\n                        DsmMemUnlock(a_twcapability.hContainer);\r\n                        return (csvOnevalue.Get());\r\n                    }\r\n\r\n                case TWON.RANGE:\r\n                    {\r\n                        CSV csvRange;\r\n                        string szTmp;\r\n                        TW_RANGE twrange;\r\n                        TW_RANGE_LINUX64 twrangelinux64;\r\n                        TW_RANGE_MACOSX twrangemacosx;\r\n                        TW_RANGE_FIX32 twrangefix32;\r\n                        TW_RANGE_FIX32_MACOSX twrangefix32macosx;\r\n\r\n                        // Mac has a level of indirection and a different structure (ick)...\r\n                        twrange = default(TW_RANGE);\r\n                        if (ms_platform == Platform.MACOSX)\r\n                        {\r\n                            intptrLocked = DsmMemLock(a_twcapability.hContainer);\r\n                            twrangemacosx = (TW_RANGE_MACOSX)Marshal.PtrToStructure(intptrLocked, typeof(TW_RANGE_MACOSX));\r\n                            twrangefix32macosx = (TW_RANGE_FIX32_MACOSX)Marshal.PtrToStructure(intptrLocked, typeof(TW_RANGE_FIX32_MACOSX));\r\n                            twrange.ItemType = (TWTY)twrangemacosx.ItemType;\r\n                            twrange.MinValue = twrangemacosx.MinValue;\r\n                            twrange.MaxValue = twrangemacosx.MaxValue;\r\n                            twrange.StepSize = twrangemacosx.StepSize;\r\n                            twrange.DefaultValue = twrangemacosx.DefaultValue;\r\n                            twrange.CurrentValue = twrangemacosx.CurrentValue;\r\n                            twrangefix32.ItemType = (TWTY)twrangefix32macosx.ItemType;\r\n                            twrangefix32.MinValue = twrangefix32macosx.MinValue;\r\n                            twrangefix32.MaxValue = twrangefix32macosx.MaxValue;\r\n                            twrangefix32.StepSize = twrangefix32macosx.StepSize;\r\n                            twrangefix32.DefaultValue = twrangefix32macosx.DefaultValue;\r\n                            twrangefix32.CurrentValue = twrangefix32macosx.CurrentValue;\r\n                        }\r\n                        // Windows or the 2.4+ Linux DSM...\r\n                        else if ((ms_platform == Platform.WINDOWS) || (m_linuxdsm == LinuxDsm.IsLatestDsm) || ((m_blFoundLatestDsm || m_blFoundLatestDsm64) && (m_linuxdsm == LinuxDsm.IsLatestDsm)))\r\n                        {\r\n                            intptrLocked = DsmMemLock(a_twcapability.hContainer);\r\n                            twrange = (TW_RANGE)Marshal.PtrToStructure(intptrLocked, typeof(TW_RANGE));\r\n                            twrangefix32 = (TW_RANGE_FIX32)Marshal.PtrToStructure(intptrLocked, typeof(TW_RANGE_FIX32));\r\n                        }\r\n                        // The -2.3 Linux DSM...\r\n                        else\r\n                        {\r\n                            intptrLocked = DsmMemLock(a_twcapability.hContainer);\r\n                            twrangelinux64 = (TW_RANGE_LINUX64)Marshal.PtrToStructure(intptrLocked, typeof(TW_RANGE_LINUX64));\r\n                            twrangefix32macosx = (TW_RANGE_FIX32_MACOSX)Marshal.PtrToStructure(intptrLocked, typeof(TW_RANGE_FIX32_MACOSX));\r\n                            twrange.ItemType = (TWTY)twrangelinux64.ItemType;\r\n                            twrange.MinValue = (uint)twrangelinux64.MinValue;\r\n                            twrange.MaxValue = (uint)twrangelinux64.MaxValue;\r\n                            twrange.StepSize = (uint)twrangelinux64.StepSize;\r\n                            twrange.DefaultValue = (uint)twrangelinux64.DefaultValue;\r\n                            twrange.CurrentValue = (uint)twrangelinux64.CurrentValue;\r\n                            twrangefix32.ItemType = (TWTY)twrangefix32macosx.ItemType;\r\n                            twrangefix32.MinValue = twrangefix32macosx.MinValue;\r\n                            twrangefix32.MaxValue = twrangefix32macosx.MaxValue;\r\n                            twrangefix32.StepSize = twrangefix32macosx.StepSize;\r\n                            twrangefix32.DefaultValue = twrangefix32macosx.DefaultValue;\r\n                            twrangefix32.CurrentValue = twrangefix32macosx.CurrentValue;\r\n                        }\r\n\r\n                        // Start the string...\r\n                        csvRange = Common(a_twcapability.Cap, a_twcapability.ConType, twrange.ItemType);\r\n\r\n                        // Tack on the data...\r\n                        switch ((TWTY)twrange.ItemType)\r\n                        {\r\n                            default:\r\n                                DsmMemUnlock(a_twcapability.hContainer);\r\n                                return (\"(Get Capability: unrecognized data type)\");\r\n\r\n                            case TWTY.INT8:\r\n                                csvRange.Add(((char)(twrange.MinValue)).ToString());\r\n                                csvRange.Add(((char)(twrange.MaxValue)).ToString());\r\n                                csvRange.Add(((char)(twrange.StepSize)).ToString());\r\n                                csvRange.Add(((char)(twrange.DefaultValue)).ToString());\r\n                                csvRange.Add(((char)(twrange.CurrentValue)).ToString());\r\n                                DsmMemUnlock(a_twcapability.hContainer);\r\n                                return (csvRange.Get());\r\n\r\n                            case TWTY.INT16:\r\n                                csvRange.Add(((short)(twrange.MinValue)).ToString());\r\n                                csvRange.Add(((short)(twrange.MaxValue)).ToString());\r\n                                csvRange.Add(((short)(twrange.StepSize)).ToString());\r\n                                csvRange.Add(((short)(twrange.DefaultValue)).ToString());\r\n                                csvRange.Add(((short)(twrange.CurrentValue)).ToString());\r\n                                DsmMemUnlock(a_twcapability.hContainer);\r\n                                return (csvRange.Get());\r\n\r\n                            case TWTY.INT32:\r\n                                csvRange.Add(((int)(twrange.MinValue)).ToString());\r\n                                csvRange.Add(((int)(twrange.MaxValue)).ToString());\r\n                                csvRange.Add(((int)(twrange.StepSize)).ToString());\r\n                                csvRange.Add(((int)(twrange.DefaultValue)).ToString());\r\n                                csvRange.Add(((int)(twrange.CurrentValue)).ToString());\r\n                                DsmMemUnlock(a_twcapability.hContainer);\r\n                                return (csvRange.Get());\r\n\r\n                            case TWTY.UINT8:\r\n                                csvRange.Add(((byte)(twrange.MinValue)).ToString());\r\n                                csvRange.Add(((byte)(twrange.MaxValue)).ToString());\r\n                                csvRange.Add(((byte)(twrange.StepSize)).ToString());\r\n                                csvRange.Add(((byte)(twrange.DefaultValue)).ToString());\r\n                                csvRange.Add(((byte)(twrange.CurrentValue)).ToString());\r\n                                DsmMemUnlock(a_twcapability.hContainer);\r\n                                return (csvRange.Get());\r\n\r\n                            case TWTY.BOOL:\r\n                            case TWTY.UINT16:\r\n                                csvRange.Add(((ushort)(twrange.MinValue)).ToString());\r\n                                csvRange.Add(((ushort)(twrange.MaxValue)).ToString());\r\n                                csvRange.Add(((ushort)(twrange.StepSize)).ToString());\r\n                                csvRange.Add(((ushort)(twrange.DefaultValue)).ToString());\r\n                                csvRange.Add(((ushort)(twrange.CurrentValue)).ToString());\r\n                                DsmMemUnlock(a_twcapability.hContainer);\r\n                                return (csvRange.Get());\r\n\r\n                            case TWTY.UINT32:\r\n                                csvRange.Add(((uint)(twrange.MinValue)).ToString());\r\n                                csvRange.Add(((uint)(twrange.MaxValue)).ToString());\r\n                                csvRange.Add(((uint)(twrange.StepSize)).ToString());\r\n                                csvRange.Add(((uint)(twrange.DefaultValue)).ToString());\r\n                                csvRange.Add(((uint)(twrange.CurrentValue)).ToString());\r\n                                DsmMemUnlock(a_twcapability.hContainer);\r\n                                return (csvRange.Get());\r\n\r\n                            case TWTY.FIX32:\r\n                                szTmp = ((double)twrangefix32.MinValue.Whole + ((double)twrangefix32.MinValue.Frac / 65536.0)).ToString(\"0.\" + new string('#', 339));\r\n                                csvRange.Add(szTmp);\r\n                                szTmp = ((double)twrangefix32.MaxValue.Whole + ((double)twrangefix32.MaxValue.Frac / 65536.0)).ToString(\"0.\" + new string('#', 339));\r\n                                csvRange.Add(szTmp);\r\n                                szTmp = ((double)twrangefix32.StepSize.Whole + ((double)twrangefix32.StepSize.Frac / 65536.0)).ToString(\"0.\" + new string('#', 339));\r\n                                csvRange.Add(szTmp);\r\n                                szTmp = ((double)twrangefix32.DefaultValue.Whole + ((double)twrangefix32.DefaultValue.Frac / 65536.0)).ToString(\"0.\" + new string('#', 339));\r\n                                csvRange.Add(szTmp);\r\n                                szTmp = ((double)twrangefix32.CurrentValue.Whole + ((double)twrangefix32.CurrentValue.Frac / 65536.0)).ToString(\"0.\" + new string('#', 339));\r\n                                csvRange.Add(szTmp);\r\n                                DsmMemUnlock(a_twcapability.hContainer);\r\n                                return (csvRange.Get());\r\n                        }\r\n                    }\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert the contents of a string into something we can poke into a\r\n        /// TW_CAPABILITY structure...\r\n        /// </summary>\r\n        /// <param name=\"a_twcapability\">A TWAIN structure</param>\r\n        /// <param name=\"a_szSetting\">A CSV string of the TWAIN structure</param>\r\n        /// <param name=\"a_szValue\">The container for this capability</param>\r\n        /// <returns>True if the conversion is successful</returns>\r\n        [PermissionSet(SecurityAction.LinkDemand, Name = \"FullTrust\", Unrestricted = false)]\r\n        public bool CsvToCapability(ref TW_CAPABILITY a_twcapability, ref string a_szSetting, string a_szValue)\r\n        {\r\n            int ii = 0;\r\n            TWTY twty = TWTY.BOOL;\r\n            uint u32NumItems = 0;\r\n            IntPtr intptr = IntPtr.Zero;\r\n            string szResult;\r\n            string[] asz;\r\n\r\n            // We need some protection for this one...\r\n            try\r\n            {\r\n                // Tokenize our values...\r\n                asz = CSV.Parse(a_szValue);\r\n                if (asz.GetLength(0) < 1)\r\n                {\r\n                    a_szSetting = \"Set Capability: (insufficient number of arguments)\";\r\n                    return (false);\r\n                }\r\n\r\n                // Set the capability from text or hex...\r\n                try\r\n                {\r\n                    // see if it is a custom cap\r\n                    if ((asz[0][0] == '8') || asz[0].StartsWith(\"0x8\"))\r\n                    {\r\n                        a_twcapability.Cap = (CAP)0xFFFF;\r\n                    }\r\n                    else if (asz[0].StartsWith(\"0x\"))\r\n                    {\r\n                        int iNum = 0;\r\n                        int.TryParse(asz[0].Substring(2), NumberStyles.AllowHexSpecifier | NumberStyles.HexNumber, CultureInfo.InvariantCulture, out iNum);\r\n                        a_twcapability.Cap = (CAP)iNum;\r\n                    }\r\n                    else\r\n                    {\r\n                        a_twcapability.Cap = (CAP)Enum.Parse(typeof(CAP), asz[0], true);\r\n\t\t\t\t\t}\r\n                }\r\n                catch\r\n                {\r\n                    // don't log this exception...\r\n                    a_twcapability.Cap = (CAP)0xFFFF;\r\n                }\r\n                if ((a_twcapability.Cap == (CAP)0xFFFF) || !asz[0].Contains(\"_\"))\r\n                {\r\n                    a_twcapability.Cap = (CAP)Convert.ToUInt16(asz[0], 16);\r\n                }\r\n\r\n                // Set the container from text or decimal...\r\n                if (asz.GetLength(0) >= 2)\r\n                {\r\n                    try\r\n                    {\r\n                        a_twcapability.ConType = (TWON)Enum.Parse(typeof(TWON), asz[1].Replace(\"TWON_\", \"\").Replace(\"twon_\", \"\"), true);\r\n                    }\r\n                    catch\r\n                    {\r\n                        // don't log this exception...\r\n                        a_twcapability.ConType = (TWON)ushort.Parse(asz[1]);\r\n                    }\r\n                }\r\n\r\n                // Set the item type from text or decimal...\r\n                if (asz.GetLength(0) >= 3)\r\n                {\r\n                    try\r\n                    {\r\n                        twty = (TWTY)Enum.Parse(typeof(TWTY), asz[2].Replace(\"TWTY_\", \"\").Replace(\"twty_\", \"\"), true);\r\n                    }\r\n                    catch\r\n                    {\r\n                        // don't log this exception...\r\n                        twty = (TWTY)ushort.Parse(asz[2]);\r\n                    }\r\n                }\r\n\r\n                // Assign the new value...\r\n                if (asz.GetLength(0) >= 4)\r\n                {\r\n                    switch (a_twcapability.ConType)\r\n                    {\r\n                        default:\r\n                            a_szSetting = \"(unrecognized container)\";\r\n                            return (false);\r\n\r\n                        case TWON.ARRAY:\r\n                            // Validate...\r\n                            if (asz.GetLength(0) < 4)\r\n                            {\r\n                                a_szSetting = \"Set Capability: (insufficient number of arguments)\";\r\n                                return (false);\r\n                            }\r\n\r\n                            // Get the values...\r\n                            u32NumItems = uint.Parse(asz[3]);\r\n\r\n                            // Allocate the container (go for worst case, which is TW_STR255)...\r\n                            if (ms_platform == Platform.MACOSX)\r\n                            {\r\n                                // Allocate...\r\n                                a_twcapability.hContainer = DsmMemAlloc((uint)(Marshal.SizeOf(default(TW_ARRAY_MACOSX)) + (((int)u32NumItems + 1) * Marshal.SizeOf(default(TW_STR255)))));\r\n                                intptr = DsmMemLock(a_twcapability.hContainer);\r\n\r\n                                // Set the meta data...\r\n                                TW_ARRAY_MACOSX twarraymacosx = default(TW_ARRAY_MACOSX);\r\n                                twarraymacosx.ItemType = (uint)twty;\r\n                                twarraymacosx.NumItems = u32NumItems;\r\n                                Marshal.StructureToPtr(twarraymacosx, intptr, true);\r\n\r\n                                // Get the pointer to the ItemList...\r\n                                intptr = (IntPtr)((UInt64)intptr + (UInt64)Marshal.SizeOf(twarraymacosx));\r\n                            }\r\n                            else\r\n                            {\r\n                                // Allocate...\r\n                                a_twcapability.hContainer = DsmMemAlloc((uint)(Marshal.SizeOf(default(TW_ARRAY)) + (((int)u32NumItems + 1) * Marshal.SizeOf(default(TW_STR255)))));\r\n                                intptr = DsmMemLock(a_twcapability.hContainer);\r\n\r\n                                // Set the meta data...\r\n                                TW_ARRAY twarray = default(TW_ARRAY);\r\n                                twarray.ItemType = twty;\r\n                                twarray.NumItems = u32NumItems;\r\n                                Marshal.StructureToPtr(twarray, intptr, true);\r\n\r\n                                // Get the pointer to the ItemList...\r\n                                intptr = (IntPtr)((UInt64)intptr + (UInt64)Marshal.SizeOf(twarray));\r\n                            }\r\n\r\n                            // Set the ItemList...\r\n                            for (ii = 0; (ii < u32NumItems) && ((ii + 4) < asz.Length); ii++)\r\n                            {\r\n                                szResult = SetIndexedItem(a_twcapability, twty, intptr, ii, asz[ii + 4]);\r\n                                if (szResult != \"\")\r\n                                {\r\n                                    return (false);\r\n                                }\r\n                            }\r\n\r\n                            // All done...\r\n                            DsmMemUnlock(a_twcapability.hContainer);\r\n                            return (true);\r\n\r\n                        case TWON.ENUMERATION:\r\n                            // Validate...\r\n                            if (asz.GetLength(0) < 6)\r\n                            {\r\n                                a_szSetting = \"Set Capability: (insufficient number of arguments)\";\r\n                                return (false);\r\n                            }\r\n\r\n                            // Get the values...\r\n                            u32NumItems = uint.Parse(asz[3]);\r\n\r\n                            // Allocate the container (go for worst case, which is TW_STR255)...\r\n                            if (ms_platform == Platform.MACOSX)\r\n                            {\r\n                                // Allocate...\r\n                                a_twcapability.hContainer = DsmMemAlloc((uint)(Marshal.SizeOf(default(TW_ENUMERATION_MACOSX)) + (((int)u32NumItems + 1) * Marshal.SizeOf(default(TW_STR255)))));\r\n                                intptr = DsmMemLock(a_twcapability.hContainer);\r\n\r\n                                // Set the meta data...\r\n                                TW_ENUMERATION_MACOSX twenumerationmacosx = default(TW_ENUMERATION_MACOSX);\r\n                                twenumerationmacosx.ItemType = (uint)twty;\r\n                                twenumerationmacosx.NumItems = u32NumItems;\r\n                                twenumerationmacosx.CurrentIndex = uint.Parse(asz[4]);\r\n                                twenumerationmacosx.DefaultIndex = uint.Parse(asz[5]);\r\n                                Marshal.StructureToPtr(twenumerationmacosx, intptr, true);\r\n\r\n                                // Get the pointer to the ItemList...\r\n                                intptr = (IntPtr)((UInt64)intptr + (UInt64)Marshal.SizeOf(twenumerationmacosx));\r\n                            }\r\n                            // Windows or the 2.4+ Linux DSM...\r\n                            else if ((ms_platform == Platform.WINDOWS) || ((m_linuxdsm == LinuxDsm.IsLatestDsm) || ((m_blFoundLatestDsm || m_blFoundLatestDsm64) && (m_linuxdsm == LinuxDsm.IsLatestDsm))))\r\n                            {\r\n                                // Allocate...\r\n                                a_twcapability.hContainer = DsmMemAlloc((uint)(Marshal.SizeOf(default(TW_ENUMERATION)) + (((int)u32NumItems + 1) * Marshal.SizeOf(default(TW_STR255)))));\r\n                                intptr = DsmMemLock(a_twcapability.hContainer);\r\n\r\n                                // Set the meta data...\r\n                                TW_ENUMERATION twenumeration = default(TW_ENUMERATION);\r\n                                twenumeration.ItemType = twty;\r\n                                twenumeration.NumItems = u32NumItems;\r\n                                twenumeration.CurrentIndex = uint.Parse(asz[4]);\r\n                                twenumeration.DefaultIndex = uint.Parse(asz[5]);\r\n                                Marshal.StructureToPtr(twenumeration, intptr, true);\r\n\r\n                                // Get the pointer to the ItemList...\r\n                                intptr = (IntPtr)((UInt64)intptr + (UInt64)Marshal.SizeOf(twenumeration));\r\n                            }\r\n                            // The -2.3 Linux DSM...\r\n                            else\r\n                            {\r\n                                // Allocate...\r\n                                a_twcapability.hContainer = DsmMemAlloc((uint)(Marshal.SizeOf(default(TW_ENUMERATION_LINUX64)) + (((int)u32NumItems + 1) * Marshal.SizeOf(default(TW_STR255)))));\r\n                                intptr = DsmMemLock(a_twcapability.hContainer);\r\n\r\n                                // Set the meta data...\r\n                                TW_ENUMERATION_LINUX64 twenumerationlinux64 = default(TW_ENUMERATION_LINUX64);\r\n                                twenumerationlinux64.ItemType = twty;\r\n                                twenumerationlinux64.NumItems = u32NumItems;\r\n                                twenumerationlinux64.CurrentIndex = uint.Parse(asz[4]);\r\n                                twenumerationlinux64.DefaultIndex = uint.Parse(asz[5]);\r\n                                Marshal.StructureToPtr(twenumerationlinux64, intptr, true);\r\n\r\n                                // Get the pointer to the ItemList...\r\n                                intptr = (IntPtr)((UInt64)intptr + (UInt64)Marshal.SizeOf(twenumerationlinux64));\r\n                            }\r\n\r\n                            // Set the ItemList...\r\n                            for (ii = 0; ii < u32NumItems; ii++)\r\n                            {\r\n                                szResult = SetIndexedItem(a_twcapability, twty, intptr, ii, asz[ii + 6]);\r\n                                if (szResult != \"\")\r\n                                {\r\n                                    return (false);\r\n                                }\r\n                            }\r\n\r\n                            // All done...\r\n                            DsmMemUnlock(a_twcapability.hContainer);\r\n                            return (true);\r\n\r\n                        case TWON.ONEVALUE:\r\n                            // Validate...\r\n                            if (asz.GetLength(0) < 4)\r\n                            {\r\n                                a_szSetting = \"Set Capability: (insufficient number of arguments)\";\r\n                                return (false);\r\n                            }\r\n\r\n                            // Allocate the container (go for worst case, which is TW_STR255)...\r\n                            if (ms_platform == Platform.MACOSX)\r\n                            {\r\n                                // Allocate...\r\n                                a_twcapability.hContainer = DsmMemAlloc((uint)(Marshal.SizeOf(default(TW_ONEVALUE_MACOSX)) + Marshal.SizeOf(default(TW_STR255))));\r\n                                intptr = DsmMemLock(a_twcapability.hContainer);\r\n\r\n                                // Set the meta data...\r\n                                TW_ONEVALUE_MACOSX twonevaluemacosx = default(TW_ONEVALUE_MACOSX);\r\n                                twonevaluemacosx.ItemType = (uint)twty;\r\n                                Marshal.StructureToPtr(twonevaluemacosx, intptr, true);\r\n\r\n                                // Get the pointer to the ItemList...\r\n                                intptr = (IntPtr)((UInt64)intptr + (UInt64)Marshal.SizeOf(twonevaluemacosx));\r\n                            }\r\n                            else\r\n                            {\r\n                                // Allocate...\r\n                                a_twcapability.hContainer = DsmMemAlloc((uint)(Marshal.SizeOf(default(TW_ONEVALUE)) + Marshal.SizeOf(default(TW_STR255))));\r\n                                intptr = DsmMemLock(a_twcapability.hContainer);\r\n\r\n                                // Set the meta data...\r\n                                TW_ONEVALUE twonevalue = default(TW_ONEVALUE);\r\n                                twonevalue.ItemType = twty;\r\n                                Marshal.StructureToPtr(twonevalue, intptr, true);\r\n\r\n                                // Get the pointer to the ItemList...\r\n                                intptr = (IntPtr)((UInt64)intptr + (UInt64)Marshal.SizeOf(twonevalue));\r\n                            }\r\n\r\n                            // Set the Item...\r\n                            szResult = SetIndexedItem(a_twcapability, twty, intptr, 0, asz[3]);\r\n                            if (szResult != \"\")\r\n                            {\r\n                                return (false);\r\n                            }\r\n\r\n                            // All done...\r\n                            DsmMemUnlock(a_twcapability.hContainer);\r\n                            return (true);\r\n\r\n                        case TWON.RANGE:\r\n                            // Validate...\r\n                            if (asz.GetLength(0) < 8)\r\n                            {\r\n                                a_szSetting = \"Set Capability: (insufficient number of arguments)\";\r\n                                return (false);\r\n                            }\r\n\r\n                            // Allocate the container (go for worst case, which is TW_STR255)...\r\n                            if (ms_platform == Platform.MACOSX)\r\n                            {\r\n                                // Allocate...\r\n                                a_twcapability.hContainer = DsmMemAlloc((uint)(Marshal.SizeOf(default(TW_RANGE_MACOSX))));\r\n                                intptr = DsmMemLock(a_twcapability.hContainer);\r\n                            }\r\n                            // Windows or the 2.4+ Linux DSM...\r\n                            else if ((ms_platform == Platform.WINDOWS) || ((m_linuxdsm == LinuxDsm.IsLatestDsm) || ((m_blFoundLatestDsm || m_blFoundLatestDsm64) && (m_linuxdsm == LinuxDsm.IsLatestDsm))))\r\n                            {\r\n                                // Allocate...\r\n                                a_twcapability.hContainer = DsmMemAlloc((uint)(Marshal.SizeOf(default(TW_RANGE))));\r\n                                intptr = DsmMemLock(a_twcapability.hContainer);\r\n                            }\r\n                            // The -2.3 Linux DSM...\r\n                            else\r\n                            {\r\n                                // Allocate...\r\n                                a_twcapability.hContainer = DsmMemAlloc((uint)(Marshal.SizeOf(default(TW_RANGE_LINUX64))));\r\n                                intptr = DsmMemLock(a_twcapability.hContainer);\r\n                            }\r\n\r\n                            // Set the Item...\r\n                            szResult = SetRangeItem(twty, intptr, asz);\r\n                            if (szResult != \"\")\r\n                            {\r\n                                return (false);\r\n                            }\r\n\r\n                            // All done...\r\n                            DsmMemUnlock(a_twcapability.hContainer);\r\n                            return (true);\r\n                    }\r\n                }\r\n\r\n                // All done (this is good for a get where only the cap was specified)...\r\n                return (true);\r\n            }\r\n            catch (Exception exception)\r\n            {\r\n                Log.Error(\"CsvToCapability exception - \" + exception.Message);\r\n                Log.Error(\"setting=<\" + a_szSetting + \">\");\r\n                a_szValue = \"(data error)\";\r\n                return (false);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert the contents of a custom DS data to a string that we can show in\r\n        /// our simple GUI...\r\n        /// </summary>\r\n        /// <param name=\"a_twcustomdsdata\">A TWAIN structure</param>\r\n        /// <returns>A CSV string of the TWAIN structure</returns>\r\n        [PermissionSet(SecurityAction.LinkDemand, Name = \"FullTrust\", Unrestricted = false)]\r\n        public string CustomdsdataToCsv(TW_CUSTOMDSDATA a_twcustomdsdata)\r\n        {\r\n            try\r\n            {\r\n                CSV csv = new CSV();\r\n                csv.Add(a_twcustomdsdata.InfoLength.ToString());\r\n                IntPtr intptr = DsmMemLock(a_twcustomdsdata.hData);\r\n                csv.Add(intptr.ToString());\r\n                DsmMemUnlock(a_twcustomdsdata.hData);\r\n                return (csv.Get());\r\n            }\r\n            catch (Exception exception)\r\n            {\r\n                Log.Error(\"***error*** - \" + exception.Message);\r\n                return (\"***error***\");\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert the contents of a string to a custom DS data structure...\r\n        /// </summary>\r\n        /// <param name=\"a_twcustomdsdata\">A TWAIN structure</param>\r\n        /// <param name=\"a_szCustomdsdata\">A CSV string of the TWAIN structure</param>\r\n        /// <returns>True if the conversion is successful</returns>\r\n        [PermissionSet(SecurityAction.LinkDemand, Name = \"FullTrust\", Unrestricted = false)]\r\n        public bool CsvToCustomdsdata(ref TW_CUSTOMDSDATA a_twcustomdsdata, string a_szCustomdsdata)\r\n        {\r\n            // Init stuff...\r\n            a_twcustomdsdata = default(TW_CUSTOMDSDATA);\r\n\r\n            // Build the string...\r\n            try\r\n            {\r\n                string[] asz = CSV.Parse(a_szCustomdsdata);\r\n\r\n                // Grab the values...\r\n                a_twcustomdsdata.InfoLength = uint.Parse(asz[0]);\r\n                a_twcustomdsdata.hData = DsmMemAlloc(a_twcustomdsdata.InfoLength);\r\n                IntPtr intptr = DsmMemLock(a_twcustomdsdata.hData);\r\n                byte[] bProfile = new byte[a_twcustomdsdata.InfoLength];\r\n                Marshal.Copy((IntPtr)UInt64.Parse(asz[1]), bProfile, 0, (int)a_twcustomdsdata.InfoLength);\r\n                Marshal.Copy(bProfile, 0, intptr, (int)a_twcustomdsdata.InfoLength);\r\n                DsmMemUnlock(a_twcustomdsdata.hData);\r\n            }\r\n            catch (Exception exception)\r\n            {\r\n                Log.Error(\"***error*** - \" + exception.Message);\r\n                return (false);\r\n            }\r\n\r\n            // All done...\r\n            return (true);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert the contents of a device event to a string that we can show in\r\n        /// our simple GUI...\r\n        /// </summary>\r\n        /// <param name=\"a_twdeviceevent\">A TWAIN structure</param>\r\n        /// <returns>A CSV string of the TWAIN structure</returns>\r\n        public static string DeviceeventToCsv(TW_DEVICEEVENT a_twdeviceevent)\r\n        {\r\n            try\r\n            {\r\n                CSV csv = new CSV();\r\n                csv.Add(((TWDE)a_twdeviceevent.Event).ToString());\r\n                csv.Add(a_twdeviceevent.DeviceName.Get());\r\n                csv.Add(a_twdeviceevent.BatteryMinutes.ToString());\r\n                csv.Add(a_twdeviceevent.BatteryPercentage.ToString());\r\n                csv.Add(a_twdeviceevent.PowerSupply.ToString());\r\n                csv.Add(((double)a_twdeviceevent.XResolution.Whole + ((double)a_twdeviceevent.XResolution.Frac / 65536.0)).ToString());\r\n                csv.Add(((double)a_twdeviceevent.YResolution.Whole + ((double)a_twdeviceevent.YResolution.Frac / 65536.0)).ToString());\r\n                csv.Add(a_twdeviceevent.FlashUsed2.ToString());\r\n                csv.Add(a_twdeviceevent.AutomaticCapture.ToString());\r\n                csv.Add(a_twdeviceevent.TimeBeforeFirstCapture.ToString());\r\n                csv.Add(a_twdeviceevent.TimeBetweenCaptures.ToString());\r\n                return (csv.Get());\r\n            }\r\n            catch (Exception exception)\r\n            {\r\n                Log.Error(\"***error*** - \" + exception.Message);\r\n                return (\"***error***\");\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert the contents of an entry point to a string that\r\n        /// we can show in our simple GUI...\r\n        /// </summary>\r\n        /// <param name=\"a_twentrypoint\">A TWAIN structure</param>\r\n        /// <returns>A CSV string of the TWAIN structure</returns>\r\n        public static string EntrypointToCsv(TW_ENTRYPOINT a_twentrypoint)\r\n        {\r\n            try\r\n            {\r\n                CSV csv = new CSV();\r\n                csv.Add(a_twentrypoint.Size.ToString());\r\n                csv.Add(\"0x\" + ((a_twentrypoint.DSM_Entry == null)?\"0\":a_twentrypoint.DSM_Entry.ToString(\"X\")));\r\n                csv.Add(\"0x\" + ((a_twentrypoint.DSM_MemAllocate == null) ? \"0\" : a_twentrypoint.DSM_MemAllocate.ToString(\"X\")));\r\n                csv.Add(\"0x\" + ((a_twentrypoint.DSM_MemFree == null) ? \"0\" : a_twentrypoint.DSM_MemFree.ToString(\"X\")));\r\n                csv.Add(\"0x\" + ((a_twentrypoint.DSM_MemLock == null) ? \"0\" : a_twentrypoint.DSM_MemLock.ToString(\"X\")));\r\n                csv.Add(\"0x\" + ((a_twentrypoint.DSM_MemUnlock == null) ? \"0\" : a_twentrypoint.DSM_MemUnlock.ToString(\"X\")));\r\n                return (csv.Get());\r\n            }\r\n            catch (Exception exception)\r\n            {\r\n                Log.Error(\"***error*** - \" + exception.Message);\r\n                return (\"***error***\");\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert the contents of an event to a string that\r\n        /// we can show in our simple GUI...\r\n        /// </summary>\r\n        /// <param name=\"a_twevent\">A TWAIN structure</param>\r\n        /// <returns>A CSV string of the TWAIN structure</returns>\r\n        public static string EventToCsv(TW_EVENT a_twevent)\r\n        {\r\n            try\r\n            {\r\n                CSV csv = new CSV();\r\n                csv.Add(a_twevent.pEvent.ToString());\r\n                csv.Add(a_twevent.TWMessage.ToString());\r\n                return (csv.Get());\r\n            }\r\n            catch (Exception exception)\r\n            {\r\n                Log.Error(\"***error*** - \" + exception.Message);\r\n                return (\"***error***\");\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert the contents of an extimageinfo to a string that we can show in\r\n        /// our simple GUI...\r\n        /// </summary>\r\n        /// <param name=\"a_twextimageinfo\">A TWAIN structure</param>\r\n        /// <returns>A CSV string of the TWAIN structure</returns>\r\n        public static string ExtimageinfoToCsv(TW_EXTIMAGEINFO a_twextimageinfo)\r\n        {\r\n            try\r\n            {\r\n                uint uTwinfo = 0;\r\n                CSV csv = new CSV();\r\n                csv.Add(a_twextimageinfo.NumInfos.ToString());\r\n                for (int ii = 0; (ii < a_twextimageinfo.NumInfos) && (ii < 200); ii++)\r\n                {\r\n                    TWEI twei;\r\n                    TWTY twty;\r\n                    STS sts;\r\n                    TW_INFO twinfo = default(TW_INFO);\r\n                    a_twextimageinfo.Get(uTwinfo, ref twinfo);\r\n                    twei = (TWEI)twinfo.InfoId;\r\n                    if (twei.ToString() != twinfo.InfoId.ToString())\r\n                    {\r\n                        csv.Add(\"TWEI_\" + twei.ToString());\r\n                    }\r\n                    else\r\n                    {\r\n                        csv.Add(string.Format(\"0x{0:X}\", twinfo.InfoId));\r\n                    }\r\n                    twty = (TWTY)twinfo.ItemType;\r\n                    if (twty.ToString() != twinfo.ItemType.ToString())\r\n                    {\r\n                        csv.Add(\"TWTY_\" + twty.ToString());\r\n                    }\r\n                    else\r\n                    {\r\n                        csv.Add(string.Format(\"0x{0:X}\", twinfo.ItemType));\r\n                    }\r\n                    csv.Add(twinfo.NumItems.ToString());\r\n                    sts = (STS)twinfo.ReturnCode;\r\n                    if (sts.ToString() != twinfo.ReturnCode.ToString())\r\n                    {\r\n                        csv.Add(\"TWRC_\" + sts.ToString());\r\n                    }\r\n                    else\r\n                    {\r\n                        csv.Add(string.Format(\"0x{0:X}\", twinfo.ReturnCode));\r\n                    }\r\n                    csv.Add(twinfo.Item.ToString());\r\n                    uTwinfo += 1;\r\n                }\r\n                return (csv.Get());\r\n            }\r\n            catch (Exception exception)\r\n            {\r\n                Log.Error(\"***error*** - \" + exception.Message);\r\n                return (\"***error***\");\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert the contents of a string to an extimageinfo structure,\r\n        /// note that we don't have to worry about containers going in this\r\n        /// direction...\r\n        /// </summary>\r\n        /// <param name=\"a_twextimageinfo\">A TWAIN structure</param>\r\n        /// <param name=\"a_szExtimageinfo\">A CSV string of the TWAIN structure</param>\r\n        /// <returns>True if the conversion is successful</returns>\r\n        public static bool CsvToExtimageinfo(ref TW_EXTIMAGEINFO a_twextimageinfo, string a_szExtimageinfo)\r\n        {\r\n            // Init stuff...\r\n            a_twextimageinfo = default(TW_EXTIMAGEINFO);\r\n\r\n            // Build the string...\r\n            try\r\n            {\r\n                int iField;\r\n                uint uTwinfo;\r\n                string[] asz = CSV.Parse(a_szExtimageinfo);\r\n\r\n                // Set the number of entries (this is the easy bit)...\r\n                uint.TryParse(asz[0], out a_twextimageinfo.NumInfos);\r\n                if (a_twextimageinfo.NumInfos > 200)\r\n                {\r\n                    Log.Error(\"***error*** - we're limited to 200 entries, if this is a problem, just add more, and fix this code...\");\r\n                    return (false);\r\n                }\r\n\r\n                // Okay, walk all the entries in steps of TW_INFO...\r\n                uTwinfo = 0;\r\n                for (iField = 1; iField < asz.Length; iField += 5)\r\n                {\r\n                    UInt64 u64;\r\n                    TWEI twei;\r\n                    TW_INFO twinfo = default(TW_INFO);\r\n                    if ((iField + 5) > asz.Length)\r\n                    {\r\n                        Log.Error(\"***error*** - badly constructed list, should be: num,(twinfo),(twinfo)...\");\r\n                        return (false);\r\n                    }\r\n                    if (TWEI.TryParse(asz[iField + 0].Replace(\"TWEI_\", \"\"), out twei))\r\n                    {\r\n                        twinfo.InfoId = (ushort)twei;\r\n                    }\r\n                    else\r\n                    {\r\n                        if (asz[iField + 0].ToLowerInvariant().StartsWith(\"0x\"))\r\n                        {\r\n                            ushort.TryParse(asz[iField + 0].Substring(2), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out twinfo.InfoId);\r\n                        }\r\n                        else\r\n                        {\r\n                            ushort.TryParse(asz[iField + 0], out twinfo.InfoId);\r\n                        }\r\n                    }\r\n                    // We really don't care about these...\r\n                    ushort.TryParse(asz[iField + 1], out twinfo.ItemType);\r\n                    ushort.TryParse(asz[iField + 2], out twinfo.NumItems);\r\n                    ushort.TryParse(asz[iField + 3], out twinfo.ReturnCode);\r\n                    UInt64.TryParse(asz[iField + 4], out u64);\r\n                    twinfo.Item = (UIntPtr)u64;\r\n                    a_twextimageinfo.Set(uTwinfo, ref twinfo);\r\n                    uTwinfo += 1;\r\n                }\r\n            }\r\n            catch (Exception exception)\r\n            {\r\n                Log.Error(\"***error*** - \" + exception.Message);\r\n                return (false);\r\n            }\r\n\r\n            // All done...\r\n            return (true);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert the contents of a filesystem to a string that we can show in\r\n        /// our simple GUI...\r\n        /// </summary>\r\n        /// <param name=\"a_twfilesystem\">A TWAIN structure</param>\r\n        /// <returns>A CSV string of the TWAIN structure</returns>\r\n        public static string FilesystemToCsv(TW_FILESYSTEM a_twfilesystem)\r\n        {\r\n            try\r\n            {\r\n                CSV csv = new CSV();\r\n                csv.Add(a_twfilesystem.InputName.Get());\r\n                csv.Add(a_twfilesystem.OutputName.Get());\r\n                csv.Add(a_twfilesystem.Context.ToString());\r\n                csv.Add(a_twfilesystem.Recursive.ToString());\r\n                csv.Add(a_twfilesystem.FileType.ToString());\r\n                csv.Add(a_twfilesystem.Size.ToString());\r\n                csv.Add(a_twfilesystem.CreateTimeDate.Get());\r\n                csv.Add(a_twfilesystem.ModifiedTimeDate.Get());\r\n                csv.Add(a_twfilesystem.FreeSpace.ToString());\r\n                csv.Add(a_twfilesystem.NewImageSize.ToString());\r\n                csv.Add(a_twfilesystem.NumberOfFiles.ToString());\r\n                csv.Add(a_twfilesystem.NumberOfSnippets.ToString());\r\n                csv.Add(a_twfilesystem.DeviceGroupMask.ToString());\r\n                return (csv.Get());\r\n            }\r\n            catch (Exception exception)\r\n            {\r\n                Log.Error(\"***error*** - \" + exception.Message);\r\n                return (\"***error***\");\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert the contents of a string to a filesystem structure...\r\n        /// </summary>\r\n        /// <param name=\"a_twfilesystem\">A TWAIN structure</param>\r\n        /// <param name=\"a_szFilesystem\">A CSV string of the TWAIN structure</param>\r\n        /// <returns>True if the conversion is successful</returns>\r\n        public static bool CsvToFilesystem(ref TW_FILESYSTEM a_twfilesystem, string a_szFilesystem)\r\n        {\r\n            // Init stuff...\r\n            a_twfilesystem = default(TW_FILESYSTEM);\r\n\r\n            // Build the string...\r\n            try\r\n            {\r\n                string[] asz = CSV.Parse(a_szFilesystem);\r\n\r\n                // Grab the values...\r\n                a_twfilesystem.InputName.Set(asz[0]);\r\n                a_twfilesystem.OutputName.Set(asz[1]);\r\n                a_twfilesystem.Context = (IntPtr)UInt64.Parse(asz[2]);\r\n                a_twfilesystem.Recursive = int.Parse(asz[3]);\r\n                a_twfilesystem.FileType = int.Parse(asz[4]);\r\n                a_twfilesystem.Size = uint.Parse(asz[5]);\r\n                a_twfilesystem.CreateTimeDate.Set(asz[6]);\r\n                a_twfilesystem.ModifiedTimeDate.Set(asz[7]);\r\n                a_twfilesystem.FreeSpace = (uint)UInt64.Parse(asz[8]);\r\n                a_twfilesystem.NewImageSize = (uint)UInt64.Parse(asz[9]);\r\n                a_twfilesystem.NumberOfFiles = (uint)UInt64.Parse(asz[10]);\r\n                a_twfilesystem.NumberOfSnippets = (uint)UInt64.Parse(asz[11]);\r\n                a_twfilesystem.DeviceGroupMask = (uint)UInt64.Parse(asz[12]);\r\n            }\r\n            catch (Exception exception)\r\n            {\r\n                Log.Error(\"***error*** - \" + exception.Message);\r\n                return (false);\r\n            }\r\n\r\n            // All done...\r\n            return (true);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert the contents of an iccprofile to a string that we can\r\n        /// show in our simple GUI...\r\n        /// </summary>\r\n        /// <param name=\"a_twmemory\">A TWAIN structure</param>\r\n        /// <returns>A CSV string of the TWAIN structure</returns>\r\n        public static string IccprofileToCsv(TW_MEMORY a_twmemory)\r\n        {\r\n            try\r\n            {\r\n                CSV csv = new CSV();\r\n                csv.Add(a_twmemory.Flags.ToString());\r\n                csv.Add(a_twmemory.Length.ToString());\r\n                csv.Add(a_twmemory.TheMem.ToString());\r\n                return (csv.Get());\r\n            }\r\n            catch (Exception exception)\r\n            {\r\n                Log.Error(\"***error*** - \" + exception.Message);\r\n                return (\"***error***\");\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert the contents of an identity to a string that we can show in\r\n        /// our simple GUI...\r\n        /// </summary>\r\n        /// <param name=\"a_twidentity\">A TWAIN structure</param>\r\n        /// <returns>A CSV string of the TWAIN structure</returns>\r\n        public static string IdentityToCsv(TW_IDENTITY a_twidentity)\r\n        {\r\n            try\r\n            {\r\n                CSV csv = new CSV();\r\n                csv.Add(a_twidentity.Id.ToString());\r\n                csv.Add(a_twidentity.Version.MajorNum.ToString());\r\n                csv.Add(a_twidentity.Version.MinorNum.ToString());\r\n                csv.Add(a_twidentity.Version.Language.ToString());\r\n                csv.Add(a_twidentity.Version.Country.ToString());\r\n                csv.Add(a_twidentity.Version.Info.Get());\r\n                csv.Add(a_twidentity.ProtocolMajor.ToString());\r\n                csv.Add(a_twidentity.ProtocolMinor.ToString());\r\n                csv.Add(\"0x\" + a_twidentity.SupportedGroups.ToString(\"X\"));\r\n                csv.Add(a_twidentity.Manufacturer.Get());\r\n                csv.Add(a_twidentity.ProductFamily.Get());\r\n                csv.Add(a_twidentity.ProductName.Get());\r\n                return (csv.Get());\r\n            }\r\n            catch (Exception exception)\r\n            {\r\n                Log.Error(\"***error*** - \" + exception.Message);\r\n                return (\"***error***\");\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert the contents of a string to an identity structure...\r\n        /// </summary>\r\n        /// <param name=\"a_twidentity\">A TWAIN structure</param>\r\n        /// <param name=\"a_szIdentity\">A CSV string of the TWAIN structure</param>\r\n        /// <returns>True if the conversion is successful</returns>\r\n        public static bool CsvToIdentity(ref TW_IDENTITY a_twidentity, string a_szIdentity)\r\n        {\r\n            // Init stuff...\r\n            a_twidentity = default(TW_IDENTITY);\r\n\r\n            // Build the string...\r\n            try\r\n            {\r\n                string[] asz = CSV.Parse(a_szIdentity);\r\n\r\n                // Grab the values...\r\n                a_twidentity.Id = ulong.Parse(asz[0]);\r\n                a_twidentity.Version.MajorNum = ushort.Parse(asz[1]);\r\n                a_twidentity.Version.MinorNum = ushort.Parse(asz[2]);\r\n                if (asz[3] != \"0\") a_twidentity.Version.Language = (TWLG)Enum.Parse(typeof(TWLG), asz[3]);\r\n                if (asz[4] != \"0\") a_twidentity.Version.Country = (TWCY)Enum.Parse(typeof(TWCY), asz[4]);\r\n                a_twidentity.Version.Info.Set(asz[5]);\r\n                a_twidentity.ProtocolMajor = ushort.Parse(asz[6]);\r\n                a_twidentity.ProtocolMinor = ushort.Parse(asz[7]);\r\n                a_twidentity.SupportedGroups = asz[8].ToLower().StartsWith(\"0x\") ? Convert.ToUInt32(asz[8].Remove(0, 2), 16) : Convert.ToUInt32(asz[8], 16);\r\n                a_twidentity.Manufacturer.Set(asz[9]);\r\n                a_twidentity.ProductFamily.Set(asz[10]);\r\n                a_twidentity.ProductName.Set(asz[11]);\r\n            }\r\n            catch (Exception exception)\r\n            {\r\n                Log.Error(\"***error*** - \" + exception.Message);\r\n                return (false);\r\n            }\r\n\r\n            // All done...\r\n            return (true);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert the contents of a image info to a string that we can show in\r\n        /// our simple GUI...\r\n        /// </summary>\r\n        /// <param name=\"a_twimageinfo\">A TWAIN structure</param>\r\n        /// <returns>A CSV string of the TWAIN structure</returns>\r\n        public static string ImageinfoToCsv(TW_IMAGEINFO a_twimageinfo)\r\n        {\r\n            try\r\n            {\r\n                CSV csv = new CSV();\r\n                csv.Add(((double)a_twimageinfo.XResolution.Whole + ((double)a_twimageinfo.XResolution.Frac / 65536.0)).ToString());\r\n                csv.Add(((double)a_twimageinfo.YResolution.Whole + ((double)a_twimageinfo.YResolution.Frac / 65536.0)).ToString());\r\n                csv.Add(a_twimageinfo.ImageWidth.ToString());\r\n                csv.Add(a_twimageinfo.ImageLength.ToString());\r\n                csv.Add(a_twimageinfo.SamplesPerPixel.ToString());\r\n                csv.Add(a_twimageinfo.BitsPerSample_0.ToString());\r\n                csv.Add(a_twimageinfo.BitsPerSample_1.ToString());\r\n                csv.Add(a_twimageinfo.BitsPerSample_2.ToString());\r\n                csv.Add(a_twimageinfo.BitsPerSample_3.ToString());\r\n                csv.Add(a_twimageinfo.BitsPerSample_4.ToString());\r\n                csv.Add(a_twimageinfo.BitsPerSample_5.ToString());\r\n                csv.Add(a_twimageinfo.BitsPerSample_6.ToString());\r\n                csv.Add(a_twimageinfo.BitsPerSample_7.ToString());\r\n                csv.Add(a_twimageinfo.Planar.ToString());\r\n                csv.Add(\"TWPT_\" + (TWPT)a_twimageinfo.PixelType);\r\n                csv.Add(\"TWCP_\" + (TWCP)a_twimageinfo.Compression);\r\n                return (csv.Get());\r\n            }\r\n            catch (Exception exception)\r\n            {\r\n                Log.Error(\"***error*** - \" + exception.Message);\r\n                return (\"***error***\");\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert the contents of a string to an callback structure...\r\n        /// </summary>\r\n        /// <param name=\"a_twimageinfo\">A TWAIN structure</param>\r\n        /// <param name=\"a_szImageinfo\">A CSV string of the TWAIN structure</param>\r\n        /// <returns>True if the conversion is successful</returns>\r\n        public static bool CsvToImageinfo(ref TW_IMAGEINFO a_twimageinfo, string a_szImageinfo)\r\n        {\r\n            // Init stuff...\r\n            a_twimageinfo = default(TW_IMAGEINFO);\r\n\r\n            // Build the string...\r\n            try\r\n            {\r\n                string[] asz = CSV.Parse(a_szImageinfo);\r\n\r\n                // Grab the values...\r\n                a_twimageinfo.XResolution.Whole = (short)double.Parse(asz[0]);\r\n                a_twimageinfo.XResolution.Frac = (ushort)((double.Parse(asz[0]) - (double)a_twimageinfo.XResolution.Whole) * 65536.0);\r\n                a_twimageinfo.YResolution.Whole = (short)double.Parse(asz[1]);\r\n                a_twimageinfo.YResolution.Frac = (ushort)((double.Parse(asz[1]) - (double)a_twimageinfo.YResolution.Whole) * 65536.0);\r\n                a_twimageinfo.ImageWidth = (short)double.Parse(asz[2]);\r\n                a_twimageinfo.ImageLength = int.Parse(asz[3]);\r\n                a_twimageinfo.SamplesPerPixel = short.Parse(asz[4]);\r\n                a_twimageinfo.BitsPerSample_0 = short.Parse(asz[5]);\r\n                a_twimageinfo.BitsPerSample_1 = short.Parse(asz[6]);\r\n                a_twimageinfo.BitsPerSample_2 = short.Parse(asz[7]);\r\n                a_twimageinfo.BitsPerSample_3 = short.Parse(asz[8]);\r\n                a_twimageinfo.BitsPerSample_4 = short.Parse(asz[9]);\r\n                a_twimageinfo.BitsPerSample_5 = short.Parse(asz[10]);\r\n                a_twimageinfo.BitsPerSample_6 = short.Parse(asz[11]);\r\n                a_twimageinfo.BitsPerSample_7 = short.Parse(asz[12]);\r\n                a_twimageinfo.Planar = ushort.Parse(CvtCapValueFromEnum(CAP.ICAP_PLANARCHUNKY, asz[13]));\r\n                a_twimageinfo.PixelType = short.Parse(CvtCapValueFromEnum(CAP.ICAP_PIXELTYPE, asz[14]));\r\n                a_twimageinfo.Compression = ushort.Parse(CvtCapValueFromEnum(CAP.ICAP_COMPRESSION, asz[15]));\r\n            }\r\n            catch (Exception exception)\r\n            {\r\n                Log.Error(\"***error*** - \" + exception.Message);\r\n                return (false);\r\n            }\r\n\r\n            // All done...\r\n            return (true);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert the contents of a image layout to a string that we can show in\r\n        /// our simple GUI...\r\n        /// </summary>\r\n        /// <param name=\"a_twimagelayout\">A TWAIN structure</param>\r\n        /// <returns>A CSV string of the TWAIN structure</returns>\r\n        public static string ImagelayoutToCsv(TW_IMAGELAYOUT a_twimagelayout)\r\n        {\r\n            try\r\n            {\r\n                CSV csv = new CSV();\r\n                csv.Add(((double)a_twimagelayout.Frame.Left.Whole + ((double)a_twimagelayout.Frame.Left.Frac / 65536.0)).ToString());\r\n                csv.Add(((double)a_twimagelayout.Frame.Top.Whole + ((double)a_twimagelayout.Frame.Top.Frac / 65536.0)).ToString());\r\n                csv.Add(((double)a_twimagelayout.Frame.Right.Whole + ((double)a_twimagelayout.Frame.Right.Frac / 65536.0)).ToString());\r\n                csv.Add(((double)a_twimagelayout.Frame.Bottom.Whole + ((double)a_twimagelayout.Frame.Bottom.Frac / 65536.0)).ToString());\r\n                csv.Add(a_twimagelayout.DocumentNumber.ToString());\r\n                csv.Add(a_twimagelayout.PageNumber.ToString());\r\n                csv.Add(a_twimagelayout.FrameNumber.ToString());\r\n                return (csv.Get());\r\n            }\r\n            catch (Exception exception)\r\n            {\r\n                Log.Error(\"***error*** - \" + exception.Message);\r\n                return (\"***error***\");\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert the contents of a string to an image layout structure...\r\n        /// </summary>\r\n        /// <param name=\"a_twimagelayout\">A TWAIN structure</param>\r\n        /// <param name=\"a_szImagelayout\">A CSV string of the TWAIN structure</param>\r\n        /// <returns>True if the conversion is successful</returns>\r\n        public static bool CsvToImagelayout(ref TW_IMAGELAYOUT a_twimagelayout, string a_szImagelayout)\r\n        {\r\n            // Init stuff...\r\n            a_twimagelayout = default(TW_IMAGELAYOUT);\r\n\r\n            // Build the string...\r\n            try\r\n            {\r\n                string[] asz = CSV.Parse(a_szImagelayout);\r\n\r\n                // Sort out the frame...\r\n                a_twimagelayout.Frame.Left.Whole = (short)double.Parse(asz[0]);\r\n                a_twimagelayout.Frame.Left.Frac = (ushort)((double.Parse(asz[0]) - (double)a_twimagelayout.Frame.Left.Whole) * 65536.0);\r\n                a_twimagelayout.Frame.Top.Whole = (short)double.Parse(asz[1]);\r\n                a_twimagelayout.Frame.Top.Frac = (ushort)((double.Parse(asz[1]) - (double)a_twimagelayout.Frame.Top.Whole) * 65536.0);\r\n                a_twimagelayout.Frame.Right.Whole = (short)double.Parse(asz[2]);\r\n                a_twimagelayout.Frame.Right.Frac = (ushort)((double.Parse(asz[2]) - (double)a_twimagelayout.Frame.Right.Whole) * 65536.0);\r\n                a_twimagelayout.Frame.Bottom.Whole = (short)double.Parse(asz[3]);\r\n                a_twimagelayout.Frame.Bottom.Frac = (ushort)((double.Parse(asz[3]) - (double)a_twimagelayout.Frame.Bottom.Whole) * 65536.0);\r\n\r\n                // And now the counters...\r\n                a_twimagelayout.DocumentNumber = (uint)int.Parse(asz[4]);\r\n                a_twimagelayout.PageNumber = (uint)int.Parse(asz[5]);\r\n                a_twimagelayout.FrameNumber = (uint)int.Parse(asz[6]);\r\n            }\r\n            catch (Exception exception)\r\n            {\r\n                Log.Error(\"***error*** - \" + exception.Message);\r\n                return (false);\r\n            }\r\n\r\n            // All done...\r\n            return (true);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert the contents of an image mem xfer structure to a string that\r\n        /// we can show in our simple GUI...\r\n        /// </summary>\r\n        /// <param name=\"a_twimagememxfer\">A TWAIN structure</param>\r\n        /// <returns>A CSV string of the TWAIN structure</returns>\r\n        public static string ImagememxferToCsv(TW_IMAGEMEMXFER a_twimagememxfer)\r\n        {\r\n            try\r\n            {\r\n                CSV csv = new CSV();\r\n                csv.Add(\"TWCP_\" + (TWCP)a_twimagememxfer.Compression);\r\n                csv.Add(a_twimagememxfer.BytesPerRow.ToString());\r\n                csv.Add(a_twimagememxfer.Columns.ToString());\r\n                csv.Add(a_twimagememxfer.Rows.ToString());\r\n                csv.Add(a_twimagememxfer.XOffset.ToString());\r\n                csv.Add(a_twimagememxfer.YOffset.ToString());\r\n                csv.Add(a_twimagememxfer.BytesWritten.ToString());\r\n                csv.Add(a_twimagememxfer.Memory.Flags.ToString());\r\n                csv.Add(a_twimagememxfer.Memory.Length.ToString());\r\n                csv.Add(a_twimagememxfer.Memory.TheMem.ToString());\r\n                return (csv.Get());\r\n            }\r\n            catch (Exception exception)\r\n            {\r\n                Log.Error(\"***error*** - \" + exception.Message);\r\n                return (\"***error***\");\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert the contents of a string to an image mem xfer structure...\r\n        /// </summary>\r\n        /// <param name=\"a_twimagememxfer\">A TWAIN structure</param>\r\n        /// <param name=\"a_szImagememxfer\">A CSV string of the TWAIN structure</param>\r\n        /// <returns>True if the conversion is successful</returns>\r\n        public static bool CsvToImagememxfer(ref TW_IMAGEMEMXFER a_twimagememxfer, string a_szImagememxfer)\r\n        {\r\n            // Init stuff...\r\n            a_twimagememxfer = default(TW_IMAGEMEMXFER);\r\n\r\n            // Build the string...\r\n            try\r\n            {\r\n                string[] asz = CSV.Parse(a_szImagememxfer);\r\n\r\n                // Sort out the structure...\r\n                a_twimagememxfer.Compression = ushort.Parse(CvtCapValueFromEnum(CAP.ICAP_COMPRESSION, asz[0]));\r\n                a_twimagememxfer.BytesPerRow = uint.Parse(asz[1]);\r\n                a_twimagememxfer.Columns = uint.Parse(asz[2]);\r\n                a_twimagememxfer.Rows = uint.Parse(asz[3]);\r\n                a_twimagememxfer.XOffset = uint.Parse(asz[4]);\r\n                a_twimagememxfer.YOffset = uint.Parse(asz[5]);\r\n                a_twimagememxfer.BytesWritten = uint.Parse(asz[6]);\r\n                a_twimagememxfer.Memory.Flags = ushort.Parse(asz[7]);\r\n                a_twimagememxfer.Memory.Length = uint.Parse(asz[8]);\r\n                a_twimagememxfer.Memory.TheMem = (IntPtr)ulong.Parse(asz[9]);\r\n            }\r\n            catch (Exception exception)\r\n            {\r\n                Log.Error(\"***error*** - \" + exception.Message);\r\n                return (false);\r\n            }\r\n\r\n            // All done...\r\n            return (true);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert the contents of a metrics structure to a string that\r\n        /// we can show in our simple GUI...\r\n        /// </summary>\r\n        /// <param name=\"a_twmetrics\">A TWAIN structure</param>\r\n        /// <returns>A CSV string of the TWAIN structure</returns>\r\n        public static string MetricsToCsv(TW_METRICS a_twmetrics)\r\n        {\r\n            try\r\n            {\r\n                CSV csv = new CSV();\r\n                csv.Add(a_twmetrics.SizeOf.ToString());\r\n                csv.Add(a_twmetrics.ImageCount.ToString());\r\n                csv.Add(a_twmetrics.SheetCount.ToString());\r\n                return (csv.Get());\r\n            }\r\n            catch (Exception exception)\r\n            {\r\n                Log.Error(\"***error*** - \" + exception.Message);\r\n                return (\"***error***\");\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert the contents of a patthru structure to a string that\r\n        /// we can show in our simple GUI...\r\n        /// </summary>\r\n        /// <param name=\"a_twpassthru\">A TWAIN structure</param>\r\n        /// <returns>A CSV string of the TWAIN structure</returns>\r\n        public static string PassthruToCsv(TW_PASSTHRU a_twpassthru)\r\n        {\r\n            try\r\n            {\r\n                CSV csv = new CSV();\r\n                csv.Add(a_twpassthru.pCommand.ToString());\r\n                csv.Add(a_twpassthru.CommandBytes.ToString());\r\n                csv.Add(a_twpassthru.Direction.ToString());\r\n                csv.Add(a_twpassthru.pData.ToString());\r\n                csv.Add(a_twpassthru.DataBytes.ToString());\r\n                csv.Add(a_twpassthru.DataBytesXfered.ToString());\r\n                return (csv.Get());\r\n            }\r\n            catch (Exception exception)\r\n            {\r\n                Log.Error(\"***error*** - \" + exception.Message);\r\n                return (\"***error***\");\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert the contents of a string to a passthru structure...\r\n        /// </summary>\r\n        /// <param name=\"a_twpassthru\">A TWAIN structure</param>\r\n        /// <param name=\"a_szPassthru\">A CSV string of the TWAIN structure</param>\r\n        /// <returns>True if the conversion is successful</returns>\r\n        public static bool CsvToPassthru(ref TW_PASSTHRU a_twpassthru, string a_szPassthru)\r\n        {\r\n            // Init stuff...\r\n            a_twpassthru = default(TW_PASSTHRU);\r\n\r\n            // Build the string...\r\n            try\r\n            {\r\n                string[] asz = CSV.Parse(a_szPassthru);\r\n\r\n                // Sort out the frame...\r\n                a_twpassthru.pCommand = (IntPtr)UInt64.Parse(asz[0]);\r\n                a_twpassthru.CommandBytes = uint.Parse(asz[1]);\r\n                a_twpassthru.Direction = int.Parse(asz[2]);\r\n                a_twpassthru.pData = (IntPtr)UInt64.Parse(asz[3]);\r\n                a_twpassthru.DataBytes = uint.Parse(asz[4]);\r\n                a_twpassthru.DataBytesXfered = uint.Parse(asz[5]);\r\n            }\r\n            catch (Exception exception)\r\n            {\r\n                Log.Error(\"***error*** - \" + exception.Message);\r\n                return (false);\r\n            }\r\n\r\n            // All done...\r\n            return (true);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert the contents of a pending xfers structure to a string that\r\n        /// we can show in our simple GUI...\r\n        /// </summary>\r\n        /// <param name=\"a_twsetupfilexfer\">A TWAIN structure</param>\r\n        /// <returns>A CSV string of the TWAIN structure</returns>\r\n        public static string PendingxfersToCsv(TW_PENDINGXFERS a_twpendingxfers)\r\n        {\r\n            try\r\n            {\r\n                CSV csv = new CSV();\r\n                csv.Add(a_twpendingxfers.Count.ToString());\r\n                csv.Add(a_twpendingxfers.EOJ.ToString());\r\n                return (csv.Get());\r\n            }\r\n            catch (Exception exception)\r\n            {\r\n                Log.Error(\"***error*** - \" + exception.Message);\r\n                return (\"***error***\");\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert the contents of a string to a pendingxfers structure...\r\n        /// </summary>\r\n        /// <param name=\"a_twpassthru\">A TWAIN structure</param>\r\n        /// <param name=\"a_szPassthru\">A CSV string of the TWAIN structure</param>\r\n        /// <returns>True if the conversion is successful</returns>\r\n        public static bool CsvToPendingXfers(ref TW_PENDINGXFERS a_twpendingxfers, string a_szPendingxfers)\r\n        {\r\n            // Init stuff...\r\n            a_twpendingxfers = default(TW_PENDINGXFERS);\r\n\r\n            // Build the string...\r\n            try\r\n            {\r\n                string[] asz = CSV.Parse(a_szPendingxfers);\r\n\r\n                // Sort out the frame...\r\n                a_twpendingxfers.Count = ushort.Parse(asz[0]);\r\n                a_twpendingxfers.EOJ = uint.Parse(asz[1]);\r\n            }\r\n            catch (Exception exception)\r\n            {\r\n                Log.Error(\"***error*** - \" + exception.Message);\r\n                return (false);\r\n            }\r\n\r\n            // All done...\r\n            return (true);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert the contents of a setup file xfer structure to a string that\r\n        /// we can show in our simple GUI...\r\n        /// </summary>\r\n        /// <param name=\"a_twsetupfilexfer\">A TWAIN structure</param>\r\n        /// <returns>A CSV string of the TWAIN structure</returns>\r\n        public static string SetupfilexferToCsv(TW_SETUPFILEXFER a_twsetupfilexfer)\r\n        {\r\n            try\r\n            {\r\n                CSV csv = new CSV();\r\n                csv.Add(a_twsetupfilexfer.FileName.Get());\r\n                csv.Add(\"TWFF_\" + a_twsetupfilexfer.Format);\r\n                csv.Add(a_twsetupfilexfer.VRefNum.ToString());\r\n                return (csv.Get());\r\n            }\r\n            catch (Exception exception)\r\n            {\r\n                Log.Error(\"***error*** - \" + exception.Message);\r\n                return (\"***error***\");\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert a string to a setupfilexfer...\r\n        /// </summary>\r\n        /// <param name=\"a_twsetupfilexfer\">A TWAIN structure</param>\r\n        /// <param name=\"a_szSetupfilexfer\">A CSV string of the TWAIN structure</param>\r\n        /// <returns>True if the conversion is successful</returns>\r\n        public static bool CsvToSetupfilexfer(ref TW_SETUPFILEXFER a_twsetupfilexfer, string a_szSetupfilexfer)\r\n        {\r\n            // Init stuff...\r\n            a_twsetupfilexfer = default(TW_SETUPFILEXFER);\r\n\r\n            // Build the string...\r\n            try\r\n            {\r\n                string[] asz = CSV.Parse(a_szSetupfilexfer);\r\n\r\n                // Sort out the values...\r\n                a_twsetupfilexfer.FileName.Set(asz[0]);\r\n                a_twsetupfilexfer.Format = (TWFF)ushort.Parse(CvtCapValueFromEnum(CAP.ICAP_IMAGEFILEFORMAT, asz[1]));\r\n                a_twsetupfilexfer.VRefNum = short.Parse(asz[2]);\r\n            }\r\n            catch (Exception exception)\r\n            {\r\n                Log.Error(\"***error*** - \" + exception.Message);\r\n                return (false);\r\n            }\r\n\r\n            // All done...\r\n            return (true);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert the contents of a setup mem xfer structure to a string that\r\n        /// we can show in our simple GUI...\r\n        /// </summary>\r\n        /// <param name=\"a_twsetupmemxfer\">A TWAIN structure</param>\r\n        /// <returns>A CSV string of the TWAIN structure</returns>\r\n        public static string SetupmemxferToCsv(TW_SETUPMEMXFER a_twsetupmemxfer)\r\n        {\r\n            try\r\n            {\r\n                CSV csv = new CSV();\r\n                csv.Add(a_twsetupmemxfer.MinBufSize.ToString());\r\n                csv.Add(a_twsetupmemxfer.MaxBufSize.ToString());\r\n                csv.Add(a_twsetupmemxfer.Preferred.ToString());\r\n                return (csv.Get());\r\n            }\r\n            catch (Exception exception)\r\n            {\r\n                Log.Error(\"***error*** - \" + exception.Message);\r\n                return (\"***error***\");\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert a string to a setupmemxfer...\r\n        /// </summary>\r\n        /// <param name=\"a_twsetupfilexfer\">A TWAIN structure</param>\r\n        /// <param name=\"a_szSetupfilexfer\">A CSV string of the TWAIN structure</param>\r\n        /// <returns>True if the conversion is successful</returns>\r\n        public static bool CsvToSetupmemxfer(ref TW_SETUPMEMXFER a_twsetupmemxfer, string a_szSetupmemxfer)\r\n        {\r\n            // Init stuff...\r\n            a_twsetupmemxfer = default(TW_SETUPMEMXFER);\r\n\r\n            // Build the string...\r\n            try\r\n            {\r\n                string[] asz = CSV.Parse(a_szSetupmemxfer);\r\n\r\n                // Sort out the values...\r\n                a_twsetupmemxfer.MinBufSize = uint.Parse(asz[0]);\r\n                a_twsetupmemxfer.MaxBufSize = uint.Parse(asz[1]);\r\n                a_twsetupmemxfer.Preferred = uint.Parse(asz[2]);\r\n            }\r\n            catch (Exception exception)\r\n            {\r\n                Log.Error(\"***error*** - \" + exception.Message);\r\n                return (false);\r\n            }\r\n\r\n            // All done...\r\n            return (true);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert the contents of a status structure to a string that\r\n        /// we can show in our simple GUI...\r\n        /// </summary>\r\n        /// <param name=\"a_twstatus\">A TWAIN structure</param>\r\n        /// <returns>A CSV string of the TWAIN structure</returns>\r\n        public static string StatusToCsv(TW_STATUS a_twstatus)\r\n        {\r\n            try\r\n            {\r\n                CSV csv = new CSV();\r\n                csv.Add(a_twstatus.ConditionCode.ToString());\r\n                csv.Add(a_twstatus.Data.ToString());\r\n                return (csv.Get());\r\n            }\r\n            catch (Exception exception)\r\n            {\r\n                Log.Error(\"***error*** - \" + exception.Message);\r\n                return (\"***error***\");\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert the contents of a statusutf8 structure to a string that\r\n        /// we can show in our simple GUI...\r\n        /// </summary>\r\n        /// <param name=\"a_twstatusutf8\">A TWAIN structure</param>\r\n        /// <returns>A CSV string of the TWAIN structure</returns>\r\n        public string Statusutf8ToCsv(TW_STATUSUTF8 a_twstatusutf8)\r\n        {\r\n            try\r\n            {\r\n                CSV csv = new CSV();\r\n                csv.Add(a_twstatusutf8.Status.ConditionCode.ToString());\r\n                csv.Add(a_twstatusutf8.Status.Data.ToString());\r\n                IntPtr intptr = DsmMemLock(a_twstatusutf8.UTF8string);\r\n                csv.Add(intptr.ToString());\r\n                DsmMemUnlock(a_twstatusutf8.UTF8string);\r\n                return (csv.Get());\r\n            }\r\n            catch (Exception exception)\r\n            {\r\n                Log.Error(\"***error*** - \" + exception.Message);\r\n                return (\"***error***\");\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert a string to a twaindirect...\r\n        /// </summary>\r\n        /// <param name=\"a_twtwaindirect\">A TWAIN structure</param>\r\n        /// <param name=\"a_szTwaindirect\">A CSV string of the TWAIN structure</param>\r\n        /// <returns>True if the conversion is successful</returns>\r\n        public static bool CsvToTwaindirect(ref TW_TWAINDIRECT a_twtwaindirect, string a_szTwaindirect)\r\n        {\r\n            // Init stuff...\r\n            a_twtwaindirect = default(TW_TWAINDIRECT);\r\n\r\n            // Build the string...\r\n            try\r\n            {\r\n                long lTmp;\r\n                string[] asz = CSV.Parse(a_szTwaindirect);\r\n\r\n                // Sort out the values...\r\n                if (!uint.TryParse(asz[0], out a_twtwaindirect.SizeOf))\r\n                {\r\n                    return (false);\r\n                }\r\n                if (!ushort.TryParse(asz[1], out a_twtwaindirect.CommunicationManager))\r\n                {\r\n                    return (false);\r\n                }\r\n                if (!long.TryParse(asz[2], out lTmp))\r\n                {\r\n                    return (false);\r\n                }\r\n                a_twtwaindirect.Send = new IntPtr(lTmp);\r\n                if (!uint.TryParse(asz[3], out a_twtwaindirect.SendSize))\r\n                {\r\n                    return (false);\r\n                }\r\n                if (!long.TryParse(asz[4], out lTmp))\r\n                {\r\n                    return (false);\r\n                }\r\n                a_twtwaindirect.Receive = new IntPtr(lTmp);\r\n                if (!uint.TryParse(asz[5], out a_twtwaindirect.ReceiveSize))\r\n                {\r\n                    return (false);\r\n                }\r\n            }\r\n            catch (Exception exception)\r\n            {\r\n                Log.Error(\"***error*** - \" + exception.Message);\r\n                return (false);\r\n            }\r\n\r\n            // All done...\r\n            return (true);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert the contents of a twaindirect structure to a string that\r\n        /// we can show in our simple GUI...\r\n        /// </summary>\r\n        /// <param name=\"a_twtwaindirect\">A TWAIN structure</param>\r\n        /// <returns>A CSV string of the TWAIN structure</returns>\r\n        public static string TwaindirectToCsv(TW_TWAINDIRECT a_twtwaindirect)\r\n        {\r\n            try\r\n            {\r\n                CSV csv = new CSV();\r\n                csv.Add(a_twtwaindirect.SizeOf.ToString());\r\n                csv.Add(a_twtwaindirect.CommunicationManager.ToString());\r\n                csv.Add(a_twtwaindirect.Send.ToString());\r\n                csv.Add(a_twtwaindirect.SendSize.ToString());\r\n                csv.Add(a_twtwaindirect.Receive.ToString());\r\n                csv.Add(a_twtwaindirect.ReceiveSize.ToString());\r\n                return (csv.Get());\r\n            }\r\n            catch (Exception exception)\r\n            {\r\n                Log.Error(\"***error*** - \" + exception.Message);\r\n                return (\"***error***\");\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert the contents of a userinterface to a string that we can show in\r\n        /// our simple GUI...\r\n        /// </summary>\r\n        /// <param name=\"a_twuserinterface\">A TWAIN structure</param>\r\n        /// <returns>A CSV string of the TWAIN structure</returns>\r\n        public static string UserinterfaceToCsv(TW_USERINTERFACE a_twuserinterface)\r\n        {\r\n            try\r\n            {\r\n                CSV csv = new CSV();\r\n                csv.Add(CvtCapValueToEnumHelper<bool>(a_twuserinterface.ShowUI.ToString()));\r\n                csv.Add(CvtCapValueToEnumHelper<bool>(a_twuserinterface.ModalUI.ToString()));\r\n                csv.Add(a_twuserinterface.hParent.ToString());\r\n                return (csv.Get());\r\n            }\r\n            catch (Exception exception)\r\n            {\r\n                Log.Error(\"***error*** - \" + exception.Message);\r\n                return (\"***error***\");\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert a string to a userinterface...\r\n        /// </summary>\r\n        /// <param name=\"a_twuserinterface\">A TWAIN structure</param>\r\n        /// <param name=\"a_szUserinterface\">A CSV string of the TWAIN structure</param>\r\n        /// <returns>True if the conversion is successful</returns>\r\n        public bool CsvToUserinterface(ref TW_USERINTERFACE a_twuserinterface, string a_szUserinterface)\r\n        {\r\n            // Init stuff...\r\n            a_twuserinterface = default(TW_USERINTERFACE);\r\n\r\n            // Build the string...\r\n            try\r\n            {\r\n                string[] asz = CSV.Parse(a_szUserinterface);\r\n\r\n                // Init stuff...\r\n                a_twuserinterface.ShowUI = 0;\r\n                a_twuserinterface.ModalUI = 0;\r\n                a_twuserinterface.hParent = IntPtr.Zero;\r\n\r\n                // Sort out the values...\r\n                ushort.TryParse(CvtCapValueFromEnumHelper<bool>(asz[0]), out a_twuserinterface.ShowUI);\r\n                ushort.TryParse(CvtCapValueFromEnumHelper<bool>(asz[1]), out a_twuserinterface.ModalUI);\r\n\r\n                // Really shouldn't have this test, but I'll probably break things if I remove it...\r\n                if (asz.Length >= 3)\r\n                {\r\n                    if (asz[2].ToLowerInvariant() == \"hwnd\")\r\n                    {\r\n                        a_twuserinterface.hParent = m_intptrHwnd;\r\n                    }\r\n                    else\r\n                    {\r\n                        Int64 i64;\r\n                        if (Int64.TryParse(asz[2], out i64))\r\n                        {\r\n                            a_twuserinterface.hParent = (IntPtr)i64;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            catch (Exception exception)\r\n            {\r\n                Log.Error(\"***error*** - \" + exception.Message);\r\n                return (false);\r\n            }\r\n\r\n            // All done...\r\n            return (true);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert the contents of a transfer group to a string that we can show in\r\n        /// our simple GUI...\r\n        /// </summary>\r\n        /// <param name=\"a_u32Xfergroup\">A TWAIN structure</param>\r\n        /// <returns>A CSV string of the TWAIN structure</returns>\r\n        public static string XfergroupToCsv(UInt32 a_u32Xfergroup)\r\n        {\r\n            try\r\n            {\r\n                CSV csv = new CSV();\r\n                csv.Add(\"0x\" + a_u32Xfergroup.ToString(\"X\"));\r\n                return (csv.Get());\r\n            }\r\n            catch (Exception exception)\r\n            {\r\n                Log.Error(\"***error*** - \" + exception.Message);\r\n                return (\"***error***\");\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert the contents of a string to a transfer group...\r\n        /// </summary>\r\n        /// <param name=\"a_twcustomdsdata\">A TWAIN structure</param>\r\n        /// <param name=\"a_szCustomdsdata\">A CSV string of the TWAIN structure</param>\r\n        /// <returns>True if the conversion is successful</returns>\r\n        public static bool CsvToXfergroup(ref UInt32 a_u32Xfergroup, string a_szXfergroup)\r\n        {\r\n            // Init stuff...\r\n            a_u32Xfergroup = 0;\r\n\r\n            // Build the string...\r\n            try\r\n            {\r\n                string[] asz = CSV.Parse(a_szXfergroup);\r\n\r\n                // Grab the values...\r\n                a_u32Xfergroup = asz[0].ToLower().StartsWith(\"0x\") ? Convert.ToUInt32(asz[0].Remove(0, 2), 16) : Convert.ToUInt32(asz[0], 16);\r\n            }\r\n            catch (Exception exception)\r\n            {\r\n                Log.Error(\"***error*** - \" + exception.Message);\r\n                return (false);\r\n            }\r\n\r\n            // All done...\r\n            return (true);\r\n        }\r\n\r\n        /// <summary>\r\n        /// This mess is what tries to turn numeric constants into something\r\n        /// a bit more readable...\r\n        /// </summary>\r\n        /// <typeparam name=\"T\">type for the conversion</typeparam>\r\n        /// <param name=\"a_szValue\">value to convert</param>\r\n        /// <returns></returns>\r\n        private static string CvtCapValueToEnumHelper<T>(string a_szValue)\r\n        {\r\n            T t;\r\n            Int32 i32 = 0;\r\n            UInt32 u32 = 0;\r\n            string szCvt = \"\";\r\n\r\n            // Adjust our value, as needed...\r\n            if (a_szValue.StartsWith(typeof(T).Name + \"_\"))\r\n            {\r\n                a_szValue = a_szValue.Substring((typeof(T).Name + \"_\").Length);\r\n            }\r\n\r\n            // Handle enums with negative numbers...\r\n            if (a_szValue.StartsWith(\"-\"))\r\n            {\r\n                if (Int32.TryParse(a_szValue, out i32))\r\n                {\r\n                    t = (T)Enum.Parse(typeof(T), a_szValue, true);\r\n                    szCvt = t.ToString();\r\n                    if (szCvt != i32.ToString())\r\n                    {\r\n                        return (typeof(T).ToString().Replace(\"TWAINWorkingGroup.TWAIN+\", \"\") + \"_\" + szCvt);\r\n                    }\r\n                }\r\n            }\r\n\r\n            // Everybody else...\r\n            else if (UInt32.TryParse(a_szValue, out u32))\r\n            {\r\n                // Handle bool...\r\n                if (typeof(T) == typeof(bool))\r\n                {\r\n                    if ((a_szValue == \"1\") || (a_szValue.ToLowerInvariant() == \"true\"))\r\n                    {\r\n                        return (\"TRUE\");\r\n                    }\r\n                    return (\"FALSE\");\r\n                }\r\n\r\n                // Handle DAT (which is a weird one)..\r\n                else if (typeof(T) == typeof(DAT))\r\n                {\r\n                    UInt32 u32Dg = u32 >> 16;\r\n                    UInt32 u32Dat = u32 & 0xFFFF;\r\n                    string szDg = ((DG)u32Dg).ToString();\r\n                    string szDat = ((DAT)u32Dat).ToString();\r\n                    szDg = (szDg != u32Dg.ToString()) ? (\"DG_\" + szDg) : string.Format(\"0x{0:X}\", u32Dg);\r\n                    szDat = (szDat != u32Dat.ToString()) ? (\"DAT_\" + szDat) : string.Format(\"0x{0:X}\", u32Dat);\r\n                    return (szDg + \"|\" + szDat);\r\n                }\r\n\r\n                // Everybody else is on their own...\r\n                else\r\n                {\r\n                    // mono hurls on this, .net doesn't, so gonna help...\r\n                    switch (a_szValue)\r\n                    {\r\n                        default: break;\r\n                        case \"65535\": a_szValue = \"-1\"; break;\r\n                        case \"65534\": a_szValue = \"-2\"; break;\r\n                        case \"65533\": a_szValue = \"-3\"; break;\r\n                        case \"65532\": a_szValue = \"-4\"; break;\r\n                    }\r\n                    t = (T)Enum.Parse(typeof(T), a_szValue, true);\r\n                }\r\n\r\n                // Check to see if we changed anything...\r\n                szCvt = t.ToString();\r\n                if (szCvt != u32.ToString())\r\n                {\r\n                    // CAP is in its final form...\r\n                    if (typeof(T) == typeof(CAP))\r\n                    {\r\n                        return (szCvt);\r\n                    }\r\n                    // Everybody else needs the name decoration removed...\r\n                    else\r\n                    {\r\n                        return (typeof(T).ToString().Replace(\"TWAINWorkingGroup.TWAIN+\", \"\") + \"_\" + szCvt);\r\n                    }\r\n                }\r\n\r\n                // We're probably a custom value...\r\n                else\r\n                {\r\n                    return (string.Format(\"0x{0:X}\", u32));\r\n                }\r\n            }\r\n\r\n            // We're a string...\r\n            return (a_szValue);\r\n        }\r\n\r\n        /// <summary>\r\n        /// This mess is what tries to turn readable stuff into numeric constants...\r\n        /// </summary>\r\n        /// <typeparam name=\"T\">type for the conversion</typeparam>\r\n        /// <param name=\"a_szValue\">value to convert</param>\r\n        /// <returns></returns>\r\n        private static string CvtCapValueFromEnumHelper<T>(string a_szValue)\r\n        {\r\n            // We can figure this one out on our own...\r\n            if ((typeof(T).Name == \"bool\") || (typeof(T).Name == \"Boolean\"))\r\n            {\r\n                return (((a_szValue.ToLowerInvariant() == \"true\") || (a_szValue == \"1\")) ? \"1\" : \"0\");\r\n            }\r\n\r\n            // Look for the enum prefix...\r\n            if (a_szValue.ToLowerInvariant().StartsWith(typeof(T).Name.ToLowerInvariant() + \"_\"))\r\n            {\r\n                return (a_szValue.Substring((typeof(T).Name + \"_\").Length));\r\n            }\r\n\r\n            // Er...\r\n            return (a_szValue);\r\n        }\r\n\r\n        /// <summary>\r\n        /// This mess is what tries to turn readable stuff into numeric constants...\r\n        /// </summary>\r\n        /// <typeparam name=\"T\">type for the conversion</typeparam>\r\n        /// <param name=\"a_szValue\">value to convert</param>\r\n        /// <returns></returns>\r\n        private static string CvtCapValueFromTwlg(string a_szValue)\r\n        {\r\n            // mono goes \"hork\", probably because the enum is wackadoodle, this\r\n            // does work on .net, but what'cha gonna do?\r\n            if (a_szValue.ToUpperInvariant().StartsWith(\"TWLG_\"))\r\n            {\r\n                switch (a_szValue.ToUpperInvariant().Substring(5))\r\n                {\r\n                    default: break;\r\n                    case \"USERLOCALE\": return (\"65535\"); // -1, kinda...\r\n                    case \"DAN\": return (\"0\");\r\n                    case \"DUT\": return (\"1\");\r\n                    case \"ENG\": return (\"2\");\r\n                    case \"FCF\": return (\"3\");\r\n                    case \"FIN\": return (\"4\");\r\n                    case \"FRN\": return (\"5\");\r\n                    case \"GER\": return (\"6\");\r\n                    case \"ICE\": return (\"7\");\r\n                    case \"ITN\": return (\"8\");\r\n                    case \"NOR\": return (\"9\");\r\n                    case \"POR\": return (\"10\");\r\n                    case \"SPA\": return (\"11\");\r\n                    case \"SWE\": return (\"12\");\r\n                    case \"USA\": return (\"13\");\r\n                    case \"AFRIKAANS\": return (\"14\");\r\n                    case \"ALBANIA\": return (\"15\");\r\n                    case \"ARABIC\": return (\"16\");\r\n                    case \"ARABIC_ALGERIA\": return (\"17\");\r\n                    case \"ARABIC_BAHRAIN\": return (\"18\");\r\n                    case \"ARABIC_EGYPT\": return (\"19\");\r\n                    case \"ARABIC_IRAQ\": return (\"20\");\r\n                    case \"ARABIC_JORDAN\": return (\"21\");\r\n                    case \"ARABIC_KUWAIT\": return (\"22\");\r\n                    case \"ARABIC_LEBANON\": return (\"23\");\r\n                    case \"ARABIC_LIBYA\": return (\"24\");\r\n                    case \"ARABIC_MOROCCO\": return (\"25\");\r\n                    case \"ARABIC_OMAN\": return (\"26\");\r\n                    case \"ARABIC_QATAR\": return (\"27\");\r\n                    case \"ARABIC_SAUDIARABIA\": return (\"28\");\r\n                    case \"ARABIC_SYRIA\": return (\"29\");\r\n                    case \"ARABIC_TUNISIA\": return (\"30\");\r\n                    case \"ARABIC_UAE\": return (\"31\");\r\n                    case \"ARABIC_YEMEN\": return (\"32\");\r\n                    case \"BASQUE\": return (\"33\");\r\n                    case \"BYELORUSSIAN\": return (\"34\");\r\n                    case \"BULGARIAN\": return (\"35\");\r\n                    case \"CATALAN\": return (\"36\");\r\n                    case \"CHINESE\": return (\"37\");\r\n                    case \"CHINESE_HONGKONG\": return (\"38\");\r\n                    case \"CHINESE_PRC\": return (\"39\");\r\n                    case \"CHINESE_SINGAPORE\": return (\"40\");\r\n                    case \"CHINESE_SIMPLIFIED\": return (\"41\");\r\n                    case \"CHINESE_TAIWAN\": return (\"42\");\r\n                    case \"CHINESE_TRADITIONAL\": return (\"43\");\r\n                    case \"CROATIA\": return (\"44\");\r\n                    case \"CZECH\": return (\"45\");\r\n                    case \"DANISH\": return (((int)TWLG.DAN).ToString());\r\n                    case \"DUTCH\": return (((int)TWLG.DUT).ToString());\r\n                    case \"DUTCH_BELGIAN\": return (\"46\");\r\n                    case \"ENGLISH\": return (((int)TWLG.ENG).ToString());\r\n                    case \"ENGLISH_AUSTRALIAN\": return (\"47\");\r\n                    case \"ENGLISH_CANADIAN\": return (\"48\");\r\n                    case \"ENGLISH_IRELAND\": return (\"49\");\r\n                    case \"ENGLISH_NEWZEALAND\": return (\"50\");\r\n                    case \"ENGLISH_SOUTHAFRICA\": return (\"51\");\r\n                    case \"ENGLISH_UK\": return (\"52\");\r\n                    case \"ENGLISH_USA\": return (((int)TWLG.USA).ToString());\r\n                    case \"ESTONIAN\": return (\"53\");\r\n                    case \"FAEROESE\": return (\"54\");\r\n                    case \"FARSI\": return (\"55\");\r\n                    case \"FINNISH\": return (((int)TWLG.FIN).ToString());\r\n                    case \"FRENCH\": return (((int)TWLG.FRN).ToString());\r\n                    case \"FRENCH_BELGIAN\": return (\"56\");\r\n                    case \"FRENCH_CANADIAN\": return (((int)TWLG.FCF).ToString());\r\n                    case \"FRENCH_LUXEMBOURG\": return (\"57\");\r\n                    case \"FRENCH_SWISS\": return (\"58\");\r\n                    case \"GERMAN\": return (((int)TWLG.GER).ToString());\r\n                    case \"GERMAN_AUSTRIAN\": return (\"59\");\r\n                    case \"GERMAN_LUXEMBOURG\": return (\"60\");\r\n                    case \"GERMAN_LIECHTENSTEIN\": return (\"61\");\r\n                    case \"GERMAN_SWISS\": return (\"62\");\r\n                    case \"GREEK\": return (\"63\");\r\n                    case \"HEBREW\": return (\"64\");\r\n                    case \"HUNGARIAN\": return (\"65\");\r\n                    case \"ICELANDIC\": return (((int)TWLG.ICE).ToString());\r\n                    case \"INDONESIAN\": return (\"66\");\r\n                    case \"ITALIAN\": return (((int)TWLG.ITN).ToString());\r\n                    case \"ITALIAN_SWISS\": return (\"67\");\r\n                    case \"JAPANESE\": return (\"68\");\r\n                    case \"KOREAN\": return (\"69\");\r\n                    case \"KOREAN_JOHAB\": return (\"70\");\r\n                    case \"LATVIAN\": return (\"71\");\r\n                    case \"LITHUANIAN\": return (\"72\");\r\n                    case \"NORWEGIAN\": return (((int)TWLG.NOR).ToString());\r\n                    case \"NORWEGIAN_BOKMAL\": return (\"73\");\r\n                    case \"NORWEGIAN_NYNORSK\": return (\"74\");\r\n                    case \"POLISH\": return (\"75\");\r\n                    case \"PORTUGUESE\": return (((int)TWLG.POR).ToString());\r\n                    case \"PORTUGUESE_BRAZIL\": return (\"76\");\r\n                    case \"ROMANIAN\": return (\"77\");\r\n                    case \"RUSSIAN\": return (\"78\");\r\n                    case \"SERBIAN_LATIN\": return (\"79\");\r\n                    case \"SLOVAK\": return (\"80\");\r\n                    case \"SLOVENIAN\": return (\"81\");\r\n                    case \"SPANISH\": return (((int)TWLG.SPA).ToString());\r\n                    case \"SPANISH_MEXICAN\": return (\"82\");\r\n                    case \"SPANISH_MODERN\": return (\"83\");\r\n                    case \"SWEDISH\": return (((int)TWLG.SWE).ToString());\r\n                    case \"THAI\": return (\"84\");\r\n                    case \"TURKISH\": return (\"85\");\r\n                    case \"UKRANIAN\": return (\"86\");\r\n                    case \"ASSAMESE\": return (\"87\");\r\n                    case \"BENGALI\": return (\"88\");\r\n                    case \"BIHARI\": return (\"89\");\r\n                    case \"BODO\": return (\"90\");\r\n                    case \"DOGRI\": return (\"91\");\r\n                    case \"GUJARATI\": return (\"92\");\r\n                    case \"HARYANVI\": return (\"93\");\r\n                    case \"HINDI\": return (\"94\");\r\n                    case \"KANNADA\": return (\"95\");\r\n                    case \"KASHMIRI\": return (\"96\");\r\n                    case \"MALAYALAM\": return (\"97\");\r\n                    case \"MARATHI\": return (\"98\");\r\n                    case \"MARWARI\": return (\"99\");\r\n                    case \"MEGHALAYAN\": return (\"100\");\r\n                    case \"MIZO\": return (\"101\");\r\n                    case \"NAGA\": return (\"102\");\r\n                    case \"ORISSI\": return (\"103\");\r\n                    case \"PUNJABI\": return (\"104\");\r\n                    case \"PUSHTU\": return (\"105\");\r\n                    case \"SERBIAN_CYRILLIC\": return (\"106\");\r\n                    case \"SIKKIMI\": return (\"107\");\r\n                    case \"SWEDISH_FINLAND\": return (\"108\");\r\n                    case \"TAMIL\": return (\"109\");\r\n                    case \"TELUGU\": return (\"110\");\r\n                    case \"TRIPURI\": return (\"111\");\r\n                    case \"URDU\": return (\"112\");\r\n                    case \"VIETNAMESE\": return (\"113\");\r\n                }\r\n            }\r\n\r\n            // Er...\r\n            return (a_szValue);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert a value to the 'friendly' name, based on the capability...\r\n        /// </summary>\r\n        /// <param name=\"a_cap\">capability driving the conversion</param>\r\n        /// <param name=\"szValue\">value to convert</param>\r\n        /// <returns></returns>\r\n        public static string CvtCapValueToEnum(CAP a_cap, string a_szValue)\r\n        {\r\n            switch (a_cap)\r\n            {\r\n                default: return (a_szValue);\r\n                case CAP.ACAP_XFERMECH: return (CvtCapValueToEnumHelper<TWSX>(a_szValue));\r\n                case CAP.CAP_ALARMS: return (CvtCapValueToEnumHelper<TWAL>(a_szValue));\r\n                case CAP.CAP_ALARMVOLUME: return (a_szValue);\r\n                case CAP.CAP_AUTHOR: return (a_szValue);\r\n                case CAP.CAP_AUTOFEED: return (CvtCapValueToEnumHelper<bool>(a_szValue));\r\n                case CAP.CAP_AUTOMATICCAPTURE: return (CvtCapValueToEnumHelper<bool>(a_szValue));\r\n                case CAP.CAP_AUTOMATICSENSEMEDIUM: return (CvtCapValueToEnumHelper<bool>(a_szValue));\r\n                case CAP.CAP_AUTOSCAN: return (CvtCapValueToEnumHelper<bool>(a_szValue));\r\n                case CAP.CAP_BATTERYMINUTES: return (a_szValue);\r\n                case CAP.CAP_BATTERYPERCENTAGE: return (a_szValue);\r\n                case CAP.CAP_CAMERAENABLED: return (CvtCapValueToEnumHelper<bool>(a_szValue));\r\n                case CAP.CAP_CAMERAORDER: return (CvtCapValueToEnumHelper<TWPT>(a_szValue));\r\n                case CAP.CAP_CAMERAPREVIEWUI: return (CvtCapValueToEnumHelper<bool>(a_szValue));\r\n                case CAP.CAP_CAMERASIDE: return (CvtCapValueToEnumHelper<TWCS>(a_szValue));\r\n                case CAP.CAP_CAPTION: return (a_szValue);\r\n                case CAP.CAP_CLEARPAGE: return (CvtCapValueToEnumHelper<bool>(a_szValue));\r\n                case CAP.CAP_CUSTOMDSDATA: return (CvtCapValueToEnumHelper<bool>(a_szValue));\r\n                case CAP.CAP_CUSTOMINTERFACEGUID: return (a_szValue);\r\n                case CAP.CAP_DEVICEEVENT: return (CvtCapValueToEnumHelper<TWDE>(a_szValue));\r\n                case CAP.CAP_DEVICEONLINE: return (CvtCapValueToEnumHelper<bool>(a_szValue));\r\n                case CAP.CAP_DEVICETIMEDATE: return (a_szValue);\r\n                case CAP.CAP_DOUBLEFEEDDETECTION: return (CvtCapValueToEnumHelper<TWDF>(a_szValue));\r\n                case CAP.CAP_DOUBLEFEEDDETECTIONLENGTH: return (a_szValue);\r\n                case CAP.CAP_DOUBLEFEEDDETECTIONRESPONSE: return (CvtCapValueToEnumHelper<TWDP>(a_szValue));\r\n                case CAP.CAP_DOUBLEFEEDDETECTIONSENSITIVITY: return (CvtCapValueToEnumHelper<TWUS>(a_szValue));\r\n                case CAP.CAP_DUPLEX: return (CvtCapValueToEnumHelper<TWDX>(a_szValue));\r\n                case CAP.CAP_DUPLEXENABLED: return (CvtCapValueToEnumHelper<bool>(a_szValue));\r\n                case CAP.CAP_ENABLEDSUIONLY: return (CvtCapValueToEnumHelper<bool>(a_szValue));\r\n                case CAP.CAP_ENDORSER: return (a_szValue);\r\n                case CAP.CAP_EXTENDEDCAPS: return (CvtCapValueToEnumHelper<CAP>(a_szValue));\r\n                case CAP.CAP_FEEDERALIGNMENT: return (CvtCapValueToEnumHelper<TWFA>(a_szValue));\r\n                case CAP.CAP_FEEDERENABLED: return (CvtCapValueToEnumHelper<bool>(a_szValue));\r\n                case CAP.CAP_FEEDERLOADED: return (CvtCapValueToEnumHelper<bool>(a_szValue));\r\n                case CAP.CAP_FEEDERORDER: return (CvtCapValueToEnumHelper<TWFO>(a_szValue));\r\n                case CAP.CAP_FEEDERPOCKET: return (CvtCapValueToEnumHelper<TWFP>(a_szValue));\r\n                case CAP.CAP_FEEDERPREP: return (CvtCapValueToEnumHelper<bool>(a_szValue));\r\n                case CAP.CAP_FEEDPAGE: return (CvtCapValueToEnumHelper<bool>(a_szValue));\r\n                case CAP.CAP_IAFIELDA_LASTPAGE: return (a_szValue);\r\n                case CAP.CAP_IAFIELDB_LASTPAGE: return (a_szValue);\r\n                case CAP.CAP_IAFIELDC_LASTPAGE: return (a_szValue);\r\n                case CAP.CAP_IAFIELDD_LASTPAGE: return (a_szValue);\r\n                case CAP.CAP_IAFIELDA_LEVEL: return (CvtCapValueToEnumHelper<TWIA>(a_szValue));\r\n                case CAP.CAP_IAFIELDB_LEVEL: return (CvtCapValueToEnumHelper<TWIA>(a_szValue));\r\n                case CAP.CAP_IAFIELDC_LEVEL: return (CvtCapValueToEnumHelper<TWIA>(a_szValue));\r\n                case CAP.CAP_IAFIELDD_LEVEL: return (CvtCapValueToEnumHelper<TWIA>(a_szValue));\r\n                case CAP.CAP_IAFIELDA_PRINTFORMAT: return (a_szValue);\r\n                case CAP.CAP_IAFIELDB_PRINTFORMAT: return (a_szValue);\r\n                case CAP.CAP_IAFIELDC_PRINTFORMAT: return (a_szValue);\r\n                case CAP.CAP_IAFIELDD_PRINTFORMAT: return (a_szValue);\r\n                case CAP.CAP_IAFIELDA_VALUE: return (a_szValue);\r\n                case CAP.CAP_IAFIELDB_VALUE: return (a_szValue);\r\n                case CAP.CAP_IAFIELDC_VALUE: return (a_szValue);\r\n                case CAP.CAP_IAFIELDD_VALUE: return (a_szValue);\r\n                case CAP.CAP_IMAGEADDRESSENABLED: return (CvtCapValueToEnumHelper<bool>(a_szValue));\r\n                case CAP.CAP_INDICATORS: return (CvtCapValueToEnumHelper<bool>(a_szValue));\r\n                case CAP.CAP_INDICATORSMODE: return (CvtCapValueToEnumHelper<TWCI>(a_szValue));\r\n                case CAP.CAP_JOBCONTROL: return (CvtCapValueToEnumHelper<TWJC>(a_szValue));\r\n                case CAP.CAP_LANGUAGE: return (CvtCapValueToEnumHelper<TWLG>(a_szValue));\r\n                case CAP.CAP_MAXBATCHBUFFERS: return (a_szValue);\r\n                case CAP.CAP_MICRENABLED: return (CvtCapValueToEnumHelper<bool>(a_szValue));\r\n                case CAP.CAP_PAPERDETECTABLE: return (CvtCapValueToEnumHelper<bool>(a_szValue));\r\n                case CAP.CAP_PAPERHANDLING: return (CvtCapValueToEnumHelper<TWPH>(a_szValue));\r\n                case CAP.CAP_POWERSAVETIME: return (a_szValue);\r\n                case CAP.CAP_POWERSUPPLY: return (CvtCapValueToEnumHelper<TWPS>(a_szValue));\r\n                case CAP.CAP_PRINTER: return (CvtCapValueToEnumHelper<TWPR>(a_szValue));\r\n                case CAP.CAP_PRINTERCHARROTATION: return (a_szValue);\r\n                case CAP.CAP_PRINTERENABLED: return (CvtCapValueToEnumHelper<bool>(a_szValue));\r\n                case CAP.CAP_PRINTERFONTSTYLE: return (CvtCapValueToEnumHelper<TWPF>(a_szValue));\r\n                case CAP.CAP_PRINTERINDEX: return (a_szValue);\r\n                case CAP.CAP_PRINTERINDEXLEADCHAR: return (a_szValue);\r\n                case CAP.CAP_PRINTERINDEXMAXVALUE: return (a_szValue);\r\n                case CAP.CAP_PRINTERINDEXNUMDIGITS: return (a_szValue);\r\n                case CAP.CAP_PRINTERINDEXSTEP: return (a_szValue);\r\n                case CAP.CAP_PRINTERINDEXTRIGGER: return (CvtCapValueToEnumHelper<TWCT>(a_szValue));\r\n                case CAP.CAP_PRINTERMODE: return (CvtCapValueToEnumHelper<TWPM>(a_szValue));\r\n                case CAP.CAP_PRINTERSTRING: return (a_szValue);\r\n                case CAP.CAP_PRINTERSTRINGPREVIEW: return (a_szValue);\r\n                case CAP.CAP_PRINTERSUFFIX: return (a_szValue);\r\n                case CAP.CAP_PRINTERVERTICALOFFSET: return (a_szValue);\r\n                case CAP.CAP_REACQUIREALLOWED: return (CvtCapValueToEnumHelper<bool>(a_szValue));\r\n                case CAP.CAP_REWINDPAGE: return (CvtCapValueToEnumHelper<bool>(a_szValue));\r\n                case CAP.CAP_SEGMENTED: return (CvtCapValueToEnumHelper<TWSG>(a_szValue));\r\n                case CAP.CAP_SERIALNUMBER: return (a_szValue);\r\n                case CAP.CAP_SHEETCOUNT: return (a_szValue);\r\n                case CAP.CAP_SUPPORTEDCAPS: return (CvtCapValueToEnumHelper<CAP>(a_szValue));\r\n                case CAP.CAP_SUPPORTEDCAPSSEGMENTUNIQUE: return (CvtCapValueToEnumHelper<CAP>(a_szValue));\r\n                case CAP.CAP_SUPPORTEDDATS: return (CvtCapValueToEnumHelper<DAT>(a_szValue));\r\n                case CAP.CAP_THUMBNAILSENABLED: return (CvtCapValueToEnumHelper<bool>(a_szValue));\r\n                case CAP.CAP_TIMEBEFOREFIRSTCAPTURE: return (a_szValue);\r\n                case CAP.CAP_TIMEBETWEENCAPTURES: return (a_szValue);\r\n                case CAP.CAP_TIMEDATE: return (a_szValue);\r\n                case CAP.CAP_UICONTROLLABLE: return (CvtCapValueToEnumHelper<bool>(a_szValue));\r\n                case CAP.CAP_XFERCOUNT: return (a_szValue);\r\n                case CAP.ICAP_AUTOBRIGHT: return (CvtCapValueToEnumHelper<bool>(a_szValue));\r\n                case CAP.ICAP_AUTODISCARDBLANKPAGES: return (a_szValue);\r\n                case CAP.ICAP_AUTOMATICBORDERDETECTION: return (CvtCapValueToEnumHelper<bool>(a_szValue));\r\n                case CAP.ICAP_AUTOMATICCOLORENABLED: return (CvtCapValueToEnumHelper<bool>(a_szValue));\r\n                case CAP.ICAP_AUTOMATICCOLORNONCOLORPIXELTYPE: return (CvtCapValueToEnumHelper<TWPT>(a_szValue));\r\n                case CAP.ICAP_AUTOMATICCROPUSESFRAME: return (CvtCapValueToEnumHelper<bool>(a_szValue));\r\n                case CAP.ICAP_AUTOMATICDESKEW: return (CvtCapValueToEnumHelper<bool>(a_szValue));\r\n                case CAP.ICAP_AUTOMATICLENGTHDETECTION: return (CvtCapValueToEnumHelper<bool>(a_szValue));\r\n                case CAP.ICAP_AUTOMATICROTATE: return (CvtCapValueToEnumHelper<bool>(a_szValue));\r\n                case CAP.ICAP_AUTOSIZE: return (CvtCapValueToEnumHelper<TWAS>(a_szValue));\r\n                case CAP.ICAP_BARCODEDETECTIONENABLED: return (CvtCapValueToEnumHelper<bool>(a_szValue));\r\n                case CAP.ICAP_BARCODEMAXRETRIES: return (a_szValue);\r\n                case CAP.ICAP_BARCODEMAXSEARCHPRIORITIES: return (a_szValue);\r\n                case CAP.ICAP_BARCODESEARCHMODE: return (CvtCapValueToEnumHelper<TWBD>(a_szValue));\r\n                case CAP.ICAP_BARCODESEARCHPRIORITIES: return (CvtCapValueToEnumHelper<TWBT>(a_szValue));\r\n                case CAP.ICAP_BARCODETIMEOUT: return (a_szValue);\r\n                case CAP.ICAP_BITDEPTH: return (a_szValue);\r\n                case CAP.ICAP_BITDEPTHREDUCTION: return (CvtCapValueToEnumHelper<TWBR>(a_szValue));\r\n                case CAP.ICAP_BITORDER: return (CvtCapValueToEnumHelper<TWBO>(a_szValue));\r\n                case CAP.ICAP_BITORDERCODES: return (CvtCapValueToEnumHelper<TWBO>(a_szValue));\r\n                case CAP.ICAP_BRIGHTNESS: return (a_szValue);\r\n                case CAP.ICAP_CCITTKFACTOR: return (a_szValue);\r\n                case CAP.ICAP_COLORMANAGEMENTENABLED: return (CvtCapValueToEnumHelper<bool>(a_szValue));\r\n                case CAP.ICAP_COMPRESSION: return (CvtCapValueToEnumHelper<TWCP>(a_szValue));\r\n                case CAP.ICAP_CONTRAST: return (a_szValue);\r\n                case CAP.ICAP_CUSTHALFTONE: return (a_szValue);\r\n                case CAP.ICAP_EXPOSURETIME: return (a_szValue);\r\n                case CAP.ICAP_EXTIMAGEINFO: return (CvtCapValueToEnumHelper<bool>(a_szValue));\r\n                case CAP.ICAP_FEEDERTYPE: return (CvtCapValueToEnumHelper<TWFE>(a_szValue));\r\n                case CAP.ICAP_FILMTYPE: return (CvtCapValueToEnumHelper<TWFM>(a_szValue));\r\n                case CAP.ICAP_FILTER: return (CvtCapValueToEnumHelper<TWFT>(a_szValue));\r\n                case CAP.ICAP_FLASHUSED: return (CvtCapValueToEnumHelper<bool>(a_szValue));\r\n                case CAP.ICAP_FLASHUSED2: return (CvtCapValueToEnumHelper<TWFL>(a_szValue));\r\n                case CAP.ICAP_FLIPROTATION: return (CvtCapValueToEnumHelper<TWFR>(a_szValue));\r\n                case CAP.ICAP_FRAMES: return (a_szValue);\r\n                case CAP.ICAP_GAMMA: return (a_szValue);\r\n                case CAP.ICAP_HALFTONES: return (a_szValue);\r\n                case CAP.ICAP_HIGHLIGHT: return (a_szValue);\r\n                case CAP.ICAP_ICCPROFILE: return (CvtCapValueToEnumHelper<TWIC>(a_szValue));\r\n                case CAP.ICAP_IMAGEDATASET: return (a_szValue);\r\n                case CAP.ICAP_IMAGEFILEFORMAT: return (CvtCapValueToEnumHelper<TWFF>(a_szValue));\r\n                case CAP.ICAP_IMAGEFILTER: return (CvtCapValueToEnumHelper<TWIF>(a_szValue));\r\n                case CAP.ICAP_IMAGEMERGE: return (CvtCapValueToEnumHelper<TWIM>(a_szValue));\r\n                case CAP.ICAP_IMAGEMERGEHEIGHTTHRESHOLD: return (a_szValue);\r\n                case CAP.ICAP_JPEGPIXELTYPE: return (CvtCapValueToEnumHelper<TWPT>(a_szValue));\r\n                case CAP.ICAP_JPEGQUALITY: return (CvtCapValueToEnumHelper<TWJQ>(a_szValue));\r\n                case CAP.ICAP_JPEGSUBSAMPLING: return (CvtCapValueToEnumHelper<TWJS>(a_szValue));\r\n                case CAP.ICAP_LAMPSTATE: return (CvtCapValueToEnumHelper<bool>(a_szValue));\r\n                case CAP.ICAP_LIGHTPATH: return (CvtCapValueToEnumHelper<TWLP>(a_szValue));\r\n                case CAP.ICAP_LIGHTSOURCE: return (CvtCapValueToEnumHelper<TWLS>(a_szValue));\r\n                case CAP.ICAP_MAXFRAMES: return (a_szValue);\r\n                case CAP.ICAP_MINIMUMHEIGHT: return (a_szValue);\r\n                case CAP.ICAP_MINIMUMWIDTH: return (a_szValue);\r\n                case CAP.ICAP_MIRROR: return (CvtCapValueToEnumHelper<TWMR>(a_szValue));\r\n                case CAP.ICAP_NOISEFILTER: return (CvtCapValueToEnumHelper<TWNF>(a_szValue));\r\n                case CAP.ICAP_ORIENTATION: return (CvtCapValueToEnumHelper<TWOR>(a_szValue));\r\n                case CAP.ICAP_OVERSCAN: return (CvtCapValueToEnumHelper<TWOV>(a_szValue));\r\n                case CAP.ICAP_PATCHCODEDETECTIONENABLED: return (CvtCapValueToEnumHelper<bool>(a_szValue));\r\n                case CAP.ICAP_PATCHCODEMAXRETRIES: return (a_szValue);\r\n                case CAP.ICAP_PATCHCODEMAXSEARCHPRIORITIES: return (a_szValue);\r\n                case CAP.ICAP_PATCHCODESEARCHMODE: return (CvtCapValueToEnumHelper<TWBD>(a_szValue));\r\n                case CAP.ICAP_PATCHCODESEARCHPRIORITIES: return (CvtCapValueToEnumHelper<TWPCH>(a_szValue));\r\n                case CAP.ICAP_PATCHCODETIMEOUT: return (a_szValue);\r\n                case CAP.ICAP_PHYSICALHEIGHT: return (a_szValue);\r\n                case CAP.ICAP_PHYSICALWIDTH: return (a_szValue);\r\n                case CAP.ICAP_PIXELFLAVOR: return (CvtCapValueToEnumHelper<TWPF>(a_szValue));\r\n                case CAP.ICAP_PIXELFLAVORCODES: return (CvtCapValueToEnumHelper<TWPF>(a_szValue));\r\n                case CAP.ICAP_PIXELTYPE: return (CvtCapValueToEnumHelper<TWPT>(a_szValue));\r\n                case CAP.ICAP_PLANARCHUNKY: return (CvtCapValueToEnumHelper<TWPC>(a_szValue));\r\n                case CAP.ICAP_ROTATION: return (a_szValue);\r\n                case CAP.ICAP_SHADOW: return (a_szValue);\r\n                case CAP.ICAP_SUPPORTEDBARCODETYPES: return (CvtCapValueToEnumHelper<TWBT>(a_szValue));\r\n                case CAP.ICAP_SUPPORTEDEXTIMAGEINFO: return (CvtCapValueToEnumHelper<TWEI>(a_szValue));\r\n                case CAP.ICAP_SUPPORTEDPATCHCODETYPES: return (CvtCapValueToEnumHelper<TWPCH>(a_szValue));\r\n                case CAP.ICAP_SUPPORTEDSIZES: return (CvtCapValueToEnumHelper<TWSS>(a_szValue));\r\n                case CAP.ICAP_THRESHOLD: return (a_szValue);\r\n                case CAP.ICAP_TILES: return (CvtCapValueToEnumHelper<bool>(a_szValue));\r\n                case CAP.ICAP_TIMEFILL: return (a_szValue);\r\n                case CAP.ICAP_UNDEFINEDIMAGESIZE: return (CvtCapValueToEnumHelper<bool>(a_szValue));\r\n                case CAP.ICAP_UNITS: return (CvtCapValueToEnumHelper<TWUN>(a_szValue));\r\n                case CAP.ICAP_XFERMECH: return (CvtCapValueToEnumHelper<TWSX>(a_szValue));\r\n                case CAP.ICAP_XNATIVERESOLUTION: return (a_szValue);\r\n                case CAP.ICAP_XRESOLUTION: return (a_szValue);\r\n                case CAP.ICAP_XSCALING: return (a_szValue);\r\n                case CAP.ICAP_YNATIVERESOLUTION: return (a_szValue);\r\n                case CAP.ICAP_YRESOLUTION: return (a_szValue);\r\n                case CAP.ICAP_YSCALING: return (a_szValue);\r\n                case CAP.ICAP_ZOOMFACTOR: return (a_szValue);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert a 'friendly' name to a numeric value...\r\n        /// </summary>\r\n        /// <param name=\"a_cap\">capability driving the conversion</param>\r\n        /// <param name=\"szValue\">value to convert</param>\r\n        /// <returns></returns>\r\n        public static string CvtCapValueFromEnum(CAP a_cap, string a_szValue)\r\n        {\r\n            int ii;\r\n\r\n            // Turn hex into a decimal...\r\n            if (a_szValue.ToLowerInvariant().StartsWith(\"0x\"))\r\n            {\r\n                return (int.Parse(a_szValue.Substring(2), NumberStyles.HexNumber).ToString());\r\n            }\r\n\r\n            // Skip numbers...\r\n            if (int.TryParse(a_szValue, out ii))\r\n            {\r\n                return (a_szValue);\r\n            }\r\n\r\n            // Process text...\r\n            switch (a_cap)\r\n            {\r\n                default: return (a_szValue);\r\n                case CAP.ACAP_XFERMECH: { TWSX twsx; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWSX>(a_szValue), out twsx) ? ((int)twsx).ToString() : a_szValue); };\r\n                case CAP.CAP_ALARMS: { TWAL twal; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWAL>(a_szValue), out twal) ? ((int)twal).ToString() : a_szValue); };\r\n                case CAP.CAP_ALARMVOLUME: return (a_szValue);\r\n                case CAP.CAP_AUTHOR: return (a_szValue);\r\n                case CAP.CAP_AUTOFEED: return (CvtCapValueFromEnumHelper<bool>(a_szValue));\r\n                case CAP.CAP_AUTOMATICCAPTURE: return (CvtCapValueFromEnumHelper<bool>(a_szValue));\r\n                case CAP.CAP_AUTOMATICSENSEMEDIUM: return (CvtCapValueFromEnumHelper<bool>(a_szValue));\r\n                case CAP.CAP_AUTOSCAN: return (CvtCapValueFromEnumHelper<bool>(a_szValue));\r\n                case CAP.CAP_BATTERYMINUTES: return (a_szValue);\r\n                case CAP.CAP_BATTERYPERCENTAGE: return (a_szValue);\r\n                case CAP.CAP_CAMERAENABLED: return (CvtCapValueFromEnumHelper<bool>(a_szValue));\r\n                case CAP.CAP_CAMERAORDER: { TWPT twpt; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWPT>(a_szValue), out twpt) ? ((int)twpt).ToString() : a_szValue); };\r\n                case CAP.CAP_CAMERAPREVIEWUI: return (CvtCapValueFromEnumHelper<bool>(a_szValue));\r\n                case CAP.CAP_CAMERASIDE: { TWCS twcs; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWCS>(a_szValue), out twcs) ? ((int)twcs).ToString() : a_szValue); };\r\n                case CAP.CAP_CAPTION: return (a_szValue);\r\n                case CAP.CAP_CLEARPAGE: return (CvtCapValueFromEnumHelper<bool>(a_szValue));\r\n                case CAP.CAP_CUSTOMDSDATA: return (CvtCapValueFromEnumHelper<bool>(a_szValue));\r\n                case CAP.CAP_CUSTOMINTERFACEGUID: return (a_szValue);\r\n                case CAP.CAP_DEVICEEVENT: { TWDE twde; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWDE>(a_szValue), out twde) ? ((int)twde).ToString() : a_szValue); };\r\n                case CAP.CAP_DEVICEONLINE: return (CvtCapValueFromEnumHelper<bool>(a_szValue));\r\n                case CAP.CAP_DEVICETIMEDATE: return (a_szValue);\r\n                case CAP.CAP_DOUBLEFEEDDETECTION: { TWDF twdf; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWDF>(a_szValue), out twdf) ? ((int)twdf).ToString() : a_szValue); };\r\n                case CAP.CAP_DOUBLEFEEDDETECTIONLENGTH: return (a_szValue);\r\n                case CAP.CAP_DOUBLEFEEDDETECTIONRESPONSE: { TWDP twdp; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWDP>(a_szValue), out twdp) ? ((int)twdp).ToString() : a_szValue); };\r\n                case CAP.CAP_DOUBLEFEEDDETECTIONSENSITIVITY: { TWUS twus; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWUS>(a_szValue), out twus) ? ((int)twus).ToString() : a_szValue); };\r\n                case CAP.CAP_DUPLEX: { TWDX twdx; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWDX>(a_szValue), out twdx) ? ((int)twdx).ToString() : a_szValue); };\r\n                case CAP.CAP_DUPLEXENABLED: return (CvtCapValueFromEnumHelper<bool>(a_szValue));\r\n                case CAP.CAP_ENABLEDSUIONLY: return (CvtCapValueFromEnumHelper<bool>(a_szValue));\r\n                case CAP.CAP_ENDORSER: return (a_szValue);\r\n                case CAP.CAP_EXTENDEDCAPS: { CAP cap; return (Enum.TryParse(CvtCapValueFromEnumHelper<CAP>(a_szValue), out cap) ? ((int)cap).ToString() : a_szValue); };\r\n                case CAP.CAP_FEEDERALIGNMENT: { TWFA twfa; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWFA>(a_szValue), out twfa) ? ((int)twfa).ToString() : a_szValue); };\r\n                case CAP.CAP_FEEDERENABLED: return (CvtCapValueFromEnumHelper<bool>(a_szValue));\r\n                case CAP.CAP_FEEDERLOADED: return (CvtCapValueFromEnumHelper<bool>(a_szValue));\r\n                case CAP.CAP_FEEDERORDER: { TWFO twfo; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWFO>(a_szValue), out twfo) ? ((int)twfo).ToString() : a_szValue); };\r\n                case CAP.CAP_FEEDERPOCKET: { TWFP twfp; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWFP>(a_szValue), out twfp) ? ((int)twfp).ToString() : a_szValue); };\r\n                case CAP.CAP_FEEDERPREP: return (CvtCapValueFromEnumHelper<bool>(a_szValue));\r\n                case CAP.CAP_FEEDPAGE: return (CvtCapValueFromEnumHelper<bool>(a_szValue));\r\n                case CAP.CAP_IAFIELDA_LASTPAGE: return (a_szValue);\r\n                case CAP.CAP_IAFIELDB_LASTPAGE: return (a_szValue);\r\n                case CAP.CAP_IAFIELDC_LASTPAGE: return (a_szValue);\r\n                case CAP.CAP_IAFIELDD_LASTPAGE: return (a_szValue);\r\n                case CAP.CAP_IAFIELDA_LEVEL: { TWIA twia; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWIA>(a_szValue), out twia) ? ((int)twia).ToString() : a_szValue); };\r\n                case CAP.CAP_IAFIELDB_LEVEL: { TWIA twia; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWIA>(a_szValue), out twia) ? ((int)twia).ToString() : a_szValue); };\r\n                case CAP.CAP_IAFIELDC_LEVEL: { TWIA twia; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWIA>(a_szValue), out twia) ? ((int)twia).ToString() : a_szValue); };\r\n                case CAP.CAP_IAFIELDD_LEVEL: { TWIA twia; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWIA>(a_szValue), out twia) ? ((int)twia).ToString() : a_szValue); };\r\n                case CAP.CAP_IAFIELDA_PRINTFORMAT: return (a_szValue);\r\n                case CAP.CAP_IAFIELDB_PRINTFORMAT: return (a_szValue);\r\n                case CAP.CAP_IAFIELDC_PRINTFORMAT: return (a_szValue);\r\n                case CAP.CAP_IAFIELDD_PRINTFORMAT: return (a_szValue);\r\n                case CAP.CAP_IAFIELDA_VALUE: return (a_szValue);\r\n                case CAP.CAP_IAFIELDB_VALUE: return (a_szValue);\r\n                case CAP.CAP_IAFIELDC_VALUE: return (a_szValue);\r\n                case CAP.CAP_IAFIELDD_VALUE: return (a_szValue);\r\n                case CAP.CAP_IMAGEADDRESSENABLED: return (CvtCapValueFromEnumHelper<bool>(a_szValue));\r\n                case CAP.CAP_INDICATORS: return (CvtCapValueFromEnumHelper<bool>(a_szValue));\r\n                case CAP.CAP_INDICATORSMODE: { TWCI twci; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWCI>(a_szValue), out twci) ? ((int)twci).ToString() : a_szValue); };\r\n                case CAP.CAP_JOBCONTROL: { TWJC twjc; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWJC>(a_szValue), out twjc) ? ((int)twjc).ToString() : a_szValue); };\r\n                case CAP.CAP_LANGUAGE: return(CvtCapValueFromTwlg(a_szValue));\r\n                case CAP.CAP_MAXBATCHBUFFERS: return (a_szValue);\r\n                case CAP.CAP_MICRENABLED: return (CvtCapValueFromEnumHelper<bool>(a_szValue));\r\n                case CAP.CAP_PAPERDETECTABLE: return (CvtCapValueFromEnumHelper<bool>(a_szValue));\r\n                case CAP.CAP_PAPERHANDLING: { TWPH twph; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWPH>(a_szValue), out twph) ? ((int)twph).ToString() : a_szValue); };\r\n                case CAP.CAP_POWERSAVETIME: return (a_szValue);\r\n                case CAP.CAP_POWERSUPPLY: { TWPS twps; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWPS>(a_szValue), out twps) ? ((int)twps).ToString() : a_szValue); };\r\n                case CAP.CAP_PRINTER: { TWPR twpr; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWPR>(a_szValue), out twpr) ? ((int)twpr).ToString() : a_szValue); };\r\n                case CAP.CAP_PRINTERCHARROTATION: return (a_szValue);\r\n                case CAP.CAP_PRINTERENABLED: return (CvtCapValueFromEnumHelper<bool>(a_szValue));\r\n                case CAP.CAP_PRINTERFONTSTYLE: { TWPF twpf; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWPF>(a_szValue), out twpf) ? ((int)twpf).ToString() : a_szValue); };\r\n                case CAP.CAP_PRINTERINDEX: return (a_szValue);\r\n                case CAP.CAP_PRINTERINDEXLEADCHAR: return (a_szValue);\r\n                case CAP.CAP_PRINTERINDEXMAXVALUE: return (a_szValue);\r\n                case CAP.CAP_PRINTERINDEXNUMDIGITS: return (a_szValue);\r\n                case CAP.CAP_PRINTERINDEXSTEP: return (a_szValue);\r\n                case CAP.CAP_PRINTERINDEXTRIGGER: { TWCT twct; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWCT>(a_szValue), out twct) ? ((int)twct).ToString() : a_szValue); };\r\n                case CAP.CAP_PRINTERMODE: { TWPM twpm; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWPM>(a_szValue), out twpm) ? ((int)twpm).ToString() : a_szValue); };\r\n                case CAP.CAP_PRINTERSTRING: return (a_szValue);\r\n                case CAP.CAP_PRINTERSTRINGPREVIEW: return (a_szValue);\r\n                case CAP.CAP_PRINTERSUFFIX: return (a_szValue);\r\n                case CAP.CAP_PRINTERVERTICALOFFSET: return (a_szValue);\r\n                case CAP.CAP_REACQUIREALLOWED: return (CvtCapValueFromEnumHelper<bool>(a_szValue));\r\n                case CAP.CAP_REWINDPAGE: return (CvtCapValueFromEnumHelper<bool>(a_szValue));\r\n                case CAP.CAP_SEGMENTED: { TWSG twsg; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWSG>(a_szValue), out twsg) ? ((int)twsg).ToString() : a_szValue); };\r\n                case CAP.CAP_SERIALNUMBER: return (a_szValue);\r\n                case CAP.CAP_SHEETCOUNT: return (a_szValue);\r\n                case CAP.CAP_SUPPORTEDCAPS: { CAP cap; return (Enum.TryParse(CvtCapValueFromEnumHelper<CAP>(a_szValue), out cap) ? ((int)cap).ToString() : a_szValue); };\r\n                case CAP.CAP_SUPPORTEDCAPSSEGMENTUNIQUE: { CAP cap; return (Enum.TryParse(CvtCapValueFromEnumHelper<CAP>(a_szValue), out cap) ? ((int)cap).ToString() : a_szValue); };\r\n                case CAP.CAP_SUPPORTEDDATS: { DAT dat; return (Enum.TryParse(CvtCapValueFromEnumHelper<DAT>(a_szValue), out dat) ? ((int)dat).ToString() : a_szValue); };\r\n                case CAP.CAP_THUMBNAILSENABLED: return (CvtCapValueFromEnumHelper<bool>(a_szValue));\r\n                case CAP.CAP_TIMEBEFOREFIRSTCAPTURE: return (a_szValue);\r\n                case CAP.CAP_TIMEBETWEENCAPTURES: return (a_szValue);\r\n                case CAP.CAP_TIMEDATE: return (a_szValue);\r\n                case CAP.CAP_UICONTROLLABLE: return (CvtCapValueFromEnumHelper<bool>(a_szValue));\r\n                case CAP.CAP_XFERCOUNT: return (a_szValue);\r\n                case CAP.ICAP_AUTOBRIGHT: return (CvtCapValueFromEnumHelper<bool>(a_szValue));\r\n                case CAP.ICAP_AUTODISCARDBLANKPAGES: { TWBP twbp; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWBP>(a_szValue), out twbp) ? ((int)twbp).ToString() : a_szValue); };\r\n                case CAP.ICAP_AUTOMATICBORDERDETECTION: return (CvtCapValueFromEnumHelper<bool>(a_szValue));\r\n                case CAP.ICAP_AUTOMATICCOLORENABLED: return (CvtCapValueFromEnumHelper<bool>(a_szValue));\r\n                case CAP.ICAP_AUTOMATICCOLORNONCOLORPIXELTYPE: { TWPT twpt; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWPT>(a_szValue), out twpt) ? ((int)twpt).ToString() : a_szValue); };\r\n                case CAP.ICAP_AUTOMATICCROPUSESFRAME: return (CvtCapValueFromEnumHelper<bool>(a_szValue));\r\n                case CAP.ICAP_AUTOMATICDESKEW: return (CvtCapValueFromEnumHelper<bool>(a_szValue));\r\n                case CAP.ICAP_AUTOMATICLENGTHDETECTION: return (CvtCapValueFromEnumHelper<bool>(a_szValue));\r\n                case CAP.ICAP_AUTOMATICROTATE: return (CvtCapValueFromEnumHelper<bool>(a_szValue));\r\n                case CAP.ICAP_AUTOSIZE: { TWAS twas; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWAS>(a_szValue), out twas) ? ((int)twas).ToString() : a_szValue); };\r\n                case CAP.ICAP_BARCODEDETECTIONENABLED: return (CvtCapValueFromEnumHelper<bool>(a_szValue));\r\n                case CAP.ICAP_BARCODEMAXRETRIES: return (a_szValue);\r\n                case CAP.ICAP_BARCODEMAXSEARCHPRIORITIES: return (a_szValue);\r\n                case CAP.ICAP_BARCODESEARCHMODE: { TWBD twbd; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWBD>(a_szValue), out twbd) ? ((int)twbd).ToString() : a_szValue); };\r\n                case CAP.ICAP_BARCODESEARCHPRIORITIES: { TWBT twbt; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWBT>(a_szValue), out twbt) ? ((int)twbt).ToString() : a_szValue); };\r\n                case CAP.ICAP_BARCODETIMEOUT: return (a_szValue);\r\n                case CAP.ICAP_BITDEPTH: return (a_szValue);\r\n                case CAP.ICAP_BITDEPTHREDUCTION: { TWBR twbr; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWBR>(a_szValue), out twbr) ? ((int)twbr).ToString() : a_szValue); };\r\n                case CAP.ICAP_BITORDER: { TWBO twbo; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWBO>(a_szValue), out twbo) ? ((int)twbo).ToString() : a_szValue); };\r\n                case CAP.ICAP_BITORDERCODES: { TWBO twbo; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWBO>(a_szValue), out twbo) ? ((int)twbo).ToString() : a_szValue); };\r\n                case CAP.ICAP_BRIGHTNESS: return (a_szValue);\r\n                case CAP.ICAP_CCITTKFACTOR: return (a_szValue);\r\n                case CAP.ICAP_COLORMANAGEMENTENABLED: return (CvtCapValueFromEnumHelper<bool>(a_szValue));\r\n                case CAP.ICAP_COMPRESSION: { TWCP twcp; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWCP>(a_szValue), out twcp) ? ((int)twcp).ToString() : a_szValue); };\r\n                case CAP.ICAP_CONTRAST: return (a_szValue);\r\n                case CAP.ICAP_CUSTHALFTONE: return (a_szValue);\r\n                case CAP.ICAP_EXPOSURETIME: return (a_szValue);\r\n                case CAP.ICAP_EXTIMAGEINFO: return (CvtCapValueFromEnumHelper<bool>(a_szValue));\r\n                case CAP.ICAP_FEEDERTYPE: { TWFE twfe; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWFE>(a_szValue), out twfe) ? ((int)twfe).ToString() : a_szValue); };\r\n                case CAP.ICAP_FILMTYPE: { TWFM twfm; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWFM>(a_szValue), out twfm) ? ((int)twfm).ToString() : a_szValue); };\r\n                case CAP.ICAP_FILTER: { TWFT twft; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWFT>(a_szValue), out twft) ? ((int)twft).ToString() : a_szValue); };\r\n                case CAP.ICAP_FLASHUSED: return (CvtCapValueFromEnumHelper<bool>(a_szValue));\r\n                case CAP.ICAP_FLASHUSED2: { TWFL twfl; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWFL>(a_szValue), out twfl) ? ((int)twfl).ToString() : a_szValue); };\r\n                case CAP.ICAP_FLIPROTATION: { TWFR twfr; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWFR>(a_szValue), out twfr) ? ((int)twfr).ToString() : a_szValue); };\r\n                case CAP.ICAP_FRAMES: return (a_szValue);\r\n                case CAP.ICAP_GAMMA: return (a_szValue);\r\n                case CAP.ICAP_HALFTONES: return (a_szValue);\r\n                case CAP.ICAP_HIGHLIGHT: return (a_szValue);\r\n                case CAP.ICAP_ICCPROFILE: { TWIC twic; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWIC>(a_szValue), out twic) ? ((int)twic).ToString() : a_szValue); };\r\n                case CAP.ICAP_IMAGEDATASET: return (a_szValue);\r\n                case CAP.ICAP_IMAGEFILEFORMAT: { TWFF twff; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWFF>(a_szValue), out twff) ? ((int)twff).ToString() : a_szValue); };\r\n                case CAP.ICAP_IMAGEFILTER: { TWIF twif; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWIF>(a_szValue), out twif) ? ((int)twif).ToString() : a_szValue); };\r\n                case CAP.ICAP_IMAGEMERGE: { TWIM twim; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWIM>(a_szValue), out twim) ? ((int)twim).ToString() : a_szValue); };\r\n                case CAP.ICAP_IMAGEMERGEHEIGHTTHRESHOLD: return (a_szValue);\r\n                case CAP.ICAP_JPEGPIXELTYPE: { TWPT twpt; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWPT>(a_szValue), out twpt) ? ((int)twpt).ToString() : a_szValue); };\r\n                case CAP.ICAP_JPEGQUALITY: { TWJQ twjq; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWJQ>(a_szValue), out twjq) ? ((int)twjq).ToString() : a_szValue); };\r\n                case CAP.ICAP_JPEGSUBSAMPLING: { TWJS twjs; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWJS>(a_szValue), out twjs) ? ((int)twjs).ToString() : a_szValue); };\r\n                case CAP.ICAP_LAMPSTATE: return (CvtCapValueFromEnumHelper<bool>(a_szValue));\r\n                case CAP.ICAP_LIGHTPATH: { TWLP twlp; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWLP>(a_szValue), out twlp) ? ((int)twlp).ToString() : a_szValue); };\r\n                case CAP.ICAP_LIGHTSOURCE: { TWLS twls; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWLS>(a_szValue), out twls) ? ((int)twls).ToString() : a_szValue); };\r\n                case CAP.ICAP_MAXFRAMES: return (a_szValue);\r\n                case CAP.ICAP_MINIMUMHEIGHT: return (a_szValue);\r\n                case CAP.ICAP_MINIMUMWIDTH: return (a_szValue);\r\n                case CAP.ICAP_MIRROR: { TWMR twmr; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWMR>(a_szValue), out twmr) ? ((int)twmr).ToString() : a_szValue); };\r\n                case CAP.ICAP_NOISEFILTER: { TWNF twnf; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWNF>(a_szValue), out twnf) ? ((int)twnf).ToString() : a_szValue); };\r\n                case CAP.ICAP_ORIENTATION: { TWOR twor; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWOR>(a_szValue), out twor) ? ((int)twor).ToString() : a_szValue); };\r\n                case CAP.ICAP_OVERSCAN: { TWOV twov; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWOV>(a_szValue), out twov) ? ((int)twov).ToString() : a_szValue); };\r\n                case CAP.ICAP_PATCHCODEDETECTIONENABLED: return (CvtCapValueFromEnumHelper<bool>(a_szValue));\r\n                case CAP.ICAP_PATCHCODEMAXRETRIES: return (a_szValue);\r\n                case CAP.ICAP_PATCHCODEMAXSEARCHPRIORITIES: return (a_szValue);\r\n                case CAP.ICAP_PATCHCODESEARCHMODE: { TWBD twbd; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWBD>(a_szValue), out twbd) ? ((int)twbd).ToString() : a_szValue); };\r\n                case CAP.ICAP_PATCHCODESEARCHPRIORITIES: { TWPCH twpch; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWPCH>(a_szValue), out twpch) ? ((int)twpch).ToString() : a_szValue); };\r\n                case CAP.ICAP_PATCHCODETIMEOUT: return (a_szValue);\r\n                case CAP.ICAP_PHYSICALHEIGHT: return (a_szValue);\r\n                case CAP.ICAP_PHYSICALWIDTH: return (a_szValue);\r\n                case CAP.ICAP_PIXELFLAVOR: { TWPF twpf; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWPF>(a_szValue), out twpf) ? ((int)twpf).ToString() : a_szValue); };\r\n                case CAP.ICAP_PIXELFLAVORCODES: { TWPF twpf; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWPF>(a_szValue), out twpf) ? ((int)twpf).ToString() : a_szValue); };\r\n                case CAP.ICAP_PIXELTYPE: { TWPT twpt; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWPT>(a_szValue), out twpt) ? ((int)twpt).ToString() : a_szValue); };\r\n                case CAP.ICAP_PLANARCHUNKY: { TWPC twpc; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWPC>(a_szValue), out twpc) ? ((int)twpc).ToString() : a_szValue); };\r\n                case CAP.ICAP_ROTATION: return (a_szValue);\r\n                case CAP.ICAP_SHADOW: return (a_szValue);\r\n                case CAP.ICAP_SUPPORTEDBARCODETYPES: { TWBT twbt; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWBT>(a_szValue), out twbt) ? ((int)twbt).ToString() : a_szValue); };\r\n                case CAP.ICAP_SUPPORTEDEXTIMAGEINFO: { TWEI twei; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWEI>(a_szValue), out twei) ? ((int)twei).ToString() : a_szValue); };\r\n                case CAP.ICAP_SUPPORTEDPATCHCODETYPES: { TWPCH twpch; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWPCH>(a_szValue), out twpch) ? ((int)twpch).ToString() : a_szValue); };\r\n                case CAP.ICAP_SUPPORTEDSIZES: { TWSS twss; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWSS>(a_szValue), out twss) ? ((int)twss).ToString() : a_szValue); };\r\n                case CAP.ICAP_THRESHOLD: return (a_szValue);\r\n                case CAP.ICAP_TILES: return (CvtCapValueFromEnumHelper<bool>(a_szValue));\r\n                case CAP.ICAP_TIMEFILL: return (a_szValue);\r\n                case CAP.ICAP_UNDEFINEDIMAGESIZE: return (CvtCapValueFromEnumHelper<bool>(a_szValue));\r\n                case CAP.ICAP_UNITS: { TWUN twun; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWUN>(a_szValue), out twun) ? ((int)twun).ToString() : a_szValue); };\r\n                case CAP.ICAP_XFERMECH: { TWSX twsx; return (Enum.TryParse(CvtCapValueFromEnumHelper<TWSX>(a_szValue), out twsx) ? ((int)twsx).ToString() : a_szValue); };\r\n                case CAP.ICAP_XNATIVERESOLUTION: return (a_szValue);\r\n                case CAP.ICAP_XRESOLUTION: return (a_szValue);\r\n                case CAP.ICAP_XSCALING: return (a_szValue);\r\n                case CAP.ICAP_YNATIVERESOLUTION: return (a_szValue);\r\n                case CAP.ICAP_YRESOLUTION: return (a_szValue);\r\n                case CAP.ICAP_YSCALING: return (a_szValue);\r\n                case CAP.ICAP_ZOOMFACTOR: return (a_szValue);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert a value to the 'friendly' name, based on the TWEI...\r\n        /// </summary>\r\n        /// <param name=\"a_twei\">TWEI driving the conversion</param>\r\n        /// <param name=\"szValue\">value to convert</param>\r\n        /// <returns></returns>\r\n        public static string CvtTweiValueToEnum(TWEI a_twei, string a_szValue)\r\n        {\r\n            switch (a_twei)\r\n            {\r\n                default: return (a_szValue);\r\n                case TWEI.BARCODECONFIDENCE: return (a_szValue);\r\n                case TWEI.BARCODECOUNT: return (a_szValue);\r\n                case TWEI.BARCODEROTATION: return (CvtCapValueToEnumHelper<TWBCOR>(a_szValue));\r\n                case TWEI.BARCODETEXT: return (a_szValue);\r\n                case TWEI.BARCODETEXT2: return (a_szValue);\r\n                case TWEI.BARCODETEXTLENGTH: return (a_szValue);\r\n                case TWEI.BARCODETYPE: return (CvtCapValueToEnumHelper<TWBT>(a_szValue));\r\n                case TWEI.BARCODEX: return (a_szValue);\r\n                case TWEI.BARCODEY: return (a_szValue);\r\n                case TWEI.BLACKSPECKLESREMOVED: return (a_szValue);\r\n                case TWEI.BOOKNAME: return (a_szValue);\r\n                case TWEI.CAMERA: return (a_szValue);\r\n                case TWEI.CHAPTERNUMBER: return (a_szValue);\r\n                case TWEI.DESHADEBLACKCOUNTNEW: return (a_szValue);\r\n                case TWEI.DESHADEBLACKCOUNTOLD: return (a_szValue);\r\n                case TWEI.DESHADEBLACKRLMAX: return (a_szValue);\r\n                case TWEI.DESHADEBLACKRLMIN: return (a_szValue);\r\n                case TWEI.DESHADECOUNT: return (a_szValue);\r\n                case TWEI.DESHADEHEIGHT: return (a_szValue);\r\n                case TWEI.DESHADELEFT: return (a_szValue);\r\n                case TWEI.DESHADESIZE: return (a_szValue);\r\n                case TWEI.DESHADETOP: return (a_szValue);\r\n                case TWEI.DESHADEWHITECOUNTNEW: return (a_szValue);\r\n                case TWEI.DESHADEWHITECOUNTOLD: return (a_szValue);\r\n                case TWEI.DESHADEWHITERLAVE: return (a_szValue);\r\n                case TWEI.DESHADEWHITERLMAX: return (a_szValue);\r\n                case TWEI.DESHADEWHITERLMIN: return (a_szValue);\r\n                case TWEI.DESHADEWIDTH: return (a_szValue);\r\n                case TWEI.DESKEWSTATUS: return (CvtCapValueToEnumHelper<TWDSK>(a_szValue));\r\n                case TWEI.DOCUMENTNUMBER: return (a_szValue);\r\n                case TWEI.ENDORSEDTEXT: return (a_szValue);\r\n                case TWEI.FILESYSTEMSOURCE: return (a_szValue);\r\n                case TWEI.FORMCONFIDENCE: return (a_szValue);\r\n                case TWEI.FORMHORZDOCOFFSET: return (a_szValue);\r\n                case TWEI.FORMTEMPLATEMATCH: return (a_szValue);\r\n                case TWEI.FORMTEMPLATEPAGEMATCH: return (a_szValue);\r\n                case TWEI.FORMVERTDOCOFFSET: return (a_szValue);\r\n                case TWEI.FRAME: return (a_szValue);\r\n                case TWEI.FRAMENUMBER: return (a_szValue);\r\n                case TWEI.HORZLINECOUNT: return (a_szValue);\r\n                case TWEI.HORZLINELENGTH: return (a_szValue);\r\n                case TWEI.HORZLINETHICKNESS: return (a_szValue);\r\n                case TWEI.HORZLINEXCOORD: return (a_szValue);\r\n                case TWEI.HORZLINEYCOORD: return (a_szValue);\r\n                case TWEI.IAFIELDA_VALUE: return (a_szValue);\r\n                case TWEI.IAFIELDB_VALUE: return (a_szValue);\r\n                case TWEI.IAFIELDC_VALUE: return (a_szValue);\r\n                case TWEI.IAFIELDD_VALUE: return (a_szValue);\r\n                case TWEI.IAFIELDE_VALUE: return (a_szValue);\r\n                case TWEI.IALEVEL: return (CvtCapValueToEnumHelper<TWIA>(a_szValue));\r\n                case TWEI.ICCPROFILE: return (a_szValue);\r\n                case TWEI.IMAGEMERGED: return (CvtCapValueToEnumHelper<bool>(a_szValue));\r\n                case TWEI.LASTSEGMENT: return (CvtCapValueToEnumHelper<bool>(a_szValue));\r\n                case TWEI.MAGDATA: return (a_szValue);\r\n                case TWEI.MAGDATALENGTH: return (a_szValue);\r\n                case TWEI.MAGTYPE: return (CvtCapValueToEnumHelper<TWMD>(a_szValue));\r\n                case TWEI.PAGENUMBER: return (a_szValue);\r\n                case TWEI.PAGESIDE: return (a_szValue);\r\n                case TWEI.PAPERCOUNT: return (a_szValue);\r\n                case TWEI.PATCHCODE: return (CvtCapValueToEnumHelper<TWPCH>(a_szValue));\r\n                case TWEI.PIXELFLAVOR: return (CvtCapValueToEnumHelper<TWPF>(a_szValue));\r\n                case TWEI.PRINTER: return (CvtCapValueToEnumHelper<TWPR>(a_szValue));\r\n                case TWEI.PRINTERTEXT: return (a_szValue);\r\n                case TWEI.SEGMENTNUMBER: return (a_szValue);\r\n                case TWEI.SKEWCONFIDENCE: return (a_szValue);\r\n                case TWEI.SKEWFINALANGLE: return (a_szValue);\r\n                case TWEI.SKEWORIGINALANGLE: return (a_szValue);\r\n                case TWEI.SKEWWINDOWX1: return (a_szValue);\r\n                case TWEI.SKEWWINDOWX2: return (a_szValue);\r\n                case TWEI.SKEWWINDOWX3: return (a_szValue);\r\n                case TWEI.SKEWWINDOWX4: return (a_szValue);\r\n                case TWEI.SKEWWINDOWY1: return (a_szValue);\r\n                case TWEI.SKEWWINDOWY2: return (a_szValue);\r\n                case TWEI.SKEWWINDOWY3: return (a_szValue);\r\n                case TWEI.SKEWWINDOWY4: return (a_szValue);\r\n                case TWEI.SPECKLESREMOVED: return (a_szValue);\r\n                case TWEI.TWAINDIRECTMETADATA: return (a_szValue);\r\n                case TWEI.VERTLINECOUNT: return (a_szValue);\r\n                case TWEI.VERTLINELENGTH: return (a_szValue);\r\n                case TWEI.VERTLINETHICKNESS: return (a_szValue);\r\n                case TWEI.VERTLINEXCOORD: return (a_szValue);\r\n                case TWEI.VERTLINEYCOORD: return (a_szValue);\r\n                case TWEI.WHITESPECKLESREMOVED: return (a_szValue);\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        // Public DSM_Entry calls, most of the DSM_Entry calls are in here.  Their\r\n        // main contribution is to make sure that they're running within the right\r\n        // thread, but they also include the state transitions...\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        #region Public DSM_Entry calls...\r\n\r\n        /// <summary>\r\n        /// Generic DSM when the dest must be zero (null)...\r\n        /// </summary>\r\n        /// <param name=\"a_dg\">Data group</param>\r\n        /// <param name=\"a_dat\">Data argument type</param>\r\n        /// <param name=\"a_msg\">Operation</param>\r\n        /// <param name=\"a_twmemref\">Pointer to data</param>\r\n        /// <returns>TWAIN status</returns>\r\n        public STS DsmEntryNullDest(DG a_dg, DAT a_dat, MSG a_msg, IntPtr a_twmemref)\r\n        {\r\n            STS sts;\r\n\r\n            // Submit the work to the TWAIN thread...\r\n            if ((m_threadTwain != null) && (m_threadTwain.ManagedThreadId != Thread.CurrentThread.ManagedThreadId))\r\n            {\r\n                lock (m_lockTwain)\r\n                {\r\n                    // Set our command variables...\r\n                    ThreadData threaddata = default(ThreadData);\r\n                    threaddata.twmemref = a_twmemref;\r\n                    threaddata.msg = a_msg;\r\n                    threaddata.dg = a_dg;\r\n                    threaddata.dat = a_dat;\r\n                    long lIndex = m_twaincommand.Submit(threaddata);\r\n\r\n                    // Submit the command and wait for the reply...\r\n                    CallerToThreadSet();\r\n                    ThreadToCallerWaitOne();\r\n\r\n                    // Return the result...\r\n                    a_twmemref = m_twaincommand.Get(lIndex).twmemref;\r\n                    sts = m_twaincommand.Get(lIndex).sts;\r\n\r\n                    // Clear the command variables...\r\n                    m_twaincommand.Delete(lIndex);\r\n                }\r\n                return (sts);\r\n            }\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendBefore(a_dg.ToString(), a_dat.ToString(), a_msg.ToString(), \"\");\r\n            }\r\n\r\n            // Windows...\r\n            if (ms_platform == Platform.WINDOWS)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.WindowsTwain32DsmEntryNullDest(ref m_twidentitylegacyApp, IntPtr.Zero, a_dg, a_dat, a_msg, a_twmemref);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.WindowsTwaindsmDsmEntryNullDest(ref m_twidentitylegacyApp, IntPtr.Zero, a_dg, a_dat, a_msg, a_twmemref);\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Linux...\r\n            else if (ms_platform == Platform.LINUX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blFoundLatestDsm64 && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux64DsmEntryNullDest(ref m_twidentitylegacyApp, IntPtr.Zero, a_dg, a_dat, a_msg, a_twmemref);\r\n                    }\r\n                    else if (m_blFoundLatestDsm && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.LinuxDsmEntryNullDest(ref m_twidentitylegacyApp, IntPtr.Zero, a_dg, a_dat, a_msg, a_twmemref);\r\n                    }\r\n                    else if (m_blFound020302Dsm64bit && (m_linuxdsm == LinuxDsm.Is020302Dsm64bit))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux020302Dsm64bitEntryNullDest(ref m_twidentityApp, IntPtr.Zero, a_dg, a_dat, a_msg, a_twmemref);\r\n                    }\r\n                    else\r\n                    {\r\n                        Log.Error(\"apparently we don't have a DSM...\");\r\n                        sts = STS.BUMMER;\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Mac OS X, which has to be different...\r\n            else if (ms_platform == Platform.MACOSX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwainDsmEntryNullDest(ref m_twidentitymacosxApp, IntPtr.Zero, a_dg, a_dat, a_msg, a_twmemref);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwaindsmDsmEntryNullDest(ref m_twidentitymacosxApp, IntPtr.Zero, a_dg, a_dat, a_msg, a_twmemref);\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Uh-oh...\r\n            else\r\n            {\r\n                TWAINWorkingGroup.Log.Assert(\"Unsupported platform...\" + ms_platform);\r\n                return (STS.BUMMER);\r\n            }\r\n\r\n            // Get DAT_STATUS, if needed...\r\n            TWAIN.STS stsRcOrCc = AutoDatStatus(sts);\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendAfter(stsRcOrCc, \"\");\r\n            }\r\n\r\n            // All done...\r\n            return (sts);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Generic DSM when the dest must be a data source...\r\n        /// </summary>\r\n        /// <param name=\"a_dg\">Data group</param>\r\n        /// <param name=\"a_dat\">Data argument type</param>\r\n        /// <param name=\"a_msg\">Operation</param>\r\n        /// <param name=\"a_twmemref\">Pointer to data</param>\r\n        /// <returns>TWAIN status</returns>\r\n        public STS DsmEntry(DG a_dg, DAT a_dat, MSG a_msg, IntPtr a_twmemref)\r\n        {\r\n            STS sts;\r\n\r\n            // Submit the work to the TWAIN thread...\r\n            if ((m_threadTwain != null) && (m_threadTwain.ManagedThreadId != Thread.CurrentThread.ManagedThreadId))\r\n            {\r\n                lock (m_lockTwain)\r\n                {\r\n                    // Set our command variables...\r\n                    ThreadData threaddata = default(ThreadData);\r\n                    threaddata.twmemref = a_twmemref;\r\n                    threaddata.dg = a_dg;\r\n                    threaddata.msg = a_msg;\r\n                    threaddata.dat = a_dat;\r\n                    long lIndex = m_twaincommand.Submit(threaddata);\r\n\r\n                    // Submit the command and wait for the reply...\r\n                    CallerToThreadSet();\r\n                    ThreadToCallerWaitOne();\r\n\r\n                    // Return the result...\r\n                    a_twmemref = m_twaincommand.Get(lIndex).twmemref;\r\n                    sts = m_twaincommand.Get(lIndex).sts;\r\n\r\n                    // Clear the command variables...\r\n                    m_twaincommand.Delete(lIndex);\r\n                }\r\n                return (sts);\r\n            }\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendBefore(a_dg.ToString(), a_dat.ToString(), a_msg.ToString(), \"\");\r\n            }\r\n\r\n            // Windows...\r\n            if (ms_platform == Platform.WINDOWS)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.WindowsTwain32DsmEntry(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, a_dat, a_msg, a_twmemref);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.WindowsTwaindsmDsmEntry(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, a_dat, a_msg, a_twmemref);\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Linux...\r\n            else if (ms_platform == Platform.LINUX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blFoundLatestDsm64 && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux64DsmEntry(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, a_dat, a_msg, a_twmemref);\r\n                    }\r\n                    else if (m_blFoundLatestDsm && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.LinuxDsmEntry(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, a_dat, a_msg, a_twmemref);\r\n                    }\r\n                    else if (m_blFound020302Dsm64bit && (m_linuxdsm == LinuxDsm.Is020302Dsm64bit))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux020302Dsm64bitEntry(ref m_twidentityApp, ref m_twidentityDs, a_dg, a_dat, a_msg, a_twmemref);\r\n                    }\r\n                    else\r\n                    {\r\n                        Log.Error(\"apparently we don't have a DSM...\");\r\n                        sts = STS.BUMMER;\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Mac OS X, which has to be different...\r\n            else if (ms_platform == Platform.MACOSX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwainDsmEntry(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.AUDIOINFO, a_msg, a_twmemref);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwaindsmDsmEntry(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.AUDIOINFO, a_msg, a_twmemref);\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Uh-oh...\r\n            else\r\n            {\r\n                Log.LogSendAfter(STS.BUMMER, \"\");\r\n                return (STS.BUMMER);\r\n            }\r\n\r\n            // Get DAT_STATUS, if needed...\r\n            TWAIN.STS stsRcOrCc = AutoDatStatus(sts);\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendAfter(stsRcOrCc, \"\");\r\n            }\r\n\r\n            // All done...\r\n            return (stsRcOrCc);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Issue file audio transfer commands...\r\n        /// </summary>\r\n        /// <param name=\"a_dg\">Data group</param>\r\n        /// <param name=\"a_msg\">Operation</param>\r\n        /// <returns>TWAIN status</returns>\r\n        private void DatAudiofilexferWindowsTwain32()\r\n        {\r\n            // If you get a first chance exception, be aware that some drivers\r\n            // will do that to you, you can ignore it and they'll keep going...\r\n            m_threaddataDatAudiofilexfer.sts = (STS)NativeMethods.WindowsTwain32DsmEntryAudiofilexfer\r\n            (\r\n                ref m_twidentitylegacyApp,\r\n                ref m_twidentitylegacyDs,\r\n                m_threaddataDatAudiofilexfer.dg,\r\n                m_threaddataDatAudiofilexfer.dat,\r\n                m_threaddataDatAudiofilexfer.msg,\r\n                IntPtr.Zero\r\n            );\r\n        }\r\n        private void DatAudiofilexferWindowsTwainDsm()\r\n        {\r\n            // If you get a first chance exception, be aware that some drivers\r\n            // will do that to you, you can ignore it and they'll keep going...\r\n            m_threaddataDatAudiofilexfer.sts = (STS)NativeMethods.WindowsTwaindsmDsmEntryAudiofilexfer\r\n            (\r\n                ref m_twidentitylegacyApp,\r\n                ref m_twidentitylegacyDs,\r\n                m_threaddataDatAudiofilexfer.dg,\r\n                m_threaddataDatAudiofilexfer.dat,\r\n                m_threaddataDatAudiofilexfer.msg,\r\n                IntPtr.Zero\r\n            );\r\n        }\r\n        public STS DatAudiofilexfer(DG a_dg, MSG a_msg)\r\n        {\r\n            STS sts;\r\n\r\n            // Submit the work to the TWAIN thread...\r\n            if (this.m_runinuithreaddelegate == null)\r\n            {\r\n                if ((m_threadTwain != null) && (m_threadTwain.ManagedThreadId != Thread.CurrentThread.ManagedThreadId))\r\n                {\r\n                    lock (m_lockTwain)\r\n                    {\r\n                        // Set our command variables...\r\n                        ThreadData threaddata = default(ThreadData);\r\n                        threaddata.dg = a_dg;\r\n                        threaddata.msg = a_msg;\r\n                        threaddata.dat = DAT.AUDIOFILEXFER;\r\n                        long lIndex = m_twaincommand.Submit(threaddata);\r\n\r\n                        // Submit the command and wait for the reply...\r\n                        CallerToThreadSet();\r\n                        ThreadToCallerWaitOne();\r\n\r\n                        // Return the result...\r\n                        sts = m_twaincommand.Get(lIndex).sts;\r\n\r\n                        // Clear the command variables...\r\n                        m_twaincommand.Delete(lIndex);\r\n                    }\r\n                    return (sts);\r\n                }\r\n            }\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendBefore(a_dg.ToString(), DAT.AUDIOFILEXFER.ToString(), a_msg.ToString(), \"\");\r\n            }\r\n\r\n            // Windows...\r\n            if (ms_platform == Platform.WINDOWS)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_threaddataDatAudiofilexfer.blIsInuse || (this.m_runinuithreaddelegate == null))\r\n                    {\r\n                        if (m_blUseLegacyDSM)\r\n                        {\r\n                            sts = (STS)NativeMethods.WindowsTwain32DsmEntryAudiofilexfer(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.AUDIOFILEXFER, a_msg, IntPtr.Zero);\r\n                        }\r\n                        else\r\n                        {\r\n                            sts = (STS)NativeMethods.WindowsTwaindsmDsmEntryAudiofilexfer(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.AUDIOFILEXFER, a_msg, IntPtr.Zero);\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        if (m_blUseLegacyDSM)\r\n                        {\r\n                            lock (m_lockTwain)\r\n                            {\r\n                                m_threaddataDatAudiofilexfer = default(ThreadData);\r\n                                m_threaddataDatAudiofilexfer.blIsInuse = true;\r\n                                m_threaddataDatAudiofilexfer.dg = a_dg;\r\n                                m_threaddataDatAudiofilexfer.msg = a_msg;\r\n                                m_threaddataDatAudiofilexfer.dat = DAT.AUDIOFILEXFER;\r\n                                RunInUiThread(DatAudiofilexferWindowsTwain32);\r\n                                sts = m_threaddataDatAudiofilexfer.sts;\r\n                                m_threaddataDatAudiofilexfer = default(ThreadData);\r\n                            }\r\n                        }\r\n                        else\r\n                        {\r\n                            lock (m_lockTwain)\r\n                            {\r\n                                m_threaddataDatAudiofilexfer = default(ThreadData);\r\n                                m_threaddataDatAudiofilexfer.blIsInuse = true;\r\n                                m_threaddataDatAudiofilexfer.dg = a_dg;\r\n                                m_threaddataDatAudiofilexfer.msg = a_msg;\r\n                                m_threaddataDatAudiofilexfer.dat = DAT.AUDIOFILEXFER;\r\n                                RunInUiThread(DatAudiofilexferWindowsTwainDsm);\r\n                                sts = m_threaddataDatAudiofilexfer.sts;\r\n                                m_threaddataDatAudiofilexfer = default(ThreadData);\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Linux...\r\n            else if (ms_platform == Platform.LINUX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blFoundLatestDsm64 && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux64DsmEntryAudiofilexfer(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.AUDIOFILEXFER, a_msg, IntPtr.Zero);\r\n                    }\r\n                    else if (m_blFoundLatestDsm && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.LinuxDsmEntryAudiofilexfer(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.AUDIOFILEXFER, a_msg, IntPtr.Zero);\r\n                    }\r\n                    else if (m_blFound020302Dsm64bit && (m_linuxdsm == LinuxDsm.Is020302Dsm64bit))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux020302Dsm64bitEntryAudiofilexfer(ref m_twidentityApp, ref m_twidentityDs, a_dg, DAT.AUDIOFILEXFER, a_msg, IntPtr.Zero);\r\n                    }\r\n                    else\r\n                    {\r\n                        Log.Error(\"apparently we don't have a DSM...\");\r\n                        sts = STS.BUMMER;\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Mac OS X, which has to be different...\r\n            else if (ms_platform == Platform.MACOSX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwainDsmEntryAudiofilexfer(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.AUDIOFILEXFER, a_msg, IntPtr.Zero);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwaindsmDsmEntryAudiofilexfer(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.AUDIOFILEXFER, a_msg, IntPtr.Zero);\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Uh-oh...\r\n            else\r\n            {\r\n                Log.LogSendAfter(STS.BUMMER, \"\");\r\n                return (STS.BUMMER);\r\n            }\r\n\r\n            // Get DAT_STATUS, if needed...\r\n            TWAIN.STS stsRcOrCc = AutoDatStatus(sts);\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendAfter(stsRcOrCc, \"\");\r\n            }\r\n\r\n            // If we had a successful transfer, then change state...\r\n            if (sts == STS.XFERDONE)\r\n            {\r\n                m_state = STATE.S7;\r\n            }\r\n\r\n            // All done...\r\n            return (stsRcOrCc);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Get/Set audio info information...\r\n        /// </summary>\r\n        /// <param name=\"a_dg\">Data group</param>\r\n        /// <param name=\"a_msg\">Operation</param>\r\n        /// <param name=\"a_twaudioinfo\">Audio structure</param>\r\n        /// <returns>TWAIN status</returns>\r\n        public STS DatAudioinfo(DG a_dg, MSG a_msg, ref TW_AUDIOINFO a_twaudioinfo)\r\n        {\r\n            STS sts;\r\n\r\n            // Submit the work to the TWAIN thread...\r\n            if ((m_threadTwain != null) && (m_threadTwain.ManagedThreadId != Thread.CurrentThread.ManagedThreadId))\r\n            {\r\n                lock (m_lockTwain)\r\n                {\r\n                    // Set our command variables...\r\n                    ThreadData threaddata = default(ThreadData);\r\n                    threaddata.twaudioinfo = a_twaudioinfo;\r\n                    threaddata.dg = a_dg;\r\n                    threaddata.msg = a_msg;\r\n                    threaddata.dat = DAT.AUDIOINFO;\r\n                    long lIndex = m_twaincommand.Submit(threaddata);\r\n\r\n                    // Submit the command and wait for the reply...\r\n                    CallerToThreadSet();\r\n                    ThreadToCallerWaitOne();\r\n\r\n                    // Return the result...\r\n                    a_twaudioinfo = m_twaincommand.Get(lIndex).twaudioinfo;\r\n                    sts = m_twaincommand.Get(lIndex).sts;\r\n\r\n                    // Clear the command variables...\r\n                    m_twaincommand.Delete(lIndex);\r\n                }\r\n                return (sts);\r\n            }\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendBefore(a_dg.ToString(), DAT.AUDIOINFO.ToString(), a_msg.ToString(), \"\");\r\n            }\r\n\r\n            // Windows...\r\n            if (ms_platform == Platform.WINDOWS)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.WindowsTwain32DsmEntryAudioAudioinfo(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.AUDIOINFO, a_msg, ref a_twaudioinfo);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.WindowsTwaindsmDsmEntryAudioAudioinfo(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.AUDIOINFO, a_msg, ref a_twaudioinfo);\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Linux...\r\n            else if (ms_platform == Platform.LINUX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blFoundLatestDsm64 && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux64DsmEntryAudioAudioinfo(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.AUDIOINFO, a_msg, ref a_twaudioinfo);\r\n                    }\r\n                    else if (m_blFoundLatestDsm && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.LinuxDsmEntryAudioAudioinfo(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.AUDIOINFO, a_msg, ref a_twaudioinfo);\r\n                    }\r\n                    else if (m_blFound020302Dsm64bit && (m_linuxdsm == LinuxDsm.Is020302Dsm64bit))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux020302Dsm64bitEntryAudioAudioinfo(ref m_twidentityApp, ref m_twidentityDs, a_dg, DAT.AUDIOINFO, a_msg, ref a_twaudioinfo);\r\n                    }\r\n                    else\r\n                    {\r\n                        Log.Error(\"apparently we don't have a DSM...\");\r\n                        sts = STS.BUMMER;\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Mac OS X, which has to be different...\r\n            else if (ms_platform == Platform.MACOSX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwainDsmEntryAudioAudioinfo(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.AUDIOINFO, a_msg, ref a_twaudioinfo);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwaindsmDsmEntryAudioAudioinfo(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.AUDIOINFO, a_msg, ref a_twaudioinfo);\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Uh-oh...\r\n            else\r\n            {\r\n                Log.LogSendAfter(STS.BUMMER, \"\");\r\n                return (STS.BUMMER);\r\n            }\r\n\r\n            // Get DAT_STATUS, if needed...\r\n            TWAIN.STS stsRcOrCc = AutoDatStatus(sts);\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendAfter(stsRcOrCc, \"\");\r\n            }\r\n\r\n            // All done...\r\n            return (stsRcOrCc);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Issue native audio transfer commands...\r\n        /// </summary>\r\n        /// <param name=\"a_dg\">Data group</param>\r\n        /// <param name=\"a_msg\">Operation</param>\r\n        /// <param name=\"a_intptr\">handle</param>\r\n        /// <returns>TWAIN status</returns>\r\n        private void DatAudionativexferWindowsTwain32()\r\n        {\r\n            // If you get a first chance exception, be aware that some drivers\r\n            // will do that to you, you can ignore it and they'll keep going...\r\n            m_threaddataDatAudionativexfer.sts = (STS)NativeMethods.WindowsTwain32DsmEntryAudionativexfer\r\n            (\r\n                ref m_twidentitylegacyApp,\r\n                ref m_twidentitylegacyDs,\r\n                m_threaddataDatAudionativexfer.dg,\r\n                m_threaddataDatAudionativexfer.dat,\r\n                m_threaddataDatAudionativexfer.msg,\r\n                ref m_threaddataDatAudionativexfer.intptrAudio\r\n            );\r\n        }\r\n        private void DatAudionativexferWindowsTwainDsm()\r\n        {\r\n            // If you get a first chance exception, be aware that some drivers\r\n            // will do that to you, you can ignore it and they'll keep going...\r\n            m_threaddataDatAudionativexfer.sts = (STS)NativeMethods.WindowsTwaindsmDsmEntryAudionativexfer\r\n            (\r\n                ref m_twidentitylegacyApp,\r\n                ref m_twidentitylegacyDs,\r\n                m_threaddataDatAudionativexfer.dg,\r\n                m_threaddataDatAudionativexfer.dat,\r\n                m_threaddataDatAudionativexfer.msg,\r\n                ref m_threaddataDatAudionativexfer.intptrAudio\r\n            );\r\n        }\r\n        [PermissionSet(SecurityAction.LinkDemand, Name = \"FullTrust\", Unrestricted = false)]\r\n        public STS DatAudionativexfer(DG a_dg, MSG a_msg, ref IntPtr a_intptrAudio)\r\n        {\r\n            STS sts;\r\n\r\n            // Submit the work to the TWAIN thread...\r\n            if (this.m_runinuithreaddelegate == null)\r\n            {\r\n                if ((m_threadTwain != null) && (m_threadTwain.ManagedThreadId != Thread.CurrentThread.ManagedThreadId))\r\n                {\r\n                    lock (m_lockTwain)\r\n                    {\r\n                        // Set our command variables...\r\n                        ThreadData threaddata = default(ThreadData);\r\n                        threaddata.intptrAudio = a_intptrAudio;\r\n                        threaddata.dg = a_dg;\r\n                        threaddata.msg = a_msg;\r\n                        threaddata.dat = DAT.AUDIONATIVEXFER;\r\n                        long lIndex = m_twaincommand.Submit(threaddata);\r\n\r\n                        // Submit the command and wait for the reply...\r\n                        CallerToThreadSet();\r\n                        ThreadToCallerWaitOne();\r\n\r\n                        // Return the result...\r\n                        a_intptrAudio = m_twaincommand.Get(lIndex).intptrAudio;\r\n                        sts = m_twaincommand.Get(lIndex).sts;\r\n\r\n                        // Clear the command variables...\r\n                        m_twaincommand.Delete(lIndex);\r\n                    }\r\n                    return (sts);\r\n                }\r\n            }\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendBefore(a_dg.ToString(), DAT.AUDIONATIVEXFER.ToString(), a_msg.ToString(), \"\");\r\n            }\r\n\r\n            // Windows...\r\n            if (ms_platform == Platform.WINDOWS)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_threaddataDatAudionativexfer.blIsInuse || (this.m_runinuithreaddelegate == null))\r\n                    {\r\n                        if (m_blUseLegacyDSM)\r\n                        {\r\n                            sts = (STS)NativeMethods.WindowsTwain32DsmEntryAudionativexfer(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.AUDIONATIVEXFER, a_msg, ref a_intptrAudio);\r\n                        }\r\n                        else\r\n                        {\r\n                            sts = (STS)NativeMethods.WindowsTwaindsmDsmEntryAudionativexfer(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.AUDIONATIVEXFER, a_msg, ref a_intptrAudio);\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        if (m_blUseLegacyDSM)\r\n                        {\r\n                            lock (m_lockTwain)\r\n                            {\r\n                                m_threaddataDatAudionativexfer = default(ThreadData);\r\n                                m_threaddataDatAudionativexfer.blIsInuse = true;\r\n                                m_threaddataDatAudionativexfer.dg = a_dg;\r\n                                m_threaddataDatAudionativexfer.msg = a_msg;\r\n                                m_threaddataDatAudionativexfer.dat = DAT.AUDIONATIVEXFER;\r\n                                RunInUiThread(DatAudionativexferWindowsTwain32);\r\n                                a_intptrAudio = m_threaddataDatAudionativexfer.intptrAudio;\r\n                                sts = m_threaddataDatAudionativexfer.sts;\r\n                                m_threaddataDatAudionativexfer = default(ThreadData);\r\n                            }\r\n                        }\r\n                        else\r\n                        {\r\n                            lock (m_lockTwain)\r\n                            {\r\n                                m_threaddataDatAudionativexfer = default(ThreadData);\r\n                                m_threaddataDatAudionativexfer.blIsInuse = true;\r\n                                m_threaddataDatAudionativexfer.dg = a_dg;\r\n                                m_threaddataDatAudionativexfer.msg = a_msg;\r\n                                m_threaddataDatAudionativexfer.dat = DAT.AUDIONATIVEXFER;\r\n                                RunInUiThread(DatAudionativexferWindowsTwainDsm);\r\n                                a_intptrAudio = m_threaddataDatAudionativexfer.intptrAudio;\r\n                                sts = m_threaddataDatAudionativexfer.sts;\r\n                                m_threaddataDatAudionativexfer = default(ThreadData);\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Linux...\r\n            else if (ms_platform == Platform.LINUX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    a_intptrAudio = IntPtr.Zero;\r\n                    if (m_blFoundLatestDsm64 && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux64DsmEntryAudionativexfer(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.AUDIONATIVEXFER, a_msg, ref a_intptrAudio);\r\n                    }\r\n                    else if (m_blFoundLatestDsm && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.LinuxDsmEntryAudionativexfer(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.AUDIONATIVEXFER, a_msg, ref a_intptrAudio);\r\n                    }\r\n                    else if (m_blFound020302Dsm64bit && (m_linuxdsm == LinuxDsm.Is020302Dsm64bit))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux020302Dsm64bitEntryAudionativexfer(ref m_twidentityApp, ref m_twidentityDs, a_dg, DAT.IMAGENATIVEXFER, a_msg, ref a_intptrAudio);\r\n                    }\r\n                    else\r\n                    {\r\n                        Log.Error(\"apparently we don't have a DSM...\");\r\n                        sts = STS.BUMMER;\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Mac OS X, which has to be different...\r\n            else if (ms_platform == Platform.MACOSX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    a_intptrAudio = IntPtr.Zero;\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwainDsmEntryAudionativexfer(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.AUDIONATIVEXFER, a_msg, ref a_intptrAudio);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwaindsmDsmEntryAudionativexfer(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.AUDIONATIVEXFER, a_msg, ref a_intptrAudio);\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Uh-oh...\r\n            else\r\n            {\r\n                Log.LogSendAfter(STS.BUMMER, \"\");\r\n                return (STS.BUMMER);\r\n            }\r\n\r\n            // Get DAT_STATUS, if needed...\r\n            TWAIN.STS stsRcOrCc = AutoDatStatus(sts);\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendAfter(stsRcOrCc, \"\");\r\n            }\r\n\r\n            // If we had a successful transfer, then change state...\r\n            if (sts == STS.XFERDONE)\r\n            {\r\n                // Bump our state...\r\n                m_state = STATE.S7;\r\n            }\r\n\r\n            // All done...\r\n            return (stsRcOrCc);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Issue callback commands...\r\n        /// </summary>\r\n        /// <param name=\"a_dg\">Data group</param>\r\n        /// <param name=\"a_msg\">Operation</param>\r\n        /// <param name=\"a_twcallback\">Callback structure</param>\r\n        /// <returns>TWAIN status</returns>\r\n        public STS DatCallback(DG a_dg, MSG a_msg, ref TW_CALLBACK a_twcallback)\r\n        {\r\n            STS sts;\r\n\r\n            // Submit the work to the TWAIN thread...\r\n            if ((m_threadTwain != null) && (m_threadTwain.ManagedThreadId != Thread.CurrentThread.ManagedThreadId))\r\n            {\r\n                lock (m_lockTwain)\r\n                {\r\n                    // Set our command variables...\r\n                    ThreadData threaddata = default(ThreadData);\r\n                    threaddata.twcallback = a_twcallback;\r\n                    threaddata.dg = a_dg;\r\n                    threaddata.msg = a_msg;\r\n                    threaddata.dat = DAT.CALLBACK;\r\n                    long lIndex = m_twaincommand.Submit(threaddata);\r\n\r\n                    // Submit the command and wait for the reply...\r\n                    CallerToThreadSet();\r\n                    ThreadToCallerWaitOne();\r\n\r\n                    // Return the result...\r\n                    a_twcallback = m_twaincommand.Get(lIndex).twcallback;\r\n                    sts = m_twaincommand.Get(lIndex).sts;\r\n\r\n                    // Clear the command variables...\r\n                    m_twaincommand.Delete(lIndex);\r\n                }\r\n                return (sts);\r\n            }\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendBefore(a_dg.ToString(), DAT.CALLBACK.ToString(), a_msg.ToString(), CallbackToCsv(a_twcallback));\r\n            }\r\n\r\n            // Windows...\r\n            if (ms_platform == Platform.WINDOWS)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.WindowsTwain32DsmEntryCallback(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.CALLBACK, a_msg, ref a_twcallback);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.WindowsTwaindsmDsmEntryCallback(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.CALLBACK, a_msg, ref a_twcallback);\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Linux...\r\n            else if (ms_platform == Platform.LINUX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blFoundLatestDsm64 && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux64DsmEntryCallback(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.CALLBACK, a_msg, ref a_twcallback);\r\n                    }\r\n                    else if (m_blFoundLatestDsm && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.LinuxDsmEntryCallback(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.CALLBACK, a_msg, ref a_twcallback);\r\n                    }\r\n                    else if (m_blFound020302Dsm64bit && (m_linuxdsm == LinuxDsm.Is020302Dsm64bit))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux020302Dsm64bitEntryCallback(ref m_twidentityApp, ref m_twidentityDs, a_dg, DAT.CALLBACK, a_msg, ref a_twcallback);\r\n                    }\r\n                    else\r\n                    {\r\n                        Log.Error(\"apparently we don't have a DSM...\");\r\n                        sts = STS.BUMMER;\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Mac OS X, which has to be different...\r\n            else if (ms_platform == Platform.MACOSX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwainDsmEntryCallback(ref m_twidentitymacosxApp, IntPtr.Zero, a_dg, DAT.CALLBACK, a_msg, ref a_twcallback);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwaindsmDsmEntryCallback(ref m_twidentitymacosxApp, ref m_twidentityDs, a_dg, DAT.CALLBACK, a_msg, ref a_twcallback);\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Uh-oh...\r\n            else\r\n            {\r\n                Log.LogSendAfter(STS.BUMMER, \"\");\r\n                return (STS.BUMMER);\r\n            }\r\n\r\n            // Get DAT_STATUS, if needed...\r\n            TWAIN.STS stsRcOrCc = AutoDatStatus(sts);\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendAfter(stsRcOrCc, CallbackToCsv(a_twcallback));\r\n            }\r\n\r\n            // All done...\r\n            return (stsRcOrCc);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Issue callback2 commands...\r\n        /// </summary>\r\n        /// <param name=\"a_dg\">Data group</param>\r\n        /// <param name=\"a_msg\">Operation</param>\r\n        /// <param name=\"a_twcallback2\">Callback2 structure</param>\r\n        /// <returns>TWAIN status</returns>\r\n        public STS DatCallback2(DG a_dg, MSG a_msg, ref TW_CALLBACK2 a_twcallback2)\r\n        {\r\n            STS sts;\r\n\r\n            // Submit the work to the TWAIN thread...\r\n            if ((m_threadTwain != null) && (m_threadTwain.ManagedThreadId != Thread.CurrentThread.ManagedThreadId))\r\n            {\r\n                lock (m_lockTwain)\r\n                {\r\n                    // Set our command variables...\r\n                    ThreadData threaddata = default(ThreadData);\r\n                    threaddata.twcallback2 = a_twcallback2;\r\n                    threaddata.dg = a_dg;\r\n                    threaddata.msg = a_msg;\r\n                    threaddata.dat = DAT.CALLBACK;\r\n                    long lIndex = m_twaincommand.Submit(threaddata);\r\n\r\n                    // Submit the command and wait for the reply...\r\n                    CallerToThreadSet();\r\n                    ThreadToCallerWaitOne();\r\n\r\n                    // Return the result...\r\n                    a_twcallback2 = m_twaincommand.Get(lIndex).twcallback2;\r\n                    sts = m_twaincommand.Get(lIndex).sts;\r\n\r\n                    // Clear the command variables...\r\n                    m_twaincommand.Delete(lIndex);\r\n                }\r\n                return (sts);\r\n            }\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendBefore(a_dg.ToString(), DAT.CALLBACK2.ToString(), a_msg.ToString(), Callback2ToCsv(a_twcallback2));\r\n            }\r\n\r\n            // Windows...\r\n            if (ms_platform == Platform.WINDOWS)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.WindowsTwain32DsmEntryCallback2(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.CALLBACK2, a_msg, ref a_twcallback2);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.WindowsTwaindsmDsmEntryCallback2(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.CALLBACK2, a_msg, ref a_twcallback2);\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Linux...\r\n            else if (ms_platform == Platform.LINUX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blFoundLatestDsm64 && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux64DsmEntryCallback2(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.CALLBACK2, a_msg, ref a_twcallback2);\r\n                    }\r\n                    else if (m_blFoundLatestDsm && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.LinuxDsmEntryCallback2(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.CALLBACK2, a_msg, ref a_twcallback2);\r\n                    }\r\n                    else if (m_blFound020302Dsm64bit && (m_linuxdsm == LinuxDsm.Is020302Dsm64bit))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux020302Dsm64bitEntryCallback2(ref m_twidentityApp, ref m_twidentityDs, a_dg, DAT.CALLBACK2, a_msg, ref a_twcallback2);\r\n                    }\r\n                    else\r\n                    {\r\n                        Log.Error(\"apparently we don't have a DSM...\");\r\n                        sts = STS.BUMMER;\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Mac OS X, which has to be different...\r\n            else if (ms_platform == Platform.MACOSX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwainDsmEntryCallback2(ref m_twidentitymacosxApp, IntPtr.Zero, a_dg, DAT.CALLBACK2, a_msg, ref a_twcallback2);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwaindsmDsmEntryCallback2(ref m_twidentitymacosxApp, ref m_twidentityDs, a_dg, DAT.CALLBACK2, a_msg, ref a_twcallback2);\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Uh-oh...\r\n            else\r\n            {\r\n                Log.LogSendAfter(STS.BUMMER, \"\");\r\n                return (STS.BUMMER);\r\n            }\r\n\r\n            // Get DAT_STATUS, if needed...\r\n            TWAIN.STS stsRcOrCc = AutoDatStatus(sts);\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendAfter(stsRcOrCc, Callback2ToCsv(a_twcallback2));\r\n            }\r\n\r\n            // All done...\r\n            return (stsRcOrCc);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Issue capabilities commands...\r\n        /// </summary>\r\n        /// <param name=\"a_dg\">Data group</param>\r\n        /// <param name=\"a_msg\">Operation</param>\r\n        /// <param name=\"a_twcapability\">CAPABILITY structure</param>\r\n        /// <returns>TWAIN status</returns>\r\n        [PermissionSet(SecurityAction.LinkDemand, Name = \"FullTrust\", Unrestricted = false)]\r\n        private void DatCapabilityWindowsTwain32()\r\n        {\r\n            // If you get a first chance exception, be aware that some drivers\r\n            // will do that to you, you can ignore it and they'll keep going...\r\n            m_threaddataDatCapability.sts = (STS)NativeMethods.WindowsTwain32DsmEntryCapability\r\n            (\r\n                ref m_twidentitylegacyApp,\r\n                ref m_twidentitylegacyDs,\r\n                m_threaddataDatCapability.dg,\r\n                m_threaddataDatCapability.dat,\r\n                m_threaddataDatCapability.msg,\r\n                ref m_threaddataDatCapability.twcapability\r\n            );\r\n        }\r\n        private void DatCapabilityWindowsTwainDsm()\r\n        {\r\n            // If you get a first chance exception, be aware that some drivers\r\n            // will do that to you, you can ignore it and they'll keep going...\r\n            m_threaddataDatCapability.sts = (STS)NativeMethods.WindowsTwaindsmDsmEntryCapability\r\n            (\r\n                ref m_twidentitylegacyApp,\r\n                ref m_twidentitylegacyDs,\r\n                m_threaddataDatCapability.dg,\r\n                m_threaddataDatCapability.dat,\r\n                m_threaddataDatCapability.msg,\r\n                ref m_threaddataDatCapability.twcapability\r\n            );\r\n        }\r\n        public STS DatCapability(DG a_dg, MSG a_msg, ref TW_CAPABILITY a_twcapability)\r\n        {\r\n            STS sts;\r\n\r\n            // Submit the work to the TWAIN thread...\r\n            if (m_runinuithreaddelegate == null)\r\n            {\r\n                if ((m_threadTwain != null) && (m_threadTwain.ManagedThreadId != Thread.CurrentThread.ManagedThreadId))\r\n                {\r\n                    lock (m_lockTwain)\r\n                    {\r\n                        ThreadData threaddata = default(ThreadData);\r\n                        long lIndex = 0;\r\n\r\n                        // TBD: sometimes this doesn't work!  Not sure why\r\n                        // yet, but a retry takes care of it.\r\n                        for (int ii = 0; ii < 5; ii++)\r\n                        {\r\n                            // Set our command variables...\r\n                            threaddata = default(ThreadData);\r\n                            threaddata.twcapability = a_twcapability;\r\n                            threaddata.dg = a_dg;\r\n                            threaddata.msg = a_msg;\r\n                            threaddata.dat = DAT.CAPABILITY;\r\n                            lIndex = m_twaincommand.Submit(threaddata);\r\n\r\n                            // Submit the command and wait for the reply...\r\n                            CallerToThreadSet();\r\n                            ThreadToCallerWaitOne();\r\n\r\n                            // Hmmm...\r\n                            if (   (a_msg == MSG.GETCURRENT)\r\n                                && (m_twaincommand.Get(lIndex).sts == STS.SUCCESS)\r\n                                && (m_twaincommand.Get(lIndex).twcapability.ConType == (TWON)0)\r\n                                && (m_twaincommand.Get(lIndex).twcapability.hContainer == IntPtr.Zero))\r\n                            {\r\n                                Thread.Sleep(1000);\r\n                                continue;\r\n                            }\r\n\r\n                            // We're done...\r\n                            break;\r\n                        }\r\n\r\n                        // Return the result...\r\n                        a_twcapability = m_twaincommand.Get(lIndex).twcapability;\r\n                        sts = m_twaincommand.Get(lIndex).sts;\r\n\r\n                        // Clear the command variables...\r\n                        m_twaincommand.Delete(lIndex);\r\n                    }\r\n                    return (sts);\r\n                }\r\n            }\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                if ((a_msg == MSG.SET) || (a_msg == MSG.SETCONSTRAINT))\r\n                {\r\n                    Log.LogSendBefore(a_dg.ToString(), DAT.CAPABILITY.ToString(), a_msg.ToString(), CapabilityToCsv(a_twcapability, (a_msg != TWAIN.MSG.QUERYSUPPORT)));\r\n                }\r\n                else\r\n                {\r\n                    string szCap = a_twcapability.Cap.ToString();\r\n                    if (!szCap.Contains(\"_\"))\r\n                    {\r\n                        szCap = \"0x\" + ((ushort)a_twcapability.Cap).ToString(\"X\");\r\n                    }\r\n                    Log.LogSendBefore(a_dg.ToString(), DAT.CAPABILITY.ToString(), a_msg.ToString(), szCap + \",0,0\");\r\n                }\r\n            }\r\n\r\n            // Windows...\r\n            if (ms_platform == Platform.WINDOWS)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_threaddataDatCapability.blIsInuse || (this.m_runinuithreaddelegate == null))\r\n                    {\r\n                        if (m_blUseLegacyDSM)\r\n                        {\r\n                            sts = (STS)NativeMethods.WindowsTwain32DsmEntryCapability(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.CAPABILITY, a_msg, ref a_twcapability);\r\n                        }\r\n                        else\r\n                        {\r\n                            sts = (STS)NativeMethods.WindowsTwaindsmDsmEntryCapability(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.CAPABILITY, a_msg, ref a_twcapability);\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        if (m_blUseLegacyDSM)\r\n                        {\r\n                            lock (m_lockTwain)\r\n                            {\r\n                                m_threaddataDatCapability = default(ThreadData);\r\n                                m_threaddataDatCapability.blIsInuse = true;\r\n                                m_threaddataDatCapability.dg = a_dg;\r\n                                m_threaddataDatCapability.msg = a_msg;\r\n                                m_threaddataDatCapability.dat = DAT.CAPABILITY;\r\n                                m_threaddataDatCapability.twcapability = a_twcapability;\r\n                                RunInUiThread(DatCapabilityWindowsTwain32);\r\n                                a_twcapability = m_threaddataDatCapability.twcapability;\r\n                                sts = m_threaddataDatCapability.sts;\r\n                                m_threaddataDatCapability = default(ThreadData);\r\n                            }\r\n                        }\r\n                        else\r\n                        {\r\n                            lock (m_lockTwain)\r\n                            {\r\n                                m_threaddataDatCapability = default(ThreadData);\r\n                                m_threaddataDatCapability.blIsInuse = true;\r\n                                m_threaddataDatCapability.dg = a_dg;\r\n                                m_threaddataDatCapability.msg = a_msg;\r\n                                m_threaddataDatCapability.dat = DAT.CAPABILITY;\r\n                                m_threaddataDatCapability.twcapability = a_twcapability;\r\n                                RunInUiThread(DatCapabilityWindowsTwainDsm);\r\n                                a_twcapability = m_threaddataDatCapability.twcapability;\r\n                                sts = m_threaddataDatCapability.sts;\r\n                                m_threaddataDatCapability = default(ThreadData);\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Linux...\r\n            else if (ms_platform == Platform.LINUX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blFoundLatestDsm64 && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux64DsmEntryCapability(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.CAPABILITY, a_msg, ref a_twcapability);\r\n                    }\r\n                    else if (m_blFoundLatestDsm && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.LinuxDsmEntryCapability(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.CAPABILITY, a_msg, ref a_twcapability);\r\n                    }\r\n                    else if (m_blFound020302Dsm64bit && (m_linuxdsm == LinuxDsm.Is020302Dsm64bit))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux020302Dsm64bitEntryCapability(ref m_twidentityApp, ref m_twidentityDs, a_dg, DAT.CAPABILITY, a_msg, ref a_twcapability);\r\n                    }\r\n                    else\r\n                    {\r\n                        Log.Error(\"apparently we don't have a DSM...\");\r\n                        sts = STS.BUMMER;\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Mac OS X, which has to be different...\r\n            else if (ms_platform == Platform.MACOSX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwainDsmEntryCapability(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.CAPABILITY, a_msg, ref a_twcapability);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwaindsmDsmEntryCapability(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.CAPABILITY, a_msg, ref a_twcapability);\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Uh-oh...\r\n            else\r\n            {\r\n                Log.LogSendAfter(STS.BUMMER, \"\");\r\n                return (STS.BUMMER);\r\n            }\r\n\r\n            // Get DAT_STATUS, if needed...\r\n            TWAIN.STS stsRcOrCc = AutoDatStatus(sts);\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                if ((a_msg == MSG.RESETALL) || ((sts != STS.SUCCESS) && (sts != STS.CHECKSTATUS)))\r\n                {\r\n                    Log.LogSendAfter(stsRcOrCc, \"\");\r\n                }\r\n                else\r\n                {\r\n                    Log.LogSendAfter(stsRcOrCc, CapabilityToCsv(a_twcapability, (a_msg != TWAIN.MSG.QUERYSUPPORT)));\r\n                }\r\n            }\r\n\r\n            // if MSG_SET/CAP_LANGUAGE, then we want to track it\r\n            if ((a_twcapability.Cap == CAP.CAP_LANGUAGE) && (a_msg == MSG.SET) && (a_twcapability.ConType == TWON.ONEVALUE))\r\n            {\r\n                string str;\r\n\r\n                // if it was successful, then go with what was set.\r\n                // otherwise ask the DS what it is currently set to\r\n                if (sts == STS.SUCCESS)\r\n                {\r\n                    str = CapabilityToCsv(a_twcapability, (a_msg != TWAIN.MSG.QUERYSUPPORT));\r\n                }\r\n                else\r\n                {\r\n                    TW_CAPABILITY twcapability = new TW_CAPABILITY();\r\n                    twcapability.Cap = CAP.CAP_LANGUAGE;\r\n                    twcapability.ConType = TWON.ONEVALUE;\r\n                    sts = DatCapability(a_dg, MSG.GETCURRENT, ref twcapability);\r\n                    if (sts == STS.SUCCESS)\r\n                    {\r\n                        str = CapabilityToCsv(twcapability, (a_msg != TWAIN.MSG.QUERYSUPPORT));\r\n                    }\r\n                    else\r\n                    {\r\n                        // couldn't get the value, so go with English\r\n                        str = \"x,\" + ((int)TWLG.ENGLISH).ToString();\r\n                    }\r\n                }\r\n\r\n                // get the value from the CSV string\r\n                TWLG twlg = TWLG.ENGLISH;\r\n                try\r\n                {\r\n                    string[] astr = str.Split(new char[] { ',' });\r\n                    int result;\r\n                    if (int.TryParse(astr[astr.Length - 1], out result))\r\n                    {\r\n                       twlg = (TWLG)result;\r\n                    }\r\n                }\r\n                catch\r\n                {\r\n                    twlg = TWLG.ENGLISH;\r\n                }\r\n                Language.Set(twlg);\r\n            }\r\n\r\n            // All done...\r\n            return (stsRcOrCc);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Get/Set for CIE color...\r\n        /// </summary>\r\n        /// <param name=\"a_dg\">Data group</param>\r\n        /// <param name=\"a_msg\">Operation</param>\r\n        /// <param name=\"a_twceicolor\">CIECOLOR structure</param>\r\n        /// <returns>TWAIN status</returns>\r\n        public STS DatCiecolor(DG a_dg, MSG a_msg, ref TW_CIECOLOR a_twciecolor)\r\n        {\r\n            STS sts;\r\n\r\n            // Submit the work to the TWAIN thread...\r\n            if ((m_threadTwain != null) && (m_threadTwain.ManagedThreadId != Thread.CurrentThread.ManagedThreadId))\r\n            {\r\n                lock (m_lockTwain)\r\n                {\r\n                    // Set our command variables...\r\n                    ThreadData threaddata = default(ThreadData);\r\n                    threaddata.twciecolor = a_twciecolor;\r\n                    threaddata.dg = a_dg;\r\n                    threaddata.msg = a_msg;\r\n                    threaddata.dat = DAT.CIECOLOR;\r\n                    long lIndex = m_twaincommand.Submit(threaddata);\r\n\r\n                    // Submit the command and wait for the reply...\r\n                    CallerToThreadSet();\r\n                    ThreadToCallerWaitOne();\r\n\r\n                    // Return the result...\r\n                    a_twciecolor = m_twaincommand.Get(lIndex).twciecolor;\r\n                    sts = m_twaincommand.Get(lIndex).sts;\r\n\r\n                    // Clear the command variables...\r\n                    m_twaincommand.Delete(lIndex);\r\n                }\r\n                return (sts);\r\n            }\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendBefore(a_dg.ToString(), DAT.CIECOLOR.ToString(), a_msg.ToString(), \"\");\r\n            }\r\n\r\n            // Windows...\r\n            if (ms_platform == Platform.WINDOWS)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.WindowsTwain32DsmEntryCiecolor(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.CIECOLOR, a_msg, ref a_twciecolor);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.WindowsTwaindsmDsmEntryCiecolor(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.CIECOLOR, a_msg, ref a_twciecolor);\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Linux...\r\n            else if (ms_platform == Platform.LINUX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blFoundLatestDsm64 && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux64DsmEntryCiecolor(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.CIECOLOR, a_msg, ref a_twciecolor);\r\n                    }\r\n                    else if (m_blFoundLatestDsm && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.LinuxDsmEntryCiecolor(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.CIECOLOR, a_msg, ref a_twciecolor);\r\n                    }\r\n                    else if (m_blFound020302Dsm64bit && (m_linuxdsm == LinuxDsm.Is020302Dsm64bit))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux020302Dsm64bitEntryCiecolor(ref m_twidentityApp, ref m_twidentityDs, a_dg, DAT.CIECOLOR, a_msg, ref a_twciecolor);\r\n                    }\r\n                    else\r\n                    {\r\n                        Log.Error(\"apparently we don't have a DSM...\");\r\n                        sts = STS.BUMMER;\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Mac OS X, which has to be different...\r\n            else if (ms_platform == Platform.MACOSX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwainDsmEntryCiecolor(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.CIECOLOR, a_msg, ref a_twciecolor);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwaindsmDsmEntryCiecolor(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.CIECOLOR, a_msg, ref a_twciecolor);\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Uh-oh...\r\n            else\r\n            {\r\n                Log.LogSendAfter(STS.BUMMER, \"\");\r\n                return (STS.BUMMER);\r\n            }\r\n\r\n            // Get DAT_STATUS, if needed...\r\n            TWAIN.STS stsRcOrCc = AutoDatStatus(sts);\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendAfter(stsRcOrCc, \"\");\r\n            }\r\n\r\n            // All done...\r\n            return (stsRcOrCc);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Get/Set the custom DS data...\r\n        /// </summary>\r\n        /// <param name=\"a_dg\">Data group</param>\r\n        /// <param name=\"a_msg\">Operation</param>\r\n        /// <param name=\"a_twcustomdsdata\">CUSTOMDSDATA structure</param>\r\n        /// <returns>TWAIN status</returns>\r\n        [PermissionSet(SecurityAction.LinkDemand, Name = \"FullTrust\", Unrestricted = false)]\r\n        public STS DatCustomdsdata(DG a_dg, MSG a_msg, ref TW_CUSTOMDSDATA a_twcustomdsdata)\r\n        {\r\n            STS sts;\r\n\r\n            // Submit the work to the TWAIN thread...\r\n            if ((m_threadTwain != null) && (m_threadTwain.ManagedThreadId != Thread.CurrentThread.ManagedThreadId))\r\n            {\r\n                lock (m_lockTwain)\r\n                {\r\n                    // Set our command variables...\r\n                    ThreadData threaddata = default(ThreadData);\r\n                    threaddata.twcustomdsdata = a_twcustomdsdata;\r\n                    threaddata.dg = a_dg;\r\n                    threaddata.msg = a_msg;\r\n                    threaddata.dat = DAT.CUSTOMDSDATA;\r\n                    long lIndex = m_twaincommand.Submit(threaddata);\r\n\r\n                    // Submit the command and wait for the reply...\r\n                    CallerToThreadSet();\r\n                    ThreadToCallerWaitOne();\r\n\r\n                    // Return the result...\r\n                    a_twcustomdsdata = m_twaincommand.Get(lIndex).twcustomdsdata;\r\n                    sts = m_twaincommand.Get(lIndex).sts;\r\n\r\n                    // Clear the command variables...\r\n                    m_twaincommand.Delete(lIndex);\r\n                }\r\n                return (sts);\r\n            }\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendBefore(a_dg.ToString(), DAT.CUSTOMDSDATA.ToString(), a_msg.ToString(), CustomdsdataToCsv(a_twcustomdsdata));\r\n            }\r\n\r\n            // Windows...\r\n            if (ms_platform == Platform.WINDOWS)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.WindowsTwain32DsmEntryCustomdsdata(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.CUSTOMDSDATA, a_msg, ref a_twcustomdsdata);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.WindowsTwaindsmDsmEntryCustomdsdata(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.CUSTOMDSDATA, a_msg, ref a_twcustomdsdata);\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Linux...\r\n            else if (ms_platform == Platform.LINUX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blFoundLatestDsm64 && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux64DsmEntryCustomdsdata(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.CUSTOMDSDATA, a_msg, ref a_twcustomdsdata);\r\n                    }\r\n                    else if (m_blFoundLatestDsm && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.LinuxDsmEntryCustomdsdata(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.CUSTOMDSDATA, a_msg, ref a_twcustomdsdata);\r\n                    }\r\n                    else if (m_blFound020302Dsm64bit && (m_linuxdsm == LinuxDsm.Is020302Dsm64bit))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux020302Dsm64bitEntryCustomdsdata(ref m_twidentityApp, ref m_twidentityDs, a_dg, DAT.CUSTOMDSDATA, a_msg, ref a_twcustomdsdata);\r\n                    }\r\n                    else\r\n                    {\r\n                        Log.Error(\"apparently we don't have a DSM...\");\r\n                        sts = STS.BUMMER;\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Mac OS X, which has to be different...\r\n            else if (ms_platform == Platform.MACOSX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwainDsmEntryCustomdsdata(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.CUSTOMDSDATA, a_msg, ref a_twcustomdsdata);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwaindsmDsmEntryCustomdsdata(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.CUSTOMDSDATA, a_msg, ref a_twcustomdsdata);\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Uh-oh...\r\n            else\r\n            {\r\n                Log.LogSendAfter(STS.BUMMER, \"\");\r\n                return (STS.BUMMER);\r\n            }\r\n\r\n            // Get DAT_STATUS, if needed...\r\n            TWAIN.STS stsRcOrCc = AutoDatStatus(sts);\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendAfter(stsRcOrCc, CustomdsdataToCsv(a_twcustomdsdata));\r\n            }\r\n\r\n            // All done...\r\n            return (stsRcOrCc);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Get device events...\r\n        /// </summary>\r\n        /// <param name=\"a_dg\">Data group</param>\r\n        /// <param name=\"a_msg\">Operation</param>\r\n        /// <param name=\"a_twdeviceevent\">DEVICEEVENT structure</param>\r\n        /// <returns>TWAIN status</returns>\r\n        public STS DatDeviceevent(DG a_dg, MSG a_msg, ref TW_DEVICEEVENT a_twdeviceevent)\r\n        {\r\n            STS sts;\r\n\r\n            // Submit the work to the TWAIN thread...\r\n            if ((m_threadTwain != null) && (m_threadTwain.ManagedThreadId != Thread.CurrentThread.ManagedThreadId))\r\n            {\r\n                lock (m_lockTwain)\r\n                {\r\n                    // Set our command variables...\r\n                    ThreadData threaddata = default(ThreadData);\r\n                    threaddata.twdeviceevent = a_twdeviceevent;\r\n                    threaddata.dg = a_dg;\r\n                    threaddata.msg = a_msg;\r\n                    threaddata.dat = DAT.DEVICEEVENT;\r\n                    long lIndex = m_twaincommand.Submit(threaddata);\r\n\r\n                    // Submit the command and wait for the reply...\r\n                    CallerToThreadSet();\r\n                    ThreadToCallerWaitOne();\r\n\r\n                    // Return the result...\r\n                    a_twdeviceevent = m_twaincommand.Get(lIndex).twdeviceevent;\r\n                    sts = m_twaincommand.Get(lIndex).sts;\r\n\r\n                    // Clear the command variables...\r\n                    m_twaincommand.Delete(lIndex);\r\n                }\r\n                return (sts);\r\n            }\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendBefore(a_dg.ToString(), DAT.DEVICEEVENT.ToString(), a_msg.ToString(), \"\");\r\n            }\r\n\r\n            // Windows...\r\n            if (ms_platform == Platform.WINDOWS)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.WindowsTwain32DsmEntryDeviceevent(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.DEVICEEVENT, a_msg, ref a_twdeviceevent);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.WindowsTwaindsmDsmEntryDeviceevent(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.DEVICEEVENT, a_msg, ref a_twdeviceevent);\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Linux...\r\n            else if (ms_platform == Platform.LINUX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blFoundLatestDsm64 && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux64DsmEntryDeviceevent(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.DEVICEEVENT, a_msg, ref a_twdeviceevent);\r\n                    }\r\n                    else if (m_blFoundLatestDsm && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.LinuxDsmEntryDeviceevent(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.DEVICEEVENT, a_msg, ref a_twdeviceevent);\r\n                    }\r\n                    else if (m_blFound020302Dsm64bit && (m_linuxdsm == LinuxDsm.Is020302Dsm64bit))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux020302Dsm64bitEntryDeviceevent(ref m_twidentityApp, ref m_twidentityDs, a_dg, DAT.DEVICEEVENT, a_msg, ref a_twdeviceevent);\r\n                    }\r\n                    else\r\n                    {\r\n                        Log.Error(\"apparently we don't have a DSM...\");\r\n                        sts = STS.BUMMER;\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Mac OS X, which has to be different...\r\n            else if (ms_platform == Platform.MACOSX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwainDsmEntryDeviceevent(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.DEVICEEVENT, a_msg, ref a_twdeviceevent);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwaindsmDsmEntryDeviceevent(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.DEVICEEVENT, a_msg, ref a_twdeviceevent);\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Uh-oh...\r\n            else\r\n            {\r\n                Log.LogSendAfter(STS.BUMMER, \"\");\r\n                return (STS.BUMMER);\r\n            }\r\n\r\n            // Get DAT_STATUS, if needed...\r\n            TWAIN.STS stsRcOrCc = AutoDatStatus(sts);\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendAfter(stsRcOrCc, DeviceeventToCsv(a_twdeviceevent));\r\n            }\r\n\r\n            // All done...\r\n            return (stsRcOrCc);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Get the entrypoint data...\r\n        /// </summary>\r\n        /// <param name=\"a_dg\">Data group</param>\r\n        /// <param name=\"a_msg\">Operation</param>\r\n        /// <param name=\"a_twentrypoint\">ENTRYPOINT structure</param>\r\n        /// <returns>TWAIN status</returns>\r\n        [PermissionSet(SecurityAction.LinkDemand, Name = \"FullTrust\", Unrestricted = false)]\r\n        public STS DatEntrypoint(DG a_dg, MSG a_msg, ref TW_ENTRYPOINT a_twentrypoint)\r\n        {\r\n            STS sts;\r\n\r\n            // Submit the work to the TWAIN thread...\r\n            if ((m_threadTwain != null) && (m_threadTwain.ManagedThreadId != Thread.CurrentThread.ManagedThreadId))\r\n            {\r\n                lock (m_lockTwain)\r\n                {\r\n                    // Set our command variables...\r\n                    ThreadData threaddata = default(ThreadData);\r\n                    threaddata.twentrypoint = a_twentrypoint;\r\n                    threaddata.dg = a_dg;\r\n                    threaddata.msg = a_msg;\r\n                    threaddata.dat = DAT.ENTRYPOINT;\r\n                    long lIndex = m_twaincommand.Submit(threaddata);\r\n\r\n                    // Submit the command and wait for the reply...\r\n                    CallerToThreadSet();\r\n                    ThreadToCallerWaitOne();\r\n\r\n                    // Return the result...\r\n                    a_twentrypoint = m_twaincommand.Get(lIndex).twentrypoint;\r\n                    sts = m_twaincommand.Get(lIndex).sts;\r\n\r\n                    // Clear the command variables...\r\n                    m_twaincommand.Delete(lIndex);\r\n                }\r\n                return (sts);\r\n            }\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendBefore(a_dg.ToString(), DAT.ENTRYPOINT.ToString(), a_msg.ToString(), EntrypointToCsv(a_twentrypoint));\r\n            }\r\n\r\n            // Windows...\r\n            if (ms_platform == Platform.WINDOWS)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.WindowsTwain32DsmEntryEntrypoint(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.ENTRYPOINT, a_msg, ref a_twentrypoint);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.WindowsTwaindsmDsmEntryEntrypoint(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.ENTRYPOINT, a_msg, ref a_twentrypoint);\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Linux...\r\n            else if (ms_platform == Platform.LINUX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    // Alright, this is super nasty.  The application issues the call to\r\n                    // DAT_ENTRYPOINT before the call to MSG_OPENDS.  We don't know which\r\n                    // driver they're going to use, so we don't know which DSM they're\r\n                    // going to end up with.  This sucks in all kinds of ways.  The only\r\n                    // reason we can hope for this to work is if all of the DSM's are in\r\n                    // agreement about the memory functions they're using.  Lucky for us\r\n                    // on Linux it's always been calloc/free.  So, we may be in the weird\r\n                    // situation of using a different DSM for the memory functions, but\r\n                    // it'l be okay.  You can stop breathing in and out of that paper bag...\r\n                    sts = STS.BUMMER;\r\n                    if (m_blFoundLatestDsm64)\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux64DsmEntryEntrypoint(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.ENTRYPOINT, a_msg, ref a_twentrypoint);\r\n                    }\r\n                    else if (m_blFoundLatestDsm)\r\n                    {\r\n                        sts = (STS)NativeMethods.LinuxDsmEntryEntrypoint(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.ENTRYPOINT, a_msg, ref a_twentrypoint);\r\n                    }\r\n                    else if (m_blFound020302Dsm64bit)\r\n                    {\r\n                        TW_ENTRYPOINT_LINUX64 twentrypointlinux64 = default(TW_ENTRYPOINT_LINUX64);\r\n                        twentrypointlinux64.Size = a_twentrypoint.Size;\r\n                        twentrypointlinux64.DSM_MemAllocate = a_twentrypoint.DSM_MemAllocate;\r\n                        twentrypointlinux64.DSM_MemFree = a_twentrypoint.DSM_MemFree;\r\n                        twentrypointlinux64.DSM_MemLock = a_twentrypoint.DSM_MemLock;\r\n                        twentrypointlinux64.DSM_MemUnlock = a_twentrypoint.DSM_MemUnlock;\r\n                        sts = (STS)NativeMethods.Linux020302Dsm64bitEntryEntrypoint(ref m_twidentityApp, ref m_twidentityDs, a_dg, DAT.ENTRYPOINT, a_msg, ref twentrypointlinux64);\r\n                        a_twentrypoint = default(TW_ENTRYPOINT);\r\n                        a_twentrypoint.Size = (uint)(twentrypointlinux64.Size & 0xFFFFFFFF);\r\n                        a_twentrypoint.DSM_MemAllocate = twentrypointlinux64.DSM_MemAllocate;\r\n                        a_twentrypoint.DSM_MemFree = twentrypointlinux64.DSM_MemFree;\r\n                        a_twentrypoint.DSM_MemLock = twentrypointlinux64.DSM_MemLock;\r\n                        a_twentrypoint.DSM_MemUnlock = twentrypointlinux64.DSM_MemUnlock;\r\n                    }\r\n                    else\r\n                    {\r\n                        Log.Error(\"apparently we don't have a DSM...\");\r\n                        sts = STS.BUMMER;\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Mac OS X, which has to be different...\r\n            else if (ms_platform == Platform.MACOSX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwainDsmEntryEntrypoint(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.ENTRYPOINT, a_msg, ref a_twentrypoint);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwaindsmDsmEntryEntrypoint(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.ENTRYPOINT, a_msg, ref a_twentrypoint);\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Uh-oh...\r\n            else\r\n            {\r\n                Log.LogSendAfter(STS.BUMMER, \"\");\r\n                return (STS.BUMMER);\r\n            }\r\n\r\n            // If we were successful, then squirrel away the data...\r\n            if (sts == TWAIN.STS.SUCCESS)\r\n            {\r\n                m_twentrypointdelegates = default(TWAIN.TW_ENTRYPOINT_DELEGATES);\r\n                m_twentrypointdelegates.Size = a_twentrypoint.Size;\r\n                m_twentrypointdelegates.DSM_Entry = a_twentrypoint.DSM_Entry;\r\n                if (a_twentrypoint.DSM_MemAllocate != null)\r\n                {\r\n                    m_twentrypointdelegates.DSM_MemAllocate = (TWAIN.DSM_MEMALLOC)Marshal.GetDelegateForFunctionPointer(a_twentrypoint.DSM_MemAllocate,typeof(TWAIN.DSM_MEMALLOC));\r\n                }\r\n                if (a_twentrypoint.DSM_MemFree != null)\r\n                {\r\n                    m_twentrypointdelegates.DSM_MemFree = (TWAIN.DSM_MEMFREE)Marshal.GetDelegateForFunctionPointer(a_twentrypoint.DSM_MemFree, typeof(TWAIN.DSM_MEMFREE));\r\n                }\r\n                if (a_twentrypoint.DSM_MemLock != null)\r\n                {\r\n                    m_twentrypointdelegates.DSM_MemLock = (TWAIN.DSM_MEMLOCK)Marshal.GetDelegateForFunctionPointer(a_twentrypoint.DSM_MemLock, typeof(TWAIN.DSM_MEMLOCK));\r\n                }\r\n                if (a_twentrypoint.DSM_MemUnlock != null)\r\n                {\r\n                    m_twentrypointdelegates.DSM_MemUnlock = (TWAIN.DSM_MEMUNLOCK)Marshal.GetDelegateForFunctionPointer(a_twentrypoint.DSM_MemUnlock, typeof(TWAIN.DSM_MEMUNLOCK));\r\n                }\r\n            }\r\n\r\n            // Get DAT_STATUS, if needed...\r\n            TWAIN.STS stsRcOrCc = AutoDatStatus(sts);\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendAfter(stsRcOrCc, EntrypointToCsv(a_twentrypoint));\r\n            }\r\n\r\n            // All done...\r\n            return (stsRcOrCc);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Issue event commands...\r\n        /// </summary>\r\n        /// <param name=\"a_dg\">Data group</param>\r\n        /// <param name=\"a_msg\">Operation</param>\r\n        /// <param name=\"a_twevent\">EVENT structure</param>\r\n        /// <returns>TWAIN status</returns>\r\n        private void DatEventWindowsTwain32()\r\n        {\r\n            // If you get a first chance exception, be aware that some drivers\r\n            // will do that to you, you can ignore it and they'll keep going...\r\n            m_threaddataDatEvent.sts = (STS)NativeMethods.WindowsTwain32DsmEntryEvent\r\n            (\r\n                ref m_twidentitylegacyApp,\r\n                ref m_twidentitylegacyDs,\r\n                m_threaddataDatEvent.dg,\r\n                m_threaddataDatEvent.dat,\r\n                m_threaddataDatEvent.msg,\r\n                ref m_threaddataDatEvent.twevent\r\n            );\r\n        }\r\n        private void DatEventWindowsTwainDsm()\r\n        {\r\n            // If you get a first chance exception, be aware that some drivers\r\n            // will do that to you, you can ignore it and they'll keep going...\r\n            m_threaddataDatEvent.sts = (STS)NativeMethods.WindowsTwaindsmDsmEntryEvent\r\n            (\r\n                ref m_twidentitylegacyApp,\r\n                ref m_twidentitylegacyDs,\r\n                m_threaddataDatEvent.dg,\r\n                m_threaddataDatEvent.dat,\r\n                m_threaddataDatEvent.msg,\r\n                ref m_threaddataDatEvent.twevent\r\n            );\r\n        }\r\n        public STS DatEvent(DG a_dg, MSG a_msg, ref TW_EVENT a_twevent, bool a_blInPreFilter = false)\r\n        {\r\n            STS sts;\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 1)\r\n            {\r\n                Log.LogSendBefore(a_dg.ToString(), DAT.EVENT.ToString(), a_msg.ToString(), \"\");\r\n            }\r\n\r\n            // Windows...\r\n            if (ms_platform == Platform.WINDOWS)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (a_blInPreFilter || m_threaddataDatEvent.blIsInuse || (this.m_runinuithreaddelegate == null))\r\n                    {\r\n                        if (m_blUseLegacyDSM)\r\n                        {\r\n                            sts = (STS)NativeMethods.WindowsTwain32DsmEntryEvent(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.EVENT, a_msg, ref a_twevent);\r\n                        }\r\n                        else\r\n                        {\r\n                            sts = (STS)NativeMethods.WindowsTwaindsmDsmEntryEvent(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.EVENT, a_msg, ref a_twevent);\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        if (m_blUseLegacyDSM)\r\n                        {\r\n                            lock (m_lockTwain)\r\n                            {\r\n                                m_threaddataDatEvent = default(ThreadData);\r\n                                m_threaddataDatEvent.blIsInuse = true;\r\n                                m_threaddataDatEvent.dg = a_dg;\r\n                                m_threaddataDatEvent.msg = a_msg;\r\n                                m_threaddataDatEvent.dat = DAT.EVENT;\r\n                                m_threaddataDatEvent.twevent = a_twevent;\r\n                                RunInUiThread(DatEventWindowsTwain32);\r\n                                a_twevent = m_threaddataDatEvent.twevent;\r\n                                sts = m_threaddataDatEvent.sts;\r\n                                m_threaddataDatEvent = default(ThreadData);\r\n                            }\r\n                        }\r\n                        else\r\n                        {\r\n                            lock (m_lockTwain)\r\n                            {\r\n                                m_threaddataDatEvent = default(ThreadData);\r\n                                m_threaddataDatEvent.blIsInuse = true;\r\n                                m_threaddataDatEvent.dg = a_dg;\r\n                                m_threaddataDatEvent.msg = a_msg;\r\n                                m_threaddataDatEvent.dat = DAT.EVENT;\r\n                                m_threaddataDatEvent.twevent = a_twevent;\r\n                                RunInUiThread(DatEventWindowsTwainDsm);\r\n                                a_twevent = m_threaddataDatEvent.twevent;\r\n                                sts = m_threaddataDatEvent.sts;\r\n                                m_threaddataDatEvent = default(ThreadData);\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Linux...\r\n            else if (ms_platform == Platform.LINUX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blFoundLatestDsm64 && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux64DsmEntryEvent(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.EVENT, a_msg, ref a_twevent);\r\n                    }\r\n                    else if (m_blFoundLatestDsm && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.LinuxDsmEntryEvent(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.EVENT, a_msg, ref a_twevent);\r\n                    }\r\n                    else if (m_blFound020302Dsm64bit && (m_linuxdsm == LinuxDsm.Is020302Dsm64bit))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux020302Dsm64bitEntryEvent(ref m_twidentityApp, ref m_twidentityDs, a_dg, DAT.EVENT, a_msg, ref a_twevent);\r\n                    }\r\n                    else\r\n                    {\r\n                        Log.Error(\"apparently we don't have a DSM...\");\r\n                        sts = STS.BUMMER;\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Mac OS X, which has to be different...\r\n            else if (ms_platform == Platform.MACOSX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwainDsmEntryEvent(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.EVENT, a_msg, ref a_twevent);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwaindsmDsmEntryEvent(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.EVENT, a_msg, ref a_twevent);\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Uh-oh...\r\n            else\r\n            {\r\n                Log.LogSendAfter(STS.BUMMER, \"\");\r\n                return (STS.BUMMER);\r\n            }\r\n\r\n            // Get DAT_STATUS, if needed...\r\n            TWAIN.STS stsRcOrCc = AutoDatStatus(sts);\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 1)\r\n            {\r\n                Log.LogSendAfter(stsRcOrCc, \"\");\r\n            }\r\n\r\n            // Check the event for anything interesting...\r\n            if ((sts == STS.DSEVENT) || (sts == STS.NOTDSEVENT))\r\n            {\r\n                ProcessEvent((MSG)a_twevent.TWMessage);\r\n            }\r\n\r\n            // All done...\r\n            return (stsRcOrCc);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Get/Set extended image info information...\r\n        /// </summary>\r\n        /// <param name=\"a_dg\">Data group</param>\r\n        /// <param name=\"a_msg\">Operation</param>\r\n        /// <param name=\"a_twextimageinfo\">EXTIMAGEINFO structure</param>\r\n        /// <returns>TWAIN status</returns>\r\n        private void DatExtimageinfoWindowsTwain32()\r\n        {\r\n            // If you get a first chance exception, be aware that some drivers\r\n            // will do that to you, you can ignore it and they'll keep going...\r\n            m_threaddataDatExtimageinfo.sts = (STS)NativeMethods.WindowsTwain32DsmEntryExtimageinfo\r\n            (\r\n                ref m_twidentitylegacyApp,\r\n                ref m_twidentitylegacyDs,\r\n                m_threaddataDatExtimageinfo.dg,\r\n                m_threaddataDatExtimageinfo.dat,\r\n                m_threaddataDatExtimageinfo.msg,\r\n                ref m_threaddataDatExtimageinfo.twextimageinfo\r\n            );\r\n        }\r\n        private void DatExtimageinfoWindowsTwainDsm()\r\n        {\r\n            // If you get a first chance exception, be aware that some drivers\r\n            // will do that to you, you can ignore it and they'll keep going...\r\n            m_threaddataDatExtimageinfo.sts = (STS)NativeMethods.WindowsTwaindsmDsmEntryExtimageinfo\r\n            (\r\n                ref m_twidentitylegacyApp,\r\n                ref m_twidentitylegacyDs,\r\n                m_threaddataDatExtimageinfo.dg,\r\n                m_threaddataDatExtimageinfo.dat,\r\n                m_threaddataDatExtimageinfo.msg,\r\n                ref m_threaddataDatExtimageinfo.twextimageinfo\r\n            );\r\n        }\r\n        public STS DatExtimageinfo(DG a_dg, MSG a_msg, ref TW_EXTIMAGEINFO a_twextimageinfo)\r\n        {\r\n            STS sts;\r\n\r\n            // Submit the work to the TWAIN thread...\r\n            if (m_runinuithreaddelegate == null)\r\n            {\r\n                if ((m_threadTwain != null) && (m_threadTwain.ManagedThreadId != Thread.CurrentThread.ManagedThreadId))\r\n                {\r\n                    lock (m_lockTwain)\r\n                    {\r\n                        // Set our command variables...\r\n                        ThreadData threaddata = default(ThreadData);\r\n                        threaddata.twextimageinfo = a_twextimageinfo;\r\n                        threaddata.dg = a_dg;\r\n                        threaddata.msg = a_msg;\r\n                        threaddata.dat = DAT.EXTIMAGEINFO;\r\n                        long lIndex = m_twaincommand.Submit(threaddata);\r\n\r\n                        // Submit the command and wait for the reply...\r\n                        CallerToThreadSet();\r\n                        ThreadToCallerWaitOne();\r\n\r\n                        // Return the result...\r\n                        a_twextimageinfo = m_twaincommand.Get(lIndex).twextimageinfo;\r\n                        sts = m_twaincommand.Get(lIndex).sts;\r\n\r\n                        // Clear the command variables...\r\n                        m_twaincommand.Delete(lIndex);\r\n                    }\r\n                    return (sts);\r\n                }\r\n            }\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendBefore(a_dg.ToString(), DAT.EXTIMAGEINFO.ToString(), a_msg.ToString(), \"\");\r\n            }\r\n\r\n            // Windows...\r\n            if (ms_platform == Platform.WINDOWS)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_threaddataDatExtimageinfo.blIsInuse || (this.m_runinuithreaddelegate == null))\r\n                    {\r\n                        if (m_blUseLegacyDSM)\r\n                        {\r\n                            sts = (STS)NativeMethods.WindowsTwain32DsmEntryExtimageinfo(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.EXTIMAGEINFO, a_msg, ref a_twextimageinfo);\r\n                        }\r\n                        else\r\n                        {\r\n                            sts = (STS)NativeMethods.WindowsTwaindsmDsmEntryExtimageinfo(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.EXTIMAGEINFO, a_msg, ref a_twextimageinfo);\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        if (m_blUseLegacyDSM)\r\n                        {\r\n                            lock (m_lockTwain)\r\n                            {\r\n                                m_threaddataDatExtimageinfo = default(ThreadData);\r\n                                m_threaddataDatExtimageinfo.blIsInuse = true;\r\n                                m_threaddataDatExtimageinfo.dg = a_dg;\r\n                                m_threaddataDatExtimageinfo.msg = a_msg;\r\n                                m_threaddataDatExtimageinfo.dat = DAT.EXTIMAGEINFO;\r\n                                m_threaddataDatExtimageinfo.twextimageinfo = a_twextimageinfo;\r\n                                RunInUiThread(DatExtimageinfoWindowsTwain32);\r\n                                a_twextimageinfo = m_threaddataDatExtimageinfo.twextimageinfo;\r\n                                sts = m_threaddataDatExtimageinfo.sts;\r\n                                m_threaddataDatExtimageinfo = default(ThreadData);\r\n                            }\r\n                        }\r\n                        else\r\n                        {\r\n                            lock (m_lockTwain)\r\n                            {\r\n                                m_threaddataDatExtimageinfo = default(ThreadData);\r\n                                m_threaddataDatExtimageinfo.blIsInuse = true;\r\n                                m_threaddataDatExtimageinfo.dg = a_dg;\r\n                                m_threaddataDatExtimageinfo.msg = a_msg;\r\n                                m_threaddataDatExtimageinfo.dat = DAT.EXTIMAGEINFO;\r\n                                m_threaddataDatExtimageinfo.twextimageinfo = a_twextimageinfo;\r\n                                RunInUiThread(DatExtimageinfoWindowsTwainDsm);\r\n                                a_twextimageinfo = m_threaddataDatExtimageinfo.twextimageinfo;\r\n                                sts = m_threaddataDatExtimageinfo.sts;\r\n                                m_threaddataDatExtimageinfo = default(ThreadData);\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Linux...\r\n            else if (ms_platform == Platform.LINUX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blFoundLatestDsm64 && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux64DsmEntryExtimageinfo(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.EXTIMAGEINFO, a_msg, ref a_twextimageinfo);\r\n                    }\r\n                    else if (m_blFoundLatestDsm && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.LinuxDsmEntryExtimageinfo(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.EXTIMAGEINFO, a_msg, ref a_twextimageinfo);\r\n                    }\r\n                    else if (m_blFound020302Dsm64bit && (m_linuxdsm == LinuxDsm.Is020302Dsm64bit))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux020302Dsm64bitEntryExtimageinfo(ref m_twidentityApp, ref m_twidentityDs, a_dg, DAT.EXTIMAGEINFO, a_msg, ref a_twextimageinfo);\r\n                    }\r\n                    else\r\n                    {\r\n                        Log.Error(\"apparently we don't have a DSM...\");\r\n                        sts = STS.BUMMER;\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Mac OS X, which has to be different...\r\n            else if (ms_platform == Platform.MACOSX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwainDsmEntryExtimageinfo(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.EXTIMAGEINFO, a_msg, ref a_twextimageinfo);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwaindsmDsmEntryExtimageinfo(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.EXTIMAGEINFO, a_msg, ref a_twextimageinfo);\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Uh-oh...\r\n            else\r\n            {\r\n                Log.LogSendAfter(STS.BUMMER, \"\");\r\n                return (STS.BUMMER);\r\n            }\r\n\r\n            // Get DAT_STATUS, if needed...\r\n            TWAIN.STS stsRcOrCc = AutoDatStatus(sts);\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendAfter(stsRcOrCc, \"\");\r\n            }\r\n\r\n            // All done...\r\n            return (stsRcOrCc);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Get/Set the filesystem...\r\n        /// </summary>\r\n        /// <param name=\"a_dg\">Data group</param>\r\n        /// <param name=\"a_msg\">Operation</param>\r\n        /// <param name=\"a_twfilesystem\">FILESYSTEM structure</param>\r\n        /// <returns>TWAIN status</returns>\r\n        public STS DatFilesystem(DG a_dg, MSG a_msg, ref TW_FILESYSTEM a_twfilesystem)\r\n        {\r\n            STS sts;\r\n\r\n            // Submit the work to the TWAIN thread...\r\n            if ((m_threadTwain != null) && (m_threadTwain.ManagedThreadId != Thread.CurrentThread.ManagedThreadId))\r\n            {\r\n                lock (m_lockTwain)\r\n                {\r\n                    // Set our command variables...\r\n                    ThreadData threaddata = default(ThreadData);\r\n                    threaddata.twfilesystem = a_twfilesystem;\r\n                    threaddata.dg = a_dg;\r\n                    threaddata.msg = a_msg;\r\n                    threaddata.dat = DAT.FILESYSTEM;\r\n                    long lIndex = m_twaincommand.Submit(threaddata);\r\n\r\n                    // Submit the command and wait for the reply...\r\n                    CallerToThreadSet();\r\n                    ThreadToCallerWaitOne();\r\n\r\n                    // Return the result...\r\n                    a_twfilesystem = m_twaincommand.Get(lIndex).twfilesystem;\r\n                    sts = m_twaincommand.Get(lIndex).sts;\r\n\r\n                    // Clear the command variables...\r\n                    m_twaincommand.Delete(lIndex);\r\n                }\r\n                return (sts);\r\n            }\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendBefore(a_dg.ToString(), DAT.FILESYSTEM.ToString(), a_msg.ToString(), FilesystemToCsv(a_twfilesystem));\r\n            }\r\n\r\n            // Windows...\r\n            if (ms_platform == Platform.WINDOWS)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.WindowsTwain32DsmEntryFilesystem(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.FILESYSTEM, a_msg, ref a_twfilesystem);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.WindowsTwaindsmDsmEntryFilesystem(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.FILESYSTEM, a_msg, ref a_twfilesystem);\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Linux...\r\n            else if (ms_platform == Platform.LINUX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blFoundLatestDsm64 && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux64DsmEntryFilesystem(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.FILESYSTEM, a_msg, ref a_twfilesystem);\r\n                    }\r\n                    else if (m_blFoundLatestDsm && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.LinuxDsmEntryFilesystem(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.FILESYSTEM, a_msg, ref a_twfilesystem);\r\n                    }\r\n                    else if (m_blFound020302Dsm64bit && (m_linuxdsm == LinuxDsm.Is020302Dsm64bit))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux020302Dsm64bitEntryFilesystem(ref m_twidentityApp, ref m_twidentityDs, a_dg, DAT.FILESYSTEM, a_msg, ref a_twfilesystem);\r\n                    }\r\n                    else\r\n                    {\r\n                        Log.Error(\"apparently we don't have a DSM...\");\r\n                        sts = STS.BUMMER;\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Mac OS X, which has to be different...\r\n            else if (ms_platform == Platform.MACOSX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwainDsmEntryFilesystem(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.FILESYSTEM, a_msg, ref a_twfilesystem);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwaindsmDsmEntryFilesystem(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.FILESYSTEM, a_msg, ref a_twfilesystem);\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Uh-oh...\r\n            else\r\n            {\r\n                Log.LogSendAfter(STS.BUMMER, \"\");\r\n                return (STS.BUMMER);\r\n            }\r\n\r\n            // Get DAT_STATUS, if needed...\r\n            TWAIN.STS stsRcOrCc = AutoDatStatus(sts);\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendAfter(stsRcOrCc, FilesystemToCsv(a_twfilesystem));\r\n            }\r\n\r\n            // All done...\r\n            return (stsRcOrCc);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Get/Set filter information...\r\n        /// </summary>\r\n        /// <param name=\"a_dg\">Data group</param>\r\n        /// <param name=\"a_msg\">Operation</param>\r\n        /// <param name=\"a_twfilter\">FILTER structure</param>\r\n        /// <returns>TWAIN status</returns>\r\n        public STS DatFilter(DG a_dg, MSG a_msg, ref TW_FILTER a_twfilter)\r\n        {\r\n            STS sts;\r\n\r\n            // Submit the work to the TWAIN thread...\r\n            if ((m_threadTwain != null) && (m_threadTwain.ManagedThreadId != Thread.CurrentThread.ManagedThreadId))\r\n            {\r\n                lock (m_lockTwain)\r\n                {\r\n                    // Set our command variables...\r\n                    ThreadData threaddata = default(ThreadData);\r\n                    threaddata.twfilter = a_twfilter;\r\n                    threaddata.dg = a_dg;\r\n                    threaddata.msg = a_msg;\r\n                    threaddata.dat = DAT.FILTER;\r\n                    long lIndex = m_twaincommand.Submit(threaddata);\r\n\r\n                    // Submit the command and wait for the reply...\r\n                    CallerToThreadSet();\r\n                    ThreadToCallerWaitOne();\r\n\r\n                    // Return the result...\r\n                    a_twfilter = m_twaincommand.Get(lIndex).twfilter;\r\n                    sts = m_twaincommand.Get(lIndex).sts;\r\n\r\n                    // Clear the command variables...\r\n                    m_twaincommand.Delete(lIndex);\r\n                }\r\n                return (sts);\r\n            }\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendBefore(a_dg.ToString(), DAT.FILTER.ToString(), a_msg.ToString(), \"\");\r\n            }\r\n\r\n            // Windows...\r\n            if (ms_platform == Platform.WINDOWS)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.WindowsTwain32DsmEntryFilter(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.FILTER, a_msg, ref a_twfilter);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.WindowsTwaindsmDsmEntryFilter(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.FILTER, a_msg, ref a_twfilter);\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Linux...\r\n            else if (ms_platform == Platform.LINUX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blFoundLatestDsm64 && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux64DsmEntryFilter(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.FILTER, a_msg, ref a_twfilter);\r\n                    }\r\n                    else if (m_blFoundLatestDsm && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.LinuxDsmEntryFilter(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.FILTER, a_msg, ref a_twfilter);\r\n                    }\r\n                    else if (m_blFound020302Dsm64bit && (m_linuxdsm == LinuxDsm.Is020302Dsm64bit))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux020302Dsm64bitEntryFilter(ref m_twidentityApp, ref m_twidentityDs, a_dg, DAT.FILTER, a_msg, ref a_twfilter);\r\n                    }\r\n                    else\r\n                    {\r\n                        Log.Error(\"apparently we don't have a DSM...\");\r\n                        sts = STS.BUMMER;\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Mac OS X, which has to be different...\r\n            else if (ms_platform == Platform.MACOSX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwainDsmEntryFilter(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.FILTER, a_msg, ref a_twfilter);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwaindsmDsmEntryFilter(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.FILTER, a_msg, ref a_twfilter);\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Uh-oh...\r\n            else\r\n            {\r\n                Log.LogSendAfter(STS.BUMMER, \"\");\r\n                return (STS.BUMMER);\r\n            }\r\n\r\n            // Get DAT_STATUS, if needed...\r\n            TWAIN.STS stsRcOrCc = AutoDatStatus(sts);\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendAfter(stsRcOrCc, \"\");\r\n            }\r\n\r\n            // All done...\r\n            return (stsRcOrCc);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Get/Set for Gray response...\r\n        /// </summary>\r\n        /// <param name=\"a_dg\">Data group</param>\r\n        /// <param name=\"a_msg\">Operation</param>\r\n        /// <param name=\"a_twgrayresponse\">GRAYRESPONSE structure</param>\r\n        /// <returns>TWAIN status</returns>\r\n        public STS DatGrayresponse(DG a_dg, MSG a_msg, ref TW_GRAYRESPONSE a_twgrayresponse)\r\n        {\r\n            STS sts;\r\n\r\n            // Submit the work to the TWAIN thread...\r\n            if ((m_threadTwain != null) && (m_threadTwain.ManagedThreadId != Thread.CurrentThread.ManagedThreadId))\r\n            {\r\n                lock (m_lockTwain)\r\n                {\r\n                    // Set our command variables...\r\n                    ThreadData threaddata = default(ThreadData);\r\n                    threaddata.twgrayresponse = a_twgrayresponse;\r\n                    threaddata.dg = a_dg;\r\n                    threaddata.msg = a_msg;\r\n                    threaddata.dat = DAT.GRAYRESPONSE;\r\n                    long lIndex = m_twaincommand.Submit(threaddata);\r\n\r\n                    // Submit the command and wait for the reply...\r\n                    CallerToThreadSet();\r\n                    ThreadToCallerWaitOne();\r\n\r\n                    // Return the result...\r\n                    a_twgrayresponse = m_twaincommand.Get(lIndex).twgrayresponse;\r\n                    sts = m_twaincommand.Get(lIndex).sts;\r\n\r\n                    // Clear the command variables...\r\n                    m_twaincommand.Delete(lIndex);\r\n                }\r\n                return (sts);\r\n            }\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendBefore(a_dg.ToString(), DAT.GRAYRESPONSE.ToString(), a_msg.ToString(), \"\");\r\n            }\r\n\r\n            // Windows...\r\n            if (ms_platform == Platform.WINDOWS)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.WindowsTwain32DsmEntryGrayresponse(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.GRAYRESPONSE, a_msg, ref a_twgrayresponse);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.WindowsTwaindsmDsmEntryGrayresponse(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.GRAYRESPONSE, a_msg, ref a_twgrayresponse);\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Linux...\r\n            else if (ms_platform == Platform.LINUX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blFoundLatestDsm64 && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux64DsmEntryGrayresponse(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.GRAYRESPONSE, a_msg, ref a_twgrayresponse);\r\n                    }\r\n                    else if (m_blFoundLatestDsm && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.LinuxDsmEntryGrayresponse(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.GRAYRESPONSE, a_msg, ref a_twgrayresponse);\r\n                    }\r\n                    else if (m_blFound020302Dsm64bit && (m_linuxdsm == LinuxDsm.Is020302Dsm64bit))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux020302Dsm64bitEntryGrayresponse(ref m_twidentityApp, ref m_twidentityDs, a_dg, DAT.GRAYRESPONSE, a_msg, ref a_twgrayresponse);\r\n                    }\r\n                    else\r\n                    {\r\n                        Log.Error(\"apparently we don't have a DSM...\");\r\n                        sts = STS.BUMMER;\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Mac OS X, which has to be different...\r\n            else if (ms_platform == Platform.MACOSX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwainDsmEntryGrayresponse(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.GRAYRESPONSE, a_msg, ref a_twgrayresponse);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwaindsmDsmEntryGrayresponse(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.GRAYRESPONSE, a_msg, ref a_twgrayresponse);\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Uh-oh...\r\n            else\r\n            {\r\n                Log.LogSendAfter(STS.BUMMER, \"\");\r\n                return (STS.BUMMER);\r\n            }\r\n\r\n            // Get DAT_STATUS, if needed...\r\n            TWAIN.STS stsRcOrCc = AutoDatStatus(sts);\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendAfter(stsRcOrCc, \"\");\r\n            }\r\n\r\n            // All done...\r\n            return (stsRcOrCc);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Get/Set an ICC profile...\r\n        /// </summary>\r\n        /// <param name=\"a_dg\">Data group</param>\r\n        /// <param name=\"a_msg\">Operation</param>\r\n        /// <param name=\"a_twmemory\">ICCPROFILE structure</param>\r\n        /// <returns>TWAIN status</returns>\r\n        public STS DatIccprofile(DG a_dg, MSG a_msg, ref TW_MEMORY a_twmemory)\r\n        {\r\n            STS sts;\r\n\r\n            // Submit the work to the TWAIN thread...\r\n            if ((m_threadTwain != null) && (m_threadTwain.ManagedThreadId != Thread.CurrentThread.ManagedThreadId))\r\n            {\r\n                lock (m_lockTwain)\r\n                {\r\n                    // Set our command variables...\r\n                    ThreadData threaddata = default(ThreadData);\r\n                    threaddata.twmemory = a_twmemory;\r\n                    threaddata.dg = a_dg;\r\n                    threaddata.msg = a_msg;\r\n                    threaddata.dat = DAT.ICCPROFILE;\r\n                    long lIndex = m_twaincommand.Submit(threaddata);\r\n\r\n                    // Submit the command and wait for the reply...\r\n                    CallerToThreadSet();\r\n                    ThreadToCallerWaitOne();\r\n\r\n                    // Return the result...\r\n                    a_twmemory = m_twaincommand.Get(lIndex).twmemory;\r\n                    sts = m_twaincommand.Get(lIndex).sts;\r\n\r\n                    // Clear the command variables...\r\n                    m_twaincommand.Delete(lIndex);\r\n                }\r\n                return (sts);\r\n            }\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendBefore(a_dg.ToString(), DAT.ICCPROFILE.ToString(), a_msg.ToString(), \"\");\r\n            }\r\n\r\n            // Windows...\r\n            if (ms_platform == Platform.WINDOWS)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.WindowsTwain32DsmEntryIccprofile(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.ICCPROFILE, a_msg, ref a_twmemory);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.WindowsTwaindsmDsmEntryIccprofile(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.ICCPROFILE, a_msg, ref a_twmemory);\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Linux...\r\n            else if (ms_platform == Platform.LINUX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blFoundLatestDsm64 && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux64DsmEntryIccprofile(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.ICCPROFILE, a_msg, ref a_twmemory);\r\n                    }\r\n                    else if (m_blFoundLatestDsm && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.LinuxDsmEntryIccprofile(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.ICCPROFILE, a_msg, ref a_twmemory);\r\n                    }\r\n                    else if (m_blFound020302Dsm64bit && (m_linuxdsm == LinuxDsm.Is020302Dsm64bit))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux020302Dsm64bitEntryIccprofile(ref m_twidentityApp, ref m_twidentityDs, a_dg, DAT.ICCPROFILE, a_msg, ref a_twmemory);\r\n                    }\r\n                    else\r\n                    {\r\n                        Log.Error(\"apparently we don't have a DSM...\");\r\n                        sts = STS.BUMMER;\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Mac OS X, which has to be different...\r\n            else if (ms_platform == Platform.MACOSX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwainDsmEntryIccprofile(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.ICCPROFILE, a_msg, ref a_twmemory);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwaindsmDsmEntryIccprofile(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.ICCPROFILE, a_msg, ref a_twmemory);\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Uh-oh...\r\n            else\r\n            {\r\n                Log.LogSendAfter(STS.BUMMER, \"\");\r\n                return (STS.BUMMER);\r\n            }\r\n\r\n            // Get DAT_STATUS, if needed...\r\n            TWAIN.STS stsRcOrCc = AutoDatStatus(sts);\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendAfter(stsRcOrCc, \"\");\r\n            }\r\n\r\n            // All done...\r\n            return (stsRcOrCc);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Issue identity commands...\r\n        /// </summary>\r\n        /// <param name=\"a_dg\">Data group</param>\r\n        /// <param name=\"a_msg\">Operation</param>\r\n        /// <param name=\"a_twidentity\">IDENTITY structure</param>\r\n        /// <returns>TWAIN status</returns>\r\n        private void DatIdentityWindowsTwain32()\r\n        {\r\n            // If you get a first chance exception, be aware that some drivers\r\n            // will do that to you, you can ignore it and they'll keep going...\r\n            if (GetState() <= STATE.S3)\r\n            {\r\n                m_threaddataDatIdentity.sts = (STS)NativeMethods.WindowsTwain32DsmEntryIdentity\r\n                (\r\n                    ref m_twidentitylegacyApp,\r\n                    IntPtr.Zero,\r\n                    m_threaddataDatIdentity.dg,\r\n                    m_threaddataDatIdentity.dat,\r\n                    m_threaddataDatIdentity.msg,\r\n                    ref m_threaddataDatIdentity.twidentitylegacy\r\n                );\r\n            }\r\n            // Man, I'm learning stupid new stuff all the time, so the old DSM\r\n            // had to have the destination.  Argh...\r\n            else\r\n            {\r\n                m_threaddataDatIdentity.sts = (STS)NativeMethods.WindowsTwain32DsmEntryIdentityState4\r\n                (\r\n                    ref m_twidentitylegacyApp,\r\n                    ref m_twidentitylegacyDs,\r\n                    m_threaddataDatIdentity.dg,\r\n                    m_threaddataDatIdentity.dat,\r\n                    m_threaddataDatIdentity.msg,\r\n                    ref m_threaddataDatIdentity.twidentitylegacy\r\n                );\r\n            }\r\n        }\r\n        private void DatIdentityWindowsTwainDsm()\r\n        {\r\n            // If you get a first chance exception, be aware that some drivers\r\n            // will do that to you, you can ignore it and they'll keep going...\r\n            m_threaddataDatIdentity.sts = (STS)NativeMethods.WindowsTwaindsmDsmEntryIdentity\r\n            (\r\n                ref m_twidentitylegacyApp,\r\n                IntPtr.Zero,\r\n                m_threaddataDatIdentity.dg,\r\n                m_threaddataDatIdentity.dat,\r\n                m_threaddataDatIdentity.msg,\r\n                ref m_threaddataDatIdentity.twidentitylegacy\r\n            );\r\n        }\r\n        [PermissionSet(SecurityAction.LinkDemand, Name = \"FullTrust\", Unrestricted = false)]\r\n        public STS DatIdentity(DG a_dg, MSG a_msg, ref TW_IDENTITY a_twidentity)\r\n        {\r\n            STS sts;\r\n\r\n            // Submit the work to the TWAIN thread...\r\n            if (m_runinuithreaddelegate == null)\r\n            {\r\n                if ((m_threadTwain != null) && (m_threadTwain.ManagedThreadId != Thread.CurrentThread.ManagedThreadId))\r\n                {\r\n                    lock (m_lockTwain)\r\n                    {\r\n                        // Set our command variables...\r\n                        ThreadData threaddata = default(ThreadData);\r\n                        threaddata.twidentity = a_twidentity;\r\n                        threaddata.dg = a_dg;\r\n                        threaddata.msg = a_msg;\r\n                        threaddata.dat = DAT.IDENTITY;\r\n                        long lIndex = m_twaincommand.Submit(threaddata);\r\n\r\n                        // Submit the command and wait for the reply...\r\n                        CallerToThreadSet();\r\n                        ThreadToCallerWaitOne();\r\n\r\n                        // Return the result...\r\n                        a_twidentity = m_twaincommand.Get(lIndex).twidentity;\r\n                        sts = m_twaincommand.Get(lIndex).sts;\r\n\r\n                        // Clear the command variables...\r\n                        m_twaincommand.Delete(lIndex);\r\n                    }\r\n                    return (sts);\r\n                }\r\n            }\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendBefore(a_dg.ToString(), DAT.IDENTITY.ToString(), a_msg.ToString(), ((a_msg == MSG.OPENDS) ? IdentityToCsv(a_twidentity) : \"\"));\r\n            }\r\n\r\n            // Windows...\r\n            if (ms_platform == Platform.WINDOWS)\r\n            {\r\n                // Convert the identity structure...\r\n                TW_IDENTITY_LEGACY twidentitylegacy = TwidentityToTwidentitylegacy(a_twidentity);\r\n\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_threaddataDatIdentity.blIsInuse || (this.m_runinuithreaddelegate == null))\r\n                    {\r\n                        if (m_blUseLegacyDSM)\r\n                        {\r\n                            if (GetState() <= STATE.S3)\r\n                            {\r\n                                sts = (STS)NativeMethods.WindowsTwain32DsmEntryIdentity(ref m_twidentitylegacyApp, IntPtr.Zero, a_dg, DAT.IDENTITY, a_msg, ref twidentitylegacy);\r\n                            }\r\n                            else\r\n                            {\r\n                                sts = (STS)NativeMethods.WindowsTwain32DsmEntryIdentityState4(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.IDENTITY, a_msg, ref twidentitylegacy);\r\n                            }\r\n                        }\r\n                        else\r\n                        {\r\n                            sts = (STS)NativeMethods.WindowsTwaindsmDsmEntryIdentity(ref m_twidentitylegacyApp, IntPtr.Zero, a_dg, DAT.IDENTITY, a_msg, ref twidentitylegacy);\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        if (m_blUseLegacyDSM)\r\n                        {\r\n                            lock (m_lockTwain)\r\n                            {\r\n                                m_threaddataDatIdentity = default(ThreadData);\r\n                                m_threaddataDatIdentity.blIsInuse = true;\r\n                                m_threaddataDatIdentity.dg = a_dg;\r\n                                m_threaddataDatIdentity.msg = a_msg;\r\n                                m_threaddataDatIdentity.dat = DAT.IDENTITY;\r\n                                m_threaddataDatIdentity.twidentitylegacy = twidentitylegacy;\r\n                                RunInUiThread(DatIdentityWindowsTwain32);\r\n                                twidentitylegacy = m_threaddataDatIdentity.twidentitylegacy;\r\n                                sts = m_threaddataDatIdentity.sts;\r\n                                m_threaddataDatIdentity = default(ThreadData);\r\n                            }\r\n                        }\r\n                        else\r\n                        {\r\n                            lock (m_lockTwain)\r\n                            {\r\n                                m_threaddataDatIdentity = default(ThreadData);\r\n                                m_threaddataDatIdentity.blIsInuse = true;\r\n                                m_threaddataDatIdentity.dg = a_dg;\r\n                                m_threaddataDatIdentity.msg = a_msg;\r\n                                m_threaddataDatIdentity.dat = DAT.IDENTITY;\r\n                                m_threaddataDatIdentity.twidentitylegacy = twidentitylegacy;\r\n                                RunInUiThread(DatIdentityWindowsTwainDsm);\r\n                                twidentitylegacy = m_threaddataDatIdentity.twidentitylegacy;\r\n                                sts = m_threaddataDatIdentity.sts;\r\n                                m_threaddataDatIdentity = default(ThreadData);\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n                a_twidentity = TwidentitylegacyToTwidentity(twidentitylegacy);\r\n            }\r\n\r\n            // Linux...\r\n            else if (ms_platform == Platform.LINUX)\r\n            {\r\n                // Issue the command, we have a serious problem with 64-bit stuff\r\n                // because TW_INT32 and TW_UINT32 were defined using long, which\r\n                // made them 64-bit values (not a good idea for 32-bit types).  This\r\n                // was fixed with TWAIN DSM 2.4, but it leaves us with a bit of a\r\n                // mess.  So, unlike all of the other calls, we're going to allow\r\n                // ourselves to access both DSMs from here.  This is only an issue\r\n                // for 64-bit systems, and we're going to assume that the data source\r\n                // is 2.4 or later, since that'll be the long term situation.  Note\r\n                // that we assume the DSMs are protecting us from talking to the\r\n                // wrong data source...\r\n                try\r\n                {\r\n                    // Since life is complex, start by assuming failure...\r\n                    sts = STS.FAILURE;\r\n\r\n                    // Handle closeds...\r\n                    if (a_msg == MSG.CLOSEDS)\r\n                    {\r\n                        // We've opened this source, and we know it's the new style...\r\n                        if (m_blFoundLatestDsm64 && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                        {\r\n                            TW_IDENTITY_LEGACY twidentitylegacy = TwidentityToTwidentitylegacy(a_twidentity);\r\n                            sts = (STS)NativeMethods.Linux64DsmEntryIdentity(ref m_twidentitylegacyApp, IntPtr.Zero, a_dg, DAT.IDENTITY, a_msg, ref twidentitylegacy);\r\n                            a_twidentity = TwidentitylegacyToTwidentity(twidentitylegacy);\r\n                        }\r\n                        // We've opened this source, and we know it's the new style...\r\n                        else if (m_blFoundLatestDsm && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                        {\r\n                            TW_IDENTITY_LEGACY twidentitylegacy = TwidentityToTwidentitylegacy(a_twidentity);\r\n                            sts = (STS)NativeMethods.LinuxDsmEntryIdentity(ref m_twidentitylegacyApp, IntPtr.Zero, a_dg, DAT.IDENTITY, a_msg, ref twidentitylegacy);\r\n                            a_twidentity = TwidentitylegacyToTwidentity(twidentitylegacy);\r\n                        }\r\n                        // We've opened this source, and we know it's the old style...\r\n                        else if (m_blFound020302Dsm64bit && (m_linuxdsm == LinuxDsm.Is020302Dsm64bit))\r\n                        {\r\n                            TW_IDENTITY_LINUX64 twidentitylinux64App = TwidentityToTwidentitylinux64(m_twidentityApp);\r\n                            TW_IDENTITY_LINUX64 twidentitylinux64 = TwidentityToTwidentitylinux64(a_twidentity);\r\n                            sts = (STS)NativeMethods.Linux020302Dsm64bitEntryIdentity(ref twidentitylinux64App, IntPtr.Zero, a_dg, DAT.IDENTITY, a_msg, ref twidentitylinux64);\r\n                            a_twidentity = Twidentitylinux64ToTwidentity(twidentitylinux64);\r\n                        }\r\n                        // We can't possibly have opened this source, so this had\r\n                        // better be a sequence error...\r\n                        else\r\n                        {\r\n                            sts = STS.SEQERROR;\r\n                        }\r\n                    }\r\n\r\n                    // Getfirst always starts with the latest DSM, if it can't find it,\r\n                    // or if it reports end of list, then go on to the old DSM, if we\r\n                    // have one.  Note that it's up to the caller to handle any errors\r\n                    // and keep searching.  We're not trying to figure out anything\r\n                    // about the driver at this level...\r\n                    else if (a_msg == MSG.GETFIRST)\r\n                    {\r\n                        m_linux64bitdsmDatIdentity = LinuxDsm.Unknown;\r\n\r\n                        // Assume end of list for the outcome...\r\n                        sts = STS.ENDOFLIST;\r\n\r\n                        // Try to start with the latest DSM...\r\n                        if (m_blFoundLatestDsm64)\r\n                        {\r\n                            m_linux64bitdsmDatIdentity = LinuxDsm.IsLatestDsm;\r\n                            TW_IDENTITY_LEGACY twidentitylegacy = TwidentityToTwidentitylegacy(a_twidentity);\r\n                            sts = (STS)NativeMethods.Linux64DsmEntryIdentity(ref m_twidentitylegacyApp, IntPtr.Zero, a_dg, DAT.IDENTITY, a_msg, ref twidentitylegacy);\r\n                            a_twidentity = TwidentitylegacyToTwidentity(twidentitylegacy);\r\n                        }\r\n\r\n                        // Try to start with the latest DSM...\r\n                        if (m_blFoundLatestDsm)\r\n                        {\r\n                            m_linux64bitdsmDatIdentity = LinuxDsm.IsLatestDsm;\r\n                            TW_IDENTITY_LEGACY twidentitylegacy = TwidentityToTwidentitylegacy(a_twidentity);\r\n                            sts = (STS)NativeMethods.LinuxDsmEntryIdentity(ref m_twidentitylegacyApp, IntPtr.Zero, a_dg, DAT.IDENTITY, a_msg, ref twidentitylegacy);\r\n                            a_twidentity = TwidentitylegacyToTwidentity(twidentitylegacy);\r\n                        }\r\n\r\n                        // If the lastest DSM didn't work, try the old stuff...\r\n                        if (m_blFound020302Dsm64bit && (sts == STS.ENDOFLIST))\r\n                        {\r\n                            m_linux64bitdsmDatIdentity = LinuxDsm.Is020302Dsm64bit;\r\n                            TW_IDENTITY_LINUX64 twidentitylinux64App = TwidentityToTwidentitylinux64(m_twidentityApp);\r\n                            TW_IDENTITY_LINUX64 twidentitylinux64 = TwidentityToTwidentitylinux64(a_twidentity);\r\n                            sts = (STS)NativeMethods.Linux020302Dsm64bitEntryIdentity(ref twidentitylinux64App, IntPtr.Zero, a_dg, DAT.IDENTITY, a_msg, ref twidentitylinux64);\r\n                            a_twidentity = Twidentitylinux64ToTwidentity(twidentitylinux64);\r\n                        }\r\n                    }\r\n\r\n                    // Getnext gets its lead from getfirst, if we have a DSM\r\n                    // value, we try it out, if we don't have one, we must be\r\n                    // at the end of list.  We'll do the new DSM and then the\r\n                    // old DSM (if we have one)...\r\n                    else if (a_msg == MSG.GETNEXT)\r\n                    {\r\n                        bool blChangeToGetFirst = false;\r\n\r\n                        // We're done, they'll have to use MSG_GETFIRST to start again...\r\n                        if (m_linux64bitdsmDatIdentity == LinuxDsm.Unknown)\r\n                        {\r\n                            sts = STS.ENDOFLIST;\r\n                        }\r\n\r\n                        // We're working the latest DSM, if we hit end of list, then we'll\r\n                        // try to switch over to the old DSM...\r\n                        if (m_blFoundLatestDsm64 && (m_linux64bitdsmDatIdentity == LinuxDsm.IsLatestDsm))\r\n                        {\r\n                            TW_IDENTITY_LEGACY twidentitylegacy = TwidentityToTwidentitylegacy(a_twidentity);\r\n                            sts = (STS)NativeMethods.Linux64DsmEntryIdentity(ref m_twidentitylegacyApp, IntPtr.Zero, a_dg, DAT.IDENTITY, a_msg, ref twidentitylegacy);\r\n                            a_twidentity = TwidentitylegacyToTwidentity(twidentitylegacy);\r\n                            if (sts == STS.ENDOFLIST)\r\n                            {\r\n                                m_linux64bitdsmDatIdentity = m_blFound020302Dsm64bit ? LinuxDsm.Is020302Dsm64bit : LinuxDsm.Unknown;\r\n                                blChangeToGetFirst = true;\r\n                            }\r\n                        }\r\n\r\n                        // We're working the latest DSM, if we hit end of list, then we'll\r\n                        // try to switch over to the old DSM...\r\n                        if (m_blFoundLatestDsm && (m_linux64bitdsmDatIdentity == LinuxDsm.IsLatestDsm))\r\n                        {\r\n                            TW_IDENTITY_LEGACY twidentitylegacy = TwidentityToTwidentitylegacy(a_twidentity);\r\n                            sts = (STS)NativeMethods.LinuxDsmEntryIdentity(ref m_twidentitylegacyApp, IntPtr.Zero, a_dg, DAT.IDENTITY, a_msg, ref twidentitylegacy);\r\n                            a_twidentity = TwidentitylegacyToTwidentity(twidentitylegacy);\r\n                            if (sts == STS.ENDOFLIST)\r\n                            {\r\n                                m_linux64bitdsmDatIdentity = m_blFound020302Dsm64bit ? LinuxDsm.Is020302Dsm64bit : LinuxDsm.Unknown;\r\n                                blChangeToGetFirst = true;\r\n                            }\r\n                        }\r\n\r\n                        // We're working the old DSM, if we hit the end of list, then we\r\n                        // clear the DSM indicator...\r\n                        if (m_blFound020302Dsm64bit && (m_linux64bitdsmDatIdentity == LinuxDsm.Is020302Dsm64bit))\r\n                        {\r\n                            TW_IDENTITY_LINUX64 twidentitylinux64App = TwidentityToTwidentitylinux64(m_twidentityApp);\r\n                            TW_IDENTITY_LINUX64 twidentitylinux64 = blChangeToGetFirst ? default(TW_IDENTITY_LINUX64) : TwidentityToTwidentitylinux64(a_twidentity);\r\n                            sts = (STS)NativeMethods.Linux020302Dsm64bitEntryIdentity(ref twidentitylinux64App, IntPtr.Zero, a_dg, DAT.IDENTITY, blChangeToGetFirst ? MSG.GETFIRST : a_msg, ref twidentitylinux64);\r\n                            a_twidentity = Twidentitylinux64ToTwidentity(twidentitylinux64);\r\n                            if (sts == STS.ENDOFLIST)\r\n                            {\r\n                                m_linux64bitdsmDatIdentity = LinuxDsm.Unknown;\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    // Open always tries the current DSM, and then the older one, if needed...\r\n                    else if (a_msg == MSG.OPENDS)\r\n                    {\r\n                        TW_IDENTITY_LEGACY twidentitylegacy = default(TW_IDENTITY_LEGACY);\r\n\r\n                        // Prime the pump by assuming we didn't find anything...\r\n                        sts = STS.NODS;\r\n\r\n                        // Try with the latest DSM first, if we have one...\r\n                        if (m_blFoundLatestDsm64)\r\n                        {\r\n                            twidentitylegacy = TwidentityToTwidentitylegacy(a_twidentity);\r\n                            twidentitylegacy.Id = 0;\r\n                            try\r\n                            {\r\n                                sts = (STS)NativeMethods.Linux64DsmEntryIdentity(ref m_twidentitylegacyApp, IntPtr.Zero, a_dg, DAT.IDENTITY, a_msg, ref twidentitylegacy);\r\n                            }\r\n                            catch\r\n                            {\r\n                                sts = STS.NODS;\r\n                            }\r\n                        }\r\n\r\n                        // Try with the latest DSM first, if we have one...\r\n                        if (m_blFoundLatestDsm)\r\n                        {\r\n                            twidentitylegacy = TwidentityToTwidentitylegacy(a_twidentity);\r\n                            twidentitylegacy.Id = 0;\r\n                            try\r\n                            {\r\n                                sts = (STS)NativeMethods.LinuxDsmEntryIdentity(ref m_twidentitylegacyApp, IntPtr.Zero, a_dg, DAT.IDENTITY, a_msg, ref twidentitylegacy);\r\n                            }\r\n                            catch\r\n                            {\r\n                                sts = STS.NODS;\r\n                            }\r\n                        }\r\n\r\n                        // We got it...\r\n                        if (sts == STS.SUCCESS)\r\n                        {\r\n                            a_twidentity = TwidentitylegacyToTwidentity(twidentitylegacy);\r\n                            m_linuxdsm = LinuxDsm.IsLatestDsm;\r\n                        }\r\n\r\n                        // No joy, so try the old DSM...\r\n                        else if (m_blFound020302Dsm64bit)\r\n                        {\r\n                            TW_IDENTITY_LINUX64 twidentitylinux64App = TwidentityToTwidentitylinux64(m_twidentityApp);\r\n                            TW_IDENTITY_LINUX64 twidentitylinux64 = TwidentityToTwidentitylinux64(a_twidentity);\r\n                            twidentitylinux64.Id = 0;\r\n                            try\r\n                            {\r\n                                sts = (STS)NativeMethods.Linux020302Dsm64bitEntryIdentity(ref twidentitylinux64App, IntPtr.Zero, a_dg, DAT.IDENTITY, a_msg, ref twidentitylinux64);\r\n                            }\r\n                            catch\r\n                            {\r\n                                sts = STS.NODS;\r\n                            }\r\n\r\n                            // We got it...\r\n                            if (sts == STS.SUCCESS)\r\n                            {\r\n                                a_twidentity = Twidentitylinux64ToTwidentity(twidentitylinux64);\r\n                                m_linuxdsm = LinuxDsm.Is020302Dsm64bit;\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    // TBD: figure out how to safely do a set on Linux...\r\n                    else if (a_msg == MSG.SET)\r\n                    {\r\n                        // Just pretend we did it...\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Mac OS X, which has to be different...\r\n            else if (ms_platform == Platform.MACOSX)\r\n            {\r\n                TW_IDENTITY_MACOSX twidentitymacosx = TwidentityToTwidentitymacosx(a_twidentity);\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwainDsmEntryIdentity(ref m_twidentitymacosxApp, IntPtr.Zero, a_dg, DAT.IDENTITY, a_msg, ref twidentitymacosx);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwaindsmDsmEntryIdentity(ref m_twidentitymacosxApp, IntPtr.Zero, a_dg, DAT.IDENTITY, a_msg, ref twidentitymacosx);\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n                a_twidentity = TwidentitymacosxToTwidentity(twidentitymacosx);\r\n            }\r\n\r\n            // Uh-oh...\r\n            else\r\n            {\r\n                Log.LogSendAfter(STS.BUMMER, \"\");\r\n                return (STS.BUMMER);\r\n            }\r\n\r\n            // Get DAT_STATUS, if needed...\r\n            TWAIN.STS stsRcOrCc = AutoDatStatus(sts);\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendAfter(stsRcOrCc, IdentityToCsv(a_twidentity));\r\n            }\r\n\r\n            // If we opened, go to state 4...\r\n            if (a_msg == MSG.OPENDS)\r\n            {\r\n                if (sts == STS.SUCCESS)\r\n                {\r\n                    // Change our state, and record the identity we picked...\r\n                    m_state = STATE.S4;\r\n                    m_twidentityDs = a_twidentity;\r\n                    m_twidentitylegacyDs = TwidentityToTwidentitylegacy(m_twidentityDs);\r\n                    m_twidentitymacosxDs = TwidentityToTwidentitymacosx(m_twidentityDs);\r\n\r\n                    // update language\r\n                    Language.Set(m_twidentityDs.Version.Language);\r\n\r\n                    // Register for callbacks...\r\n\r\n                    // Windows...\r\n                    if (ms_platform == Platform.WINDOWS)\r\n                    {\r\n                        if (m_blUseCallbacks)\r\n                        {\r\n                            TW_CALLBACK twcallback = new TW_CALLBACK();\r\n                            twcallback.CallBackProc = Marshal.GetFunctionPointerForDelegate(m_windowsdsmentrycontrolcallbackdelegate);\r\n                            // Log it...\r\n                            if (Log.GetLevel() > 0)\r\n                            {\r\n                                Log.LogSendBefore(a_dg.ToString(), DAT.CALLBACK.ToString(), a_msg.ToString(), CallbackToCsv(twcallback));\r\n                            }\r\n                            // Issue the command...\r\n                            try\r\n                            {\r\n                                if (m_blUseLegacyDSM)\r\n                                {\r\n                                    sts = (STS)NativeMethods.WindowsTwain32DsmEntryCallback(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, DG.CONTROL, DAT.CALLBACK, MSG.REGISTER_CALLBACK, ref twcallback);\r\n                                }\r\n                                else\r\n                                {\r\n                                    sts = (STS)NativeMethods.WindowsTwaindsmDsmEntryCallback(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, DG.CONTROL, DAT.CALLBACK, MSG.REGISTER_CALLBACK, ref twcallback);\r\n                                }\r\n                            }\r\n                            catch (Exception exception)\r\n                            {\r\n                                // The driver crashed...\r\n                                Log.Error(\"crash - \" + exception.Message);\r\n                                Log.LogSendAfter(STS.BUMMER, \"\");\r\n                                return (STS.BUMMER);\r\n                            }\r\n                            // Log it...\r\n                            if (Log.GetLevel() > 0)\r\n                            {\r\n                                Log.LogSendAfter(sts, \"\");\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    // Linux...\r\n                    else if (ms_platform == Platform.LINUX)\r\n                    {\r\n                        TW_CALLBACK twcallback = new TW_CALLBACK();\r\n                        twcallback.CallBackProc = Marshal.GetFunctionPointerForDelegate(m_linuxdsmentrycontrolcallbackdelegate);\r\n                        // Log it...\r\n                        if (Log.GetLevel() > 0)\r\n                        {\r\n                            Log.LogSendBefore(a_dg.ToString(), DAT.CALLBACK.ToString(), MSG.REGISTER_CALLBACK.ToString(), CallbackToCsv(twcallback));\r\n                        }\r\n                        // Issue the command...\r\n                        try\r\n                        {\r\n                            if (m_blFoundLatestDsm64 && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                            {\r\n                                sts = (STS)NativeMethods.Linux64DsmEntryCallback(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, DG.CONTROL, DAT.CALLBACK, MSG.REGISTER_CALLBACK, ref twcallback);\r\n                            }\r\n                            else if (m_blFoundLatestDsm && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                            {\r\n                                sts = (STS)NativeMethods.LinuxDsmEntryCallback(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, DG.CONTROL, DAT.CALLBACK, MSG.REGISTER_CALLBACK, ref twcallback);\r\n                            }\r\n                            else if (m_blFound020302Dsm64bit && (m_linuxdsm == LinuxDsm.Is020302Dsm64bit))\r\n                            {\r\n                                sts = (STS)NativeMethods.Linux020302Dsm64bitEntryCallback(ref m_twidentityApp, ref m_twidentityDs, DG.CONTROL, DAT.CALLBACK, MSG.REGISTER_CALLBACK, ref twcallback);\r\n                            }\r\n                            else\r\n                            {\r\n                                Log.Error(\"apparently we don't have a DSM...\");\r\n                                sts = STS.BUMMER;\r\n                            }\r\n                        }\r\n                        catch (Exception exception)\r\n                        {\r\n                            // The driver crashed...\r\n                            Log.Error(\"crash - \" + exception.Message);\r\n                            Log.LogSendAfter(STS.BUMMER, \"\");\r\n                            return (STS.BUMMER);\r\n                        }\r\n                        // Log it...\r\n                        if (Log.GetLevel() > 0)\r\n                        {\r\n                            Log.LogSendAfter(sts, \"\");\r\n                        }\r\n                    }\r\n\r\n                    // Mac OS X, which has to be different...\r\n                    else if (ms_platform == Platform.MACOSX)\r\n                    {\r\n                        IntPtr intptr = IntPtr.Zero;\r\n                        TW_CALLBACK twcallback = new TW_CALLBACK();\r\n                        twcallback.CallBackProc = Marshal.GetFunctionPointerForDelegate(m_macosxdsmentrycontrolcallbackdelegate);\r\n                        // Log it...\r\n                        if (Log.GetLevel() > 0)\r\n                        {\r\n                            Log.LogSendBefore(a_dg.ToString(), DAT.CALLBACK.ToString(), a_msg.ToString(), CallbackToCsv(twcallback));\r\n                        }\r\n                        // Issue the command...\r\n                        try\r\n                        {\r\n                            if (m_blUseLegacyDSM)\r\n                            {\r\n                                sts = (STS)NativeMethods.MacosxTwainDsmEntryCallback(ref m_twidentitymacosxApp, intptr, DG.CONTROL, DAT.CALLBACK, MSG.REGISTER_CALLBACK, ref twcallback);\r\n                            }\r\n                            else\r\n                            {\r\n                                sts = (STS)NativeMethods.MacosxTwaindsmDsmEntryCallback(ref m_twidentitymacosxApp, ref m_twidentityDs, DG.CONTROL, DAT.CALLBACK, MSG.REGISTER_CALLBACK, ref twcallback);\r\n                            }\r\n                        }\r\n                        catch (Exception exception)\r\n                        {\r\n                            // The driver crashed...\r\n                            Log.Error(\"crash - \" + exception.Message);\r\n                            Log.LogSendAfter(STS.BUMMER, \"\");\r\n                            return (STS.BUMMER);\r\n                        }\r\n                        // Log it...\r\n                        if (Log.GetLevel() > 0)\r\n                        {\r\n                            Log.LogSendAfter(sts, \"\");\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            // If we closed, go to state 3...\r\n            else if (a_msg == MSG.CLOSEDS)\r\n            {\r\n                if (sts == STS.SUCCESS)\r\n                {\r\n                    m_state = STATE.S3;\r\n                }\r\n            }\r\n\r\n            // All done...\r\n            return (stsRcOrCc);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Get/Set image info information...\r\n        /// </summary>\r\n        /// <param name=\"a_dg\">Data group</param>\r\n        /// <param name=\"a_msg\">Operation</param>\r\n        /// <param name=\"a_twimageinfo\">IMAGEINFO structure</param>\r\n        /// <returns>TWAIN status</returns>\r\n        private void DatImageinfoWindowsTwain32()\r\n        {\r\n            // If you get a first chance exception, be aware that some drivers\r\n            // will do that to you, you can ignore it and they'll keep going...\r\n            m_threaddataDatImageinfo.sts = (STS)NativeMethods.WindowsTwain32DsmEntryImageinfo\r\n            (\r\n                ref m_twidentitylegacyApp,\r\n                ref m_twidentitylegacyDs,\r\n                m_threaddataDatImageinfo.dg,\r\n                m_threaddataDatImageinfo.dat,\r\n                m_threaddataDatImageinfo.msg,\r\n                ref m_threaddataDatImageinfo.twimageinfo\r\n            );\r\n        }\r\n        private void DatImageinfoWindowsTwainDsm()\r\n        {\r\n            // If you get a first chance exception, be aware that some drivers\r\n            // will do that to you, you can ignore it and they'll keep going...\r\n            m_threaddataDatImageinfo.sts = (STS)NativeMethods.WindowsTwaindsmDsmEntryImageinfo\r\n            (\r\n                ref m_twidentitylegacyApp,\r\n                ref m_twidentitylegacyDs,\r\n                m_threaddataDatImageinfo.dg,\r\n                m_threaddataDatImageinfo.dat,\r\n                m_threaddataDatImageinfo.msg,\r\n                ref m_threaddataDatImageinfo.twimageinfo\r\n            );\r\n        }\r\n        public STS DatImageinfo(DG a_dg, MSG a_msg, ref TW_IMAGEINFO a_twimageinfo)\r\n        {\r\n            STS sts;\r\n\r\n            // Submit the work to the TWAIN thread...\r\n            if (m_runinuithreaddelegate == null)\r\n            {\r\n                if ((m_threadTwain != null) && (m_threadTwain.ManagedThreadId != Thread.CurrentThread.ManagedThreadId))\r\n                {\r\n                    lock (m_lockTwain)\r\n                    {\r\n                        // Set our command variables...\r\n                        ThreadData threaddata = default(ThreadData);\r\n                        threaddata.twimageinfo = a_twimageinfo;\r\n                        threaddata.dg = a_dg;\r\n                        threaddata.msg = a_msg;\r\n                        threaddata.dat = DAT.IMAGEINFO;\r\n                        long lIndex = m_twaincommand.Submit(threaddata);\r\n\r\n                        // Submit the command and wait for the reply...\r\n                        CallerToThreadSet();\r\n                        ThreadToCallerWaitOne();\r\n\r\n                        // Return the result...\r\n                        a_twimageinfo = m_twaincommand.Get(lIndex).twimageinfo;\r\n                        sts = m_twaincommand.Get(lIndex).sts;\r\n\r\n                        // Clear the command variables...\r\n                        m_twaincommand.Delete(lIndex);\r\n                    }\r\n                    return (sts);\r\n                }\r\n            }\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendBefore(a_dg.ToString(), DAT.IMAGEINFO.ToString(), a_msg.ToString(), \"\");\r\n            }\r\n\r\n            // Windows...\r\n            if (ms_platform == Platform.WINDOWS)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_threaddataDatImageinfo.blIsInuse || (this.m_runinuithreaddelegate == null))\r\n                    {\r\n                        if (m_blUseLegacyDSM)\r\n                        {\r\n                            sts = (STS)NativeMethods.WindowsTwain32DsmEntryImageinfo(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.IMAGEINFO, a_msg, ref a_twimageinfo);\r\n                        }\r\n                        else\r\n                        {\r\n                            sts = (STS)NativeMethods.WindowsTwaindsmDsmEntryImageinfo(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.IMAGEINFO, a_msg, ref a_twimageinfo);\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        if (m_blUseLegacyDSM)\r\n                        {\r\n                            lock (m_lockTwain)\r\n                            {\r\n                                m_threaddataDatImageinfo = default(ThreadData);\r\n                                m_threaddataDatImageinfo.blIsInuse = true;\r\n                                m_threaddataDatImageinfo.dg = a_dg;\r\n                                m_threaddataDatImageinfo.msg = a_msg;\r\n                                m_threaddataDatImageinfo.dat = DAT.IMAGEINFO;\r\n                                m_threaddataDatImageinfo.twimageinfo = a_twimageinfo;\r\n                                RunInUiThread(DatImageinfoWindowsTwain32);\r\n                                a_twimageinfo = m_threaddataDatImageinfo.twimageinfo;\r\n                                sts = m_threaddataDatImageinfo.sts;\r\n                                m_threaddataDatImageinfo = default(ThreadData);\r\n                            }\r\n                        }\r\n                        else\r\n                        {\r\n                            lock (m_lockTwain)\r\n                            {\r\n                                m_threaddataDatImageinfo = default(ThreadData);\r\n                                m_threaddataDatImageinfo.blIsInuse = true;\r\n                                m_threaddataDatImageinfo.dg = a_dg;\r\n                                m_threaddataDatImageinfo.msg = a_msg;\r\n                                m_threaddataDatImageinfo.dat = DAT.IMAGEINFO;\r\n                                m_threaddataDatImageinfo.twimageinfo = a_twimageinfo;\r\n                                RunInUiThread(DatImageinfoWindowsTwainDsm);\r\n                                a_twimageinfo = m_threaddataDatImageinfo.twimageinfo;\r\n                                sts = m_threaddataDatImageinfo.sts;\r\n                                m_threaddataDatImageinfo = default(ThreadData);\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Linux...\r\n            else if (ms_platform == Platform.LINUX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blFoundLatestDsm64 && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux64DsmEntryImageinfo(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.IMAGEINFO, a_msg, ref a_twimageinfo);\r\n                    }\r\n                    else if (m_blFoundLatestDsm && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.LinuxDsmEntryImageinfo(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.IMAGEINFO, a_msg, ref a_twimageinfo);\r\n                    }\r\n                    else if (m_blFound020302Dsm64bit && (m_linuxdsm == LinuxDsm.Is020302Dsm64bit))\r\n                    {\r\n                        TW_IMAGEINFO_LINUX64 twimageinfolinux64 = default(TW_IMAGEINFO_LINUX64);\r\n                        sts = (STS)NativeMethods.Linux020302Dsm64bitEntryImageinfo(ref m_twidentityApp, ref m_twidentityDs, a_dg, DAT.IMAGEINFO, a_msg, ref twimageinfolinux64);\r\n                        a_twimageinfo.XResolution = twimageinfolinux64.XResolution;\r\n                        a_twimageinfo.YResolution = twimageinfolinux64.YResolution;\r\n                        a_twimageinfo.ImageWidth = (int)twimageinfolinux64.ImageWidth;\r\n                        a_twimageinfo.ImageLength = (int)twimageinfolinux64.ImageLength;\r\n                        a_twimageinfo.SamplesPerPixel = twimageinfolinux64.SamplesPerPixel;\r\n                        a_twimageinfo.BitsPerSample_0 = twimageinfolinux64.BitsPerSample_0;\r\n                        a_twimageinfo.BitsPerSample_1 = twimageinfolinux64.BitsPerSample_1;\r\n                        a_twimageinfo.BitsPerSample_2 = twimageinfolinux64.BitsPerSample_2;\r\n                        a_twimageinfo.BitsPerSample_3 = twimageinfolinux64.BitsPerSample_3;\r\n                        a_twimageinfo.BitsPerSample_4 = twimageinfolinux64.BitsPerSample_4;\r\n                        a_twimageinfo.BitsPerSample_5 = twimageinfolinux64.BitsPerSample_5;\r\n                        a_twimageinfo.BitsPerSample_6 = twimageinfolinux64.BitsPerSample_6;\r\n                        a_twimageinfo.BitsPerSample_7 = twimageinfolinux64.BitsPerSample_7;\r\n                        a_twimageinfo.BitsPerPixel = twimageinfolinux64.BitsPerPixel;\r\n                        a_twimageinfo.Planar = twimageinfolinux64.Planar;\r\n                        a_twimageinfo.PixelType = twimageinfolinux64.PixelType;\r\n                        a_twimageinfo.Compression = twimageinfolinux64.Compression;\r\n                    }\r\n                    else\r\n                    {\r\n                        Log.Error(\"apparently we don't have a DSM...\");\r\n                        sts = STS.BUMMER;\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Mac OS X, which has to be different...\r\n            else if (ms_platform == Platform.MACOSX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwainDsmEntryImageinfo(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.IMAGEINFO, a_msg, ref a_twimageinfo);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwaindsmDsmEntryImageinfo(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.IMAGEINFO, a_msg, ref a_twimageinfo);\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Uh-oh...\r\n            else\r\n            {\r\n                Log.LogSendAfter(STS.BUMMER, \"\");\r\n                return (STS.BUMMER);\r\n            }\r\n\r\n            // Get DAT_STATUS, if needed...\r\n            TWAIN.STS stsRcOrCc = AutoDatStatus(sts);\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendAfter(stsRcOrCc, ImageinfoToCsv(a_twimageinfo));\r\n            }\r\n\r\n            // All done...\r\n            return (stsRcOrCc);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Get/Set layout information...\r\n        /// </summary>\r\n        /// <param name=\"a_dg\">Data group</param>\r\n        /// <param name=\"a_msg\">Operation</param>\r\n        /// <param name=\"a_twimagelayout\">IMAGELAYOUT structure</param>\r\n        /// <returns>TWAIN status</returns>\r\n        private void DatImagelayoutWindowsTwain32()\r\n        {\r\n            // If you get a first chance exception, be aware that some drivers\r\n            // will do that to you, you can ignore it and they'll keep going...\r\n            m_threaddataDatImagelayout.sts = (STS)NativeMethods.WindowsTwain32DsmEntryImagelayout\r\n            (\r\n                ref m_twidentitylegacyApp,\r\n                ref m_twidentitylegacyDs,\r\n                m_threaddataDatImagelayout.dg,\r\n                m_threaddataDatImagelayout.dat,\r\n                m_threaddataDatImagelayout.msg,\r\n                ref m_threaddataDatImagelayout.twimagelayout\r\n            );\r\n        }\r\n        private void DatImagelayoutWindowsTwainDsm()\r\n        {\r\n            // If you get a first chance exception, be aware that some drivers\r\n            // will do that to you, you can ignore it and they'll keep going...\r\n            m_threaddataDatImagelayout.sts = (STS)NativeMethods.WindowsTwaindsmDsmEntryImagelayout\r\n            (\r\n                ref m_twidentitylegacyApp,\r\n                ref m_twidentitylegacyDs,\r\n                m_threaddataDatImagelayout.dg,\r\n                m_threaddataDatImagelayout.dat,\r\n                m_threaddataDatImagelayout.msg,\r\n                ref m_threaddataDatImagelayout.twimagelayout\r\n            );\r\n        }\r\n        public STS DatImagelayout(DG a_dg, MSG a_msg, ref TW_IMAGELAYOUT a_twimagelayout)\r\n        {\r\n            STS sts;\r\n\r\n            // Submit the work to the TWAIN thread...\r\n            if (m_runinuithreaddelegate == null)\r\n            {\r\n                if ((m_threadTwain != null) && (m_threadTwain.ManagedThreadId != Thread.CurrentThread.ManagedThreadId))\r\n                {\r\n                    lock (m_lockTwain)\r\n                    {\r\n                        // Set our command variables...\r\n                        ThreadData threaddata = default(ThreadData);\r\n                        threaddata.twimagelayout = a_twimagelayout;\r\n                        threaddata.dg = a_dg;\r\n                        threaddata.msg = a_msg;\r\n                        threaddata.dat = DAT.IMAGELAYOUT;\r\n                        long lIndex = m_twaincommand.Submit(threaddata);\r\n\r\n                        // Submit the command and wait for the reply...\r\n                        CallerToThreadSet();\r\n                        ThreadToCallerWaitOne();\r\n\r\n                        // Return the result...\r\n                        a_twimagelayout = m_twaincommand.Get(lIndex).twimagelayout;\r\n                        sts = m_twaincommand.Get(lIndex).sts;\r\n\r\n                        // Clear the command variables...\r\n                        m_twaincommand.Delete(lIndex);\r\n                    }\r\n                    return (sts);\r\n                }\r\n            }\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendBefore(a_dg.ToString(), DAT.IMAGELAYOUT.ToString(), a_msg.ToString(), ImagelayoutToCsv(a_twimagelayout));\r\n            }\r\n\r\n            // Windows...\r\n            if (ms_platform == Platform.WINDOWS)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_threaddataDatImagelayout.blIsInuse || (this.m_runinuithreaddelegate == null))\r\n                    {\r\n                        if (m_blUseLegacyDSM)\r\n                        {\r\n                            sts = (STS)NativeMethods.WindowsTwain32DsmEntryImagelayout(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.IMAGELAYOUT, a_msg, ref a_twimagelayout);\r\n                        }\r\n                        else\r\n                        {\r\n                            sts = (STS)NativeMethods.WindowsTwaindsmDsmEntryImagelayout(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.IMAGELAYOUT, a_msg, ref a_twimagelayout);\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        if (m_blUseLegacyDSM)\r\n                        {\r\n                            lock (m_lockTwain)\r\n                            {\r\n                                m_threaddataDatImagelayout = default(ThreadData);\r\n                                m_threaddataDatImagelayout.blIsInuse = true;\r\n                                m_threaddataDatImagelayout.dg = a_dg;\r\n                                m_threaddataDatImagelayout.msg = a_msg;\r\n                                m_threaddataDatImagelayout.dat = DAT.IMAGELAYOUT;\r\n                                m_threaddataDatImagelayout.twimagelayout = a_twimagelayout;\r\n                                RunInUiThread(DatImagelayoutWindowsTwain32);\r\n                                a_twimagelayout = m_threaddataDatImagelayout.twimagelayout;\r\n                                sts = m_threaddataDatImagelayout.sts;\r\n                                m_threaddataDatImagelayout = default(ThreadData);\r\n                            }\r\n                        }\r\n                        else\r\n                        {\r\n                            lock (m_lockTwain)\r\n                            {\r\n                                m_threaddataDatImagelayout = default(ThreadData);\r\n                                m_threaddataDatImagelayout.blIsInuse = true;\r\n                                m_threaddataDatImagelayout.dg = a_dg;\r\n                                m_threaddataDatImagelayout.msg = a_msg;\r\n                                m_threaddataDatImagelayout.dat = DAT.IMAGELAYOUT;\r\n                                m_threaddataDatImagelayout.twimagelayout = a_twimagelayout;\r\n                                RunInUiThread(DatImagelayoutWindowsTwainDsm);\r\n                                a_twimagelayout = m_threaddataDatImagelayout.twimagelayout;\r\n                                sts = m_threaddataDatImagelayout.sts;\r\n                                m_threaddataDatImagelayout = default(ThreadData);\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Linux...\r\n            else if (ms_platform == Platform.LINUX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blFoundLatestDsm64 && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux64DsmEntryImagelayout(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.IMAGELAYOUT, a_msg, ref a_twimagelayout);\r\n                    }\r\n                    else if (m_blFoundLatestDsm && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.LinuxDsmEntryImagelayout(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.IMAGELAYOUT, a_msg, ref a_twimagelayout);\r\n                    }\r\n                    else if (m_blFound020302Dsm64bit && (m_linuxdsm == LinuxDsm.Is020302Dsm64bit))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux020302Dsm64bitEntryImagelayout(ref m_twidentityApp, ref m_twidentityDs, a_dg, DAT.IMAGELAYOUT, a_msg, ref a_twimagelayout);\r\n                    }\r\n                    else\r\n                    {\r\n                        Log.Error(\"apparently we don't have a DSM...\");\r\n                        sts = STS.BUMMER;\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Mac OS X, which has to be different...\r\n            else if (ms_platform == Platform.MACOSX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwainDsmEntryImagelayout(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.IMAGELAYOUT, a_msg, ref a_twimagelayout);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwaindsmDsmEntryImagelayout(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.IMAGELAYOUT, a_msg, ref a_twimagelayout);\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Uh-oh...\r\n            else\r\n            {\r\n                Log.LogSendAfter(STS.BUMMER, \"\");\r\n                return (STS.BUMMER);\r\n            }\r\n\r\n            // Get DAT_STATUS, if needed...\r\n            TWAIN.STS stsRcOrCc = AutoDatStatus(sts);\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendAfter(stsRcOrCc, ImagelayoutToCsv(a_twimagelayout));\r\n            }\r\n\r\n            // All done...\r\n            return (stsRcOrCc);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Issue file image transfer commands...\r\n        /// </summary>\r\n        /// <param name=\"a_dg\">Data group</param>\r\n        /// <param name=\"a_msg\">Operation</param>\r\n        /// <returns>TWAIN status</returns>\r\n        private void DatImagefilexferWindowsTwain32()\r\n        {\r\n            // If you get a first chance exception, be aware that some drivers\r\n            // will do that to you, you can ignore it and they'll keep going...\r\n            m_threaddataDatImagefilexfer.sts = (STS)NativeMethods.WindowsTwain32DsmEntryImagefilexfer\r\n            (\r\n                ref m_twidentitylegacyApp,\r\n                ref m_twidentitylegacyDs,\r\n                m_threaddataDatImagefilexfer.dg,\r\n                m_threaddataDatImagefilexfer.dat,\r\n                m_threaddataDatImagefilexfer.msg,\r\n                IntPtr.Zero\r\n            );\r\n        }\r\n        private void DatImagefilexferWindowsTwainDsm()\r\n        {\r\n            // If you get a first chance exception, be aware that some drivers\r\n            // will do that to you, you can ignore it and they'll keep going...\r\n            m_threaddataDatImagefilexfer.sts = (STS)NativeMethods.WindowsTwaindsmDsmEntryImagefilexfer\r\n            (\r\n                ref m_twidentitylegacyApp,\r\n                ref m_twidentitylegacyDs,\r\n                m_threaddataDatImagefilexfer.dg,\r\n                m_threaddataDatImagefilexfer.dat,\r\n                m_threaddataDatImagefilexfer.msg,\r\n                IntPtr.Zero\r\n            );\r\n        }\r\n        public STS DatImagefilexfer(DG a_dg, MSG a_msg)\r\n        {\r\n            STS sts;\r\n\r\n            // Submit the work to the TWAIN thread...\r\n            if (this.m_runinuithreaddelegate == null)\r\n            {\r\n                if ((m_threadTwain != null) && (m_threadTwain.ManagedThreadId != Thread.CurrentThread.ManagedThreadId))\r\n                {\r\n                    lock (m_lockTwain)\r\n                    {\r\n                        // Set our command variables...\r\n                        ThreadData threaddata = default(ThreadData);\r\n                        threaddata.dg = a_dg;\r\n                        threaddata.msg = a_msg;\r\n                        threaddata.dat = DAT.IMAGEFILEXFER;\r\n                        long lIndex = m_twaincommand.Submit(threaddata);\r\n\r\n                        // Submit the command and wait for the reply...\r\n                        CallerToThreadSet();\r\n                        ThreadToCallerWaitOne();\r\n\r\n                        // Return the result...\r\n                        sts = m_twaincommand.Get(lIndex).sts;\r\n\r\n                        // Clear the command variables...\r\n                        m_twaincommand.Delete(lIndex);\r\n                    }\r\n                    return (sts);\r\n                }\r\n            }\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendBefore(a_dg.ToString(), DAT.IMAGEFILEXFER.ToString(), a_msg.ToString(), \"\");\r\n            }\r\n\r\n            // Windows...\r\n            if (ms_platform == Platform.WINDOWS)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_threaddataDatImagefilexfer.blIsInuse || (this.m_runinuithreaddelegate == null))\r\n                    {\r\n                        if (m_blUseLegacyDSM)\r\n                        {\r\n                            sts = (STS)NativeMethods.WindowsTwain32DsmEntryImagefilexfer(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.IMAGEFILEXFER, a_msg, IntPtr.Zero);\r\n                        }\r\n                        else\r\n                        {\r\n                            sts = (STS)NativeMethods.WindowsTwaindsmDsmEntryImagefilexfer(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.IMAGEFILEXFER, a_msg, IntPtr.Zero);\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        if (m_blUseLegacyDSM)\r\n                        {\r\n                            lock (m_lockTwain)\r\n                            {\r\n                                m_threaddataDatImagefilexfer = default(ThreadData);\r\n                                m_threaddataDatImagefilexfer.blIsInuse = true;\r\n                                m_threaddataDatImagefilexfer.dg = a_dg;\r\n                                m_threaddataDatImagefilexfer.msg = a_msg;\r\n                                m_threaddataDatImagefilexfer.dat = DAT.IMAGEFILEXFER;\r\n                                RunInUiThread(DatImagefilexferWindowsTwain32);\r\n                                sts = m_threaddataDatImagefilexfer.sts;\r\n                                m_threaddataDatImagefilexfer = default(ThreadData);\r\n                            }\r\n                        }\r\n                        else\r\n                        {\r\n                            lock (m_lockTwain)\r\n                            {\r\n                                m_threaddataDatImagefilexfer = default(ThreadData);\r\n                                m_threaddataDatImagefilexfer.blIsInuse = true;\r\n                                m_threaddataDatImagefilexfer.dg = a_dg;\r\n                                m_threaddataDatImagefilexfer.msg = a_msg;\r\n                                m_threaddataDatImagefilexfer.dat = DAT.IMAGEFILEXFER;\r\n                                RunInUiThread(DatImagefilexferWindowsTwainDsm);\r\n                                sts = m_threaddataDatImagefilexfer.sts;\r\n                                m_threaddataDatImagefilexfer = default(ThreadData);\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Linux...\r\n            else if (ms_platform == Platform.LINUX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blFoundLatestDsm64 && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux64DsmEntryImagefilexfer(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.IMAGEFILEXFER, a_msg, IntPtr.Zero);\r\n                    }\r\n                    else if (m_blFoundLatestDsm && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.LinuxDsmEntryImagefilexfer(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.IMAGEFILEXFER, a_msg, IntPtr.Zero);\r\n                    }\r\n                    else if (m_blFound020302Dsm64bit && (m_linuxdsm == LinuxDsm.Is020302Dsm64bit))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux020302Dsm64bitEntryImagefilexfer(ref m_twidentityApp, ref m_twidentityDs, a_dg, DAT.IMAGEFILEXFER, a_msg, IntPtr.Zero);\r\n                    }\r\n                    else\r\n                    {\r\n                        Log.Error(\"apparently we don't have a DSM...\");\r\n                        sts = STS.BUMMER;\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Mac OS X, which has to be different...\r\n            else if (ms_platform == Platform.MACOSX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwainDsmEntryImagefilexfer(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.IMAGEFILEXFER, a_msg, IntPtr.Zero);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwaindsmDsmEntryImagefilexfer(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.IMAGEFILEXFER, a_msg, IntPtr.Zero);\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Uh-oh...\r\n            else\r\n            {\r\n                Log.LogSendAfter(STS.BUMMER, \"\");\r\n                return (STS.BUMMER);\r\n            }\r\n\r\n            // Get DAT_STATUS, if needed...\r\n            TWAIN.STS stsRcOrCc = AutoDatStatus(sts);\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendAfter(stsRcOrCc, \"\");\r\n            }\r\n\r\n            // If we had a successful transfer, then change state...\r\n            if (sts == STS.XFERDONE)\r\n            {\r\n                m_state = STATE.S7;\r\n            }\r\n\r\n            // All done...\r\n            return (stsRcOrCc);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Issue memory file image transfer commands...\r\n        /// </summary>\r\n        /// <param name=\"a_dg\">Data group</param>\r\n        /// <param name=\"a_msg\">Operation</param>\r\n        /// <param name=\"a_twimagememxfer\">IMAGEMEMXFER structure</param>\r\n        /// <returns>TWAIN status</returns>\r\n        private void DatImagememfilexferWindowsTwain32()\r\n        {\r\n            // If you get a first chance exception, be aware that some drivers\r\n            // will do that to you, you can ignore it and they'll keep going...\r\n            m_threaddataDatImagememfilexfer.sts = (STS)NativeMethods.WindowsTwain32DsmEntryImagememfilexfer\r\n            (\r\n                ref m_twidentitylegacyApp,\r\n                ref m_twidentitylegacyDs,\r\n                m_threaddataDatImagememfilexfer.dg,\r\n                m_threaddataDatImagememfilexfer.dat,\r\n                m_threaddataDatImagememfilexfer.msg,\r\n                ref m_threaddataDatImagememfilexfer.twimagememxfer\r\n            );\r\n        }\r\n        private void DatImagememfilexferWindowsTwainDsm()\r\n        {\r\n            // If you get a first chance exception, be aware that some drivers\r\n            // will do that to you, you can ignore it and they'll keep going...\r\n            m_threaddataDatImagememfilexfer.sts = (STS)NativeMethods.WindowsTwaindsmDsmEntryImagememfilexfer\r\n            (\r\n                ref m_twidentitylegacyApp,\r\n                ref m_twidentitylegacyDs,\r\n                m_threaddataDatImagememfilexfer.dg,\r\n                m_threaddataDatImagememfilexfer.dat,\r\n                m_threaddataDatImagememfilexfer.msg,\r\n                ref m_threaddataDatImagememfilexfer.twimagememxfer\r\n            );\r\n        }\r\n        public STS DatImagememfilexfer(DG a_dg, MSG a_msg, ref TW_IMAGEMEMXFER a_twimagememxfer)\r\n        {\r\n            STS sts;\r\n\r\n            // Submit the work to the TWAIN thread...\r\n            if (this.m_runinuithreaddelegate == null)\r\n            {\r\n                if ((m_threadTwain != null) && (m_threadTwain.ManagedThreadId != Thread.CurrentThread.ManagedThreadId))\r\n                {\r\n                    lock (m_lockTwain)\r\n                    {\r\n                        // Set our command variables...\r\n                        ThreadData threaddata = default(ThreadData);\r\n                        threaddata.twimagememxfer = a_twimagememxfer;\r\n                        threaddata.dg = a_dg;\r\n                        threaddata.msg = a_msg;\r\n                        threaddata.dat = DAT.IMAGEMEMFILEXFER;\r\n                        long lIndex = m_twaincommand.Submit(threaddata);\r\n\r\n                        // Submit the command and wait for the reply...\r\n                        CallerToThreadSet();\r\n                        ThreadToCallerWaitOne();\r\n\r\n                        // Return the result...\r\n                        a_twimagememxfer = m_twaincommand.Get(lIndex).twimagememxfer;\r\n                        sts = m_twaincommand.Get(lIndex).sts;\r\n\r\n                        // Clear the command variables...\r\n                        m_twaincommand.Delete(lIndex);\r\n                    }\r\n                    return (sts);\r\n                }\r\n            }\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendBefore(a_dg.ToString(), DAT.IMAGEMEMFILEXFER.ToString(), a_msg.ToString(), ImagememxferToCsv(a_twimagememxfer));\r\n            }\r\n\r\n            // Windows...\r\n            if (ms_platform == Platform.WINDOWS)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_threaddataDatImagememfilexfer.blIsInuse || (this.m_runinuithreaddelegate == null))\r\n                    {\r\n                        if (m_blUseLegacyDSM)\r\n                        {\r\n                            sts = (STS)NativeMethods.WindowsTwain32DsmEntryImagememfilexfer(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.IMAGEMEMFILEXFER, a_msg, ref a_twimagememxfer);\r\n                        }\r\n                        else\r\n                        {\r\n                            sts = (STS)NativeMethods.WindowsTwaindsmDsmEntryImagememfilexfer(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.IMAGEMEMFILEXFER, a_msg, ref a_twimagememxfer);\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        if (m_blUseLegacyDSM)\r\n                        {\r\n                            lock (m_lockTwain)\r\n                            {\r\n                                m_threaddataDatImagememfilexfer = default(ThreadData);\r\n                                m_threaddataDatImagememfilexfer.blIsInuse = true;\r\n                                m_threaddataDatImagememfilexfer.dg = a_dg;\r\n                                m_threaddataDatImagememfilexfer.msg = a_msg;\r\n                                m_threaddataDatImagememfilexfer.dat = DAT.IMAGEMEMFILEXFER;\r\n                                m_threaddataDatImagememfilexfer.twimagememxfer = a_twimagememxfer;\r\n                                RunInUiThread(DatImagememfilexferWindowsTwain32);\r\n                                a_twimagememxfer = m_threaddataDatImagememfilexfer.twimagememxfer;\r\n                                sts = m_threaddataDatImagememfilexfer.sts;\r\n                                m_threaddataDatImagememfilexfer = default(ThreadData);\r\n                            }\r\n                        }\r\n                        else\r\n                        {\r\n                            lock (m_lockTwain)\r\n                            {\r\n                                m_threaddataDatImagememfilexfer = default(ThreadData);\r\n                                m_threaddataDatImagememfilexfer.blIsInuse = true;\r\n                                m_threaddataDatImagememfilexfer.dg = a_dg;\r\n                                m_threaddataDatImagememfilexfer.msg = a_msg;\r\n                                m_threaddataDatImagememfilexfer.dat = DAT.IMAGEMEMFILEXFER;\r\n                                m_threaddataDatImagememfilexfer.twimagememxfer = a_twimagememxfer;\r\n                                RunInUiThread(DatImagememfilexferWindowsTwainDsm);\r\n                                a_twimagememxfer = m_threaddataDatImagememfilexfer.twimagememxfer;\r\n                                sts = m_threaddataDatImagememfilexfer.sts;\r\n                                m_threaddataDatImagememfilexfer = default(ThreadData);\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Linux...\r\n            else if (ms_platform == Platform.LINUX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blFoundLatestDsm64 && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux64DsmEntryImagememfilexfer(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.IMAGEMEMFILEXFER, a_msg, ref a_twimagememxfer);\r\n                    }\r\n                    else if (m_blFoundLatestDsm && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.LinuxDsmEntryImagememfilexfer(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.IMAGEMEMFILEXFER, a_msg, ref a_twimagememxfer);\r\n                    }\r\n                    else if (m_blFound020302Dsm64bit && (m_linuxdsm == LinuxDsm.Is020302Dsm64bit))\r\n                    {\r\n                        TW_IMAGEMEMXFER_LINUX64 twimagememxferlinux64 = default(TW_IMAGEMEMXFER_LINUX64);\r\n                        twimagememxferlinux64.BytesPerRow = a_twimagememxfer.BytesPerRow;\r\n                        twimagememxferlinux64.BytesWritten = a_twimagememxfer.BytesWritten;\r\n                        twimagememxferlinux64.Columns = a_twimagememxfer.Columns;\r\n                        twimagememxferlinux64.Compression = a_twimagememxfer.Compression;\r\n                        twimagememxferlinux64.MemoryFlags = a_twimagememxfer.Memory.Flags;\r\n                        twimagememxferlinux64.MemoryLength = a_twimagememxfer.Memory.Length;\r\n                        twimagememxferlinux64.MemoryTheMem = a_twimagememxfer.Memory.TheMem;\r\n                        twimagememxferlinux64.Rows = a_twimagememxfer.Rows;\r\n                        twimagememxferlinux64.XOffset = a_twimagememxfer.XOffset;\r\n                        twimagememxferlinux64.YOffset = a_twimagememxfer.YOffset;\r\n                        sts = (STS)NativeMethods.Linux020302Dsm64bitEntryImagememfilexfer(ref m_twidentityApp, ref m_twidentityDs, a_dg, DAT.IMAGEMEMFILEXFER, a_msg, ref twimagememxferlinux64);\r\n                        a_twimagememxfer.BytesPerRow = (uint)twimagememxferlinux64.BytesPerRow;\r\n                        a_twimagememxfer.BytesWritten = (uint)twimagememxferlinux64.BytesWritten;\r\n                        a_twimagememxfer.Columns = (uint)twimagememxferlinux64.Columns;\r\n                        a_twimagememxfer.Compression = (ushort)twimagememxferlinux64.Compression;\r\n                        a_twimagememxfer.Memory.Flags = (uint)twimagememxferlinux64.MemoryFlags;\r\n                        a_twimagememxfer.Memory.Length = (uint)twimagememxferlinux64.MemoryLength;\r\n                        a_twimagememxfer.Memory.TheMem = twimagememxferlinux64.MemoryTheMem;\r\n                        a_twimagememxfer.Rows = (uint)twimagememxferlinux64.Rows;\r\n                        a_twimagememxfer.XOffset = (uint)twimagememxferlinux64.XOffset;\r\n                        a_twimagememxfer.YOffset = (uint)twimagememxferlinux64.YOffset;\r\n                    }\r\n                    else\r\n                    {\r\n                        Log.Error(\"apparently we don't have a DSM...\");\r\n                        sts = STS.BUMMER;\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Mac OS X, which has to be different...\r\n            else if (ms_platform == Platform.MACOSX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    TW_IMAGEMEMXFER_MACOSX twimagememxfermacosx = default(TW_IMAGEMEMXFER_MACOSX);\r\n                    twimagememxfermacosx.BytesPerRow = a_twimagememxfer.BytesPerRow;\r\n                    twimagememxfermacosx.BytesWritten = a_twimagememxfer.BytesWritten;\r\n                    twimagememxfermacosx.Columns = a_twimagememxfer.Columns;\r\n                    twimagememxfermacosx.Compression = a_twimagememxfer.Compression;\r\n                    twimagememxfermacosx.Memory.Flags = a_twimagememxfer.Memory.Flags;\r\n                    twimagememxfermacosx.Memory.Length = a_twimagememxfer.Memory.Length;\r\n                    twimagememxfermacosx.Memory.TheMem = a_twimagememxfer.Memory.TheMem;\r\n                    twimagememxfermacosx.Rows = a_twimagememxfer.Rows;\r\n                    twimagememxfermacosx.XOffset = a_twimagememxfer.XOffset;\r\n                    twimagememxfermacosx.YOffset = a_twimagememxfer.YOffset;\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwainDsmEntryImagememfilexfer(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.IMAGEMEMFILEXFER, a_msg, ref twimagememxfermacosx);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwaindsmDsmEntryImagememfilexfer(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.IMAGEMEMFILEXFER, a_msg, ref twimagememxfermacosx);\r\n                    }\r\n                    a_twimagememxfer.BytesPerRow = twimagememxfermacosx.BytesPerRow;\r\n                    a_twimagememxfer.BytesWritten = twimagememxfermacosx.BytesWritten;\r\n                    a_twimagememxfer.Columns = twimagememxfermacosx.Columns;\r\n                    a_twimagememxfer.Compression = (ushort)twimagememxfermacosx.Compression;\r\n                    a_twimagememxfer.Memory.Flags = twimagememxfermacosx.Memory.Flags;\r\n                    a_twimagememxfer.Memory.Length = twimagememxfermacosx.Memory.Length;\r\n                    a_twimagememxfer.Memory.TheMem = twimagememxfermacosx.Memory.TheMem;\r\n                    a_twimagememxfer.Rows = twimagememxfermacosx.Rows;\r\n                    a_twimagememxfer.XOffset = twimagememxfermacosx.XOffset;\r\n                    a_twimagememxfer.YOffset = twimagememxfermacosx.YOffset;\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Uh-oh...\r\n            else\r\n            {\r\n                Log.LogSendAfter(STS.BUMMER, \"\");\r\n                return (STS.BUMMER);\r\n            }\r\n\r\n            // Get DAT_STATUS, if needed...\r\n            TWAIN.STS stsRcOrCc = AutoDatStatus(sts);\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendAfter(stsRcOrCc, ImagememxferToCsv(a_twimagememxfer));\r\n            }\r\n\r\n            // If we had a successful transfer, then change state...\r\n            if (sts == STS.XFERDONE)\r\n            {\r\n                m_state = STATE.S7;\r\n            }\r\n\r\n            // All done...\r\n            return (stsRcOrCc);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Issue memory image transfer commands...\r\n        /// </summary>\r\n        /// <param name=\"a_dg\">Data group</param>\r\n        /// <param name=\"a_msg\">Operation</param>\r\n        /// <param name=\"a_twimagememxfer\">IMAGEMEMXFER structure</param>\r\n        /// <returns>TWAIN status</returns>\r\n        private void DatImagememxferWindowsTwain32()\r\n        {\r\n            // If you get a first chance exception, be aware that some drivers\r\n            // will do that to you, you can ignore it and they'll keep going...\r\n            m_threaddataDatImagememxfer.sts = (STS)NativeMethods.WindowsTwain32DsmEntryImagememxfer\r\n            (\r\n                ref m_twidentitylegacyApp,\r\n                ref m_twidentitylegacyDs,\r\n                m_threaddataDatImagememxfer.dg,\r\n                m_threaddataDatImagememxfer.dat,\r\n                m_threaddataDatImagememxfer.msg,\r\n                ref m_threaddataDatImagememxfer.twimagememxfer\r\n            );\r\n        }\r\n        private void DatImagememxferWindowsTwainDsm()\r\n        {\r\n            // If you get a first chance exception, be aware that some drivers\r\n            // will do that to you, you can ignore it and they'll keep going...\r\n            m_threaddataDatImagememxfer.sts = (STS)NativeMethods.WindowsTwaindsmDsmEntryImagememxfer\r\n            (\r\n                ref m_twidentitylegacyApp,\r\n                ref m_twidentitylegacyDs,\r\n                m_threaddataDatImagememxfer.dg,\r\n                m_threaddataDatImagememxfer.dat,\r\n                m_threaddataDatImagememxfer.msg,\r\n                ref m_threaddataDatImagememxfer.twimagememxfer\r\n            );\r\n        }\r\n        public STS DatImagememxfer(DG a_dg, MSG a_msg, ref TW_IMAGEMEMXFER a_twimagememxfer)\r\n        {\r\n            STS sts;\r\n\r\n            // Submit the work to the TWAIN thread...\r\n            if (this.m_runinuithreaddelegate == null)\r\n            {\r\n                if ((m_threadTwain != null) && (m_threadTwain.ManagedThreadId != Thread.CurrentThread.ManagedThreadId))\r\n                {\r\n                    lock (m_lockTwain)\r\n                    {\r\n                        // Set our command variables...\r\n                        ThreadData threaddata = default(ThreadData);\r\n                        threaddata.twimagememxfer = a_twimagememxfer;\r\n                        threaddata.dg = a_dg;\r\n                        threaddata.msg = a_msg;\r\n                        threaddata.dat = DAT.IMAGEMEMXFER;\r\n                        long lIndex = m_twaincommand.Submit(threaddata);\r\n\r\n                        // Submit the command and wait for the reply...\r\n                        CallerToThreadSet();\r\n                        ThreadToCallerWaitOne();\r\n\r\n                        // Return the result...\r\n                        a_twimagememxfer = m_twaincommand.Get(lIndex).twimagememxfer;\r\n                        sts = m_twaincommand.Get(lIndex).sts;\r\n\r\n                        // Clear the command variables...\r\n                        m_twaincommand.Delete(lIndex);\r\n                    }\r\n                    return (sts);\r\n                }\r\n            }\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendBefore(a_dg.ToString(), DAT.IMAGEMEMXFER.ToString(), a_msg.ToString(), ImagememxferToCsv(a_twimagememxfer));\r\n            }\r\n\r\n            // Windows...\r\n            if (ms_platform == Platform.WINDOWS)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_threaddataDatImagememxfer.blIsInuse || (this.m_runinuithreaddelegate == null))\r\n                    {\r\n                        if (m_blUseLegacyDSM)\r\n                        {\r\n                            sts = (STS)NativeMethods.WindowsTwain32DsmEntryImagememxfer(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.IMAGEMEMXFER, a_msg, ref a_twimagememxfer);\r\n                        }\r\n                        else\r\n                        {\r\n                            sts = (STS)NativeMethods.WindowsTwaindsmDsmEntryImagememxfer(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.IMAGEMEMXFER, a_msg, ref a_twimagememxfer);\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        if (m_blUseLegacyDSM)\r\n                        {\r\n                            lock (m_lockTwain)\r\n                            {\r\n                                m_threaddataDatImagememxfer = default(ThreadData);\r\n                                m_threaddataDatImagememxfer.blIsInuse = true;\r\n                                m_threaddataDatImagememxfer.dg = a_dg;\r\n                                m_threaddataDatImagememxfer.msg = a_msg;\r\n                                m_threaddataDatImagememxfer.dat = DAT.IMAGEMEMXFER;\r\n                                m_threaddataDatImagememxfer.twimagememxfer = a_twimagememxfer;\r\n                                RunInUiThread(DatImagememxferWindowsTwain32);\r\n                                a_twimagememxfer = m_threaddataDatImagememxfer.twimagememxfer;\r\n                                sts = m_threaddataDatImagememxfer.sts;\r\n                                m_threaddataDatImagememxfer = default(ThreadData);\r\n                            }\r\n                        }\r\n                        else\r\n                        {\r\n                            lock (m_lockTwain)\r\n                            {\r\n                                m_threaddataDatImagememxfer = default(ThreadData);\r\n                                m_threaddataDatImagememxfer.blIsInuse = true;\r\n                                m_threaddataDatImagememxfer.dg = a_dg;\r\n                                m_threaddataDatImagememxfer.msg = a_msg;\r\n                                m_threaddataDatImagememxfer.dat = DAT.IMAGEMEMXFER;\r\n                                m_threaddataDatImagememxfer.twimagememxfer = a_twimagememxfer;\r\n                                RunInUiThread(DatImagememxferWindowsTwainDsm);\r\n                                a_twimagememxfer = m_threaddataDatImagememxfer.twimagememxfer;\r\n                                sts = m_threaddataDatImagememxfer.sts;\r\n                                m_threaddataDatImagememxfer = default(ThreadData);\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Linux...\r\n            else if (ms_platform == Platform.LINUX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blFoundLatestDsm64 && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux64DsmEntryImagememxfer(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.IMAGEMEMXFER, a_msg, ref a_twimagememxfer);\r\n                    }\r\n                    else if (m_blFoundLatestDsm && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.LinuxDsmEntryImagememxfer(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.IMAGEMEMXFER, a_msg, ref a_twimagememxfer);\r\n                    }\r\n                    else if (m_blFound020302Dsm64bit && (m_linuxdsm == LinuxDsm.Is020302Dsm64bit))\r\n                    {\r\n                        TW_IMAGEMEMXFER_LINUX64 twimagememxferlinux64 = default(TW_IMAGEMEMXFER_LINUX64);\r\n                        twimagememxferlinux64.BytesPerRow = a_twimagememxfer.BytesPerRow;\r\n                        twimagememxferlinux64.BytesWritten = a_twimagememxfer.BytesWritten;\r\n                        twimagememxferlinux64.Columns = a_twimagememxfer.Columns;\r\n                        twimagememxferlinux64.Compression = a_twimagememxfer.Compression;\r\n                        twimagememxferlinux64.MemoryFlags = a_twimagememxfer.Memory.Flags;\r\n                        twimagememxferlinux64.MemoryLength = a_twimagememxfer.Memory.Length;\r\n                        twimagememxferlinux64.MemoryTheMem = a_twimagememxfer.Memory.TheMem;\r\n                        twimagememxferlinux64.Rows = a_twimagememxfer.Rows;\r\n                        twimagememxferlinux64.XOffset = a_twimagememxfer.XOffset;\r\n                        twimagememxferlinux64.YOffset = a_twimagememxfer.YOffset;\r\n                        sts = (STS)NativeMethods.Linux020302Dsm64bitEntryImagememxfer(ref m_twidentityApp, ref m_twidentityDs, a_dg, DAT.IMAGEMEMXFER, a_msg, ref twimagememxferlinux64);\r\n                        a_twimagememxfer.BytesPerRow = (uint)twimagememxferlinux64.BytesPerRow;\r\n                        a_twimagememxfer.BytesWritten = (uint)twimagememxferlinux64.BytesWritten;\r\n                        a_twimagememxfer.Columns = (uint)twimagememxferlinux64.Columns;\r\n                        a_twimagememxfer.Compression = (ushort)twimagememxferlinux64.Compression;\r\n                        a_twimagememxfer.Memory.Flags = (uint)twimagememxferlinux64.MemoryFlags;\r\n                        a_twimagememxfer.Memory.Length = (uint)twimagememxferlinux64.MemoryLength;\r\n                        a_twimagememxfer.Memory.TheMem = twimagememxferlinux64.MemoryTheMem;\r\n                        a_twimagememxfer.Rows = (uint)twimagememxferlinux64.Rows;\r\n                        a_twimagememxfer.XOffset = (uint)twimagememxferlinux64.XOffset;\r\n                        a_twimagememxfer.YOffset = (uint)twimagememxferlinux64.YOffset;\r\n                    }\r\n                    else\r\n                    {\r\n                        Log.Error(\"apparently we don't have a DSM...\");\r\n                        sts = STS.BUMMER;\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Mac OS X, which has to be different...\r\n            else if (ms_platform == Platform.MACOSX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    TW_IMAGEMEMXFER_MACOSX twimagememxfermacosx = default(TW_IMAGEMEMXFER_MACOSX);\r\n                    twimagememxfermacosx.BytesPerRow = a_twimagememxfer.BytesPerRow;\r\n                    twimagememxfermacosx.BytesWritten = a_twimagememxfer.BytesWritten;\r\n                    twimagememxfermacosx.Columns = a_twimagememxfer.Columns;\r\n                    twimagememxfermacosx.Compression = a_twimagememxfer.Compression;\r\n                    twimagememxfermacosx.Memory.Flags = a_twimagememxfer.Memory.Flags;\r\n                    twimagememxfermacosx.Memory.Length = a_twimagememxfer.Memory.Length;\r\n                    twimagememxfermacosx.Memory.TheMem = a_twimagememxfer.Memory.TheMem;\r\n                    twimagememxfermacosx.Rows = a_twimagememxfer.Rows;\r\n                    twimagememxfermacosx.XOffset = a_twimagememxfer.XOffset;\r\n                    twimagememxfermacosx.YOffset = a_twimagememxfer.YOffset;\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwainDsmEntryImagememxfer(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.IMAGEMEMXFER, a_msg, ref twimagememxfermacosx);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwaindsmDsmEntryImagememxfer(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.IMAGEMEMXFER, a_msg, ref twimagememxfermacosx);\r\n                    }\r\n                    a_twimagememxfer.BytesPerRow = twimagememxfermacosx.BytesPerRow;\r\n                    a_twimagememxfer.BytesWritten = twimagememxfermacosx.BytesWritten;\r\n                    a_twimagememxfer.Columns = twimagememxfermacosx.Columns;\r\n                    a_twimagememxfer.Compression = (ushort)twimagememxfermacosx.Compression;\r\n                    a_twimagememxfer.Memory.Flags = twimagememxfermacosx.Memory.Flags;\r\n                    a_twimagememxfer.Memory.Length = twimagememxfermacosx.Memory.Length;\r\n                    a_twimagememxfer.Memory.TheMem = twimagememxfermacosx.Memory.TheMem;\r\n                    a_twimagememxfer.Rows = twimagememxfermacosx.Rows;\r\n                    a_twimagememxfer.XOffset = twimagememxfermacosx.XOffset;\r\n                    a_twimagememxfer.YOffset = twimagememxfermacosx.YOffset;\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Uh-oh...\r\n            else\r\n            {\r\n                Log.LogSendAfter(STS.BUMMER, \"\");\r\n                return (STS.BUMMER);\r\n            }\r\n\r\n            // Get DAT_STATUS, if needed...\r\n            TWAIN.STS stsRcOrCc = AutoDatStatus(sts);\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendAfter(stsRcOrCc, ImagememxferToCsv(a_twimagememxfer));\r\n            }\r\n\r\n            // If we had a successful transfer, then change state...\r\n            if (sts == STS.XFERDONE)\r\n            {\r\n                m_state = STATE.S7;\r\n            }\r\n\r\n            // All done...\r\n            return (stsRcOrCc);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Issue native image transfer commands...\r\n        /// </summary>\r\n        /// <param name=\"a_dg\">Data group</param>\r\n        /// <param name=\"a_msg\">Operation</param>\r\n        /// <param name=\"a_bitmap\">BITMAP structure</param>\r\n        /// <returns>TWAIN status</returns>\r\n        private void DatImagenativexferWindowsTwain32()\r\n        {\r\n            // If you get a first chance exception, be aware that some drivers\r\n            // will do that to you, you can ignore it and they'll keep going...\r\n            m_threaddataDatImagenativexfer.sts = (STS)NativeMethods.WindowsTwain32DsmEntryImagenativexfer\r\n            (\r\n                ref m_twidentitylegacyApp,\r\n                ref m_twidentitylegacyDs,\r\n                m_threaddataDatImagenativexfer.dg,\r\n                m_threaddataDatImagenativexfer.dat,\r\n                m_threaddataDatImagenativexfer.msg,\r\n                ref m_threaddataDatImagenativexfer.intptrBitmap\r\n            );\r\n        }\r\n        private void DatImagenativexferWindowsTwainDsm()\r\n        {\r\n            // If you get a first chance exception, be aware that some drivers\r\n            // will do that to you, you can ignore it and they'll keep going...\r\n            m_threaddataDatImagenativexfer.sts = (STS)NativeMethods.WindowsTwaindsmDsmEntryImagenativexfer\r\n            (\r\n                ref m_twidentitylegacyApp,\r\n                ref m_twidentitylegacyDs,\r\n                m_threaddataDatImagenativexfer.dg,\r\n                m_threaddataDatImagenativexfer.dat,\r\n                m_threaddataDatImagenativexfer.msg,\r\n                ref m_threaddataDatImagenativexfer.intptrBitmap\r\n            );\r\n        }\r\n        [PermissionSet(SecurityAction.LinkDemand, Name = \"FullTrust\", Unrestricted = false)]\r\n        public STS DatImagenativexfer(DG a_dg, MSG a_msg, ref Bitmap a_bitmap)\r\n        {\r\n            IntPtr intptrBitmapHandle = IntPtr.Zero;\r\n            return (DatImagenativexferBitmap(a_dg, a_msg, ref a_bitmap, ref intptrBitmapHandle, false));\r\n        }\r\n        [PermissionSet(SecurityAction.LinkDemand, Name = \"FullTrust\", Unrestricted = false)]\r\n        public STS DatImagenativexferHandle(DG a_dg, MSG a_msg, ref IntPtr a_intptrBitmapHandle)\r\n        {\r\n            Bitmap bitmap = null;\r\n            return (DatImagenativexferBitmap(a_dg, a_msg, ref bitmap, ref a_intptrBitmapHandle, true));\r\n        }\r\n        [PermissionSet(SecurityAction.LinkDemand, Name = \"FullTrust\", Unrestricted = false)]\r\n        public STS DatImagenativexferBitmap(DG a_dg, MSG a_msg, ref Bitmap a_bitmap, ref IntPtr a_intptrBitmapHandle, bool a_blUseBitmapHandle)\r\n        {\r\n            STS sts;\r\n            IntPtr intptrBitmap = IntPtr.Zero;\r\n\r\n            // Submit the work to the TWAIN thread...\r\n            if (this.m_runinuithreaddelegate == null)\r\n            {\r\n                if ((m_threadTwain != null) && (m_threadTwain.ManagedThreadId != Thread.CurrentThread.ManagedThreadId))\r\n                {\r\n                    lock (m_lockTwain)\r\n                    {\r\n                        // Set our command variables...\r\n                        ThreadData threaddata = default(ThreadData);\r\n                        threaddata.bitmap = a_bitmap;\r\n                        threaddata.blUseBitmapHandle = a_blUseBitmapHandle;\r\n                        threaddata.dg = a_dg;\r\n                        threaddata.msg = a_msg;\r\n                        threaddata.dat = DAT.IMAGENATIVEXFER;\r\n                        long lIndex = m_twaincommand.Submit(threaddata);\r\n\r\n                        // Submit the command and wait for the reply...\r\n                        CallerToThreadSet();\r\n                        ThreadToCallerWaitOne();\r\n\r\n                        // Return the result...\r\n                        a_bitmap = m_twaincommand.Get(lIndex).bitmap;\r\n                        a_intptrBitmapHandle = m_twaincommand.Get(lIndex).intptrBitmap;\r\n                        sts = m_twaincommand.Get(lIndex).sts;\r\n\r\n                        // Clear the command variables...\r\n                        m_twaincommand.Delete(lIndex);\r\n                    }\r\n                    return (sts);\r\n                }\r\n            }\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendBefore(a_dg.ToString(), DAT.IMAGENATIVEXFER.ToString(), a_msg.ToString(), \"\");\r\n            }\r\n\r\n            // Windows...\r\n            if (ms_platform == Platform.WINDOWS)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_threaddataDatImagenativexfer.blIsInuse || (this.m_runinuithreaddelegate == null))\r\n                    {\r\n                        if (m_blUseLegacyDSM)\r\n                        {\r\n                            sts = (STS)NativeMethods.WindowsTwain32DsmEntryImagenativexfer(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.IMAGENATIVEXFER, a_msg, ref intptrBitmap);\r\n                        }\r\n                        else\r\n                        {\r\n                            sts = (STS)NativeMethods.WindowsTwaindsmDsmEntryImagenativexfer(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.IMAGENATIVEXFER, a_msg, ref intptrBitmap);\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        if (m_blUseLegacyDSM)\r\n                        {\r\n                            lock (m_lockTwain)\r\n                            {\r\n                                m_threaddataDatImagenativexfer = default(ThreadData);\r\n                                m_threaddataDatImagenativexfer.blIsInuse = true;\r\n                                m_threaddataDatImagenativexfer.dg = a_dg;\r\n                                m_threaddataDatImagenativexfer.msg = a_msg;\r\n                                m_threaddataDatImagenativexfer.dat = DAT.IMAGENATIVEXFER;\r\n                                RunInUiThread(DatImagenativexferWindowsTwain32);\r\n                                intptrBitmap = a_intptrBitmapHandle = m_threaddataDatImagenativexfer.intptrBitmap;\r\n                                sts = m_threaddataDatImagenativexfer.sts;\r\n                                m_threaddataDatImagenativexfer = default(ThreadData);\r\n                            }\r\n                        }\r\n                        else\r\n                        {\r\n                            lock (m_lockTwain)\r\n                            {\r\n                                m_threaddataDatImagenativexfer = default(ThreadData);\r\n                                m_threaddataDatImagenativexfer.blIsInuse = true;\r\n                                m_threaddataDatImagenativexfer.dg = a_dg;\r\n                                m_threaddataDatImagenativexfer.msg = a_msg;\r\n                                m_threaddataDatImagenativexfer.dat = DAT.IMAGENATIVEXFER;\r\n                                RunInUiThread(DatImagenativexferWindowsTwainDsm);\r\n                                intptrBitmap = a_intptrBitmapHandle = m_threaddataDatImagenativexfer.intptrBitmap;\r\n                                sts = m_threaddataDatImagenativexfer.sts;\r\n                                m_threaddataDatImagenativexfer = default(ThreadData);\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Linux...\r\n            else if (ms_platform == Platform.LINUX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blFoundLatestDsm64 && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux64DsmEntryImagenativexfer(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.IMAGENATIVEXFER, a_msg, ref intptrBitmap);\r\n                    }\r\n                    else if (m_blFoundLatestDsm && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.LinuxDsmEntryImagenativexfer(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.IMAGENATIVEXFER, a_msg, ref intptrBitmap);\r\n                    }\r\n                    else if (m_blFound020302Dsm64bit && (m_linuxdsm == LinuxDsm.Is020302Dsm64bit))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux020302Dsm64bitEntryImagenativexfer(ref m_twidentityApp, ref m_twidentityDs, a_dg, DAT.IMAGENATIVEXFER, a_msg, ref intptrBitmap);\r\n                    }\r\n                    else\r\n                    {\r\n                        Log.Error(\"apparently we don't have a DSM...\");\r\n                        sts = STS.BUMMER;\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Mac OS X, which has to be different...\r\n            else if (ms_platform == Platform.MACOSX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    intptrBitmap = IntPtr.Zero;\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwainDsmEntryImagenativexfer(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.IMAGENATIVEXFER, a_msg, ref intptrBitmap);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwaindsmDsmEntryImagenativexfer(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.IMAGENATIVEXFER, a_msg, ref intptrBitmap);\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Uh-oh...\r\n            else\r\n            {\r\n                Log.LogSendAfter(STS.BUMMER, \"\");\r\n                return (STS.BUMMER);\r\n            }\r\n\r\n            // Get DAT_STATUS, if needed...\r\n            TWAIN.STS stsRcOrCc = AutoDatStatus(sts);\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendAfter(stsRcOrCc, \"\");\r\n            }\r\n\r\n            // If we had a successful transfer, then convert the data...\r\n            if (sts == STS.XFERDONE)\r\n            {\r\n                if (a_blUseBitmapHandle)\r\n                {\r\n                    a_intptrBitmapHandle = intptrBitmap;\r\n                }\r\n                else\r\n                {\r\n                    // Bump our state...\r\n                    m_state = STATE.S7;\r\n\r\n                    // Turn the DIB into a Bitmap object...\r\n                    a_bitmap = NativeToBitmap(ms_platform, intptrBitmap);\r\n\r\n                    // We're done with the data we got from the driver...\r\n                    Marshal.FreeHGlobal(intptrBitmap);\r\n                    intptrBitmap = IntPtr.Zero;\r\n                }\r\n            }\r\n\r\n            // All done...\r\n            return (stsRcOrCc);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Get/Set JPEG compression tables...\r\n        /// </summary>\r\n        /// <param name=\"a_dg\">Data group</param>\r\n        /// <param name=\"a_msg\">Operation</param>\r\n        /// <param name=\"a_twjpegcompression\">JPEGCOMPRESSION structure</param>\r\n        /// <returns>TWAIN status</returns>\r\n        public STS DatJpegcompression(DG a_dg, MSG a_msg, ref TW_JPEGCOMPRESSION a_twjpegcompression)\r\n        {\r\n            STS sts;\r\n\r\n            // Submit the work to the TWAIN thread...\r\n            if ((m_threadTwain != null) && (m_threadTwain.ManagedThreadId != Thread.CurrentThread.ManagedThreadId))\r\n            {\r\n                lock (m_lockTwain)\r\n                {\r\n                    // Set our command variables...\r\n                    ThreadData threaddata = default(ThreadData);\r\n                    threaddata.twjpegcompression = a_twjpegcompression;\r\n                    threaddata.dg = a_dg;\r\n                    threaddata.msg = a_msg;\r\n                    threaddata.dat = DAT.JPEGCOMPRESSION;\r\n                    long lIndex = m_twaincommand.Submit(threaddata);\r\n\r\n                    // Submit the command and wait for the reply...\r\n                    CallerToThreadSet();\r\n                    ThreadToCallerWaitOne();\r\n\r\n                    // Return the result...\r\n                    a_twjpegcompression = m_twaincommand.Get(lIndex).twjpegcompression;\r\n                    sts = m_twaincommand.Get(lIndex).sts;\r\n\r\n                    // Clear the command variables...\r\n                    m_twaincommand.Delete(lIndex);\r\n                }\r\n                return (sts);\r\n            }\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendBefore(a_dg.ToString(), DAT.JPEGCOMPRESSION.ToString(), a_msg.ToString(), \"\");\r\n            }\r\n\r\n            // Windows...\r\n            if (ms_platform == Platform.WINDOWS)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.WindowsTwain32DsmEntryJpegcompression(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.JPEGCOMPRESSION, a_msg, ref a_twjpegcompression);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.WindowsTwaindsmDsmEntryJpegcompression(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.JPEGCOMPRESSION, a_msg, ref a_twjpegcompression);\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Linux...\r\n            else if (ms_platform == Platform.LINUX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blFoundLatestDsm64 && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux64DsmEntryJpegcompression(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.JPEGCOMPRESSION, a_msg, ref a_twjpegcompression);\r\n                    }\r\n                    else if (m_blFoundLatestDsm && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.LinuxDsmEntryJpegcompression(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.JPEGCOMPRESSION, a_msg, ref a_twjpegcompression);\r\n                    }\r\n                    else if (m_blFound020302Dsm64bit && (m_linuxdsm == LinuxDsm.Is020302Dsm64bit))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux020302Dsm64bitEntryJpegcompression(ref m_twidentityApp, ref m_twidentityDs, a_dg, DAT.JPEGCOMPRESSION, a_msg, ref a_twjpegcompression);\r\n                    }\r\n                    else\r\n                    {\r\n                        Log.Error(\"apparently we don't have a DSM...\");\r\n                        sts = STS.BUMMER;\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Mac OS X, which has to be different...\r\n            else if (ms_platform == Platform.MACOSX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwainDsmEntryJpegcompression(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.JPEGCOMPRESSION, a_msg, ref a_twjpegcompression);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwaindsmDsmEntryJpegcompression(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.JPEGCOMPRESSION, a_msg, ref a_twjpegcompression);\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Uh-oh...\r\n            else\r\n            {\r\n                Log.LogSendAfter(STS.BUMMER, \"\");\r\n                return (STS.BUMMER);\r\n            }\r\n\r\n            // Get DAT_STATUS, if needed...\r\n            TWAIN.STS stsRcOrCc = AutoDatStatus(sts);\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendAfter(stsRcOrCc, \"\");\r\n            }\r\n\r\n            // All done...\r\n            return (stsRcOrCc);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Get/Set metrics...\r\n        /// </summary>\r\n        /// <param name=\"a_dg\">Data group</param>\r\n        /// <param name=\"a_msg\">Operation</param>\r\n        /// <param name=\"a_twmetrics\">JPEGCOMPRESSION structure</param>\r\n        /// <returns>TWAIN status</returns>\r\n        public STS DatMetrics(DG a_dg, MSG a_msg, ref TW_METRICS a_twmetrics)\r\n        {\r\n            STS sts;\r\n\r\n            // Submit the work to the TWAIN thread...\r\n            if ((m_threadTwain != null) && (m_threadTwain.ManagedThreadId != Thread.CurrentThread.ManagedThreadId))\r\n            {\r\n                lock (m_lockTwain)\r\n                {\r\n                    // Set our command variables...\r\n                    ThreadData threaddata = default(ThreadData);\r\n                    threaddata.twmetrics = a_twmetrics;\r\n                    threaddata.dg = a_dg;\r\n                    threaddata.msg = a_msg;\r\n                    threaddata.dat = DAT.METRICS;\r\n                    long lIndex = m_twaincommand.Submit(threaddata);\r\n\r\n                    // Submit the command and wait for the reply...\r\n                    CallerToThreadSet();\r\n                    ThreadToCallerWaitOne();\r\n\r\n                    // Return the result...\r\n                    a_twmetrics = m_twaincommand.Get(lIndex).twmetrics;\r\n                    sts = m_twaincommand.Get(lIndex).sts;\r\n\r\n                    // Clear the command variables...\r\n                    m_twaincommand.Delete(lIndex);\r\n                }\r\n                return (sts);\r\n            }\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendBefore(a_dg.ToString(), DAT.METRICS.ToString(), a_msg.ToString(), \"\");\r\n            }\r\n\r\n            // Windows...\r\n            if (ms_platform == Platform.WINDOWS)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.WindowsTwain32DsmEntryMetrics(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.METRICS, a_msg, ref a_twmetrics);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.WindowsTwaindsmDsmEntryMetrics(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.METRICS, a_msg, ref a_twmetrics);\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Linux...\r\n            else if (ms_platform == Platform.LINUX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blFoundLatestDsm64 && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux64DsmEntryMetrics(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.METRICS, a_msg, ref a_twmetrics);\r\n                    }\r\n                    else if (m_blFoundLatestDsm && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.LinuxDsmEntryMetrics(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.METRICS, a_msg, ref a_twmetrics);\r\n                    }\r\n                    else if (m_blFound020302Dsm64bit && (m_linuxdsm == LinuxDsm.Is020302Dsm64bit))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux020302Dsm64bitEntryMetrics(ref m_twidentityApp, ref m_twidentityDs, a_dg, DAT.METRICS, a_msg, ref a_twmetrics);\r\n                    }\r\n                    else\r\n                    {\r\n                        Log.Error(\"apparently we don't have a DSM...\");\r\n                        sts = STS.BUMMER;\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Mac OS X, which has to be different...\r\n            else if (ms_platform == Platform.MACOSX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwainDsmEntryMetrics(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.METRICS, a_msg, ref a_twmetrics);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwaindsmDsmEntryMetrics(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.METRICS, a_msg, ref a_twmetrics);\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Uh-oh...\r\n            else\r\n            {\r\n                Log.LogSendAfter(STS.BUMMER, \"\");\r\n                return (STS.BUMMER);\r\n            }\r\n\r\n            // Get DAT_STATUS, if needed...\r\n            TWAIN.STS stsRcOrCc = AutoDatStatus(sts);\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendAfter(stsRcOrCc, \"\");\r\n            }\r\n\r\n            // All done...\r\n            return (stsRcOrCc);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Get/Set for a Pallete8...\r\n        /// </summary>\r\n        /// <param name=\"a_dg\">Data group</param>\r\n        /// <param name=\"a_msg\">Operation</param>\r\n        /// <param name=\"a_twpalette8\">PALETTE8 structure</param>\r\n        /// <returns>TWAIN status</returns>\r\n        public STS DatPalette8(DG a_dg, MSG a_msg, ref TW_PALETTE8 a_twpalette8)\r\n        {\r\n            STS sts;\r\n\r\n            // Submit the work to the TWAIN thread...\r\n            if ((m_threadTwain != null) && (m_threadTwain.ManagedThreadId != Thread.CurrentThread.ManagedThreadId))\r\n            {\r\n                lock (m_lockTwain)\r\n                {\r\n                    // Set our command variables...\r\n                    ThreadData threaddata = default(ThreadData);\r\n                    threaddata.twpalette8 = a_twpalette8;\r\n                    threaddata.dg = a_dg;\r\n                    threaddata.msg = a_msg;\r\n                    threaddata.dat = DAT.PALETTE8;\r\n                    long lIndex = m_twaincommand.Submit(threaddata);\r\n\r\n                    // Submit the command and wait for the reply...\r\n                    CallerToThreadSet();\r\n                    ThreadToCallerWaitOne();\r\n\r\n                    // Return the result...\r\n                    a_twpalette8 = m_twaincommand.Get(lIndex).twpalette8;\r\n                    sts = m_twaincommand.Get(lIndex).sts;\r\n\r\n                    // Clear the command variables...\r\n                    m_twaincommand.Delete(lIndex);\r\n                }\r\n                return (sts);\r\n            }\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendBefore(a_dg.ToString(), DAT.PALETTE8.ToString(), a_msg.ToString(), \"\");\r\n            }\r\n\r\n            // Windows...\r\n            if (ms_platform == Platform.WINDOWS)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.WindowsTwain32DsmEntryPalette8(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.PALETTE8, a_msg, ref a_twpalette8);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.WindowsTwaindsmDsmEntryPalette8(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.PALETTE8, a_msg, ref a_twpalette8);\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Linux...\r\n            else if (ms_platform == Platform.LINUX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blFoundLatestDsm64 && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux64DsmEntryPalette8(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.PALETTE8, a_msg, ref a_twpalette8);\r\n                    }\r\n                    else if (m_blFoundLatestDsm && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.LinuxDsmEntryPalette8(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.PALETTE8, a_msg, ref a_twpalette8);\r\n                    }\r\n                    else if (m_blFound020302Dsm64bit && (m_linuxdsm == LinuxDsm.Is020302Dsm64bit))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux020302Dsm64bitEntryPalette8(ref m_twidentityApp, ref m_twidentityDs, a_dg, DAT.PALETTE8, a_msg, ref a_twpalette8);\r\n                    }\r\n                    else\r\n                    {\r\n                        Log.Error(\"apparently we don't have a DSM...\");\r\n                        sts = STS.BUMMER;\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Mac OS X, which has to be different...\r\n            else if (ms_platform == Platform.MACOSX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwainDsmEntryPalette8(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.PALETTE8, a_msg, ref a_twpalette8);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwaindsmDsmEntryPalette8(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.PALETTE8, a_msg, ref a_twpalette8);\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Uh-oh...\r\n            else\r\n            {\r\n                Log.LogSendAfter(STS.BUMMER, \"\");\r\n                return (STS.BUMMER);\r\n            }\r\n\r\n            // Get DAT_STATUS, if needed...\r\n            TWAIN.STS stsRcOrCc = AutoDatStatus(sts);\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendAfter(stsRcOrCc, \"\");\r\n            }\r\n\r\n            // All done...\r\n            return (stsRcOrCc);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Issue DSM commands...\r\n        /// </summary>\r\n        /// <param name=\"a_dg\">Data group</param>\r\n        /// <param name=\"a_msg\">Operation</param>\r\n        /// <param name=\"a_intptrHwnd\">PARENT structure</param>\r\n        /// <returns>TWAIN status</returns>\r\n        private void DatParentWindowsTwain32()\r\n        {\r\n            // If you get a first chance exception, be aware that some drivers\r\n            // will do that to you, you can ignore it and they'll keep going...\r\n            m_threaddataDatParent.sts = (STS)NativeMethods.WindowsTwain32DsmEntryParent\r\n            (\r\n                ref m_twidentitylegacyApp,\r\n                IntPtr.Zero,\r\n                m_threaddataDatParent.dg,\r\n                m_threaddataDatParent.dat,\r\n                m_threaddataDatParent.msg,\r\n                ref m_threaddataDatParent.intptrHwnd\r\n            );\r\n        }\r\n        private void DatParentWindowsTwainDsm()\r\n        {\r\n            // If you get a first chance exception, be aware that some drivers\r\n            // will do that to you, you can ignore it and they'll keep going...\r\n            m_threaddataDatParent.sts = (STS)NativeMethods.WindowsTwaindsmDsmEntryParent\r\n            (\r\n                ref m_twidentitylegacyApp,\r\n                IntPtr.Zero,\r\n                m_threaddataDatParent.dg,\r\n                m_threaddataDatParent.dat,\r\n                m_threaddataDatParent.msg,\r\n                ref m_threaddataDatParent.intptrHwnd\r\n            );\r\n        }\r\n        [PermissionSet(SecurityAction.LinkDemand, Name = \"FullTrust\", Unrestricted = false)]\r\n        public STS DatParent(DG a_dg, MSG a_msg, ref IntPtr a_intptrHwnd)\r\n        {\r\n            STS sts;\r\n\r\n            // Submit the work to the TWAIN thread...\r\n            if (m_runinuithreaddelegate == null)\r\n            {\r\n                if ((m_threadTwain != null) && (m_threadTwain.ManagedThreadId != Thread.CurrentThread.ManagedThreadId))\r\n                {\r\n                    lock (m_lockTwain)\r\n                    {\r\n                        // Set our command variables...\r\n                        ThreadData threaddata = default(ThreadData);\r\n                        threaddata.intptrHwnd = a_intptrHwnd;\r\n                        threaddata.dg = a_dg;\r\n                        threaddata.msg = a_msg;\r\n                        threaddata.dat = DAT.PARENT;\r\n                        long lIndex = m_twaincommand.Submit(threaddata);\r\n\r\n                        // Submit the command and wait for the reply...\r\n                        CallerToThreadSet();\r\n                        ThreadToCallerWaitOne();\r\n\r\n                        // Return the result...\r\n                        a_intptrHwnd = m_twaincommand.Get(lIndex).intptrHwnd;\r\n                        sts = m_twaincommand.Get(lIndex).sts;\r\n\r\n                        // Clear the command variables...\r\n                        m_twaincommand.Delete(lIndex);\r\n                    }\r\n                    return (sts);\r\n                }\r\n            }\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendBefore(a_dg.ToString(), DAT.PARENT.ToString(), a_msg.ToString(), \"\");\r\n            }\r\n\r\n            // Windows...\r\n            if (ms_platform == Platform.WINDOWS)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_threaddataDatParent.blIsInuse || (this.m_runinuithreaddelegate == null))\r\n                    {\r\n                        if (m_blUseLegacyDSM)\r\n                        {\r\n                            sts = (STS)NativeMethods.WindowsTwain32DsmEntryParent(ref m_twidentitylegacyApp, IntPtr.Zero, a_dg, DAT.PARENT, a_msg, ref a_intptrHwnd);\r\n                        }\r\n                        else\r\n                        {\r\n                            sts = (STS)NativeMethods.WindowsTwaindsmDsmEntryParent(ref m_twidentitylegacyApp, IntPtr.Zero, a_dg, DAT.PARENT, a_msg, ref a_intptrHwnd);\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        if (m_blUseLegacyDSM)\r\n                        {\r\n                            lock (m_lockTwain)\r\n                            {\r\n                                m_threaddataDatParent = default(ThreadData);\r\n                                m_threaddataDatParent.blIsInuse = true;\r\n                                m_threaddataDatParent.dg = a_dg;\r\n                                m_threaddataDatParent.msg = a_msg;\r\n                                m_threaddataDatParent.dat = DAT.PARENT;\r\n                                m_threaddataDatParent.intptrHwnd = a_intptrHwnd;\r\n                                RunInUiThread(DatParentWindowsTwain32);\r\n                                sts = m_threaddataDatParent.sts;\r\n                                m_threaddataDatParent = default(ThreadData);\r\n                            }\r\n                        }\r\n                        else\r\n                        {\r\n                            lock (m_lockTwain)\r\n                            {\r\n                                m_threaddataDatParent = default(ThreadData);\r\n                                m_threaddataDatParent.blIsInuse = true;\r\n                                m_threaddataDatParent.dg = a_dg;\r\n                                m_threaddataDatParent.msg = a_msg;\r\n                                m_threaddataDatParent.dat = DAT.PARENT;\r\n                                m_threaddataDatParent.intptrHwnd = a_intptrHwnd;\r\n                                RunInUiThread(DatParentWindowsTwainDsm);\r\n                                sts = m_threaddataDatParent.sts;\r\n                                m_threaddataDatParent = default(ThreadData);\r\n                            }\r\n                        }\r\n                    }\r\n                    // Needed for the DF_DSM2 flag...\r\n                    m_twidentityApp.SupportedGroups = m_twidentitylegacyApp.SupportedGroups;\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Linux...\r\n            else if (ms_platform == Platform.LINUX)\r\n            {\r\n                STS stsLatest = STS.BUMMER;\r\n                STS sts020302Dsm64bit = STS.BUMMER;\r\n\r\n                // We're trying both DSM's...\r\n                sts = STS.BUMMER;\r\n\r\n                // Load the new DSM, whatever it is, if we found one...\r\n                if (m_blFoundLatestDsm64)\r\n                {\r\n                    try\r\n                    {\r\n                        stsLatest = (STS)NativeMethods.Linux64DsmEntryParent(ref m_twidentitylegacyApp, IntPtr.Zero, a_dg, DAT.PARENT, a_msg, ref a_intptrHwnd);\r\n                        // Needed for the DF_DSM2 flag...\r\n                        m_twidentityApp.SupportedGroups = m_twidentitylegacyApp.SupportedGroups;\r\n                    }\r\n                    catch\r\n                    {\r\n                        // Forget this...\r\n                        m_blFoundLatestDsm64 = false;\r\n                    }\r\n                }\r\n\r\n                // Load the new DSM, whatever it is, if we found one...\r\n                if (m_blFoundLatestDsm)\r\n                {\r\n                    try\r\n                    {\r\n                        stsLatest = (STS)NativeMethods.LinuxDsmEntryParent(ref m_twidentitylegacyApp, IntPtr.Zero, a_dg, DAT.PARENT, a_msg, ref a_intptrHwnd);\r\n                        // Needed for the DF_DSM2 flag...\r\n                        m_twidentityApp.SupportedGroups = m_twidentitylegacyApp.SupportedGroups;\r\n                    }\r\n                    catch\r\n                    {\r\n                        // Forget this...\r\n                        m_blFoundLatestDsm = false;\r\n                    }\r\n                }\r\n\r\n                // Load libtwaindsm.so.2.3.2, if we found it...\r\n                if (m_blFound020302Dsm64bit)\r\n                {\r\n                    try\r\n                    {\r\n                        sts020302Dsm64bit = (STS)NativeMethods.Linux020302Dsm64bitEntryParent(ref m_twidentityApp, IntPtr.Zero, a_dg, DAT.PARENT, a_msg, ref a_intptrHwnd);\r\n                    }\r\n                    catch\r\n                    {\r\n                        // Forget this...\r\n                        m_blFound020302Dsm64bit = false;\r\n                    }\r\n                }\r\n\r\n                // We only need one success to get through this...\r\n                sts = STS.BUMMER;\r\n                if ((stsLatest == STS.SUCCESS) || (sts020302Dsm64bit == STS.SUCCESS))\r\n                {\r\n                    sts = STS.SUCCESS;\r\n                }\r\n            }\r\n\r\n            // Mac OS X, which has to be different...\r\n            else if (ms_platform == Platform.MACOSX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwainDsmEntryParent(ref m_twidentitymacosxApp, IntPtr.Zero, a_dg, DAT.PARENT, a_msg, ref a_intptrHwnd);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwaindsmDsmEntryParent(ref m_twidentitymacosxApp, IntPtr.Zero, a_dg, DAT.PARENT, a_msg, ref a_intptrHwnd);\r\n                    }\r\n                    // Needed for the DF_DSM2 flag...\r\n                    m_twidentityApp.SupportedGroups = m_twidentitymacosxApp.SupportedGroups;\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Uh-oh...\r\n            else\r\n            {\r\n                Log.LogSendAfter(STS.BUMMER, \"\");\r\n                return (STS.BUMMER);\r\n            }\r\n\r\n            // Get DAT_STATUS, if needed...\r\n            TWAIN.STS stsRcOrCc = AutoDatStatus(sts);\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendAfter(stsRcOrCc, \"\");\r\n            }\r\n\r\n            // If we opened, go to state 3, and start tracking\r\n            // TWAIN's state in the log file...\r\n            if (a_msg == MSG.OPENDSM)\r\n            {\r\n                if (sts == STS.SUCCESS)\r\n                {\r\n                    m_state = STATE.S3;\r\n                    Log.RegisterTwain(this);\r\n                }\r\n            }\r\n\r\n            // If we closed, go to state 2, and stop tracking\r\n            // TWAIN's state in the log file...\r\n            else if (a_msg == MSG.CLOSEDSM)\r\n            {\r\n                if (sts == STS.SUCCESS)\r\n                {\r\n                    m_state = STATE.S2;\r\n                    Log.RegisterTwain(null);\r\n                }\r\n            }\r\n\r\n            // All done...\r\n            return (stsRcOrCc);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Get/Set for a raw commands...\r\n        /// </summary>\r\n        /// <param name=\"a_dg\">Data group</param>\r\n        /// <param name=\"a_msg\">Operation</param>\r\n        /// <param name=\"a_twpassthru\">PASSTHRU structure</param>\r\n        /// <returns>TWAIN status</returns>\r\n        public STS DatPassthru(DG a_dg, MSG a_msg, ref TW_PASSTHRU a_twpassthru)\r\n        {\r\n            STS sts;\r\n\r\n            // Submit the work to the TWAIN thread...\r\n            if ((m_threadTwain != null) && (m_threadTwain.ManagedThreadId != Thread.CurrentThread.ManagedThreadId))\r\n            {\r\n                lock (m_lockTwain)\r\n                {\r\n                    // Set our command variables...\r\n                    ThreadData threaddata = default(ThreadData);\r\n                    threaddata.twpassthru = a_twpassthru;\r\n                    threaddata.dg = a_dg;\r\n                    threaddata.msg = a_msg;\r\n                    threaddata.dat = DAT.PASSTHRU;\r\n                    long lIndex = m_twaincommand.Submit(threaddata);\r\n\r\n                    // Submit the command and wait for the reply...\r\n                    CallerToThreadSet();\r\n                    ThreadToCallerWaitOne();\r\n\r\n                    // Return the result...\r\n                    a_twpassthru = m_twaincommand.Get(lIndex).twpassthru;\r\n                    sts = m_twaincommand.Get(lIndex).sts;\r\n\r\n                    // Clear the command variables...\r\n                    m_twaincommand.Delete(lIndex);\r\n                }\r\n                return (sts);\r\n            }\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendBefore(a_dg.ToString(), DAT.PASSTHRU.ToString(), a_msg.ToString(), \"\");\r\n            }\r\n\r\n            // Windows...\r\n            if (ms_platform == Platform.WINDOWS)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.WindowsTwain32DsmEntryPassthru(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.PASSTHRU, a_msg, ref a_twpassthru);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.WindowsTwaindsmDsmEntryPassthru(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.PASSTHRU, a_msg, ref a_twpassthru);\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Linux...\r\n            else if (ms_platform == Platform.LINUX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blFoundLatestDsm64 && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux64DsmEntryPassthru(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.PASSTHRU, a_msg, ref a_twpassthru);\r\n                    }\r\n                    else if (m_blFoundLatestDsm && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.LinuxDsmEntryPassthru(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.PASSTHRU, a_msg, ref a_twpassthru);\r\n                    }\r\n                    else if (m_blFound020302Dsm64bit && (m_linuxdsm == LinuxDsm.Is020302Dsm64bit))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux020302Dsm64bitEntryPassthru(ref m_twidentityApp, ref m_twidentityDs, a_dg, DAT.PASSTHRU, a_msg, ref a_twpassthru);\r\n                    }\r\n                    else\r\n                    {\r\n                        Log.Error(\"apparently we don't have a DSM...\");\r\n                        sts = STS.BUMMER;\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Mac OS X, which has to be different...\r\n            else if (ms_platform == Platform.MACOSX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwainDsmEntryPassthru(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.PASSTHRU, a_msg, ref a_twpassthru);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwaindsmDsmEntryPassthru(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.PASSTHRU, a_msg, ref a_twpassthru);\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Uh-oh...\r\n            else\r\n            {\r\n                Log.LogSendAfter(STS.BUMMER, \"\");\r\n                return (STS.BUMMER);\r\n            }\r\n\r\n            // Get DAT_STATUS, if needed...\r\n            TWAIN.STS stsRcOrCc = AutoDatStatus(sts);\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendAfter(stsRcOrCc, \"\");\r\n            }\r\n\r\n            // All done...\r\n            return (stsRcOrCc);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Issue pendingxfers commands...\r\n        /// </summary>\r\n        /// <param name=\"a_dg\">Data group</param>\r\n        /// <param name=\"a_msg\">Operation</param>\r\n        /// <param name=\"a_twpendingxfers\">PENDINGXFERS structure</param>\r\n        /// <returns>TWAIN status</returns>\r\n        private void DatPendingxfersWindowsTwain32()\r\n        {\r\n            // If you get a first chance exception, be aware that some drivers\r\n            // will do that to you, you can ignore it and they'll keep going...\r\n            m_threaddataDatPendingxfers.sts = (STS)NativeMethods.WindowsTwain32DsmEntryPendingxfers\r\n            (\r\n                ref m_twidentitylegacyApp,\r\n                ref m_twidentitylegacyDs,\r\n                m_threaddataDatPendingxfers.dg,\r\n                m_threaddataDatPendingxfers.dat,\r\n                m_threaddataDatPendingxfers.msg,\r\n                ref m_threaddataDatPendingxfers.twpendingxfers\r\n            );\r\n        }\r\n        private void DatPendingxfersWindowsTwainDsm()\r\n        {\r\n            // If you get a first chance exception, be aware that some drivers\r\n            // will do that to you, you can ignore it and they'll keep going...\r\n            m_threaddataDatPendingxfers.sts = (STS)NativeMethods.WindowsTwaindsmDsmEntryPendingxfers\r\n            (\r\n                ref m_twidentitylegacyApp,\r\n                ref m_twidentitylegacyDs,\r\n                m_threaddataDatPendingxfers.dg,\r\n                m_threaddataDatPendingxfers.dat,\r\n                m_threaddataDatPendingxfers.msg,\r\n                ref m_threaddataDatPendingxfers.twpendingxfers\r\n            );\r\n        }\r\n        public STS DatPendingxfers(DG a_dg, MSG a_msg, ref TW_PENDINGXFERS a_twpendingxfers)\r\n        {\r\n            STS sts;\r\n\r\n            // Submit the work to the TWAIN thread...\r\n            if (m_runinuithreaddelegate == null)\r\n            {\r\n                if ((m_threadTwain != null) && (m_threadTwain.ManagedThreadId != Thread.CurrentThread.ManagedThreadId))\r\n                {\r\n                    lock (m_lockTwain)\r\n                    {\r\n                        // Set our command variables...\r\n                        ThreadData threaddata = default(ThreadData);\r\n                        threaddata.twpendingxfers = a_twpendingxfers;\r\n                        threaddata.dg = a_dg;\r\n                        threaddata.msg = a_msg;\r\n                        threaddata.dat = DAT.PENDINGXFERS;\r\n                        long lIndex = m_twaincommand.Submit(threaddata);\r\n\r\n                        // Submit the command and wait for the reply...\r\n                        CallerToThreadSet();\r\n                        ThreadToCallerWaitOne();\r\n\r\n                        // Return the result...\r\n                        a_twpendingxfers = m_twaincommand.Get(lIndex).twpendingxfers;\r\n                        sts = m_twaincommand.Get(lIndex).sts;\r\n\r\n                        // Clear the command variables...\r\n                        m_twaincommand.Delete(lIndex);\r\n                    }\r\n                    return (sts);\r\n                }\r\n            }\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendBefore(a_dg.ToString(), DAT.PENDINGXFERS.ToString(), a_msg.ToString(), \"\");\r\n            }\r\n\r\n            // Windows...\r\n            if (ms_platform == Platform.WINDOWS)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_threaddataDatPendingxfers.blIsInuse || (this.m_runinuithreaddelegate == null))\r\n                    {\r\n                        if (m_blUseLegacyDSM)\r\n                        {\r\n                            sts = (STS)NativeMethods.WindowsTwain32DsmEntryPendingxfers(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.PENDINGXFERS, a_msg, ref a_twpendingxfers);\r\n                        }\r\n                        else\r\n                        {\r\n                            sts = (STS)NativeMethods.WindowsTwaindsmDsmEntryPendingxfers(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.PENDINGXFERS, a_msg, ref a_twpendingxfers);\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        if (m_blUseLegacyDSM)\r\n                        {\r\n                            lock (m_lockTwain)\r\n                            {\r\n                                m_threaddataDatPendingxfers = default(ThreadData);\r\n                                m_threaddataDatPendingxfers.blIsInuse = true;\r\n                                m_threaddataDatPendingxfers.dg = a_dg;\r\n                                m_threaddataDatPendingxfers.msg = a_msg;\r\n                                m_threaddataDatPendingxfers.dat = DAT.PENDINGXFERS;\r\n                                m_threaddataDatPendingxfers.twpendingxfers = a_twpendingxfers;\r\n                                RunInUiThread(DatPendingxfersWindowsTwain32);\r\n                                a_twpendingxfers = m_threaddataDatPendingxfers.twpendingxfers;\r\n                                sts = m_threaddataDatPendingxfers.sts;\r\n                                m_threaddataDatPendingxfers = default(ThreadData);\r\n                            }\r\n                        }\r\n                        else\r\n                        {\r\n                            lock (m_lockTwain)\r\n                            {\r\n                                m_threaddataDatPendingxfers = default(ThreadData);\r\n                                m_threaddataDatPendingxfers.blIsInuse = true;\r\n                                m_threaddataDatPendingxfers.dg = a_dg;\r\n                                m_threaddataDatPendingxfers.msg = a_msg;\r\n                                m_threaddataDatPendingxfers.dat = DAT.PENDINGXFERS;\r\n                                m_threaddataDatPendingxfers.twpendingxfers = a_twpendingxfers;\r\n                                RunInUiThread(DatPendingxfersWindowsTwainDsm);\r\n                                a_twpendingxfers = m_threaddataDatPendingxfers.twpendingxfers;\r\n                                sts = m_threaddataDatPendingxfers.sts;\r\n                                m_threaddataDatPendingxfers = default(ThreadData);\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Linux...\r\n            else if (ms_platform == Platform.LINUX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blFoundLatestDsm64 && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux64DsmEntryPendingxfers(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.PENDINGXFERS, a_msg, ref a_twpendingxfers);\r\n                    }\r\n                    else if (m_blFoundLatestDsm && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.LinuxDsmEntryPendingxfers(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.PENDINGXFERS, a_msg, ref a_twpendingxfers);\r\n                    }\r\n                    else if (m_blFound020302Dsm64bit && (m_linuxdsm == LinuxDsm.Is020302Dsm64bit))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux020302Dsm64bitEntryPendingxfers(ref m_twidentityApp, ref m_twidentityDs, a_dg, DAT.PENDINGXFERS, a_msg, ref a_twpendingxfers);\r\n                    }\r\n                    else\r\n                    {\r\n                        Log.Error(\"apparently we don't have a DSM...\");\r\n                        sts = STS.BUMMER;\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Mac OS X, which has to be different...\r\n            else if (ms_platform == Platform.MACOSX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwainDsmEntryPendingxfers(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.PENDINGXFERS, a_msg, ref a_twpendingxfers);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwaindsmDsmEntryPendingxfers(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.PENDINGXFERS, a_msg, ref a_twpendingxfers);\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Uh-oh...\r\n            else\r\n            {\r\n                Log.LogSendAfter(STS.BUMMER, \"\");\r\n                return (STS.BUMMER);\r\n            }\r\n\r\n            // Get DAT_STATUS, if needed...\r\n            TWAIN.STS stsRcOrCc = AutoDatStatus(sts);\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendAfter(stsRcOrCc, PendingxfersToCsv(a_twpendingxfers));\r\n            }\r\n\r\n            // If we endxfer, go to state 5 or 6...\r\n            if (a_msg == MSG.ENDXFER)\r\n            {\r\n                if (sts == STS.SUCCESS)\r\n                {\r\n                    if (a_twpendingxfers.Count == 0)\r\n                    {\r\n                        m_blAcceptXferReady = true;\r\n                        m_blIsMsgxferready = false;\r\n                        m_state = STATE.S5;\r\n                    }\r\n                    else\r\n                    {\r\n                        m_state = STATE.S6;\r\n                    }\r\n                }\r\n            }\r\n\r\n            // If we reset, go to state 5...\r\n            else if (a_msg == MSG.RESET)\r\n            {\r\n                if (sts == STS.SUCCESS)\r\n                {\r\n                    m_blAcceptXferReady = true;\r\n                    m_blIsMsgxferready = false;\r\n                    m_state = STATE.S5;\r\n                }\r\n            }\r\n\r\n            // All done...\r\n            return (stsRcOrCc);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Get/Set for RGB response...\r\n        /// </summary>\r\n        /// <param name=\"a_dg\">Data group</param>\r\n        /// <param name=\"a_msg\">Operation</param>\r\n        /// <param name=\"a_twrgbresponse\">RGBRESPONSE structure</param>\r\n        /// <returns>TWAIN status</returns>\r\n        public STS DatRgbresponse(DG a_dg, MSG a_msg, ref TW_RGBRESPONSE a_twrgbresponse)\r\n        {\r\n            STS sts;\r\n\r\n            // Submit the work to the TWAIN thread...\r\n            if ((m_threadTwain != null) && (m_threadTwain.ManagedThreadId != Thread.CurrentThread.ManagedThreadId))\r\n            {\r\n                lock (m_lockTwain)\r\n                {\r\n                    // Set our command variables...\r\n                    ThreadData threaddata = default(ThreadData);\r\n                    threaddata.twrgbresponse = a_twrgbresponse;\r\n                    threaddata.dg = a_dg;\r\n                    threaddata.msg = a_msg;\r\n                    threaddata.dat = DAT.RGBRESPONSE;\r\n                    long lIndex = m_twaincommand.Submit(threaddata);\r\n\r\n                    // Submit the command and wait for the reply...\r\n                    CallerToThreadSet();\r\n                    ThreadToCallerWaitOne();\r\n\r\n                    // Return the result...\r\n                    a_twrgbresponse = m_twaincommand.Get(lIndex).twrgbresponse;\r\n                    sts = m_twaincommand.Get(lIndex).sts;\r\n\r\n                    // Clear the command variables...\r\n                    m_twaincommand.Delete(lIndex);\r\n                }\r\n                return (sts);\r\n            }\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendBefore(a_dg.ToString(), DAT.RGBRESPONSE.ToString(), a_msg.ToString(), \"\");\r\n            }\r\n\r\n            // Windows...\r\n            if (ms_platform == Platform.WINDOWS)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.WindowsTwain32DsmEntryRgbresponse(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.RGBRESPONSE, a_msg, ref a_twrgbresponse);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.WindowsTwaindsmDsmEntryRgbresponse(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.RGBRESPONSE, a_msg, ref a_twrgbresponse);\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Linux...\r\n            else if (ms_platform == Platform.LINUX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blFoundLatestDsm64 && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux64DsmEntryRgbresponse(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.RGBRESPONSE, a_msg, ref a_twrgbresponse);\r\n                    }\r\n                    else if (m_blFoundLatestDsm && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.LinuxDsmEntryRgbresponse(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.RGBRESPONSE, a_msg, ref a_twrgbresponse);\r\n                    }\r\n                    else if (m_blFound020302Dsm64bit && (m_linuxdsm == LinuxDsm.Is020302Dsm64bit))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux020302Dsm64bitEntryRgbresponse(ref m_twidentityApp, ref m_twidentityDs, a_dg, DAT.RGBRESPONSE, a_msg, ref a_twrgbresponse);\r\n                    }\r\n                    else\r\n                    {\r\n                        Log.Error(\"apparently we don't have a DSM...\");\r\n                        sts = STS.BUMMER;\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Mac OS X, which has to be different...\r\n            else if (ms_platform == Platform.MACOSX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwainDsmEntryRgbresponse(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.RGBRESPONSE, a_msg, ref a_twrgbresponse);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwaindsmDsmEntryRgbresponse(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.RGBRESPONSE, a_msg, ref a_twrgbresponse);\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Uh-oh...\r\n            else\r\n            {\r\n                Log.LogSendAfter(STS.BUMMER, \"\");\r\n                return (STS.BUMMER);\r\n            }\r\n\r\n            // Get DAT_STATUS, if needed...\r\n            TWAIN.STS stsRcOrCc = AutoDatStatus(sts);\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendAfter(stsRcOrCc, \"\");\r\n            }\r\n\r\n            // All done...\r\n            return (stsRcOrCc);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Get/Set for a file xfer...\r\n        /// </summary>\r\n        /// <param name=\"a_dg\">Data group</param>\r\n        /// <param name=\"a_msg\">Operation</param>\r\n        /// <param name=\"a_twsetupfilexfer\">SETUPFILEXFER structure</param>\r\n        /// <returns>TWAIN status</returns>\r\n        private void DatSetupfilexferWindowsTwain32()\r\n        {\r\n            // If you get a first chance exception, be aware that some drivers\r\n            // will do that to you, you can ignore it and they'll keep going...\r\n            m_threaddataDatSetupfilexfer.sts = (STS)NativeMethods.WindowsTwain32DsmEntrySetupfilexfer\r\n            (\r\n                ref m_twidentitylegacyApp,\r\n                ref m_twidentitylegacyDs,\r\n                m_threaddataDatSetupfilexfer.dg,\r\n                m_threaddataDatSetupfilexfer.dat,\r\n                m_threaddataDatSetupfilexfer.msg,\r\n                ref m_threaddataDatSetupfilexfer.twsetupfilexfer\r\n            );\r\n        }\r\n        private void DatSetupfilexferWindowsTwainDsm()\r\n        {\r\n            // If you get a first chance exception, be aware that some drivers\r\n            // will do that to you, you can ignore it and they'll keep going...\r\n            m_threaddataDatSetupfilexfer.sts = (STS)NativeMethods.WindowsTwaindsmDsmEntrySetupfilexfer\r\n            (\r\n                ref m_twidentitylegacyApp,\r\n                ref m_twidentitylegacyDs,\r\n                m_threaddataDatSetupfilexfer.dg,\r\n                m_threaddataDatSetupfilexfer.dat,\r\n                m_threaddataDatSetupfilexfer.msg,\r\n                ref m_threaddataDatSetupfilexfer.twsetupfilexfer\r\n            );\r\n        }\r\n        public STS DatSetupfilexfer(DG a_dg, MSG a_msg, ref TW_SETUPFILEXFER a_twsetupfilexfer)\r\n        {\r\n            STS sts;\r\n\r\n            // Submit the work to the TWAIN thread...\r\n            if (m_runinuithreaddelegate == null)\r\n            {\r\n                if ((m_threadTwain != null) && (m_threadTwain.ManagedThreadId != Thread.CurrentThread.ManagedThreadId))\r\n                {\r\n                    lock (m_lockTwain)\r\n                    {\r\n                        // Set our command variables...\r\n                        ThreadData threaddata = default(ThreadData);\r\n                        threaddata.twsetupfilexfer = a_twsetupfilexfer;\r\n                        threaddata.dg = a_dg;\r\n                        threaddata.msg = a_msg;\r\n                        threaddata.dat = DAT.SETUPFILEXFER;\r\n                        long lIndex = m_twaincommand.Submit(threaddata);\r\n\r\n                        // Submit the command and wait for the reply...\r\n                        CallerToThreadSet();\r\n                        ThreadToCallerWaitOne();\r\n\r\n                        // Return the result...\r\n                        a_twsetupfilexfer = m_twaincommand.Get(lIndex).twsetupfilexfer;\r\n                        sts = m_twaincommand.Get(lIndex).sts;\r\n\r\n                        // Clear the command variables...\r\n                        m_twaincommand.Delete(lIndex);\r\n                    }\r\n                    return (sts);\r\n                }\r\n            }\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendBefore(a_dg.ToString(), DAT.SETUPFILEXFER.ToString(), a_msg.ToString(), SetupfilexferToCsv(a_twsetupfilexfer));\r\n            }\r\n\r\n            // Windows...\r\n            if (ms_platform == Platform.WINDOWS)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_threaddataDatSetupfilexfer.blIsInuse || (this.m_runinuithreaddelegate == null))\r\n                    {\r\n                        if (m_blUseLegacyDSM)\r\n                        {\r\n                            sts = (STS)NativeMethods.WindowsTwain32DsmEntrySetupfilexfer(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.SETUPFILEXFER, a_msg, ref a_twsetupfilexfer);\r\n                        }\r\n                        else\r\n                        {\r\n                            sts = (STS)NativeMethods.WindowsTwaindsmDsmEntrySetupfilexfer(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.SETUPFILEXFER, a_msg, ref a_twsetupfilexfer);\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        if (m_blUseLegacyDSM)\r\n                        {\r\n                            lock (m_lockTwain)\r\n                            {\r\n                                m_threaddataDatSetupfilexfer = default(ThreadData);\r\n                                m_threaddataDatSetupfilexfer.blIsInuse = true;\r\n                                m_threaddataDatSetupfilexfer.dg = a_dg;\r\n                                m_threaddataDatSetupfilexfer.msg = a_msg;\r\n                                m_threaddataDatSetupfilexfer.dat = DAT.SETUPFILEXFER;\r\n                                m_threaddataDatSetupfilexfer.twsetupfilexfer = a_twsetupfilexfer;\r\n                                RunInUiThread(DatSetupfilexferWindowsTwain32);\r\n                                a_twsetupfilexfer = m_threaddataDatSetupfilexfer.twsetupfilexfer;\r\n                                sts = m_threaddataDatSetupfilexfer.sts;\r\n                                m_threaddataDatSetupfilexfer = default(ThreadData);\r\n                            }\r\n                        }\r\n                        else\r\n                        {\r\n                            lock (m_lockTwain)\r\n                            {\r\n                                m_threaddataDatSetupfilexfer = default(ThreadData);\r\n                                m_threaddataDatSetupfilexfer.blIsInuse = true;\r\n                                m_threaddataDatSetupfilexfer.dg = a_dg;\r\n                                m_threaddataDatSetupfilexfer.msg = a_msg;\r\n                                m_threaddataDatSetupfilexfer.dat = DAT.SETUPFILEXFER;\r\n                                m_threaddataDatSetupfilexfer.twsetupfilexfer = a_twsetupfilexfer;\r\n                                RunInUiThread(DatSetupfilexferWindowsTwainDsm);\r\n                                a_twsetupfilexfer = m_threaddataDatSetupfilexfer.twsetupfilexfer;\r\n                                sts = m_threaddataDatSetupfilexfer.sts;\r\n                                m_threaddataDatSetupfilexfer = default(ThreadData);\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Linux...\r\n            else if (ms_platform == Platform.LINUX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blFoundLatestDsm64 && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux64DsmEntrySetupfilexfer(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.SETUPFILEXFER, a_msg, ref a_twsetupfilexfer);\r\n                    }\r\n                    else if (m_blFoundLatestDsm && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.LinuxDsmEntrySetupfilexfer(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.SETUPFILEXFER, a_msg, ref a_twsetupfilexfer);\r\n                    }\r\n                    else if (m_blFound020302Dsm64bit && (m_linuxdsm == LinuxDsm.Is020302Dsm64bit))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux020302Dsm64bitEntrySetupfilexfer(ref m_twidentityApp, ref m_twidentityDs, a_dg, DAT.SETUPFILEXFER, a_msg, ref a_twsetupfilexfer);\r\n                    }\r\n                    else\r\n                    {\r\n                        Log.Error(\"apparently we don't have a DSM...\");\r\n                        sts = STS.BUMMER;\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Mac OS X, which has to be different...\r\n            else if (ms_platform == Platform.MACOSX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwainDsmEntrySetupfilexfer(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.SETUPFILEXFER, a_msg, ref a_twsetupfilexfer);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwaindsmDsmEntrySetupfilexfer(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.SETUPFILEXFER, a_msg, ref a_twsetupfilexfer);\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Uh-oh...\r\n            else\r\n            {\r\n                Log.LogSendAfter(STS.BUMMER, \"\");\r\n                return (STS.BUMMER);\r\n            }\r\n\r\n            // Get DAT_STATUS, if needed...\r\n            TWAIN.STS stsRcOrCc = AutoDatStatus(sts);\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendAfter(stsRcOrCc, SetupfilexferToCsv(a_twsetupfilexfer));\r\n            }\r\n\r\n            // All done...\r\n            return (stsRcOrCc);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Get info about the memory xfer...\r\n        /// </summary>\r\n        /// <param name=\"a_dg\">Data group</param>\r\n        /// <param name=\"a_msg\">Operation</param>\r\n        /// <param name=\"a_twsetupmemxfer\">SETUPMEMXFER structure</param>\r\n        /// <returns>TWAIN status</returns>\r\n        private void DatSetupmemxferWindowsTwain32()\r\n        {\r\n            // If you get a first chance exception, be aware that some drivers\r\n            // will do that to you, you can ignore it and they'll keep going...\r\n            m_threaddataDatSetupmemxfer.sts = (STS)NativeMethods.WindowsTwain32DsmEntrySetupmemxfer\r\n            (\r\n                ref m_twidentitylegacyApp,\r\n                ref m_twidentitylegacyDs,\r\n                m_threaddataDatSetupmemxfer.dg,\r\n                m_threaddataDatSetupmemxfer.dat,\r\n                m_threaddataDatSetupmemxfer.msg,\r\n                ref m_threaddataDatSetupmemxfer.twsetupmemxfer\r\n            );\r\n        }\r\n        private void DatSetupmemxferWindowsTwainDsm()\r\n        {\r\n            // If you get a first chance exception, be aware that some drivers\r\n            // will do that to you, you can ignore it and they'll keep going...\r\n            m_threaddataDatSetupmemxfer.sts = (STS)NativeMethods.WindowsTwaindsmDsmEntrySetupmemxfer\r\n            (\r\n                ref m_twidentitylegacyApp,\r\n                ref m_twidentitylegacyDs,\r\n                m_threaddataDatSetupmemxfer.dg,\r\n                m_threaddataDatSetupmemxfer.dat,\r\n                m_threaddataDatSetupmemxfer.msg,\r\n                ref m_threaddataDatSetupmemxfer.twsetupmemxfer\r\n            );\r\n        }\r\n        public STS DatSetupmemxfer(DG a_dg, MSG a_msg, ref TW_SETUPMEMXFER a_twsetupmemxfer)\r\n        {\r\n            STS sts;\r\n\r\n            // Submit the work to the TWAIN thread...\r\n            if (m_runinuithreaddelegate == null)\r\n            {\r\n                if ((m_threadTwain != null) && (m_threadTwain.ManagedThreadId != Thread.CurrentThread.ManagedThreadId))\r\n                {\r\n                    lock (m_lockTwain)\r\n                    {\r\n                        // Set our command variables...\r\n                        ThreadData threaddata = default(ThreadData);\r\n                        threaddata.twsetupmemxfer = a_twsetupmemxfer;\r\n                        threaddata.dg = a_dg;\r\n                        threaddata.msg = a_msg;\r\n                        threaddata.dat = DAT.SETUPMEMXFER;\r\n                        long lIndex = m_twaincommand.Submit(threaddata);\r\n\r\n                        // Submit the command and wait for the reply...\r\n                        CallerToThreadSet();\r\n                        ThreadToCallerWaitOne();\r\n\r\n                        // Return the result...\r\n                        a_twsetupmemxfer = m_twaincommand.Get(lIndex).twsetupmemxfer;\r\n                        sts = m_twaincommand.Get(lIndex).sts;\r\n\r\n                        // Clear the command variables...\r\n                        m_twaincommand.Delete(lIndex);\r\n                    }\r\n                    return (sts);\r\n                }\r\n            }\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendBefore(a_dg.ToString(), DAT.SETUPMEMXFER.ToString(), a_msg.ToString(), \"\");\r\n            }\r\n\r\n            // Windows...\r\n            if (ms_platform == Platform.WINDOWS)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_threaddataDatSetupmemxfer.blIsInuse || (this.m_runinuithreaddelegate == null))\r\n                    {\r\n                        if (m_blUseLegacyDSM)\r\n                        {\r\n                            sts = (STS)NativeMethods.WindowsTwain32DsmEntrySetupmemxfer(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.SETUPMEMXFER, a_msg, ref a_twsetupmemxfer);\r\n                        }\r\n                        else\r\n                        {\r\n                            sts = (STS)NativeMethods.WindowsTwaindsmDsmEntrySetupmemxfer(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.SETUPMEMXFER, a_msg, ref a_twsetupmemxfer);\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        if (m_blUseLegacyDSM)\r\n                        {\r\n                            lock (m_lockTwain)\r\n                            {\r\n                                m_threaddataDatSetupmemxfer = default(ThreadData);\r\n                                m_threaddataDatSetupmemxfer.blIsInuse = true;\r\n                                m_threaddataDatSetupmemxfer.dg = a_dg;\r\n                                m_threaddataDatSetupmemxfer.msg = a_msg;\r\n                                m_threaddataDatSetupmemxfer.dat = DAT.SETUPMEMXFER;\r\n                                m_threaddataDatSetupmemxfer.twsetupmemxfer = a_twsetupmemxfer;\r\n                                RunInUiThread(DatSetupmemxferWindowsTwain32);\r\n                                a_twsetupmemxfer = m_threaddataDatSetupmemxfer.twsetupmemxfer;\r\n                                sts = m_threaddataDatSetupmemxfer.sts;\r\n                                m_threaddataDatSetupmemxfer = default(ThreadData);\r\n                            }\r\n                        }\r\n                        else\r\n                        {\r\n                            lock (m_lockTwain)\r\n                            {\r\n                                m_threaddataDatSetupmemxfer = default(ThreadData);\r\n                                m_threaddataDatSetupmemxfer.blIsInuse = true;\r\n                                m_threaddataDatSetupmemxfer.dg = a_dg;\r\n                                m_threaddataDatSetupmemxfer.msg = a_msg;\r\n                                m_threaddataDatSetupmemxfer.dat = DAT.SETUPMEMXFER;\r\n                                m_threaddataDatSetupmemxfer.twsetupmemxfer = a_twsetupmemxfer;\r\n                                RunInUiThread(DatSetupmemxferWindowsTwainDsm);\r\n                                a_twsetupmemxfer = m_threaddataDatSetupmemxfer.twsetupmemxfer;\r\n                                sts = m_threaddataDatSetupmemxfer.sts;\r\n                                m_threaddataDatSetupmemxfer = default(ThreadData);\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Linux...\r\n            else if (ms_platform == Platform.LINUX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blFoundLatestDsm64 && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux64DsmEntrySetupmemxfer(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.SETUPMEMXFER, a_msg, ref a_twsetupmemxfer);\r\n                    }\r\n                    else if (m_blFoundLatestDsm && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.LinuxDsmEntrySetupmemxfer(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.SETUPMEMXFER, a_msg, ref a_twsetupmemxfer);\r\n                    }\r\n                    else if (m_blFound020302Dsm64bit && (m_linuxdsm == LinuxDsm.Is020302Dsm64bit))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux020302Dsm64bitEntrySetupmemxfer(ref m_twidentityApp, ref m_twidentityDs, a_dg, DAT.SETUPMEMXFER, a_msg, ref a_twsetupmemxfer);\r\n                    }\r\n                    else\r\n                    {\r\n                        Log.Error(\"apparently we don't have a DSM...\");\r\n                        sts = STS.BUMMER;\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Mac OS X, which has to be different...\r\n            else if (ms_platform == Platform.MACOSX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwainDsmEntrySetupmemxfer(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.SETUPMEMXFER, a_msg, ref a_twsetupmemxfer);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwaindsmDsmEntrySetupmemxfer(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.SETUPMEMXFER, a_msg, ref a_twsetupmemxfer);\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Uh-oh...\r\n            else\r\n            {\r\n                Log.LogSendAfter(STS.BUMMER, \"\");\r\n                return (STS.BUMMER);\r\n            }\r\n\r\n            // Get DAT_STATUS, if needed...\r\n            TWAIN.STS stsRcOrCc = AutoDatStatus(sts);\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendAfter(stsRcOrCc, SetupmemxferToCsv(a_twsetupmemxfer));\r\n            }\r\n\r\n            // All done...\r\n            return (stsRcOrCc);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Get some text for an error...\r\n        /// </summary>\r\n        /// <param name=\"a_dg\">Data group</param>\r\n        /// <param name=\"a_msg\">Operation</param>\r\n        /// <param name=\"a_twstatus\">STATUS structure</param>\r\n        /// <returns>TWAIN status</returns>\r\n        private void DatStatusWindowsTwain32()\r\n        {\r\n            // If you get a first chance exception, be aware that some drivers\r\n            // will do that to you, you can ignore it and they'll keep going...\r\n            m_threaddataDatStatus.sts = (STS)NativeMethods.WindowsTwain32DsmEntryStatus\r\n            (\r\n                ref m_twidentitylegacyApp,\r\n                ref m_twidentitylegacyDs,\r\n                m_threaddataDatStatus.dg,\r\n                m_threaddataDatStatus.dat,\r\n                m_threaddataDatStatus.msg,\r\n                ref m_threaddataDatStatus.twstatus\r\n            );\r\n        }\r\n        private void DatStatusWindowsTwainDsm()\r\n        {\r\n            // If you get a first chance exception, be aware that some drivers\r\n            // will do that to you, you can ignore it and they'll keep going...\r\n            m_threaddataDatStatus.sts = (STS)NativeMethods.WindowsTwaindsmDsmEntryStatus\r\n            (\r\n                ref m_twidentitylegacyApp,\r\n                ref m_twidentitylegacyDs,\r\n                m_threaddataDatStatus.dg,\r\n                m_threaddataDatStatus.dat,\r\n                m_threaddataDatStatus.msg,\r\n                ref m_threaddataDatStatus.twstatus\r\n            );\r\n        }\r\n        public STS DatStatus(DG a_dg, MSG a_msg, ref TW_STATUS a_twstatus)\r\n        {\r\n            STS sts;\r\n\r\n            // Submit the work to the TWAIN thread...\r\n            if (m_runinuithreaddelegate == null)\r\n            {\r\n                if ((m_threadTwain != null) && (m_threadTwain.ManagedThreadId != Thread.CurrentThread.ManagedThreadId))\r\n                {\r\n                    lock (m_lockTwain)\r\n                    {\r\n                        // Set our command variables...\r\n                        ThreadData threaddata = default(ThreadData);\r\n                        threaddata.twstatus = a_twstatus;\r\n                        threaddata.dg = a_dg;\r\n                        threaddata.msg = a_msg;\r\n                        threaddata.dat = DAT.STATUS;\r\n                        long lIndex = m_twaincommand.Submit(threaddata);\r\n\r\n                        // Submit the command and wait for the reply...\r\n                        CallerToThreadSet();\r\n                        ThreadToCallerWaitOne();\r\n\r\n                        // Return the result...\r\n                        a_twstatus = m_twaincommand.Get(lIndex).twstatus;\r\n                        sts = m_twaincommand.Get(lIndex).sts;\r\n\r\n                        // Clear the command variables...\r\n                        m_twaincommand.Delete(lIndex);\r\n                    }\r\n                    return (sts);\r\n                }\r\n            }\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendBefore(a_dg.ToString(), DAT.STATUS.ToString(), a_msg.ToString(), \"\");\r\n            }\r\n\r\n            // Windows...\r\n            if (ms_platform == Platform.WINDOWS)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_threaddataDatStatus.blIsInuse || (this.m_runinuithreaddelegate == null))\r\n                    {\r\n                        if (m_blUseLegacyDSM)\r\n                        {\r\n                            sts = (STS)NativeMethods.WindowsTwain32DsmEntryStatus(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.STATUS, a_msg, ref a_twstatus);\r\n                        }\r\n                        else\r\n                        {\r\n                            sts = (STS)NativeMethods.WindowsTwaindsmDsmEntryStatus(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.STATUS, a_msg, ref a_twstatus);\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        if (m_blUseLegacyDSM)\r\n                        {\r\n                            lock (m_lockTwain)\r\n                            {\r\n                                m_threaddataDatStatus = default(ThreadData);\r\n                                m_threaddataDatStatus.blIsInuse = true;\r\n                                m_threaddataDatStatus.dg = a_dg;\r\n                                m_threaddataDatStatus.msg = a_msg;\r\n                                m_threaddataDatStatus.dat = DAT.STATUS;\r\n                                m_threaddataDatStatus.twstatus = a_twstatus;\r\n                                RunInUiThread(DatStatusWindowsTwain32);\r\n                                a_twstatus = m_threaddataDatStatus.twstatus;\r\n                                sts = m_threaddataDatStatus.sts;\r\n                                m_threaddataDatStatus = default(ThreadData);\r\n                            }\r\n                        }\r\n                        else\r\n                        {\r\n                            lock (m_lockTwain)\r\n                            {\r\n                                m_threaddataDatStatus = default(ThreadData);\r\n                                m_threaddataDatStatus.blIsInuse = true;\r\n                                m_threaddataDatStatus.dg = a_dg;\r\n                                m_threaddataDatStatus.msg = a_msg;\r\n                                m_threaddataDatStatus.dat = DAT.STATUS;\r\n                                m_threaddataDatStatus.twstatus = a_twstatus;\r\n                                RunInUiThread(DatStatusWindowsTwainDsm);\r\n                                a_twstatus = m_threaddataDatStatus.twstatus;\r\n                                sts = m_threaddataDatStatus.sts;\r\n                                m_threaddataDatStatus = default(ThreadData);\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Linux...\r\n            else if (ms_platform == Platform.LINUX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blFoundLatestDsm64 && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux64DsmEntryStatus(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.STATUS, a_msg, ref a_twstatus);\r\n                    }\r\n                    else if (m_blFoundLatestDsm && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.LinuxDsmEntryStatus(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.STATUS, a_msg, ref a_twstatus);\r\n                    }\r\n                    else if (m_blFound020302Dsm64bit && (m_linuxdsm == LinuxDsm.Is020302Dsm64bit))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux020302Dsm64bitEntryStatus(ref m_twidentityApp, ref m_twidentityDs, a_dg, DAT.STATUS, a_msg, ref a_twstatus);\r\n                    }\r\n                    else\r\n                    {\r\n                        Log.Error(\"apparently we don't have a DSM...\");\r\n                        sts = STS.BUMMER;\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Mac OS X, which has to be different...\r\n            else if (ms_platform == Platform.MACOSX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwainDsmEntryStatus(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.STATUS, a_msg, ref a_twstatus);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwaindsmDsmEntryStatus(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.STATUS, a_msg, ref a_twstatus);\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Uh-oh...\r\n            else\r\n            {\r\n                Log.LogSendAfter(STS.BUMMER, \"\");\r\n                return (STS.BUMMER);\r\n            }\r\n\r\n            // Skip getting the status...  :)\r\n            TWAIN.STS stsRcOrCc = sts;\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendAfter(stsRcOrCc, \"\");\r\n            }\r\n\r\n            // All done...\r\n            return (stsRcOrCc);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Get some text for an error...\r\n        /// </summary>\r\n        /// <param name=\"a_dg\">Data group</param>\r\n        /// <param name=\"a_msg\">Operation</param>\r\n        /// <param name=\"a_twstatusutf8\">STATUSUTF8 structure</param>\r\n        /// <returns>TWAIN status</returns>\r\n        public STS DatStatusutf8(DG a_dg, MSG a_msg, ref TW_STATUSUTF8 a_twstatusutf8)\r\n        {\r\n            STS sts;\r\n\r\n            // Submit the work to the TWAIN thread...\r\n            if ((m_threadTwain != null) && (m_threadTwain.ManagedThreadId != Thread.CurrentThread.ManagedThreadId))\r\n            {\r\n                lock (m_lockTwain)\r\n                {\r\n                    // Set our command variables...\r\n                    ThreadData threaddata = default(ThreadData);\r\n                    threaddata.twstatusutf8 = a_twstatusutf8;\r\n                    threaddata.dg = a_dg;\r\n                    threaddata.msg = a_msg;\r\n                    threaddata.dat = DAT.STATUSUTF8;\r\n                    long lIndex = m_twaincommand.Submit(threaddata);\r\n\r\n                    // Submit the command and wait for the reply...\r\n                    CallerToThreadSet();\r\n                    ThreadToCallerWaitOne();\r\n\r\n                    // Return the result...\r\n                    a_twstatusutf8 = m_twaincommand.Get(lIndex).twstatusutf8;\r\n                    sts = m_twaincommand.Get(lIndex).sts;\r\n\r\n                    // Clear the command variables...\r\n                    m_twaincommand.Delete(lIndex);\r\n                }\r\n                return (sts);\r\n            }\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendBefore(a_dg.ToString(), DAT.STATUSUTF8.ToString(), a_msg.ToString(), \"\");\r\n            }\r\n\r\n            // Windows...\r\n            if (ms_platform == Platform.WINDOWS)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.WindowsTwain32DsmEntryStatusutf8(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.STATUSUTF8, a_msg, ref a_twstatusutf8);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.WindowsTwaindsmDsmEntryStatusutf8(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.STATUSUTF8, a_msg, ref a_twstatusutf8);\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Linux...\r\n            else if (ms_platform == Platform.LINUX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blFoundLatestDsm64 && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux64DsmEntryStatusutf8(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.STATUSUTF8, a_msg, ref a_twstatusutf8);\r\n                    }\r\n                    else if (m_blFoundLatestDsm && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.LinuxDsmEntryStatusutf8(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.STATUSUTF8, a_msg, ref a_twstatusutf8);\r\n                    }\r\n                    else if (m_blFound020302Dsm64bit && (m_linuxdsm == LinuxDsm.Is020302Dsm64bit))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux020302Dsm64bitEntryStatusutf8(ref m_twidentityApp, ref m_twidentityDs, a_dg, DAT.STATUSUTF8, a_msg, ref a_twstatusutf8);\r\n                    }\r\n                    else\r\n                    {\r\n                        Log.Error(\"apparently we don't have a DSM...\");\r\n                        sts = STS.BUMMER;\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Mac OS X, which has to be different...\r\n            else if (ms_platform == Platform.MACOSX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwainDsmEntryStatusutf8(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.STATUSUTF8, a_msg, ref a_twstatusutf8);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwaindsmDsmEntryStatusutf8(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.STATUSUTF8, a_msg, ref a_twstatusutf8);\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Uh-oh...\r\n            else\r\n            {\r\n                Log.LogSendAfter(STS.BUMMER, \"\");\r\n                return (STS.BUMMER);\r\n            }\r\n\r\n            // Get DAT_STATUS, if needed...\r\n            TWAIN.STS stsRcOrCc = AutoDatStatus(sts);\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendAfter(stsRcOrCc, \"\");\r\n            }\r\n\r\n            // All done...\r\n            return (stsRcOrCc);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Get some text for an error...\r\n        /// </summary>\r\n        /// <param name=\"a_dg\">Data group</param>\r\n        /// <param name=\"a_msg\">Operation</param>\r\n        /// <param name=\"a_twtwaindirect\">TWAINDIRECT structure</param>\r\n        /// <returns>TWAIN status</returns>\r\n        public STS DatTwaindirect(DG a_dg, MSG a_msg, ref TW_TWAINDIRECT a_twtwaindirect)\r\n        {\r\n            STS sts;\r\n\r\n            // Submit the work to the TWAIN thread...\r\n            if ((m_threadTwain != null) && (m_threadTwain.ManagedThreadId != Thread.CurrentThread.ManagedThreadId))\r\n            {\r\n                lock (m_lockTwain)\r\n                {\r\n                    // Set our command variables...\r\n                    ThreadData threaddata = default(ThreadData);\r\n                    threaddata.twtwaindirect = a_twtwaindirect;\r\n                    threaddata.dg = a_dg;\r\n                    threaddata.msg = a_msg;\r\n                    threaddata.dat = DAT.TWAINDIRECT;\r\n                    long lIndex = m_twaincommand.Submit(threaddata);\r\n\r\n                    // Submit the command and wait for the reply...\r\n                    CallerToThreadSet();\r\n                    ThreadToCallerWaitOne();\r\n\r\n                    // Return the result...\r\n                    a_twtwaindirect = m_twaincommand.Get(lIndex).twtwaindirect;\r\n                    sts = m_twaincommand.Get(lIndex).sts;\r\n\r\n                    // Clear the command variables...\r\n                    m_twaincommand.Delete(lIndex);\r\n                }\r\n                return (sts);\r\n            }\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendBefore(a_dg.ToString(), DAT.TWAINDIRECT.ToString(), a_msg.ToString(), \"\");\r\n            }\r\n\r\n            // Windows...\r\n            if (ms_platform == Platform.WINDOWS)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.WindowsTwain32DsmEntryTwaindirect(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.TWAINDIRECT, a_msg, ref a_twtwaindirect);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.WindowsTwaindsmDsmEntryTwaindirect(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.TWAINDIRECT, a_msg, ref a_twtwaindirect);\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Linux...\r\n            else if (ms_platform == Platform.LINUX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blFoundLatestDsm64 && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux64DsmEntryTwaindirect(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.TWAINDIRECT, a_msg, ref a_twtwaindirect);\r\n                    }\r\n                    else if (m_blFoundLatestDsm && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.LinuxDsmEntryTwaindirect(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.TWAINDIRECT, a_msg, ref a_twtwaindirect);\r\n                    }\r\n                    else if (m_blFound020302Dsm64bit && (m_linuxdsm == LinuxDsm.Is020302Dsm64bit))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux020302Dsm64bitEntryTwaindirect(ref m_twidentityApp, ref m_twidentityDs, a_dg, DAT.TWAINDIRECT, a_msg, ref a_twtwaindirect);\r\n                    }\r\n                    else\r\n                    {\r\n                        Log.Error(\"apparently we don't have a DSM...\");\r\n                        sts = STS.BUMMER;\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Mac OS X, which has to be different...\r\n            else if (ms_platform == Platform.MACOSX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwainDsmEntryTwaindirect(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.TWAINDIRECT, a_msg, ref a_twtwaindirect);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwaindsmDsmEntryTwaindirect(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.TWAINDIRECT, a_msg, ref a_twtwaindirect);\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Uh-oh...\r\n            else\r\n            {\r\n                Log.LogSendAfter(STS.BUMMER, \"\");\r\n                return (STS.BUMMER);\r\n            }\r\n\r\n            // Get DAT_STATUS, if needed...\r\n            TWAIN.STS stsRcOrCc = AutoDatStatus(sts);\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendAfter(stsRcOrCc, \"\");\r\n            }\r\n\r\n            // All done...\r\n            return (stsRcOrCc);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Issue capabilities commands...\r\n        /// </summary>\r\n        /// <param name=\"a_dg\">Data group</param>\r\n        /// <param name=\"a_msg\">Operation</param>\r\n        /// <param name=\"a_twuserinterface\">USERINTERFACE structure</param>\r\n        /// <returns>TWAIN status</returns>\r\n        private void DatUserinterfaceWindowsTwain32()\r\n        {\r\n            // If you get a first chance exception, be aware that some drivers\r\n            // will do that to you, you can ignore it and they'll keep going...\r\n            m_threaddataDatUserinterface.sts = (STS)NativeMethods.WindowsTwain32DsmEntryUserinterface\r\n            (\r\n                ref m_twidentitylegacyApp,\r\n                ref m_twidentitylegacyDs,\r\n                m_threaddataDatUserinterface.dg,\r\n                m_threaddataDatUserinterface.dat,\r\n                m_threaddataDatUserinterface.msg,\r\n                ref m_threaddataDatUserinterface.twuserinterface\r\n            );\r\n        }\r\n        private void DatUserinterfaceWindowsTwainDsm()\r\n        {\r\n            // If you get a first chance exception, be aware that some drivers\r\n            // will do that to you, you can ignore it and they'll keep going...\r\n            m_threaddataDatUserinterface.sts = (STS)NativeMethods.WindowsTwaindsmDsmEntryUserinterface\r\n            (\r\n                ref m_twidentitylegacyApp,\r\n                ref m_twidentitylegacyDs,\r\n                m_threaddataDatUserinterface.dg,\r\n                m_threaddataDatUserinterface.dat,\r\n                m_threaddataDatUserinterface.msg,\r\n                ref m_threaddataDatUserinterface.twuserinterface\r\n            );\r\n        }\r\n        public STS DatUserinterface(DG a_dg, MSG a_msg, ref TW_USERINTERFACE a_twuserinterface)\r\n        {\r\n            STS sts;\r\n\r\n            // Submit the work to the TWAIN thread...\r\n            if (this.m_runinuithreaddelegate == null)\r\n            {\r\n                if ((m_threadTwain != null) && (m_threadTwain.ManagedThreadId != Thread.CurrentThread.ManagedThreadId))\r\n                {\r\n                    lock (m_lockTwain)\r\n                    {\r\n                        // Set our command variables...\r\n                        ThreadData threaddata = default(ThreadData);\r\n                        threaddata.twuserinterface = a_twuserinterface;\r\n                        threaddata.twuserinterface.hParent = m_intptrHwnd;\r\n                        threaddata.dg = a_dg;\r\n                        threaddata.msg = a_msg;\r\n                        threaddata.dat = DAT.USERINTERFACE;\r\n                        long lIndex = m_twaincommand.Submit(threaddata);\r\n\r\n                        // Submit the command and wait for the reply...\r\n                        CallerToThreadSet();\r\n                        ThreadToCallerWaitOne();\r\n\r\n                        // Return the result...\r\n                        a_twuserinterface = m_twaincommand.Get(lIndex).twuserinterface;\r\n                        sts = m_twaincommand.Get(lIndex).sts;\r\n\r\n                        // Clear the command variables...\r\n                        m_twaincommand.Delete(lIndex);\r\n                    }\r\n                    return (sts);\r\n                }\r\n            }\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendBefore(a_dg.ToString(), DAT.USERINTERFACE.ToString(), a_msg.ToString(), UserinterfaceToCsv(a_twuserinterface));\r\n            }\r\n\r\n            // We need this to handle data sources that return MSG_XFERREADY in\r\n            // the midst of processing MSG_ENABLEDS, otherwise we'll miss it...\r\n            m_blAcceptXferReady = (a_msg == MSG.ENABLEDS);\r\n            m_blRunningDatUserinterface = (a_msg == MSG.ENABLEDS);\r\n\r\n            // Windows...\r\n            if (ms_platform == Platform.WINDOWS)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_threaddataDatUserinterface.blIsInuse || (this.m_runinuithreaddelegate == null))\r\n                    {\r\n                        if (m_blUseLegacyDSM)\r\n                        {\r\n                            sts = (STS)NativeMethods.WindowsTwain32DsmEntryUserinterface(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.USERINTERFACE, a_msg, ref a_twuserinterface);\r\n                        }\r\n                        else\r\n                        {\r\n                            sts = (STS)NativeMethods.WindowsTwaindsmDsmEntryUserinterface(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.USERINTERFACE, a_msg, ref a_twuserinterface);\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        if (m_blUseLegacyDSM)\r\n                        {\r\n                            lock (m_lockTwain)\r\n                            {\r\n                                m_threaddataDatUserinterface = default(ThreadData);\r\n                                m_threaddataDatUserinterface.blIsInuse = true;\r\n                                m_threaddataDatUserinterface.dg = a_dg;\r\n                                m_threaddataDatUserinterface.msg = a_msg;\r\n                                m_threaddataDatUserinterface.dat = DAT.USERINTERFACE;\r\n                                m_threaddataDatUserinterface.twuserinterface = a_twuserinterface;\r\n                                RunInUiThread(DatUserinterfaceWindowsTwain32);\r\n                                a_twuserinterface = m_threaddataDatUserinterface.twuserinterface;\r\n                                sts = m_threaddataDatUserinterface.sts;\r\n                                m_threaddataDatUserinterface = default(ThreadData);\r\n                            }\r\n                        }\r\n                        else\r\n                        {\r\n                            lock (m_lockTwain)\r\n                            {\r\n                                m_threaddataDatUserinterface = default(ThreadData);\r\n                                m_threaddataDatUserinterface.blIsInuse = true;\r\n                                m_threaddataDatUserinterface.dg = a_dg;\r\n                                m_threaddataDatUserinterface.msg = a_msg;\r\n                                m_threaddataDatUserinterface.dat = DAT.USERINTERFACE;\r\n                                m_threaddataDatUserinterface.twuserinterface = a_twuserinterface;\r\n                                RunInUiThread(DatUserinterfaceWindowsTwainDsm);\r\n                                a_twuserinterface = m_threaddataDatUserinterface.twuserinterface;\r\n                                sts = m_threaddataDatUserinterface.sts;\r\n                                m_threaddataDatUserinterface = default(ThreadData);\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    m_blRunningDatUserinterface = false;\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Linux...\r\n            else if (ms_platform == Platform.LINUX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blFoundLatestDsm64 && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux64DsmEntryUserinterface(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.USERINTERFACE, a_msg, ref a_twuserinterface);\r\n                    }\r\n                    else if (m_blFoundLatestDsm && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.LinuxDsmEntryUserinterface(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.USERINTERFACE, a_msg, ref a_twuserinterface);\r\n                    }\r\n                    else if (m_blFound020302Dsm64bit && (m_linuxdsm == LinuxDsm.Is020302Dsm64bit))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux020302Dsm64bitEntryUserinterface(ref m_twidentityApp, ref m_twidentityDs, a_dg, DAT.USERINTERFACE, a_msg, ref a_twuserinterface);\r\n                    }\r\n                    else\r\n                    {\r\n                        Log.Error(\"apparently we don't have a DSM...\");\r\n                        sts = STS.BUMMER;\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    m_blRunningDatUserinterface = false;\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Mac OS X, which has to be different...\r\n            else if (ms_platform == Platform.MACOSX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwainDsmEntryUserinterface(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.USERINTERFACE, a_msg, ref a_twuserinterface);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwaindsmDsmEntryUserinterface(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.USERINTERFACE, a_msg, ref a_twuserinterface);\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    m_blRunningDatUserinterface = false;\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Uh-oh...\r\n            else\r\n            {\r\n                Log.LogSendAfter(STS.BUMMER, \"\");\r\n                m_blRunningDatUserinterface = false;\r\n                return (STS.BUMMER);\r\n            }\r\n\r\n            // Get DAT_STATUS, if needed...\r\n            TWAIN.STS stsRcOrCc = AutoDatStatus(sts);\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendAfter(stsRcOrCc, \"\");\r\n            }\r\n\r\n            // If successful, decide which way to jump...\r\n            if (sts == STS.SUCCESS)\r\n            {\r\n                switch (a_msg)\r\n                {\r\n                    // No clue...\r\n                    default:\r\n                        break;\r\n\r\n                    // Jump up...\r\n                    case MSG.ENABLEDS:\r\n                    case MSG.ENABLEDSUIONLY:\r\n                        m_state = STATE.S5;\r\n                        break;\r\n\r\n                    // Jump down...\r\n                    case MSG.DISABLEDS:\r\n                        m_blIsMsgclosedsreq = false;\r\n                        m_blIsMsgclosedsok = false;\r\n                        m_state = STATE.S4;\r\n                        break;\r\n                }\r\n            }\r\n\r\n            // All done...\r\n            m_blRunningDatUserinterface = false;\r\n            return (stsRcOrCc);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Get/Set the Xfer Group...\r\n        /// </summary>\r\n        /// <param name=\"a_dg\">Data group</param>\r\n        /// <param name=\"a_msg\">Operation</param>\r\n        /// <param name=\"a_twuint32\">XFERGROUP structure</param>\r\n        /// <returns>TWAIN status</returns>\r\n        public STS DatXferGroup(DG a_dg, MSG a_msg, ref UInt32 a_twuint32)\r\n        {\r\n            STS sts;\r\n\r\n            // Submit the work to the TWAIN thread...\r\n            if ((m_threadTwain != null) && (m_threadTwain.ManagedThreadId != Thread.CurrentThread.ManagedThreadId))\r\n            {\r\n                lock (m_lockTwain)\r\n                {\r\n                    // Set our command variables...\r\n                    ThreadData threaddata = default(ThreadData);\r\n                    threaddata.twuint32 = a_twuint32;\r\n                    threaddata.dg = a_dg;\r\n                    threaddata.msg = a_msg;\r\n                    threaddata.dat = DAT.XFERGROUP;\r\n                    long lIndex = m_twaincommand.Submit(threaddata);\r\n\r\n                    // Submit the command and wait for the reply...\r\n                    CallerToThreadSet();\r\n                    ThreadToCallerWaitOne();\r\n\r\n                    // Return the result...\r\n                    a_twuint32 = m_twaincommand.Get(lIndex).twuint32;\r\n                    sts = m_twaincommand.Get(lIndex).sts;\r\n\r\n                    // Clear the command variables...\r\n                    m_twaincommand.Delete(lIndex);\r\n                }\r\n                return (sts);\r\n            }\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendBefore(a_dg.ToString(), DAT.XFERGROUP.ToString(), a_msg.ToString(), XfergroupToCsv(a_twuint32));\r\n            }\r\n\r\n            // Windows...\r\n            if (ms_platform == Platform.WINDOWS)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.WindowsTwain32DsmEntryXfergroup(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.XFERGROUP, a_msg, ref a_twuint32);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.WindowsTwaindsmDsmEntryXfergroup(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.XFERGROUP, a_msg, ref a_twuint32);\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Linux...\r\n            else if (ms_platform == Platform.LINUX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blFoundLatestDsm64 && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux64DsmEntryXfergroup(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.XFERGROUP, a_msg, ref a_twuint32);\r\n                    }\r\n                    else if (m_blFoundLatestDsm && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        sts = (STS)NativeMethods.LinuxDsmEntryXfergroup(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, a_dg, DAT.XFERGROUP, a_msg, ref a_twuint32);\r\n                    }\r\n                    else if (m_blFound020302Dsm64bit && (m_linuxdsm == LinuxDsm.Is020302Dsm64bit))\r\n                    {\r\n                        sts = (STS)NativeMethods.Linux020302Dsm64bitEntryXfergroup(ref m_twidentityApp, ref m_twidentityDs, a_dg, DAT.XFERGROUP, a_msg, ref a_twuint32);\r\n                    }\r\n                    else\r\n                    {\r\n                        Log.Error(\"apparently we don't have a DSM...\");\r\n                        sts = STS.BUMMER;\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Mac OS X, which has to be different...\r\n            else if (ms_platform == Platform.MACOSX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwainDsmEntryXfergroup(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.XFERGROUP, a_msg, ref a_twuint32);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwaindsmDsmEntryXfergroup(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, a_dg, DAT.XFERGROUP, a_msg, ref a_twuint32);\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    Log.LogSendAfter(STS.BUMMER, \"\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Uh-oh...\r\n            else\r\n            {\r\n                Log.LogSendAfter(STS.BUMMER, \"\");\r\n                return (STS.BUMMER);\r\n            }\r\n\r\n            // Get DAT_STATUS, if needed...\r\n            TWAIN.STS stsRcOrCc = AutoDatStatus(sts);\r\n\r\n            // Log it...\r\n            if (Log.GetLevel() > 0)\r\n            {\r\n                Log.LogSendAfter(stsRcOrCc, XfergroupToCsv(a_twuint32));\r\n            }\r\n\r\n            // All done...\r\n            return (stsRcOrCc);\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        // Public Definitions, this is where you get the callback definitions for\r\n        // handling device events and scanning...\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        #region Public Definitions...\r\n\r\n        /// <summary>\r\n        /// The form of the device event callback used by the caller when they are\r\n        /// running in states 4, 5, 6 and 7...\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public delegate STS DeviceEventCallback();\r\n\r\n        /// <summary>\r\n        /// The form of the callback used by the caller when they are running\r\n        /// in states 5, 6 and 7; anything after DG_CONTROL / DAT_USERINTERFACE /\r\n        /// MSG_ENABLEDS* until DG_CONTROL / DAT_USERINTERFACE / MSG_DISABLEDS...\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public delegate STS ScanCallback(bool a_blClosing);\r\n\r\n        /// <summary>\r\n        /// We use this to run code in the context of the caller's UI thread...\r\n        /// </summary>\r\n        /// <param name=\"a_action\">code to run</param>\r\n        public delegate void RunInUiThreadDelegate(Action a_action);\r\n\r\n        /// <summary>\r\n        /// Only one DSM can be installed on a Linux system, and it must match\r\n        /// the architecture.  To handle the legacy problem due to the bad\r\n        /// definition of TW_INT32/TW_UINT32, we also support access to the\r\n        /// 64-bit 2.3.2 DSM.  This is only used if we see a driver that seems\r\n        /// to be returning garbage for its TW_IDENTITY...\r\n        /// </summary>\r\n        public enum LinuxDsm\r\n        {\r\n            Unknown,\r\n            IsLatestDsm,\r\n            Is020302Dsm64bit\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        // Private Definitions (TIFF): this stuff should have been here all along to\r\n        // make it easier to share.  It's only needed when writing out files from\r\n        // DAT_IMAGEMEMXFER data.\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        #region Private Definitions (TIFF)...\r\n\r\n        // A TIFF header is composed of tags...\r\n        [StructLayout(LayoutKind.Sequential, Pack = 2)]\r\n        public struct TiffTag\r\n        {\r\n            public TiffTag(ushort a_u16Tag, ushort a_u16Type, uint a_u32Count, uint a_u32Value)\r\n            {\r\n                u16Tag = a_u16Tag;\r\n                u16Type = a_u16Type;\r\n                u32Count = a_u32Count;\r\n                u32Value = a_u32Value;\r\n            }\r\n\r\n            public ushort u16Tag;\r\n            public ushort u16Type;\r\n            public uint u32Count;\r\n            public uint u32Value;\r\n        }\r\n\r\n        // TIFF header for Uncompressed BITONAL images...\r\n        [StructLayout(LayoutKind.Sequential, Pack = 2)]\r\n        public struct TiffBitonalUncompressed\r\n        {\r\n            // Constructor...\r\n            public TiffBitonalUncompressed(uint a_u32Width, uint a_u32Height, uint a_u32Resolution, uint a_u32Size)\r\n            {\r\n                // Header...\r\n                u16ByteOrder = 0x4949;\r\n                u16Version = 42;\r\n                u32OffsetFirstIFD = 8;\r\n\r\n                // First IFD...\r\n                u16IFD = 16;\r\n\r\n                // Tags...\r\n                tifftagNewSubFileType = new TiffTag(254, 4, 1, 0);\r\n                tifftagSubFileType = new TiffTag(255, 3, 1, 1);\r\n                tifftagImageWidth = new TiffTag(256, 4, 1, a_u32Width);\r\n                tifftagImageLength = new TiffTag(257, 4, 1, a_u32Height);\r\n                tifftagBitsPerSample = new TiffTag(258, 3, 1, 1);\r\n                tifftagCompression = new TiffTag(259, 3, 1, 1);\r\n                tifftagPhotometricInterpretation = new TiffTag(262, 3, 1, 1);\r\n                tifftagFillOrder = new TiffTag(266, 3, 1, 1);\r\n                tifftagStripOffsets = new TiffTag(273, 4, 1, 222);\r\n                tifftagSamplesPerPixel = new TiffTag(277, 3, 1, 1);\r\n                tifftagRowsPerStrip = new TiffTag(278, 4, 1, a_u32Height);\r\n                tifftagStripByteCounts = new TiffTag(279, 4, 1, a_u32Size);\r\n                tifftagXResolution = new TiffTag(282, 5, 1, 206);\r\n                tifftagYResolution = new TiffTag(283, 5, 1, 214);\r\n                tifftagT4T6Options = new TiffTag(292, 4, 1, 0);\r\n                tifftagResolutionUnit = new TiffTag(296, 3, 1, 2);\r\n\r\n                // Footer...\r\n                u32NextIFD = 0;\r\n                u64XResolution = (ulong)0x100000000 + (ulong)a_u32Resolution;\r\n                u64YResolution = (ulong)0x100000000 + (ulong)a_u32Resolution;\r\n            }\r\n\r\n            // Header...\r\n            public ushort u16ByteOrder;\r\n            public ushort u16Version;\r\n            public uint u32OffsetFirstIFD;\r\n\r\n            // First IFD...\r\n            public ushort u16IFD;\r\n\r\n            // Tags...\r\n            public TiffTag tifftagNewSubFileType;\r\n            public TiffTag tifftagSubFileType;\r\n            public TiffTag tifftagImageWidth;\r\n            public TiffTag tifftagImageLength;\r\n            public TiffTag tifftagBitsPerSample;\r\n            public TiffTag tifftagCompression;\r\n            public TiffTag tifftagPhotometricInterpretation;\r\n            public TiffTag tifftagFillOrder;\r\n            public TiffTag tifftagStripOffsets;\r\n            public TiffTag tifftagSamplesPerPixel;\r\n            public TiffTag tifftagRowsPerStrip;\r\n            public TiffTag tifftagStripByteCounts;\r\n            public TiffTag tifftagXResolution;\r\n            public TiffTag tifftagYResolution;\r\n            public TiffTag tifftagT4T6Options;\r\n            public TiffTag tifftagResolutionUnit;\r\n\r\n            // Footer...\r\n            public uint u32NextIFD;\r\n            public ulong u64XResolution;\r\n            public ulong u64YResolution;\r\n        }\r\n\r\n        // TIFF header for Group4 BITONAL images...\r\n        [StructLayout(LayoutKind.Sequential, Pack = 2)]\r\n        public struct TiffBitonalG4\r\n        {\r\n            // Constructor...\r\n            public TiffBitonalG4(uint a_u32Width, uint a_u32Height, uint a_u32Resolution, uint a_u32Size)\r\n            {\r\n                // Header...\r\n                u16ByteOrder = 0x4949;\r\n                u16Version = 42;\r\n                u32OffsetFirstIFD = 8;\r\n\r\n                // First IFD...\r\n                u16IFD = 16;\r\n\r\n                // Tags...\r\n                tifftagNewSubFileType = new TiffTag(254, 4, 1, 0);\r\n                tifftagSubFileType = new TiffTag(255, 3, 1, 1);\r\n                tifftagImageWidth = new TiffTag(256, 4, 1, a_u32Width);\r\n                tifftagImageLength = new TiffTag(257, 4, 1, a_u32Height);\r\n                tifftagBitsPerSample = new TiffTag(258, 3, 1, 1);\r\n                tifftagCompression = new TiffTag(259, 3, 1, 4);\r\n                tifftagPhotometricInterpretation = new TiffTag(262, 3, 1, 0);\r\n                tifftagFillOrder = new TiffTag(266, 3, 1, 1);\r\n                tifftagStripOffsets = new TiffTag(273, 4, 1, 222);\r\n                tifftagSamplesPerPixel = new TiffTag(277, 3, 1, 1);\r\n                tifftagRowsPerStrip = new TiffTag(278, 4, 1, a_u32Height);\r\n                tifftagStripByteCounts = new TiffTag(279, 4, 1, a_u32Size);\r\n                tifftagXResolution = new TiffTag(282, 5, 1, 206);\r\n                tifftagYResolution = new TiffTag(283, 5, 1, 214);\r\n                tifftagT4T6Options = new TiffTag(293, 4, 1, 0);\r\n                tifftagResolutionUnit = new TiffTag(296, 3, 1, 2);\r\n\r\n                // Footer...\r\n                u32NextIFD = 0;\r\n                u64XResolution = (ulong)0x100000000 + (ulong)a_u32Resolution;\r\n                u64YResolution = (ulong)0x100000000 + (ulong)a_u32Resolution;\r\n            }\r\n\r\n            // Header...\r\n            public ushort u16ByteOrder;\r\n            public ushort u16Version;\r\n            public uint u32OffsetFirstIFD;\r\n\r\n            // First IFD...\r\n            public ushort u16IFD;\r\n\r\n            // Tags...\r\n            public TiffTag tifftagNewSubFileType;\r\n            public TiffTag tifftagSubFileType;\r\n            public TiffTag tifftagImageWidth;\r\n            public TiffTag tifftagImageLength;\r\n            public TiffTag tifftagBitsPerSample;\r\n            public TiffTag tifftagCompression;\r\n            public TiffTag tifftagPhotometricInterpretation;\r\n            public TiffTag tifftagFillOrder;\r\n            public TiffTag tifftagStripOffsets;\r\n            public TiffTag tifftagSamplesPerPixel;\r\n            public TiffTag tifftagRowsPerStrip;\r\n            public TiffTag tifftagStripByteCounts;\r\n            public TiffTag tifftagXResolution;\r\n            public TiffTag tifftagYResolution;\r\n            public TiffTag tifftagT4T6Options;\r\n            public TiffTag tifftagResolutionUnit;\r\n\r\n            // Footer...\r\n            public uint u32NextIFD;\r\n            public ulong u64XResolution;\r\n            public ulong u64YResolution;\r\n        }\r\n\r\n        // TIFF header for Uncompressed GRAYSCALE images...\r\n        [StructLayout(LayoutKind.Sequential, Pack = 2)]\r\n        public struct TiffGrayscaleUncompressed\r\n        {\r\n            // Constructor...\r\n            public TiffGrayscaleUncompressed(uint a_u32Width, uint a_u32Height, uint a_u32Resolution, uint a_u32Size)\r\n            {\r\n                // Header...\r\n                u16ByteOrder = 0x4949;\r\n                u16Version = 42;\r\n                u32OffsetFirstIFD = 8;\r\n\r\n                // First IFD...\r\n                u16IFD = 14;\r\n\r\n                // Tags...\r\n                tifftagNewSubFileType = new TiffTag(254, 4, 1, 0);\r\n                tifftagSubFileType = new TiffTag(255, 3, 1, 1);\r\n                tifftagImageWidth = new TiffTag(256, 4, 1, a_u32Width);\r\n                tifftagImageLength = new TiffTag(257, 4, 1, a_u32Height);\r\n                tifftagBitsPerSample = new TiffTag(258, 3, 1, 8);\r\n                tifftagCompression = new TiffTag(259, 3, 1, 1);\r\n                tifftagPhotometricInterpretation = new TiffTag(262, 3, 1, 1);\r\n                tifftagStripOffsets = new TiffTag(273, 4, 1, 198);\r\n                tifftagSamplesPerPixel = new TiffTag(277, 3, 1, 1);\r\n                tifftagRowsPerStrip = new TiffTag(278, 4, 1, a_u32Height);\r\n                tifftagStripByteCounts = new TiffTag(279, 4, 1, a_u32Size);\r\n                tifftagXResolution = new TiffTag(282, 5, 1, 182);\r\n                tifftagYResolution = new TiffTag(283, 5, 1, 190);\r\n                tifftagResolutionUnit = new TiffTag(296, 3, 1, 2);\r\n\r\n                // Footer...\r\n                u32NextIFD = 0;\r\n                u64XResolution = (ulong)0x100000000 + (ulong)a_u32Resolution;\r\n                u64YResolution = (ulong)0x100000000 + (ulong)a_u32Resolution;\r\n            }\r\n\r\n            // Header...\r\n            public ushort u16ByteOrder;\r\n            public ushort u16Version;\r\n            public uint u32OffsetFirstIFD;\r\n\r\n            // First IFD...\r\n            public ushort u16IFD;\r\n\r\n            // Tags...\r\n            public TiffTag tifftagNewSubFileType;\r\n            public TiffTag tifftagSubFileType;\r\n            public TiffTag tifftagImageWidth;\r\n            public TiffTag tifftagImageLength;\r\n            public TiffTag tifftagBitsPerSample;\r\n            public TiffTag tifftagCompression;\r\n            public TiffTag tifftagPhotometricInterpretation;\r\n            public TiffTag tifftagStripOffsets;\r\n            public TiffTag tifftagSamplesPerPixel;\r\n            public TiffTag tifftagRowsPerStrip;\r\n            public TiffTag tifftagStripByteCounts;\r\n            public TiffTag tifftagXResolution;\r\n            public TiffTag tifftagYResolution;\r\n            public TiffTag tifftagResolutionUnit;\r\n\r\n            // Footer...\r\n            public uint u32NextIFD;\r\n            public ulong u64XResolution;\r\n            public ulong u64YResolution;\r\n        }\r\n\r\n        // TIFF header for Uncompressed COLOR images...\r\n        [StructLayout(LayoutKind.Sequential, Pack = 2)]\r\n        public struct TiffColorUncompressed\r\n        {\r\n            // Constructor...\r\n            public TiffColorUncompressed(uint a_u32Width, uint a_u32Height, uint a_u32Resolution, uint a_u32Size)\r\n            {\r\n                // Header...\r\n                u16ByteOrder = 0x4949;\r\n                u16Version = 42;\r\n                u32OffsetFirstIFD = 8;\r\n\r\n                // First IFD...\r\n                u16IFD = 14;\r\n\r\n                // Tags...\r\n                tifftagNewSubFileType = new TiffTag(254, 4, 1, 0);\r\n                tifftagSubFileType = new TiffTag(255, 3, 1, 1);\r\n                tifftagImageWidth = new TiffTag(256, 4, 1, a_u32Width);\r\n                tifftagImageLength = new TiffTag(257, 4, 1, a_u32Height);\r\n                tifftagBitsPerSample = new TiffTag(258, 3, 3, 182);\r\n                tifftagCompression = new TiffTag(259, 3, 1, 1);\r\n                tifftagPhotometricInterpretation = new TiffTag(262, 3, 1, 2);\r\n                tifftagStripOffsets = new TiffTag(273, 4, 1, 204);\r\n                tifftagSamplesPerPixel = new TiffTag(277, 3, 1, 3);\r\n                tifftagRowsPerStrip = new TiffTag(278, 4, 1, a_u32Height);\r\n                tifftagStripByteCounts = new TiffTag(279, 4, 1, a_u32Size);\r\n                tifftagXResolution = new TiffTag(282, 5, 1, 188);\r\n                tifftagYResolution = new TiffTag(283, 5, 1, 196);\r\n                tifftagResolutionUnit = new TiffTag(296, 3, 1, 2);\r\n\r\n                // Footer...\r\n                u32NextIFD = 0;\r\n                u16XBitsPerSample1 = 8;\r\n                u16XBitsPerSample2 = 8;\r\n                u16XBitsPerSample3 = 8;\r\n                u64XResolution = (ulong)0x100000000 + (ulong)a_u32Resolution;\r\n                u64YResolution = (ulong)0x100000000 + (ulong)a_u32Resolution;\r\n            }\r\n\r\n            // Header...\r\n            public ushort u16ByteOrder;\r\n            public ushort u16Version;\r\n            public uint u32OffsetFirstIFD;\r\n\r\n            // First IFD...\r\n            public ushort u16IFD;\r\n\r\n            // Tags...\r\n            public TiffTag tifftagNewSubFileType;\r\n            public TiffTag tifftagSubFileType;\r\n            public TiffTag tifftagImageWidth;\r\n            public TiffTag tifftagImageLength;\r\n            public TiffTag tifftagBitsPerSample;\r\n            public TiffTag tifftagCompression;\r\n            public TiffTag tifftagPhotometricInterpretation;\r\n            public TiffTag tifftagStripOffsets;\r\n            public TiffTag tifftagSamplesPerPixel;\r\n            public TiffTag tifftagRowsPerStrip;\r\n            public TiffTag tifftagStripByteCounts;\r\n            public TiffTag tifftagXResolution;\r\n            public TiffTag tifftagYResolution;\r\n            public TiffTag tifftagResolutionUnit;\r\n\r\n            // Footer...\r\n            public uint u32NextIFD;\r\n            public ushort u16XBitsPerSample1;\r\n            public ushort u16XBitsPerSample2;\r\n            public ushort u16XBitsPerSample3;\r\n            public ulong u64XResolution;\r\n            public ulong u64YResolution;\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        // Private Functions, the main thread is in here...\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        #region Private Functions...\r\n\r\n        /// <summary>\r\n        /// Cleanup...\r\n        /// </summary>\r\n        /// <param name=\"a_blDisposing\">true if we need to clean up managed resources</param>\r\n        [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]\r\n        internal void Dispose(bool a_blDisposing)\r\n        {\r\n            // Free managed resources...\r\n            if (a_blDisposing)\r\n            {\r\n                // Make sure we've closed any drivers...\r\n                Rollback(TWAIN.STATE.S2);\r\n\r\n                // Make sure that our thread is gone...\r\n                if (m_threadTwain != null)\r\n                {\r\n                    m_threadTwain.Join();\r\n                    m_threadTwain = null;\r\n                }\r\n\r\n                // This one too...\r\n                if (m_threadRunningDatUserinterface != null)\r\n                {\r\n                    m_threadRunningDatUserinterface.Join();\r\n                    m_threadRunningDatUserinterface = null;\r\n                }\r\n\r\n                // Clean up our communication thingy...\r\n                m_twaincommand = null;\r\n\r\n                // Cleanup...\r\n                if (m_autoreseteventCaller != null)\r\n                {\r\n                    m_autoreseteventCaller.Close();\r\n                    m_autoreseteventCaller = null;\r\n                }\r\n                if (m_autoreseteventThread != null)\r\n                {\r\n                    m_autoreseteventThread.Close();\r\n                    m_autoreseteventThread = null;\r\n                }\r\n                if (m_autoreseteventRollback != null)\r\n                {\r\n                    m_autoreseteventRollback.Close();\r\n                    m_autoreseteventRollback = null;\r\n                }\r\n                if (m_autoreseteventThreadStarted != null)\r\n                {\r\n                    m_autoreseteventThreadStarted.Close();\r\n                    m_autoreseteventThreadStarted = null;\r\n                }\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// This is our main loop where we issue commands to the TWAIN\r\n        /// object on behalf of the caller.  This function runs in its\r\n        /// own thread...\r\n        /// </summary>\r\n        private void Main()\r\n        {\r\n            bool blRunning;\r\n            bool blScanning;\r\n            long lIndex;\r\n            ThreadData threaddata;\r\n\r\n            // Okay, we're ready to run...\r\n            m_autoreseteventThreadStarted.Set();\r\n            Log.Info(\"main>>> thread started...\");\r\n\r\n            //\r\n            // We have three different ways of driving the TWAIN driver...\r\n            //\r\n            // First, we can accept a direct command from the user for commands\r\n            // that move from state 2 to state 4, and for any commands that are\r\n            // issued in state 4.\r\n            //\r\n            // Second, we have a scanning callback function, that operates when\r\n            // we are transferring images; this means that we don't want the\r\n            // user making those calls directly.\r\n            //\r\n            // Third, we have a rollback function, that allows the calls to\r\n            // move anywhere from state 7 to state 2; what this means is that we\r\n            // don't want the user making those calls directly.\r\n            //\r\n            // The trick is to move smoothly between these three styles of\r\n            // access, and what we find is that the first and second are pretty\r\n            // easy to do, but the third one is tricky...\r\n            //\r\n            blRunning = true;\r\n            blScanning = false;\r\n            while (blRunning)\r\n            {\r\n                // Get the next item, if we don't have anything, then we may\r\n                // need to wait...\r\n                if (!m_twaincommand.GetNext(out lIndex, out threaddata))\r\n                {\r\n                    // If we're not scanning, then wait for a command to wake\r\n                    // us up...\r\n                    if (!blScanning)\r\n                    {\r\n                        CallerToThreadWaitOne();\r\n                        m_twaincommand.GetNext(out lIndex, out threaddata);\r\n                    }\r\n                }\r\n\r\n                // Leave...now...\r\n                if (threaddata.blExitThread)\r\n                {\r\n                    m_twaincommand.Complete(lIndex, threaddata);\r\n                    m_scancallback(true);\r\n                    ThreadToCallerSet();\r\n                    ThreadToRollbackSet();\r\n                    return;\r\n                }\r\n\r\n                // Process device events...\r\n                if (IsMsgDeviceEvent())\r\n                {\r\n                    m_deviceeventcallback();\r\n                }\r\n\r\n                // We don't have a direct command, it's either a rollback request,\r\n                // a request to run the scan callback, or its a false positive,\r\n                // which we can safely ignore...\r\n                if (threaddata.dat == default(DAT))\r\n                {\r\n                    // The caller has asked us to rollback the state machine...\r\n                    if (threaddata.blRollback)\r\n                    {\r\n                        threaddata.blRollback = false;\r\n                        Rollback(threaddata.stateRollback);\r\n                        blScanning = (threaddata.stateRollback >= STATE.S5);\r\n                        blRunning = (threaddata.stateRollback > STATE.S2);\r\n                        if (!blRunning)\r\n                        {\r\n                            m_scancallback(true);\r\n                        }\r\n                        ThreadToRollbackSet();\r\n                    }\r\n\r\n                    // Callback stuff here between MSG_ENABLEDS* and MSG_DISABLEDS...\r\n                    else if (GetState() >= STATE.S5)\r\n                    {\r\n                        m_scancallback(false);\r\n                        blScanning = true;\r\n                    }\r\n\r\n                    // We're done scanning...\r\n                    else\r\n                    {\r\n                        blScanning = false;\r\n                    }\r\n\r\n                    // Tag the command as complete...\r\n                    m_twaincommand.Complete(lIndex, threaddata);\r\n\r\n                    // Go back to the top...\r\n                    continue;\r\n                }\r\n\r\n                // Otherwise, directly issue the command...\r\n                switch (threaddata.dat)\r\n                {\r\n                    // Unrecognized DAT...\r\n                    default:\r\n                        if (m_state < STATE.S4)\r\n                        {\r\n                            threaddata.sts = DsmEntryNullDest(threaddata.dg, threaddata.dat, threaddata.msg, threaddata.twmemref);\r\n                        }\r\n                        else\r\n                        {\r\n                            threaddata.sts = DsmEntry(threaddata.dg, threaddata.dat, threaddata.msg, threaddata.twmemref);\r\n                        }\r\n                        break;\r\n\r\n                    // Audio file xfer...\r\n                    case DAT.AUDIOFILEXFER:\r\n                        threaddata.sts = DatAudiofilexfer(threaddata.dg, threaddata.msg);\r\n                        break;\r\n\r\n                    // Audio info...\r\n                    case DAT.AUDIOINFO:\r\n                        threaddata.sts = DatAudioinfo(threaddata.dg, threaddata.msg, ref threaddata.twaudioinfo);\r\n                        break;\r\n\r\n                    // Audio native xfer...\r\n                    case DAT.AUDIONATIVEXFER:\r\n                        threaddata.sts = DatAudionativexfer(threaddata.dg, threaddata.msg, ref threaddata.intptrAudio);\r\n                        break;\r\n\r\n                    // Negotiation commands...\r\n                    case DAT.CAPABILITY:\r\n                        threaddata.sts = DatCapability(threaddata.dg, threaddata.msg, ref threaddata.twcapability);\r\n                        break;\r\n\r\n                    // CIE color...\r\n                    case DAT.CIECOLOR:\r\n                        threaddata.sts = DatCiecolor(threaddata.dg, threaddata.msg, ref threaddata.twciecolor);\r\n                        break;\r\n\r\n                    // Snapshots...\r\n                    case DAT.CUSTOMDSDATA:\r\n                        threaddata.sts = DatCustomdsdata(threaddata.dg, threaddata.msg, ref threaddata.twcustomdsdata);\r\n                        break;\r\n\r\n                    // Functions...\r\n                    case DAT.ENTRYPOINT:\r\n                        threaddata.sts = DatEntrypoint(threaddata.dg, threaddata.msg, ref threaddata.twentrypoint);\r\n                        break;\r\n\r\n                    // Image meta data...\r\n                    case DAT.EXTIMAGEINFO:\r\n                        threaddata.sts = DatExtimageinfo(threaddata.dg, threaddata.msg, ref threaddata.twextimageinfo);\r\n                        break;\r\n\r\n                    // Filesystem...\r\n                    case DAT.FILESYSTEM:\r\n                        threaddata.sts = DatFilesystem(threaddata.dg, threaddata.msg, ref threaddata.twfilesystem);\r\n                        break;\r\n\r\n                    // Filter...\r\n                    case DAT.FILTER:\r\n                        threaddata.sts = DatFilter(threaddata.dg, threaddata.msg, ref threaddata.twfilter);\r\n                        break;\r\n\r\n                    // Grayscale...\r\n                    case DAT.GRAYRESPONSE:\r\n                        threaddata.sts = DatGrayresponse(threaddata.dg, threaddata.msg, ref threaddata.twgrayresponse);\r\n                        break;\r\n\r\n                    // ICC color profiles...\r\n                    case DAT.ICCPROFILE:\r\n                        threaddata.sts = DatIccprofile(threaddata.dg, threaddata.msg, ref threaddata.twmemory);\r\n                        break;\r\n\r\n                    // Enumerate and Open commands...\r\n                    case DAT.IDENTITY:\r\n                        threaddata.sts = DatIdentity(threaddata.dg, threaddata.msg, ref threaddata.twidentity);\r\n                        break;\r\n\r\n                    // More meta data...\r\n                    case DAT.IMAGEINFO:\r\n                        threaddata.sts = DatImageinfo(threaddata.dg, threaddata.msg, ref threaddata.twimageinfo);\r\n                        break;\r\n\r\n                    // File xfer...\r\n                    case DAT.IMAGEFILEXFER:\r\n                        threaddata.sts = DatImagefilexfer(threaddata.dg, threaddata.msg);\r\n                        break;\r\n\r\n                    // Image layout commands...\r\n                    case DAT.IMAGELAYOUT:\r\n                        threaddata.sts = DatImagelayout(threaddata.dg, threaddata.msg, ref threaddata.twimagelayout);\r\n                        break;\r\n\r\n                    // Memory file transfer (yes, we're using TW_IMAGEMEMXFER, that's okay)...\r\n                    case DAT.IMAGEMEMFILEXFER:\r\n                        threaddata.sts = DatImagememfilexfer(threaddata.dg, threaddata.msg, ref threaddata.twimagememxfer);\r\n                        break;\r\n\r\n                    // Memory transfer...\r\n                    case DAT.IMAGEMEMXFER:\r\n                        threaddata.sts = DatImagememxfer(threaddata.dg, threaddata.msg, ref threaddata.twimagememxfer);\r\n                        break;\r\n\r\n                    // Native transfer...\r\n                    case DAT.IMAGENATIVEXFER:\r\n                        if (threaddata.blUseBitmapHandle)\r\n                        {\r\n                            threaddata.sts = DatImagenativexferHandle(threaddata.dg, threaddata.msg, ref threaddata.intptrBitmap);\r\n                        }\r\n                        else\r\n                        {\r\n                            threaddata.sts = DatImagenativexfer(threaddata.dg, threaddata.msg, ref threaddata.bitmap);\r\n                        }\r\n                        break;\r\n\r\n                    // JPEG compression...\r\n                    case DAT.JPEGCOMPRESSION:\r\n                        threaddata.sts = DatJpegcompression(threaddata.dg, threaddata.msg, ref threaddata.twjpegcompression);\r\n                        break;\r\n\r\n                    // Metrics...\r\n                    case DAT.METRICS:\r\n                        threaddata.sts = DatMetrics(threaddata.dg, threaddata.msg, ref threaddata.twmetrics);\r\n                        break;\r\n\r\n                    // Palette8...\r\n                    case DAT.PALETTE8:\r\n                        threaddata.sts = DatPalette8(threaddata.dg, threaddata.msg, ref threaddata.twpalette8);\r\n                        break;\r\n\r\n                    // DSM commands...\r\n                    case DAT.PARENT:\r\n                        threaddata.sts = DatParent(threaddata.dg, threaddata.msg, ref threaddata.intptrHwnd);\r\n                        break;\r\n\r\n                    // Raw commands...\r\n                    case DAT.PASSTHRU:\r\n                        threaddata.sts = DatPassthru(threaddata.dg, threaddata.msg, ref threaddata.twpassthru);\r\n                        break;\r\n\r\n                    // Pending transfers...\r\n                    case DAT.PENDINGXFERS:\r\n                        threaddata.sts = DatPendingxfers(threaddata.dg, threaddata.msg, ref threaddata.twpendingxfers);\r\n                        break;\r\n\r\n                    // RGB...\r\n                    case DAT.RGBRESPONSE:\r\n                        threaddata.sts = DatRgbresponse(threaddata.dg, threaddata.msg, ref threaddata.twrgbresponse);\r\n                        break;\r\n\r\n                    // Setup file transfer...\r\n                    case DAT.SETUPFILEXFER:\r\n                        threaddata.sts = DatSetupfilexfer(threaddata.dg, threaddata.msg, ref threaddata.twsetupfilexfer);\r\n                        break;\r\n\r\n                    // Get memory info...\r\n                    case DAT.SETUPMEMXFER:\r\n                        threaddata.sts = DatSetupmemxfer(threaddata.dg, threaddata.msg, ref threaddata.twsetupmemxfer);\r\n                        break;\r\n\r\n                    // Status...\r\n                    case DAT.STATUS:\r\n                        threaddata.sts = DatStatus(threaddata.dg, threaddata.msg, ref threaddata.twstatus);\r\n                        break;\r\n\r\n                    // Status text...\r\n                    case DAT.STATUSUTF8:\r\n                        threaddata.sts = DatStatusutf8(threaddata.dg, threaddata.msg, ref threaddata.twstatusutf8);\r\n                        break;\r\n\r\n                    // TWAIN Direct...\r\n                    case DAT.TWAINDIRECT:\r\n                        threaddata.sts = DatTwaindirect(threaddata.dg, threaddata.msg, ref threaddata.twtwaindirect);\r\n                        break;\r\n\r\n                    // Scan and GUI commands...\r\n                    case DAT.USERINTERFACE:\r\n                        threaddata.sts = DatUserinterface(threaddata.dg, threaddata.msg, ref threaddata.twuserinterface);\r\n                        if (threaddata.sts == STS.SUCCESS)\r\n                        {\r\n                            if ((threaddata.dg == DG.CONTROL) && (threaddata.dat == DAT.USERINTERFACE) && (threaddata.msg == MSG.DISABLEDS))\r\n                            {\r\n                                blScanning = false;\r\n                            }\r\n                            else if ((threaddata.dg == DG.CONTROL) && (threaddata.dat == DAT.USERINTERFACE) && (threaddata.msg == MSG.DISABLEDS))\r\n                            {\r\n                                if (threaddata.twuserinterface.ShowUI == 0)\r\n                                {\r\n                                    blScanning = true;\r\n                                }\r\n                            }\r\n                        }\r\n                        break;\r\n\r\n                    // Transfer group...\r\n                    case DAT.XFERGROUP:\r\n                        threaddata.sts = DatXferGroup(threaddata.dg, threaddata.msg, ref threaddata.twuint32);\r\n                        break;\r\n                }\r\n\r\n                // Report to the caller that we're done, and loop back up for another...\r\n                m_twaincommand.Complete(lIndex, threaddata);\r\n                ThreadToCallerSet();\r\n            }\r\n\r\n            // Some insurance to make sure we loosen up the caller...\r\n            m_scancallback(true);\r\n            ThreadToCallerSet();\r\n            return;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Use an event message to set the appropriate flags...\r\n        /// </summary>\r\n        /// <param name=\"a_msg\">Message to process</param>\r\n        private void ProcessEvent(MSG a_msg)\r\n        {\r\n            switch (a_msg)\r\n            {\r\n                // Do nothing...\r\n                default:\r\n                    break;\r\n\r\n                // If we're in state 5, then go to state 6...\r\n                case MSG.XFERREADY:\r\n                    if (m_blAcceptXferReady)\r\n                    {\r\n                        // Protect us from driver's that spam this event...\r\n                        m_blAcceptXferReady = false;\r\n\r\n                        // We're still processing DAT_USERINTERFACE, that's a kick the\r\n                        // teeth.  We can't wait for it here, so launch a thread to wait\r\n                        // for it to finish, so we can go to the next state as soon as\r\n                        // it's done...\r\n                        if (m_blRunningDatUserinterface)\r\n                        {\r\n                            m_threadRunningDatUserinterface = new Thread(RunningDatUserinterface);\r\n                            m_threadRunningDatUserinterface.Start();\r\n                            return;\r\n                        }\r\n\r\n                        // Change our state...\r\n                        m_state = STATE.S6;\r\n                        m_blIsMsgxferready = true;\r\n                        CallerToThreadSet();\r\n\r\n                        // Kick off the scan engine...\r\n                        if (m_scancallback != null)\r\n                        {\r\n                            m_scancallback(false);\r\n                        }\r\n                    }\r\n                    break;\r\n\r\n                // The cancel button was pressed...\r\n                case MSG.CLOSEDSREQ:\r\n                    m_blIsMsgclosedsreq = true;\r\n                    CallerToThreadSet();\r\n                    if (m_scancallback != null)\r\n                    {\r\n                        m_scancallback(false);\r\n                    }\r\n                    break;\r\n\r\n                // The OK button was pressed...\r\n                case MSG.CLOSEDSOK:\r\n                    m_blIsMsgclosedsok = true;\r\n                    CallerToThreadSet();\r\n                    if (m_scancallback != null)\r\n                    {\r\n                        m_scancallback(false);\r\n                    }\r\n                    break;\r\n\r\n                // A device event arrived...\r\n                case MSG.DEVICEEVENT:\r\n                    m_blIsMsgdeviceevent = true;\r\n                    CallerToThreadSet();\r\n                    break;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// As long as DAT_USERINTERFACE is running we'll spin here...\r\n        /// </summary>\r\n        private void RunningDatUserinterface()\r\n        {\r\n            // Wait until something kicks us out...\r\n            while ((m_state >= STATE.S4) && m_blRunningDatUserinterface)\r\n            {\r\n                Thread.Sleep(20);\r\n            }\r\n\r\n            // If we never made it to state 5, then bail...\r\n            if (m_state < STATE.S5)\r\n            {\r\n                return;\r\n            }\r\n\r\n            // Bump up our state...\r\n            m_state = STATE.S6;\r\n            m_blIsMsgxferready = true;\r\n            CallerToThreadSet();\r\n\r\n            // Kick off the scan engine...\r\n            if (m_scancallback != null)\r\n            {\r\n                m_scancallback(false);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// TWAIN needs help, if we want it to run stuff in our main\r\n        /// UI thread...\r\n        /// </summary>\r\n        /// <param name=\"code\">the code to run</param>\r\n        private void RunInUiThread(Action a_action)\r\n        {\r\n            m_runinuithreaddelegate(a_action);\r\n        }\r\n\r\n        /// <summary>\r\n        /// The caller is asking the thread to wake-up...\r\n        /// </summary>\r\n        private void CallerToThreadSet()\r\n        {\r\n            m_autoreseteventCaller.Set();\r\n        }\r\n\r\n        /// <summary>\r\n        /// The thread is waiting for the caller to wake it...\r\n        /// </summary>\r\n        private bool CallerToThreadWaitOne()\r\n        {\r\n            return (m_autoreseteventCaller.WaitOne());\r\n        }\r\n\r\n        /// <summary>\r\n        /// The common start to every capability csv...\r\n        /// </summary>\r\n        /// <param name=\"a_cap\">Capability number</param>\r\n        /// <param name=\"a_twon\">Container</param>\r\n        /// <param name=\"a_twty\">Data type</param>\r\n        /// <returns></returns>\r\n        private CSV Common(CAP a_cap, TWON a_twon, TWTY a_twty)\r\n        {\r\n            CSV csv = new CSV();\r\n\r\n            // Add the capability...\r\n            string szCap = a_cap.ToString();\r\n            if (!szCap.Contains(\"_\"))\r\n            {\r\n                szCap = \"0x\" + ((ushort)a_cap).ToString(\"X\");\r\n            }\r\n\r\n            // Build the CSV...\r\n            csv.Add(szCap);\r\n            csv.Add(\"TWON_\" + a_twon);\r\n            csv.Add(\"TWTY_\" + a_twty);\r\n\r\n            // And return it...\r\n            return (csv);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Has a device event arrived?  Make sure to clear it, because\r\n        /// we can get many of these.  We don't have to worry about a\r\n        /// race condition, because the caller is expected to drain the\r\n        /// driver of all events.\r\n        /// </summary>\r\n        /// <returns>True if a device event is pending</returns>\r\n        private bool IsMsgDeviceEvent()\r\n        {\r\n            if (m_blIsMsgdeviceevent)\r\n            {\r\n                m_blIsMsgdeviceevent = false;\r\n                return (true);\r\n            }\r\n            return (false);\r\n        }\r\n\r\n        /// <summary>\r\n        /// The thread is asking the caller to wake-up...\r\n        /// </summary>\r\n        private void ThreadToCallerSet()\r\n        {\r\n            m_autoreseteventThread.Set();\r\n        }\r\n\r\n        /// <summary>\r\n        /// The caller is waiting for the thread to wake it...\r\n        /// </summary>\r\n        /// <returns>Result of the wait</returns>\r\n        private bool ThreadToCallerWaitOne()\r\n        {\r\n            return (m_autoreseteventThread.WaitOne());\r\n        }\r\n\r\n        /// <summary>\r\n        /// The thread is asking the rollback to wake-up...\r\n        /// </summary>\r\n        private void ThreadToRollbackSet()\r\n        {\r\n            m_autoreseteventRollback.Set();\r\n        }\r\n\r\n        /// <summary>\r\n        /// The rollback is waiting for the thread to wake it...\r\n        /// </summary>\r\n        /// <returns>Result of the wait</returns>\r\n        private bool ThreadToRollbackWaitOne()\r\n        {\r\n            return (m_autoreseteventRollback.WaitOne());\r\n        }\r\n\r\n        /// <summary>\r\n        /// Automatically collect the condition code for TWRC_FAILURE's...\r\n        /// </summary>\r\n        /// <param name=\"a_sts\">The return code from the last operation</param>\r\n        /// <param name=\"a_sts\">The return code from the last operation</param>\r\n        /// <returns>The final statue return</returns>\r\n        private STS AutoDatStatus(STS a_sts)\r\n        {\r\n            STS sts;\r\n            TW_STATUS twstatus = new TW_STATUS();\r\n\r\n            // Automatic system is off, or the status is not TWRC_FAILURE, so just return the status we got...\r\n            if (!m_blAutoDatStatus || (a_sts != STS.FAILURE))\r\n            {\r\n                return (a_sts);\r\n            }\r\n\r\n            // Windows...\r\n            if (ms_platform == Platform.WINDOWS)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blUseLegacyDSM)\r\n                    {\r\n                        if (GetState() <= STATE.S3)\r\n                        {\r\n                            sts = (STS)NativeMethods.WindowsTwain32DsmEntryStatusState3(ref m_twidentitylegacyApp, IntPtr.Zero, DG.CONTROL, DAT.STATUS, MSG.GET, ref twstatus);\r\n                        }\r\n                        else\r\n                        {\r\n                            sts = (STS)NativeMethods.WindowsTwain32DsmEntryStatus(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, DG.CONTROL, DAT.STATUS, MSG.GET, ref twstatus);\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        if (GetState() <= STATE.S3)\r\n                        {\r\n                            sts = (STS)NativeMethods.WindowsTwaindsmDsmEntryStatusState3(ref m_twidentitylegacyApp, IntPtr.Zero, DG.CONTROL, DAT.STATUS, MSG.GET, ref twstatus);\r\n                        }\r\n                        else\r\n                        {\r\n                            sts = (STS)NativeMethods.WindowsTwaindsmDsmEntryStatus(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, DG.CONTROL, DAT.STATUS, MSG.GET, ref twstatus);\r\n                        }\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    TWAINWorkingGroup.Log.Error(\"Driver crash...\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Linux...\r\n            else if (ms_platform == Platform.LINUX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (m_blFoundLatestDsm64 && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        if (GetState() <= STATE.S3)\r\n                        {\r\n                            sts = (STS)NativeMethods.Linux64DsmEntryStatusState3(ref m_twidentitylegacyApp, IntPtr.Zero, DG.CONTROL, DAT.STATUS, MSG.GET, ref twstatus);\r\n                        }\r\n                        else\r\n                        {\r\n                            sts = (STS)NativeMethods.Linux64DsmEntryStatus(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, DG.CONTROL, DAT.STATUS, MSG.GET, ref twstatus);\r\n                        }\r\n                    }\r\n                    else if (m_blFoundLatestDsm && (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                    {\r\n                        if (GetState() <= STATE.S3)\r\n                        {\r\n                            sts = (STS)NativeMethods.LinuxDsmEntryStatusState3(ref m_twidentitylegacyApp, IntPtr.Zero, DG.CONTROL, DAT.STATUS, MSG.GET, ref twstatus);\r\n                        }\r\n                        else\r\n                        {\r\n                            sts = (STS)NativeMethods.LinuxDsmEntryStatus(ref m_twidentitylegacyApp, ref m_twidentitylegacyDs, DG.CONTROL, DAT.STATUS, MSG.GET, ref twstatus);\r\n                        }\r\n                    }\r\n                    else if (m_blFound020302Dsm64bit && (m_linuxdsm == LinuxDsm.Is020302Dsm64bit))\r\n                    {\r\n                        if (GetState() <= STATE.S3)\r\n                        {\r\n                            sts = (STS)NativeMethods.Linux020302Dsm64bitEntryStatusState3(ref m_twidentityApp, IntPtr.Zero, DG.CONTROL, DAT.STATUS, MSG.GET, ref twstatus);\r\n                        }\r\n                        else\r\n                        {\r\n                            sts = (STS)NativeMethods.Linux020302Dsm64bitEntryStatus(ref m_twidentityApp, ref m_twidentityDs, DG.CONTROL, DAT.STATUS, MSG.GET, ref twstatus);\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        Log.Error(\"apparently we don't have a DSM...\");\r\n                        sts = STS.BUMMER;\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    TWAINWorkingGroup.Log.Error(\"Driver crash...\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Mac OS X, which has to be different...\r\n            else if (ms_platform == Platform.MACOSX)\r\n            {\r\n                // Issue the command...\r\n                try\r\n                {\r\n                    if (GetState() <= STATE.S3)\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwainDsmEntryStatusState3(ref m_twidentitymacosxApp, IntPtr.Zero, DG.CONTROL, DAT.STATUS, MSG.GET, ref twstatus);\r\n                    }\r\n                    else\r\n                    {\r\n                        sts = (STS)NativeMethods.MacosxTwainDsmEntryStatus(ref m_twidentitymacosxApp, ref m_twidentitymacosxDs, DG.CONTROL, DAT.STATUS, MSG.GET, ref twstatus);\r\n                    }\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    // The driver crashed...\r\n                    Log.Error(\"crash - \" + exception.Message);\r\n                    TWAINWorkingGroup.Log.Error(\"Driver crash...\");\r\n                    return (STS.BUMMER);\r\n                }\r\n            }\r\n\r\n            // Uh-oh...\r\n            else\r\n            {\r\n                TWAINWorkingGroup.Log.Assert(\"Unsupported platform...\" + ms_platform);\r\n                return (STS.BUMMER);\r\n            }\r\n\r\n            // Uh-oh, the status call failed...\r\n            if (sts != STS.SUCCESS)\r\n            {\r\n                return (a_sts);\r\n            }\r\n\r\n            // All done...\r\n            return ((STS)(STSCC + twstatus.ConditionCode));\r\n        }\r\n\r\n        /// <summary>\r\n        /// 32-bit or 64-bit...\r\n        /// </summary>\r\n        /// <returns>Number of bits in the machine word for this process</returns>\r\n        public static int GetMachineWordBitSize()\r\n        {\r\n            return ((IntPtr.Size == 4) ? 32 : 64);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Quick access to our platform id...\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public static Platform GetPlatform()\r\n        {\r\n            // First pass...\r\n            if (ms_blFirstPassGetPlatform)\r\n            {\r\n                // Dont'c come in here again...\r\n                ms_blFirstPassGetPlatform = false;\r\n\r\n                // We're Windows...\r\n                if (Environment.OSVersion.ToString().Contains(\"Microsoft Windows\"))\r\n                {\r\n                    ms_platform = Platform.WINDOWS;\r\n                    ms_processor = (GetMachineWordBitSize() == 64) ? Processor.X86_64 : Processor.X86;\r\n                }\r\n\r\n                // We're Mac OS X (this has to come before LINUX!!!)...\r\n                else if (Directory.Exists(\"/Library/Application Support\"))\r\n                {\r\n                    ms_platform = Platform.MACOSX;\r\n                    ms_processor = (GetMachineWordBitSize() == 64) ? Processor.X86_64 : Processor.X86;\r\n                }\r\n\r\n                // We're Linux...\r\n                else if (Environment.OSVersion.ToString().Contains(\"Unix\"))\r\n                {\r\n                    string szProcessor = \"\";\r\n                    ms_platform = Platform.LINUX;\r\n                    try\r\n                    {\r\n                        Process process = new Process()\r\n                        {\r\n                            StartInfo = new ProcessStartInfo()\r\n                            {\r\n                                FileName = \"uname\",\r\n                                Arguments = \"-m\",\r\n                                UseShellExecute = false,\r\n                                RedirectStandardOutput = true,\r\n                                CreateNoWindow = true\r\n                            }\r\n                        };\r\n                        process.Start();\r\n                        process.WaitForExit();\r\n                        szProcessor = process.StandardOutput.ReadToEnd();\r\n                        process.Close();\r\n                    }\r\n                    catch\r\n                    {\r\n                        Console.Out.WriteLine(\"Oh dear, this isn't good...where's uname?\");\r\n                    }\r\n                    if (szProcessor.Contains(\"mips64\"))\r\n                    {\r\n                        ms_processor = Processor.MIPS64EL;\r\n                    }\r\n                    else\r\n                    {\r\n                        ms_processor = (GetMachineWordBitSize() == 64) ? Processor.X86_64 : Processor.X86;\r\n                    }\r\n                }\r\n\r\n                // We have a problem, Log will throw for us...\r\n                else\r\n                {\r\n                    ms_platform = Platform.UNKNOWN;\r\n                    ms_processor = Processor.UNKNOWN;\r\n                    TWAINWorkingGroup.Log.Assert(\"Unsupported platform...\" + ms_platform);\r\n                }\r\n            }\r\n\r\n            // All done...\r\n            return (ms_platform);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Quick access to our processor id...\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public static Processor GetProcessor()\r\n        {\r\n            // First pass...\r\n            if (ms_blFirstPassGetPlatform)\r\n            {\r\n                GetPlatform();\r\n            }\r\n\r\n            // All done...\r\n            return (ms_processor);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert the contents of a capability to a string that we can show in\r\n        /// our simple GUI...\r\n        /// </summary>\r\n        /// <param name=\"a_twty\">Data type</param>\r\n        /// <param name=\"a_intptr\">Pointer to the data</param>\r\n        /// <param name=\"a_iIndex\">Index of the item in the data</param>\r\n        /// <returns>Data in CSV form</returns>\r\n        [PermissionSet(SecurityAction.LinkDemand, Name = \"FullTrust\", Unrestricted = false)]\r\n        public string GetIndexedItem(TW_CAPABILITY a_twcapability, TWTY a_twty, IntPtr a_intptr, int a_iIndex)\r\n        {\r\n            IntPtr intptr;\r\n\r\n            // Index by type...\r\n            switch (a_twty)\r\n            {\r\n                default:\r\n                    return (\"Get Capability: (unrecognized item type)...\" + a_twty);\r\n\r\n                case TWTY.INT8:\r\n                    {\r\n                        intptr = (IntPtr)((ulong)a_intptr + (ulong)(1 * a_iIndex));\r\n                        sbyte i8Value = (sbyte)Marshal.PtrToStructure(intptr, typeof(sbyte));\r\n                        return (i8Value.ToString());\r\n                    }\r\n\r\n                case TWTY.INT16:\r\n                    {\r\n                        intptr = (IntPtr)((ulong)a_intptr + (ulong)(2 * a_iIndex));\r\n                        short i16Value = (short)Marshal.PtrToStructure(intptr, typeof(short));\r\n                        return (i16Value.ToString());\r\n                    }\r\n\r\n                case TWTY.INT32:\r\n                    {\r\n                        intptr = (IntPtr)((ulong)a_intptr + (ulong)(4 * a_iIndex));\r\n                        int i32Value = (int)Marshal.PtrToStructure(intptr, typeof(int));\r\n                        return (i32Value.ToString());\r\n                    }\r\n\r\n                case TWTY.UINT8:\r\n                    {\r\n                        intptr = (IntPtr)((ulong)a_intptr + (ulong)(1 * a_iIndex));\r\n                        byte u8Value = (byte)Marshal.PtrToStructure(intptr, typeof(byte));\r\n                        return (u8Value.ToString());\r\n                    }\r\n\r\n                case TWTY.BOOL:\r\n                case TWTY.UINT16:\r\n                    {\r\n                        intptr = (IntPtr)((ulong)a_intptr + (ulong)(2 * a_iIndex));\r\n                        ushort u16Value = (ushort)Marshal.PtrToStructure(intptr, typeof(ushort));\r\n                        return (u16Value.ToString());\r\n                    }\r\n\r\n                case TWTY.UINT32:\r\n                    {\r\n                        intptr = (IntPtr)((ulong)a_intptr + (ulong)(4 * a_iIndex));\r\n                        uint u32Value = (uint)Marshal.PtrToStructure(intptr, typeof(uint));\r\n                        return (u32Value.ToString());\r\n                    }\r\n\r\n                case TWTY.FIX32:\r\n                    {\r\n                        intptr = (IntPtr)((ulong)a_intptr + (ulong)(4 * a_iIndex));\r\n                        TW_FIX32 twfix32 = (TW_FIX32)Marshal.PtrToStructure(intptr, typeof(TW_FIX32));\r\n                        return (((double)twfix32.Whole + ((double)twfix32.Frac / 65536.0)).ToString());\r\n                    }\r\n\r\n                case TWTY.FRAME:\r\n                    {\r\n                        CSV csv = new CSV();\r\n                        intptr = (IntPtr)((ulong)a_intptr + (ulong)(16 * a_iIndex));\r\n                        TW_FRAME twframe = (TW_FRAME)Marshal.PtrToStructure(intptr, typeof(TW_FRAME));\r\n                        csv.Add(((double)twframe.Left.Whole + ((double)twframe.Left.Frac / 65536.0)).ToString());\r\n                        csv.Add(((double)twframe.Top.Whole + ((double)twframe.Top.Frac / 65536.0)).ToString());\r\n                        csv.Add(((double)twframe.Right.Whole + ((double)twframe.Right.Frac / 65536.0)).ToString());\r\n                        csv.Add(((double)twframe.Bottom.Whole + ((double)twframe.Bottom.Frac / 65536.0)).ToString());\r\n                        return (csv.Get());\r\n                    }\r\n\r\n                case TWTY.STR32:\r\n                    {\r\n                        intptr = (IntPtr)((ulong)a_intptr + (ulong)(34 * a_iIndex));\r\n                        TW_STR32 twstr32 = (TW_STR32)Marshal.PtrToStructure(intptr, typeof(TW_STR32));\r\n                        return (twstr32.Get());\r\n                    }\r\n\r\n                case TWTY.STR64:\r\n                    {\r\n                        intptr = (IntPtr)((ulong)a_intptr + (ulong)(66 * a_iIndex));\r\n                        TW_STR64 twstr64 = (TW_STR64)Marshal.PtrToStructure(intptr, typeof(TW_STR64));\r\n                        return (twstr64.Get());\r\n                    }\r\n\r\n                case TWTY.STR128:\r\n                    {\r\n                        intptr = (IntPtr)((ulong)a_intptr + (ulong)(130 * a_iIndex));\r\n                        TW_STR128 twstr128 = (TW_STR128)Marshal.PtrToStructure(intptr, typeof(TW_STR128));\r\n                        return (twstr128.Get());\r\n                    }\r\n\r\n                case TWTY.STR255:\r\n                    {\r\n                        intptr = (IntPtr)((ulong)a_intptr + (ulong)(256 * a_iIndex));\r\n                        TW_STR255 twstr255 = (TW_STR255)Marshal.PtrToStructure(intptr, typeof(TW_STR255));\r\n                        return (twstr255.Get());\r\n                    }\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert the value of a string into a capability...\r\n        /// </summary>\r\n        /// <param name=\"a_twcapability\">All info on the capability</param>\r\n        /// <param name=\"a_twty\">Data type</param>\r\n        /// <param name=\"a_intptr\">Point to the data</param>\r\n        /// <param name=\"a_iIndex\">Index for item in the data</param>\r\n        /// <param name=\"a_szValue\">CSV value to be used to set the data</param>\r\n        /// <returns>Empty string or an error string</returns>\r\n        [PermissionSet(SecurityAction.LinkDemand, Name = \"FullTrust\", Unrestricted = false)]\r\n        public string SetIndexedItem(TW_CAPABILITY a_twcapability, TWTY a_twty, IntPtr a_intptr, int a_iIndex, string a_szValue)\r\n        {\r\n            IntPtr intptr;\r\n\r\n            // Index by type...\r\n            switch (a_twty)\r\n            {\r\n                default:\r\n                    return (\"Set Capability: (unrecognized item type)...\" + a_twty);\r\n\r\n                case TWTY.INT8:\r\n                    {\r\n                        // We do this to make sure the entire Item value is overwritten...\r\n                        if (a_twcapability.ConType == TWON.ONEVALUE)\r\n                        {\r\n                            int i32Value = sbyte.Parse(CvtCapValueFromEnum(a_twcapability.Cap, a_szValue));\r\n                            Marshal.StructureToPtr(i32Value, a_intptr, true);\r\n                            return (\"\");\r\n                        }\r\n                        // These items have to be packed on the type sizes...\r\n                        else\r\n                        {\r\n                            sbyte i8Value = sbyte.Parse(CvtCapValueFromEnum(a_twcapability.Cap, a_szValue));\r\n                            intptr = (IntPtr)((ulong)a_intptr + (ulong)(1 * a_iIndex));\r\n                            Marshal.StructureToPtr(i8Value, intptr, true);\r\n                            return (\"\");\r\n                        }\r\n                    }\r\n\r\n                case TWTY.INT16:\r\n                    {\r\n                        // We use i32Value to make sure the entire Item value is overwritten...\r\n                        if (a_twcapability.ConType == TWON.ONEVALUE)\r\n                        {\r\n                            int i32Value = short.Parse(CvtCapValueFromEnum(a_twcapability.Cap, a_szValue));\r\n                            Marshal.StructureToPtr(i32Value, a_intptr, true);\r\n                            return (\"\");\r\n                        }\r\n                        // These items have to be packed on the type sizes...\r\n                        else\r\n                        {\r\n                            short i16Value = short.Parse(CvtCapValueFromEnum(a_twcapability.Cap, a_szValue));\r\n                            intptr = (IntPtr)((ulong)a_intptr + (ulong)(2 * a_iIndex));\r\n                            Marshal.StructureToPtr(i16Value, intptr, true);\r\n                            return (\"\");\r\n                        }\r\n                    }\r\n\r\n                case TWTY.INT32:\r\n                    {\r\n                        // Entire value will always be overwritten, so we don't have to get fancy...\r\n                        int i32Value = int.Parse(CvtCapValueFromEnum(a_twcapability.Cap, a_szValue));\r\n                        intptr = (IntPtr)((ulong)a_intptr + (ulong)(4 * a_iIndex));\r\n                        Marshal.StructureToPtr(i32Value, intptr, true);\r\n                        return (\"\");\r\n                    }\r\n\r\n                case TWTY.UINT8:\r\n                    {\r\n                        // We use u32Value to make sure the entire Item value is overwritten...\r\n                        if (a_twcapability.ConType == TWON.ONEVALUE)\r\n                        {\r\n                            uint u32Value = byte.Parse(CvtCapValueFromEnum(a_twcapability.Cap, a_szValue));\r\n                            Marshal.StructureToPtr(u32Value, a_intptr, true);\r\n                            return (\"\");\r\n                        }\r\n                        // These items have to be packed on the type sizes...\r\n                        else\r\n                        {\r\n                            byte u8Value = byte.Parse(CvtCapValueFromEnum(a_twcapability.Cap, a_szValue));\r\n                            intptr = (IntPtr)((ulong)a_intptr + (ulong)(1 * a_iIndex));\r\n                            Marshal.StructureToPtr(u8Value, intptr, true);\r\n                            return (\"\");\r\n                        }\r\n                    }\r\n\r\n                case TWTY.BOOL:\r\n                case TWTY.UINT16:\r\n                    {\r\n                        // We use u32Value to make sure the entire Item value is overwritten...\r\n                        if (a_twcapability.ConType == TWON.ONEVALUE)\r\n                        {\r\n                            uint u32Value = ushort.Parse(CvtCapValueFromEnum(a_twcapability.Cap, a_szValue));\r\n                            Marshal.StructureToPtr(u32Value, a_intptr, true);\r\n                            return (\"\");\r\n                        }\r\n                        else\r\n                        {\r\n                            ushort u16Value = ushort.Parse(CvtCapValueFromEnum(a_twcapability.Cap, a_szValue));\r\n                            intptr = (IntPtr)((ulong)a_intptr + (ulong)(2 * a_iIndex));\r\n                            Marshal.StructureToPtr(u16Value, intptr, true);\r\n                            return (\"\");\r\n                        }\r\n                    }\r\n\r\n                case TWTY.UINT32:\r\n                    {\r\n                        // Entire value will always be overwritten, so we don't have to get fancy...\r\n                        uint u32Value = uint.Parse(CvtCapValueFromEnum(a_twcapability.Cap, a_szValue));\r\n                        intptr = (IntPtr)((ulong)a_intptr + (ulong)(4 * a_iIndex));\r\n                        Marshal.StructureToPtr(u32Value, intptr, true);\r\n                        return (\"\");\r\n                    }\r\n\r\n                case TWTY.FIX32:\r\n                    {\r\n                        // Entire value will always be overwritten, so we don't have to get fancy...\r\n                        TW_FIX32 twfix32 = default(TW_FIX32);\r\n                        twfix32.Whole = (short)Convert.ToDouble(a_szValue);\r\n                        twfix32.Frac = (ushort)((Convert.ToDouble(a_szValue) - (double)twfix32.Whole) * 65536.0);\r\n                        intptr = (IntPtr)((ulong)a_intptr + (ulong)(4 * a_iIndex));\r\n                        Marshal.StructureToPtr(twfix32, intptr, true);\r\n                        return (\"\");\r\n                    }\r\n\r\n                case TWTY.FRAME:\r\n                    {\r\n                        TW_FRAME twframe = default(TW_FRAME);\r\n                        string[] asz = CSV.Parse(a_szValue);\r\n                        twframe.Left.Whole = (short)Convert.ToDouble(asz[0]);\r\n                        twframe.Left.Frac = (ushort)((Convert.ToDouble(asz[0]) - (double)twframe.Left.Whole) * 65536.0);\r\n                        twframe.Top.Whole = (short)Convert.ToDouble(asz[1]);\r\n                        twframe.Top.Frac = (ushort)((Convert.ToDouble(asz[1]) - (double)twframe.Top.Whole) * 65536.0);\r\n                        twframe.Right.Whole = (short)Convert.ToDouble(asz[2]);\r\n                        twframe.Right.Frac = (ushort)((Convert.ToDouble(asz[2]) - (double)twframe.Right.Whole) * 65536.0);\r\n                        twframe.Bottom.Whole = (short)Convert.ToDouble(asz[3]);\r\n                        twframe.Bottom.Frac = (ushort)((Convert.ToDouble(asz[3]) - (double)twframe.Bottom.Whole) * 65536.0);\r\n                        intptr = (IntPtr)((ulong)a_intptr + (ulong)(16 * a_iIndex));\r\n                        Marshal.StructureToPtr(twframe, intptr, true);\r\n                        return (\"\");\r\n                    }\r\n\r\n                case TWTY.STR32:\r\n                    {\r\n                        TW_STR32 twstr32 = default(TW_STR32);\r\n                        twstr32.Set(a_szValue);\r\n                        intptr = (IntPtr)((ulong)a_intptr + (ulong)(34 * a_iIndex));\r\n                        Marshal.StructureToPtr(twstr32, intptr, true);\r\n                        return (\"\");\r\n                    }\r\n\r\n                case TWTY.STR64:\r\n                    {\r\n                        TW_STR64 twstr64 = default(TW_STR64);\r\n                        twstr64.Set(a_szValue);\r\n                        intptr = (IntPtr)((ulong)a_intptr + (ulong)(66 * a_iIndex));\r\n                        Marshal.StructureToPtr(twstr64, intptr, true);\r\n                        return (\"\");\r\n                    }\r\n\r\n                case TWTY.STR128:\r\n                    {\r\n                        TW_STR128 twstr128 = default(TW_STR128);\r\n                        twstr128.Set(a_szValue);\r\n                        intptr = (IntPtr)((ulong)a_intptr + (ulong)(130 * a_iIndex));\r\n                        Marshal.StructureToPtr(twstr128, intptr, true);\r\n                        return (\"\");\r\n                    }\r\n\r\n                case TWTY.STR255:\r\n                    {\r\n                        TW_STR255 twstr255 = default(TW_STR255);\r\n                        twstr255.Set(a_szValue);\r\n                        intptr = (IntPtr)((ulong)a_intptr + (ulong)(256 * a_iIndex));\r\n                        Marshal.StructureToPtr(twstr255, intptr, true);\r\n                        return (\"\");\r\n                    }\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert strings into a range...\r\n        /// </summary>\r\n        /// <param name=\"a_twty\">Data type</param>\r\n        /// <param name=\"a_intptr\">Pointer to the data</param>\r\n        /// <param name=\"a_asz\">List of strings</param>\r\n        /// <returns>Empty string or an error string</returns>\r\n        [PermissionSet(SecurityAction.LinkDemand, Name = \"FullTrust\", Unrestricted = false)]\r\n        public string SetRangeItem(TWTY a_twty, IntPtr a_intptr, string[] a_asz)\r\n        {\r\n            TW_RANGE twrange = default(TW_RANGE);\r\n            TW_RANGE_MACOSX twrangemacosx = default(TW_RANGE_MACOSX);\r\n            TW_RANGE_LINUX64 twrangelinux64 = default(TW_RANGE_LINUX64);\r\n            TW_RANGE_FIX32 twrangefix32 = default(TW_RANGE_FIX32);\r\n            TW_RANGE_FIX32_MACOSX twrangefix32macosx = default(TW_RANGE_FIX32_MACOSX);\r\n\r\n            // Index by type...\r\n            switch (a_twty)\r\n            {\r\n                default:\r\n                    return (\"Set Capability: (unrecognized item type)...\" + a_twty);\r\n\r\n                case TWTY.INT8:\r\n                    {\r\n                        if (ms_platform == Platform.MACOSX)\r\n                        {\r\n                            twrangemacosx.ItemType = (uint)a_twty;\r\n                            twrangemacosx.MinValue = (uint)sbyte.Parse(a_asz[3]);\r\n                            twrangemacosx.MaxValue = (uint)sbyte.Parse(a_asz[4]);\r\n                            twrangemacosx.StepSize = (uint)sbyte.Parse(a_asz[5]);\r\n                            twrangemacosx.DefaultValue = (uint)sbyte.Parse(a_asz[6]);\r\n                            twrangemacosx.CurrentValue = (uint)sbyte.Parse(a_asz[7]);\r\n                            Marshal.StructureToPtr(twrangemacosx, a_intptr, true);\r\n                        }\r\n                        else if ((m_linuxdsm == LinuxDsm.Unknown) || (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                        {\r\n                            twrange.ItemType = a_twty;\r\n                            twrange.MinValue = (uint)sbyte.Parse(a_asz[3]);\r\n                            twrange.MaxValue = (uint)sbyte.Parse(a_asz[4]);\r\n                            twrange.StepSize = (uint)sbyte.Parse(a_asz[5]);\r\n                            twrange.DefaultValue = (uint)sbyte.Parse(a_asz[6]);\r\n                            twrange.CurrentValue = (uint)sbyte.Parse(a_asz[7]);\r\n                            Marshal.StructureToPtr(twrange, a_intptr, true);\r\n                        }\r\n                        else\r\n                        {\r\n                            twrangelinux64.ItemType = a_twty;\r\n                            twrangelinux64.MinValue = (uint)sbyte.Parse(a_asz[3]);\r\n                            twrangelinux64.MaxValue = (uint)sbyte.Parse(a_asz[4]);\r\n                            twrangelinux64.StepSize = (uint)sbyte.Parse(a_asz[5]);\r\n                            twrangelinux64.DefaultValue = (uint)sbyte.Parse(a_asz[6]);\r\n                            twrangelinux64.CurrentValue = (uint)sbyte.Parse(a_asz[7]);\r\n                            Marshal.StructureToPtr(twrangelinux64, a_intptr, true);\r\n                        }\r\n                        return (\"\");\r\n                    }\r\n\r\n                case TWTY.INT16:\r\n                    {\r\n                        if (ms_platform == Platform.MACOSX)\r\n                        {\r\n                            twrangemacosx.ItemType = (uint)a_twty;\r\n                            twrangemacosx.MinValue = (uint)short.Parse(a_asz[3]);\r\n                            twrangemacosx.MaxValue = (uint)short.Parse(a_asz[4]);\r\n                            twrangemacosx.StepSize = (uint)short.Parse(a_asz[5]);\r\n                            twrangemacosx.DefaultValue = (uint)short.Parse(a_asz[6]);\r\n                            twrangemacosx.CurrentValue = (uint)short.Parse(a_asz[7]);\r\n                            Marshal.StructureToPtr(twrangemacosx, a_intptr, true);\r\n                        }\r\n                        else if ((m_linuxdsm == LinuxDsm.Unknown) || (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                        {\r\n                            twrange.ItemType = a_twty;\r\n                            twrange.MinValue = (uint)short.Parse(a_asz[3]);\r\n                            twrange.MaxValue = (uint)short.Parse(a_asz[4]);\r\n                            twrange.StepSize = (uint)short.Parse(a_asz[5]);\r\n                            twrange.DefaultValue = (uint)short.Parse(a_asz[6]);\r\n                            twrange.CurrentValue = (uint)short.Parse(a_asz[7]);\r\n                            Marshal.StructureToPtr(twrange, a_intptr, true);\r\n                        }\r\n                        else\r\n                        {\r\n                            twrangelinux64.ItemType = a_twty;\r\n                            twrangelinux64.MinValue = (uint)short.Parse(a_asz[3]);\r\n                            twrangelinux64.MaxValue = (uint)short.Parse(a_asz[4]);\r\n                            twrangelinux64.StepSize = (uint)short.Parse(a_asz[5]);\r\n                            twrangelinux64.DefaultValue = (uint)short.Parse(a_asz[6]);\r\n                            twrangelinux64.CurrentValue = (uint)short.Parse(a_asz[7]);\r\n                            Marshal.StructureToPtr(twrangelinux64, a_intptr, true);\r\n                        }\r\n                        return (\"\");\r\n                    }\r\n\r\n                case TWTY.INT32:\r\n                    {\r\n                        if (ms_platform == Platform.MACOSX)\r\n                        {\r\n                            twrangemacosx.ItemType = (uint)a_twty;\r\n                            twrangemacosx.MinValue = (uint)int.Parse(a_asz[3]);\r\n                            twrangemacosx.MaxValue = (uint)int.Parse(a_asz[4]);\r\n                            twrangemacosx.StepSize = (uint)int.Parse(a_asz[5]);\r\n                            twrangemacosx.DefaultValue = (uint)int.Parse(a_asz[6]);\r\n                            twrangemacosx.CurrentValue = (uint)int.Parse(a_asz[7]);\r\n                            Marshal.StructureToPtr(twrangemacosx, a_intptr, true);\r\n                        }\r\n                        else if ((m_linuxdsm == LinuxDsm.Unknown) || (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                        {\r\n                            twrange.ItemType = a_twty;\r\n                            twrange.MinValue = (uint)int.Parse(a_asz[3]);\r\n                            twrange.MaxValue = (uint)int.Parse(a_asz[4]);\r\n                            twrange.StepSize = (uint)int.Parse(a_asz[5]);\r\n                            twrange.DefaultValue = (uint)int.Parse(a_asz[6]);\r\n                            twrange.CurrentValue = (uint)int.Parse(a_asz[7]);\r\n                            Marshal.StructureToPtr(twrange, a_intptr, true);\r\n                        }\r\n                        else\r\n                        {\r\n                            twrangelinux64.ItemType = a_twty;\r\n                            twrangelinux64.MinValue = (uint)int.Parse(a_asz[3]);\r\n                            twrangelinux64.MaxValue = (uint)int.Parse(a_asz[4]);\r\n                            twrangelinux64.StepSize = (uint)int.Parse(a_asz[5]);\r\n                            twrangelinux64.DefaultValue = (uint)int.Parse(a_asz[6]);\r\n                            twrangelinux64.CurrentValue = (uint)int.Parse(a_asz[7]);\r\n                            Marshal.StructureToPtr(twrangelinux64, a_intptr, true);\r\n                        }\r\n                        return (\"\");\r\n                    }\r\n\r\n                case TWTY.UINT8:\r\n                    {\r\n                        if (ms_platform == Platform.MACOSX)\r\n                        {\r\n                            twrangemacosx.ItemType = (uint)a_twty;\r\n                            twrangemacosx.MinValue = (uint)byte.Parse(a_asz[3]);\r\n                            twrangemacosx.MaxValue = (uint)byte.Parse(a_asz[4]);\r\n                            twrangemacosx.StepSize = (uint)byte.Parse(a_asz[5]);\r\n                            twrangemacosx.DefaultValue = (uint)byte.Parse(a_asz[6]);\r\n                            twrangemacosx.CurrentValue = (uint)byte.Parse(a_asz[7]);\r\n                            Marshal.StructureToPtr(twrangemacosx, a_intptr, true);\r\n                        }\r\n                        else if ((m_linuxdsm == LinuxDsm.Unknown) || (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                        {\r\n                            twrange.ItemType = a_twty;\r\n                            twrange.MinValue = (uint)byte.Parse(a_asz[3]);\r\n                            twrange.MaxValue = (uint)byte.Parse(a_asz[4]);\r\n                            twrange.StepSize = (uint)byte.Parse(a_asz[5]);\r\n                            twrange.DefaultValue = (uint)byte.Parse(a_asz[6]);\r\n                            twrange.CurrentValue = (uint)byte.Parse(a_asz[7]);\r\n                            Marshal.StructureToPtr(twrange, a_intptr, true);\r\n                        }\r\n                        else\r\n                        {\r\n                            twrangelinux64.ItemType = a_twty;\r\n                            twrangelinux64.MinValue = (uint)byte.Parse(a_asz[3]);\r\n                            twrangelinux64.MaxValue = (uint)byte.Parse(a_asz[4]);\r\n                            twrangelinux64.StepSize = (uint)byte.Parse(a_asz[5]);\r\n                            twrangelinux64.DefaultValue = (uint)byte.Parse(a_asz[6]);\r\n                            twrangelinux64.CurrentValue = (uint)byte.Parse(a_asz[7]);\r\n                            Marshal.StructureToPtr(twrangelinux64, a_intptr, true);\r\n                        }\r\n                        return (\"\");\r\n                    }\r\n\r\n                case TWTY.BOOL:\r\n                case TWTY.UINT16:\r\n                    {\r\n                        if (ms_platform == Platform.MACOSX)\r\n                        {\r\n                            twrangemacosx.ItemType = (uint)a_twty;\r\n                            twrangemacosx.MinValue = (uint)ushort.Parse(a_asz[3]);\r\n                            twrangemacosx.MaxValue = (uint)ushort.Parse(a_asz[4]);\r\n                            twrangemacosx.StepSize = (uint)ushort.Parse(a_asz[5]);\r\n                            twrangemacosx.DefaultValue = (uint)ushort.Parse(a_asz[6]);\r\n                            twrangemacosx.CurrentValue = (uint)ushort.Parse(a_asz[7]);\r\n                            Marshal.StructureToPtr(twrangemacosx, a_intptr, true);\r\n                        }\r\n                        else if ((m_linuxdsm == LinuxDsm.Unknown) || (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                        {\r\n                            twrange.ItemType = a_twty;\r\n                            twrange.MinValue = (uint)ushort.Parse(a_asz[3]);\r\n                            twrange.MaxValue = (uint)ushort.Parse(a_asz[4]);\r\n                            twrange.StepSize = (uint)ushort.Parse(a_asz[5]);\r\n                            twrange.DefaultValue = (uint)ushort.Parse(a_asz[6]);\r\n                            twrange.CurrentValue = (uint)ushort.Parse(a_asz[7]);\r\n                            Marshal.StructureToPtr(twrange, a_intptr, true);\r\n                        }\r\n                        else\r\n                        {\r\n                            twrangelinux64.ItemType = a_twty;\r\n                            twrangelinux64.MinValue = (uint)ushort.Parse(a_asz[3]);\r\n                            twrangelinux64.MaxValue = (uint)ushort.Parse(a_asz[4]);\r\n                            twrangelinux64.StepSize = (uint)ushort.Parse(a_asz[5]);\r\n                            twrangelinux64.DefaultValue = (uint)ushort.Parse(a_asz[6]);\r\n                            twrangelinux64.CurrentValue = (uint)ushort.Parse(a_asz[7]);\r\n                            Marshal.StructureToPtr(twrangelinux64, a_intptr, true);\r\n                        }\r\n                        return (\"\");\r\n                    }\r\n\r\n                case TWTY.UINT32:\r\n                    {\r\n                        if (ms_platform == Platform.MACOSX)\r\n                        {\r\n                            twrangemacosx.ItemType = (uint)a_twty;\r\n                            twrangemacosx.MinValue = uint.Parse(a_asz[3]);\r\n                            twrangemacosx.MaxValue = uint.Parse(a_asz[4]);\r\n                            twrangemacosx.StepSize = uint.Parse(a_asz[5]);\r\n                            twrangemacosx.DefaultValue = uint.Parse(a_asz[6]);\r\n                            twrangemacosx.CurrentValue = uint.Parse(a_asz[7]);\r\n                            Marshal.StructureToPtr(twrangemacosx, a_intptr, true);\r\n                        }\r\n                        else if ((m_linuxdsm == LinuxDsm.Unknown) || (m_linuxdsm == LinuxDsm.IsLatestDsm))\r\n                        {\r\n                            twrange.ItemType = a_twty;\r\n                            twrange.MinValue = uint.Parse(a_asz[3]);\r\n                            twrange.MaxValue = uint.Parse(a_asz[4]);\r\n                            twrange.StepSize = uint.Parse(a_asz[5]);\r\n                            twrange.DefaultValue = uint.Parse(a_asz[6]);\r\n                            twrange.CurrentValue = uint.Parse(a_asz[7]);\r\n                            Marshal.StructureToPtr(twrange, a_intptr, true);\r\n                        }\r\n                        else\r\n                        {\r\n                            twrangelinux64.ItemType = a_twty;\r\n                            twrangelinux64.MinValue = uint.Parse(a_asz[3]);\r\n                            twrangelinux64.MaxValue = uint.Parse(a_asz[4]);\r\n                            twrangelinux64.StepSize = uint.Parse(a_asz[5]);\r\n                            twrangelinux64.DefaultValue = uint.Parse(a_asz[6]);\r\n                            twrangelinux64.CurrentValue = uint.Parse(a_asz[7]);\r\n                            Marshal.StructureToPtr(twrangelinux64, a_intptr, true);\r\n                        }\r\n                        return (\"\");\r\n                    }\r\n\r\n                case TWTY.FIX32:\r\n                    {\r\n                        double dMinValue = Convert.ToDouble(a_asz[3]);\r\n                        double dMaxValue = Convert.ToDouble(a_asz[4]);\r\n                        double dStepSize = Convert.ToDouble(a_asz[5]);\r\n                        double dDefaultValue = Convert.ToDouble(a_asz[6]);\r\n                        double dCurrentValue = Convert.ToDouble(a_asz[7]);\r\n                        if (ms_platform == Platform.MACOSX)\r\n                        {\r\n                            twrangefix32macosx.ItemType = (uint)a_twty;\r\n                            twrangefix32macosx.MinValue.Whole = (short)dMinValue;\r\n                            twrangefix32macosx.MinValue.Frac = (ushort)((dMinValue - (double)twrangefix32macosx.MinValue.Whole) * 65536.0);\r\n                            twrangefix32macosx.MaxValue.Whole = (short)dMaxValue;\r\n                            twrangefix32macosx.MaxValue.Frac = (ushort)((dMaxValue - (double)twrangefix32macosx.MaxValue.Whole) * 65536.0);\r\n                            twrangefix32macosx.StepSize.Whole = (short)dStepSize;\r\n                            twrangefix32macosx.StepSize.Frac = (ushort)((dStepSize - (double)twrangefix32macosx.StepSize.Whole) * 65536.0);\r\n                            twrangefix32macosx.DefaultValue.Whole = (short)dDefaultValue;\r\n                            twrangefix32macosx.DefaultValue.Frac = (ushort)((dDefaultValue - (double)twrangefix32macosx.DefaultValue.Whole) * 65536.0);\r\n                            twrangefix32macosx.CurrentValue.Whole = (short)dCurrentValue;\r\n                            twrangefix32macosx.CurrentValue.Frac = (ushort)((dCurrentValue - (double)twrangefix32macosx.CurrentValue.Whole) * 65536.0);\r\n                            Marshal.StructureToPtr(twrangefix32macosx, a_intptr, true);\r\n                        }\r\n                        else\r\n                        {\r\n                            twrangefix32.ItemType = a_twty;\r\n                            twrangefix32.MinValue.Whole = (short)dMinValue;\r\n                            twrangefix32.MinValue.Frac = (ushort)((dMinValue - (double)twrangefix32.MinValue.Whole) * 65536.0);\r\n                            twrangefix32.MaxValue.Whole = (short)dMaxValue;\r\n                            twrangefix32.MaxValue.Frac = (ushort)((dMaxValue - (double)twrangefix32.MaxValue.Whole) * 65536.0);\r\n                            twrangefix32.StepSize.Whole = (short)dStepSize;\r\n                            twrangefix32.StepSize.Frac = (ushort)((dStepSize - (double)twrangefix32.StepSize.Whole) * 65536.0);\r\n                            twrangefix32.DefaultValue.Whole = (short)dDefaultValue;\r\n                            twrangefix32.DefaultValue.Frac = (ushort)((dDefaultValue - (double)twrangefix32.DefaultValue.Whole) * 65536.0);\r\n                            twrangefix32.CurrentValue.Whole = (short)dCurrentValue;\r\n                            twrangefix32.CurrentValue.Frac = (ushort)((dCurrentValue - (double)twrangefix32.CurrentValue.Whole) * 65536.0);\r\n                            Marshal.StructureToPtr(twrangefix32, a_intptr, true);\r\n                        }\r\n                        return (\"\");\r\n                    }\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Our callback delegate for Windows...\r\n        /// </summary>\r\n        /// <param name=\"origin\">Origin of message</param>\r\n        /// <param name=\"dest\">Message target</param>\r\n        /// <param name=\"dg\">Data group</param>\r\n        /// <param name=\"dat\">Data argument type</param>\r\n        /// <param name=\"msg\">Operation</param>\r\n        /// <param name=\"twnull\">NULL pointer</param>\r\n        /// <returns>TWAIN status</returns>\r\n        private UInt16 WindowsDsmEntryCallbackProxy\r\n        (\r\n            ref TW_IDENTITY_LEGACY origin,\r\n            ref TW_IDENTITY_LEGACY dest,\r\n            DG dg,\r\n            DAT dat,\r\n            MSG msg,\r\n            IntPtr twnull\r\n        )\r\n        {\r\n            ProcessEvent(msg);\r\n            return ((UInt16)STS.SUCCESS);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Our callback delegate for Linux...\r\n        /// </summary>\r\n        /// <param name=\"origin\">Origin of message</param>\r\n        /// <param name=\"dest\">Message target</param>\r\n        /// <param name=\"dg\">Data group</param>\r\n        /// <param name=\"dat\">Data argument type</param>\r\n        /// <param name=\"msg\">Operation</param>\r\n        /// <param name=\"twnull\">NULL pointer</param>\r\n        /// <returns>TWAIN status</returns>\r\n        private UInt16 LinuxDsmEntryCallbackProxy\r\n        (\r\n            ref TW_IDENTITY_LEGACY origin,\r\n            ref TW_IDENTITY_LEGACY dest,\r\n            DG dg,\r\n            DAT dat,\r\n            MSG msg,\r\n            IntPtr twnull\r\n        )\r\n        {\r\n            ProcessEvent(msg);\r\n            return ((UInt16)STS.SUCCESS);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Our callback delegate for Mac OS X...\r\n        /// </summary>\r\n        /// <param name=\"origin\">Origin of message</param>\r\n        /// <param name=\"dest\">Message target</param>\r\n        /// <param name=\"dg\">Data group</param>\r\n        /// <param name=\"dat\">Data argument type</param>\r\n        /// <param name=\"msg\">Operation</param>\r\n        /// <param name=\"twnull\">NULL pointer</param>\r\n        /// <returns>TWAIN status</returns>\r\n        private UInt16 MacosxDsmEntryCallbackProxy\r\n        (\r\n            ref TW_IDENTITY_MACOSX origin,\r\n            ref TW_IDENTITY_MACOSX dest,\r\n            DG dg,\r\n            DAT dat,\r\n            MSG msg,\r\n            IntPtr twnull\r\n        )\r\n        {\r\n            ProcessEvent(msg);\r\n            return ((UInt16)STS.SUCCESS);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Get .NET 'Bitmap' object from memory DIB via stream constructor.\r\n        /// This should work for most DIBs.\r\n        /// </summary>\r\n        /// <param name=\"a_platform\">Our operating system</param>\r\n        /// <param name=\"a_intptrNative\">The pointer to something (presumably a BITMAP or a TIFF image)</param>\r\n        /// <returns>C# Bitmap of image</returns>\r\n        private Bitmap NativeToBitmap(Platform a_platform, IntPtr a_intptrNative)\r\n        {\r\n            ushort u16Magic;\r\n            IntPtr intptrNative;\r\n\r\n            // We need the first two bytes to decide if we have a DIB or a TIFF.  Don't\r\n            // forget to lock the silly thing...\r\n            intptrNative = DsmMemLock(a_intptrNative);\r\n            u16Magic = (ushort)Marshal.PtrToStructure(intptrNative, typeof(ushort));\r\n\r\n            // Windows uses a DIB, the first usigned short is 40...\r\n            if (u16Magic == 40)\r\n            {\r\n                byte[] bBitmap;\r\n                BITMAPFILEHEADER bitmapfileheader;\r\n                BITMAPINFOHEADER bitmapinfoheader;\r\n\r\n                // Our incoming DIB is a bitmap info header...\r\n                bitmapinfoheader = (BITMAPINFOHEADER)Marshal.PtrToStructure(intptrNative, typeof(BITMAPINFOHEADER));\r\n\r\n                // Build our file header...\r\n                bitmapfileheader = new BITMAPFILEHEADER();\r\n                bitmapfileheader.bfType = 0x4D42; // \"BM\"\r\n                bitmapfileheader.bfSize\r\n                    = (uint)Marshal.SizeOf(typeof(BITMAPFILEHEADER)) +\r\n                       bitmapinfoheader.biSize +\r\n                       (bitmapinfoheader.biClrUsed * 4) +\r\n                       bitmapinfoheader.biSizeImage;\r\n                bitmapfileheader.bfOffBits\r\n                    = (uint)Marshal.SizeOf(typeof(BITMAPFILEHEADER)) +\r\n                       bitmapinfoheader.biSize +\r\n                       (bitmapinfoheader.biClrUsed * 4);\r\n\r\n                // Copy the file header into our byte array...\r\n                IntPtr intptr = Marshal.AllocHGlobal(Marshal.SizeOf(bitmapfileheader));\r\n                Marshal.StructureToPtr(bitmapfileheader, intptr, true);\r\n                bBitmap = new byte[bitmapfileheader.bfSize];\r\n                Marshal.Copy(intptr, bBitmap, 0, Marshal.SizeOf(bitmapfileheader));\r\n                Marshal.FreeHGlobal(intptr);\r\n                intptr = IntPtr.Zero;\r\n\r\n                // Copy the rest of the DIB into our byte array......\r\n                Marshal.Copy(intptrNative, bBitmap, Marshal.SizeOf(typeof(BITMAPFILEHEADER)), (int)bitmapfileheader.bfSize - Marshal.SizeOf(typeof(BITMAPFILEHEADER)));\r\n\r\n                // Now we can turn the in-memory bitmap file into a Bitmap object...\r\n                MemoryStream memorystream = new MemoryStream(bBitmap);\r\n\r\n                // Unfortunately the stream has to be kept with the bitmap...\r\n                Bitmap bitmapStream = new Bitmap(memorystream);\r\n\r\n                // So we make a copy (ick)...\r\n                Bitmap bitmap;\r\n                switch (bitmapinfoheader.biBitCount)\r\n                {\r\n                    default:\r\n                    case 24:\r\n                        bitmap = bitmapStream.Clone(new Rectangle(0, 0, bitmapStream.Width, bitmapStream.Height), System.Drawing.Imaging.PixelFormat.Format24bppRgb);\r\n                        break;\r\n                    case 8:\r\n                        bitmap = bitmapStream.Clone(new Rectangle(0, 0, bitmapStream.Width, bitmapStream.Height), System.Drawing.Imaging.PixelFormat.Format8bppIndexed);\r\n                        break;\r\n                    case 1:\r\n                        bitmap = bitmapStream.Clone(new Rectangle(0, 0, bitmapStream.Width, bitmapStream.Height), System.Drawing.Imaging.PixelFormat.Format1bppIndexed);\r\n                        break;\r\n                }\r\n\r\n                // Fix the resolution...\r\n                bitmap.SetResolution((int)(bitmap.HorizontalResolution + 0.5), (int)(bitmap.VerticalResolution + 0.5));\r\n\r\n                // Cleanup...\r\n                //bitmapStream.Dispose();\r\n                //memorystream.Close();\r\n                bitmapStream = null;\r\n                memorystream = null;\r\n                bBitmap = null;\r\n\r\n                // Return our bitmap...\r\n                DsmMemUnlock(a_intptrNative);\r\n                return (bitmap);\r\n            }\r\n\r\n            // Linux and Mac OS X use TIFF.  We'll handle a simple Intel TIFF (\"II\")...\r\n            else if (u16Magic == 0x4949)\r\n            {\r\n                int iTiffSize;\r\n                ulong u64;\r\n                ulong u64Pointer;\r\n                ulong u64TiffHeaderSize;\r\n                ulong u64TiffTagSize;\r\n                byte[] abTiff;\r\n                TIFFHEADER tiffheader;\r\n                TIFFTAG tifftag;\r\n\r\n                // Init stuff...\r\n                tiffheader = new TIFFHEADER();\r\n                tifftag = new TIFFTAG();\r\n                u64TiffHeaderSize = (ulong)Marshal.SizeOf(tiffheader);\r\n                u64TiffTagSize = (ulong)Marshal.SizeOf(tifftag);\r\n\r\n                // Find the size of the image so we can turn it into a memory stream...\r\n                iTiffSize = 0;\r\n                tiffheader = (TIFFHEADER)Marshal.PtrToStructure(intptrNative, typeof(TIFFHEADER));\r\n                for (u64 = 0; u64 < 999; u64++)\r\n                {\r\n                    u64Pointer = (ulong)intptrNative + u64TiffHeaderSize + (u64TiffTagSize * u64);\r\n                    tifftag = (TIFFTAG)Marshal.PtrToStructure((IntPtr)u64Pointer, typeof(TIFFTAG));\r\n\r\n                    // StripOffsets...\r\n                    if (tifftag.u16Tag == 273)\r\n                    {\r\n                        iTiffSize += (int)tifftag.u32Value;\r\n                    }\r\n\r\n                    // StripByteCounts...\r\n                    if (tifftag.u16Tag == 279)\r\n                    {\r\n                        iTiffSize += (int)tifftag.u32Value;\r\n                    }\r\n                }\r\n\r\n                // No joy...\r\n                if (iTiffSize == 0)\r\n                {\r\n                    DsmMemUnlock(a_intptrNative);\r\n                    return (null);\r\n                }\r\n\r\n                // Copy the data to our byte array...\r\n                abTiff = new byte[iTiffSize];\r\n                Marshal.Copy(intptrNative, abTiff, 0, iTiffSize);\r\n\r\n                // Move the image into a memory stream...\r\n                MemoryStream memorystream = new MemoryStream(abTiff);\r\n\r\n                // Turn the memory stream into an in-memory TIFF image...\r\n                Image imageTiff = Image.FromStream(memorystream);\r\n\r\n                // Convert the in-memory tiff to a Bitmap object...\r\n                Bitmap bitmap = new Bitmap(imageTiff);\r\n\r\n                // Cleanup...\r\n                abTiff = null;\r\n                memorystream = null;\r\n                imageTiff = null;\r\n\r\n                // Return our bitmap...\r\n                DsmMemUnlock(a_intptrNative);\r\n                return (bitmap);\r\n            }\r\n\r\n            // Uh-oh...\r\n            DsmMemUnlock(a_intptrNative);\r\n            return (null);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Get .NET 'Bitmap' object from memory DIB via stream constructor.\r\n        /// This should work for most DIBs.\r\n        /// </summary>\r\n        /// <param name=\"a_intptrNative\">The pointer to something (presumably a BITMAP or a TIFF image)</param>\r\n        /// <returns>C# Bitmap of image</returns>\r\n        public byte[] NativeToByteArray(IntPtr a_intptrNative, bool a_blIsHandle, out int a_iHeaderBytes)\r\n        {\r\n            ushort u16Magic;\r\n            UIntPtr uintptrBytes;\r\n            IntPtr intptrNative;\r\n\r\n            // Init stuff...\r\n            a_iHeaderBytes = 0;\r\n\r\n            // Give ourselves what protection we can...\r\n            try\r\n            {\r\n                // We need the first two bytes to decide if we have a DIB or a TIFF.  Don't\r\n                // forget to lock the silly thing...\r\n                intptrNative = a_blIsHandle ? DsmMemLock(a_intptrNative) : a_intptrNative;\r\n                u16Magic = (ushort)Marshal.PtrToStructure(intptrNative, typeof(ushort));\r\n\r\n                // Windows uses a DIB, the first unsigned short is 40...\r\n                if (u16Magic == 40)\r\n                {\r\n                    byte[] abBitmap;\r\n                    BITMAPFILEHEADER bitmapfileheader;\r\n                    BITMAPINFOHEADER bitmapinfoheader;\r\n\r\n                    // Our incoming DIB is a bitmap info header...\r\n                    bitmapinfoheader = (BITMAPINFOHEADER)Marshal.PtrToStructure(intptrNative, typeof(BITMAPINFOHEADER));\r\n\r\n                    // Build our file header...\r\n                    bitmapfileheader = new BITMAPFILEHEADER();\r\n                    bitmapfileheader.bfType = 0x4D42; // \"BM\"\r\n                    bitmapfileheader.bfSize\r\n                        = (uint)Marshal.SizeOf(typeof(BITMAPFILEHEADER)) +\r\n                           bitmapinfoheader.biSize +\r\n                           (bitmapinfoheader.biClrUsed * 4) +\r\n                           bitmapinfoheader.biSizeImage;\r\n                    bitmapfileheader.bfOffBits\r\n                        = (uint)Marshal.SizeOf(typeof(BITMAPFILEHEADER)) +\r\n                           bitmapinfoheader.biSize +\r\n                           (bitmapinfoheader.biClrUsed * 4);\r\n\r\n                    // Copy the file header into our byte array...\r\n                    IntPtr intptr = Marshal.AllocHGlobal(Marshal.SizeOf(bitmapfileheader));\r\n                    Marshal.StructureToPtr(bitmapfileheader, intptr, true);\r\n                    abBitmap = new byte[bitmapfileheader.bfSize];\r\n                    Marshal.Copy(intptr, abBitmap, 0, Marshal.SizeOf(bitmapfileheader));\r\n                    Marshal.FreeHGlobal(intptr);\r\n                    intptr = IntPtr.Zero;\r\n\r\n                    // Copy the rest of the DIB into our byte array...\r\n                    a_iHeaderBytes = (int)bitmapfileheader.bfOffBits;\r\n                    Marshal.Copy(intptrNative, abBitmap, Marshal.SizeOf(typeof(BITMAPFILEHEADER)), (int)bitmapfileheader.bfSize - Marshal.SizeOf(typeof(BITMAPFILEHEADER)));\r\n\r\n                    // Unlock the handle, and return our byte array...\r\n                    if (a_blIsHandle)\r\n                    {\r\n                        DsmMemUnlock(a_intptrNative);\r\n                    }\r\n                    return (abBitmap);\r\n                }\r\n\r\n                // Linux and Mac OS X use TIFF.  We'll handle a simple Intel TIFF (\"II\")...\r\n                else if (u16Magic == 0x4949)\r\n                {\r\n                    int iTiffSize;\r\n                    ulong u64;\r\n                    ulong u64Pointer;\r\n                    ulong u64TiffHeaderSize;\r\n                    ulong u64TiffTagSize;\r\n                    byte[] abTiff;\r\n                    TIFFHEADER tiffheader;\r\n                    TIFFTAG tifftag;\r\n\r\n                    // Init stuff...\r\n                    tiffheader = new TIFFHEADER();\r\n                    tifftag = new TIFFTAG();\r\n                    u64TiffHeaderSize = (ulong)Marshal.SizeOf(tiffheader);\r\n                    u64TiffTagSize = (ulong)Marshal.SizeOf(tifftag);\r\n\r\n                    // Find the size of the image so we can turn it into a byte array...\r\n                    iTiffSize = 0;\r\n                    tiffheader = (TIFFHEADER)Marshal.PtrToStructure(intptrNative, typeof(TIFFHEADER));\r\n                    for (u64 = 0; u64 < 999; u64++)\r\n                    {\r\n                        u64Pointer = (ulong)intptrNative + u64TiffHeaderSize + (u64TiffTagSize * u64);\r\n                        tifftag = (TIFFTAG)Marshal.PtrToStructure((IntPtr)u64Pointer, typeof(TIFFTAG));\r\n\r\n                        // StripOffsets...\r\n                        if (tifftag.u16Tag == 273)\r\n                        {\r\n                            iTiffSize += (int)tifftag.u32Value;\r\n                            a_iHeaderBytes = (int)tifftag.u32Value;\r\n                        }\r\n\r\n                        // StripByteCounts...\r\n                        if (tifftag.u16Tag == 279)\r\n                        {\r\n                            iTiffSize += (int)tifftag.u32Value;\r\n                        }\r\n                    }\r\n\r\n                    // No joy...\r\n                    if (iTiffSize == 0)\r\n                    {\r\n                        if (a_blIsHandle)\r\n                        {\r\n                            DsmMemUnlock(a_intptrNative);\r\n                        }\r\n                        return (null);\r\n                    }\r\n\r\n                    // Copy the data to our byte array...\r\n                    abTiff = new byte[iTiffSize];\r\n                    Marshal.Copy(intptrNative, abTiff, 0, iTiffSize);\r\n\r\n                    // Unlock the handle, and return our byte array...\r\n                    if (a_blIsHandle)\r\n                    {\r\n                        DsmMemUnlock(a_intptrNative);\r\n                    }\r\n                    return (abTiff);\r\n                }\r\n\r\n                // As long as we're here, let's handle JFIF (JPEG) too,\r\n                // this can never be a handle...\r\n                else if (u16Magic == 0xFFD8)\r\n                {\r\n                    byte[] abJfif;\r\n\r\n                    // We need the size of this memory block...\r\n                    switch (GetPlatform())\r\n                    {\r\n                        default:\r\n                            Log.Error(\"Really? <\" + GetPlatform() + \">\");\r\n                            return (null);\r\n                        case Platform.WINDOWS:\r\n                            uintptrBytes = NativeMethods._msize(a_intptrNative);\r\n                            break;\r\n                        case Platform.LINUX:\r\n                            uintptrBytes = NativeMethods.malloc_usable_size(a_intptrNative);\r\n                            break;\r\n                        case Platform.MACOSX:\r\n                            uintptrBytes = NativeMethods.malloc_size(a_intptrNative);\r\n                            break;\r\n                    }\r\n                    abJfif = new byte[(int)uintptrBytes];\r\n                    Marshal.Copy(a_intptrNative, abJfif, 0, (int)(int)uintptrBytes);\r\n                    return (abJfif);\r\n                }\r\n            }\r\n            catch (Exception exception)\r\n            {\r\n                Log.Error(\"NativeToByteArray threw an exceptions - \" + exception.Message);\r\n            }\r\n\r\n            // Byte-bye...\r\n            DsmMemUnlock(a_intptrNative);\r\n            return (null);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert a public identity to a legacy identity...\r\n        /// </summary>\r\n        /// <param name=\"a_twidentity\">Identity to convert</param>\r\n        /// <returns>Legacy form of identity</returns>\r\n        private TW_IDENTITY_LEGACY TwidentityToTwidentitylegacy(TW_IDENTITY a_twidentity)\r\n        {\r\n            TW_IDENTITY_LEGACY twidentitylegacy = new TW_IDENTITY_LEGACY();\r\n            twidentitylegacy.Id = (uint)a_twidentity.Id;\r\n            twidentitylegacy.Manufacturer = a_twidentity.Manufacturer;\r\n            twidentitylegacy.ProductFamily = a_twidentity.ProductFamily;\r\n            twidentitylegacy.ProductName = a_twidentity.ProductName;\r\n            twidentitylegacy.ProtocolMajor = a_twidentity.ProtocolMajor;\r\n            twidentitylegacy.ProtocolMinor = a_twidentity.ProtocolMinor;\r\n            twidentitylegacy.SupportedGroups = a_twidentity.SupportedGroups;\r\n            twidentitylegacy.Version.Country = a_twidentity.Version.Country;\r\n            twidentitylegacy.Version.Info = a_twidentity.Version.Info;\r\n            twidentitylegacy.Version.Language = a_twidentity.Version.Language;\r\n            twidentitylegacy.Version.MajorNum = a_twidentity.Version.MajorNum;\r\n            twidentitylegacy.Version.MinorNum = a_twidentity.Version.MinorNum;\r\n            return (twidentitylegacy);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert a public identity to a linux64 identity...\r\n        /// </summary>\r\n        /// <param name=\"a_twidentity\">Identity to convert</param>\r\n        /// <returns>Linux64 form of identity</returns>\r\n        private TW_IDENTITY_LINUX64 TwidentityToTwidentitylinux64(TW_IDENTITY a_twidentity)\r\n        {\r\n            TW_IDENTITY_LINUX64 twidentitylinux64 = new TW_IDENTITY_LINUX64();\r\n            twidentitylinux64.Id = a_twidentity.Id;\r\n            twidentitylinux64.Manufacturer = a_twidentity.Manufacturer;\r\n            twidentitylinux64.ProductFamily = a_twidentity.ProductFamily;\r\n            twidentitylinux64.ProductName = a_twidentity.ProductName;\r\n            twidentitylinux64.ProtocolMajor = a_twidentity.ProtocolMajor;\r\n            twidentitylinux64.ProtocolMinor = a_twidentity.ProtocolMinor;\r\n            twidentitylinux64.SupportedGroups = a_twidentity.SupportedGroups;\r\n            twidentitylinux64.Version.Country = a_twidentity.Version.Country;\r\n            twidentitylinux64.Version.Info = a_twidentity.Version.Info;\r\n            twidentitylinux64.Version.Language = a_twidentity.Version.Language;\r\n            twidentitylinux64.Version.MajorNum = a_twidentity.Version.MajorNum;\r\n            twidentitylinux64.Version.MinorNum = a_twidentity.Version.MinorNum;\r\n            return (twidentitylinux64);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert a public identity to a macosx identity...\r\n        /// </summary>\r\n        /// <param name=\"a_twidentity\">Identity to convert</param>\r\n        /// <returns>Mac OS X form of identity</returns>\r\n        public static TW_IDENTITY_MACOSX TwidentityToTwidentitymacosx(TW_IDENTITY a_twidentity)\r\n        {\r\n            TW_IDENTITY_MACOSX twidentitymacosx = new TW_IDENTITY_MACOSX();\r\n            twidentitymacosx.Id = (uint)a_twidentity.Id;\r\n            twidentitymacosx.Manufacturer = a_twidentity.Manufacturer;\r\n            twidentitymacosx.ProductFamily = a_twidentity.ProductFamily;\r\n            twidentitymacosx.ProductName = a_twidentity.ProductName;\r\n            twidentitymacosx.ProtocolMajor = a_twidentity.ProtocolMajor;\r\n            twidentitymacosx.ProtocolMinor = a_twidentity.ProtocolMinor;\r\n            twidentitymacosx.SupportedGroups = a_twidentity.SupportedGroups;\r\n            twidentitymacosx.Version.Country = a_twidentity.Version.Country;\r\n            twidentitymacosx.Version.Info = a_twidentity.Version.Info;\r\n            twidentitymacosx.Version.Language = a_twidentity.Version.Language;\r\n            twidentitymacosx.Version.MajorNum = a_twidentity.Version.MajorNum;\r\n            twidentitymacosx.Version.MinorNum = a_twidentity.Version.MinorNum;\r\n            return (twidentitymacosx);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert a legacy identity to a public identity...\r\n        /// </summary>\r\n        /// <param name=\"a_twidentitylegacy\">Legacy identity to convert</param>\r\n        /// <returns>Regular form of identity</returns>\r\n        private TW_IDENTITY TwidentitylegacyToTwidentity(TW_IDENTITY_LEGACY a_twidentitylegacy)\r\n        {\r\n            TW_IDENTITY twidentity = new TW_IDENTITY();\r\n            twidentity.Id = a_twidentitylegacy.Id;\r\n            twidentity.Manufacturer = a_twidentitylegacy.Manufacturer;\r\n            twidentity.ProductFamily = a_twidentitylegacy.ProductFamily;\r\n            twidentity.ProductName = a_twidentitylegacy.ProductName;\r\n            twidentity.ProtocolMajor = a_twidentitylegacy.ProtocolMajor;\r\n            twidentity.ProtocolMinor = a_twidentitylegacy.ProtocolMinor;\r\n            twidentity.SupportedGroups = a_twidentitylegacy.SupportedGroups;\r\n            twidentity.Version.Country = a_twidentitylegacy.Version.Country;\r\n            twidentity.Version.Info = a_twidentitylegacy.Version.Info;\r\n            twidentity.Version.Language = a_twidentitylegacy.Version.Language;\r\n            twidentity.Version.MajorNum = a_twidentitylegacy.Version.MajorNum;\r\n            twidentity.Version.MinorNum = a_twidentitylegacy.Version.MinorNum;\r\n            return (twidentity);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert a linux64 identity to a public identity...\r\n        /// </summary>\r\n        /// <param name=\"a_twidentitylegacy\">Legacy identity to convert</param>\r\n        /// <returns>Regular form of identity</returns>\r\n        private TW_IDENTITY Twidentitylinux64ToTwidentity(TW_IDENTITY_LINUX64 a_twidentitylinux64)\r\n        {\r\n            TW_IDENTITY twidentity = new TW_IDENTITY();\r\n            twidentity.Id = a_twidentitylinux64.Id;\r\n            twidentity.Manufacturer = a_twidentitylinux64.Manufacturer;\r\n            twidentity.ProductFamily = a_twidentitylinux64.ProductFamily;\r\n            twidentity.ProductName = a_twidentitylinux64.ProductName;\r\n            twidentity.ProtocolMajor = a_twidentitylinux64.ProtocolMajor;\r\n            twidentity.ProtocolMinor = a_twidentitylinux64.ProtocolMinor;\r\n            twidentity.SupportedGroups = (uint)a_twidentitylinux64.SupportedGroups;\r\n            twidentity.Version.Country = a_twidentitylinux64.Version.Country;\r\n            twidentity.Version.Info = a_twidentitylinux64.Version.Info;\r\n            twidentity.Version.Language = a_twidentitylinux64.Version.Language;\r\n            twidentity.Version.MajorNum = a_twidentitylinux64.Version.MajorNum;\r\n            twidentity.Version.MinorNum = a_twidentitylinux64.Version.MinorNum;\r\n            return (twidentity);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert a macosx identity to a public identity...\r\n        /// </summary>\r\n        /// <param name=\"a_twidentitymacosx\">Mac OS X identity to convert</param>\r\n        /// <returns>Regular identity</returns>\r\n        private TW_IDENTITY TwidentitymacosxToTwidentity(TW_IDENTITY_MACOSX a_twidentitymacosx)\r\n        {\r\n            TW_IDENTITY twidentity = new TW_IDENTITY();\r\n            twidentity.Id = a_twidentitymacosx.Id;\r\n            twidentity.Manufacturer = a_twidentitymacosx.Manufacturer;\r\n            twidentity.ProductFamily = a_twidentitymacosx.ProductFamily;\r\n            twidentity.ProductName = a_twidentitymacosx.ProductName;\r\n            twidentity.ProtocolMajor = a_twidentitymacosx.ProtocolMajor;\r\n            twidentity.ProtocolMinor = a_twidentitymacosx.ProtocolMinor;\r\n            twidentity.SupportedGroups = a_twidentitymacosx.SupportedGroups;\r\n            twidentity.Version.Country = a_twidentitymacosx.Version.Country;\r\n            twidentity.Version.Info = a_twidentitymacosx.Version.Info;\r\n            twidentity.Version.Language = a_twidentitymacosx.Version.Language;\r\n            twidentity.Version.MajorNum = a_twidentitymacosx.Version.MajorNum;\r\n            twidentity.Version.MinorNum = a_twidentitymacosx.Version.MinorNum;\r\n            return (twidentity);\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        // Private Structures, things we need for the thread, and to support stuff\r\n        // like DAT_IMAGENATIVEXFER...\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        #region Private Structures...\r\n\r\n        /// <summary>\r\n        /// The data we share with the thread...\r\n        /// </summary>\r\n        [SuppressMessage(\"Microsoft.Design\", \"CA1049:TypesThatOwnNativeResourcesShouldBeDisposable\")]\r\n        private struct ThreadData\r\n        {\r\n            // The state of the structure...\r\n            public bool blIsInuse;\r\n            public bool blIsComplete;\r\n            public bool blExitThread;\r\n\r\n            // Command...\r\n            public DG dg;\r\n            public DAT dat;\r\n            public MSG msg;\r\n            public STATE stateRollback;\r\n            public bool blRollback;\r\n\r\n            // Payload...\r\n            public IntPtr intptrHwnd;\r\n            public IntPtr intptrBitmap;\r\n            public IntPtr intptrAudio;\r\n            public IntPtr twmemref;\r\n            public Bitmap bitmap;\r\n            public bool blUseBitmapHandle;\r\n            public UInt32 twuint32;\r\n            public TW_AUDIOINFO twaudioinfo;\r\n            public TW_CALLBACK twcallback;\r\n            public TW_CALLBACK2 twcallback2;\r\n            public TW_CAPABILITY twcapability;\r\n            public TW_CIECOLOR twciecolor;\r\n            public TW_CUSTOMDSDATA twcustomdsdata;\r\n            public TW_DEVICEEVENT twdeviceevent;\r\n            public TW_ENTRYPOINT twentrypoint;\r\n            public TW_EVENT twevent;\r\n            public TW_EXTIMAGEINFO twextimageinfo;\r\n            public TW_FILESYSTEM twfilesystem;\r\n            public TW_FILTER twfilter;\r\n            public TW_GRAYRESPONSE twgrayresponse;\r\n            public TW_IDENTITY twidentity;\r\n            public TW_IDENTITY_LEGACY twidentitylegacy;\r\n            public TW_IMAGEINFO twimageinfo;\r\n            public TW_IMAGELAYOUT twimagelayout;\r\n            public TW_IMAGEMEMXFER twimagememxfer;\r\n            public TW_JPEGCOMPRESSION twjpegcompression;\r\n            public TW_METRICS twmetrics;\r\n            public TW_MEMORY twmemory;\r\n            public TW_PALETTE8 twpalette8;\r\n            public TW_PASSTHRU twpassthru;\r\n            public TW_PENDINGXFERS twpendingxfers;\r\n            public TW_RGBRESPONSE twrgbresponse;\r\n            public TW_SETUPFILEXFER twsetupfilexfer;\r\n            public TW_SETUPMEMXFER twsetupmemxfer;\r\n            public TW_STATUS twstatus;\r\n            public TW_STATUSUTF8 twstatusutf8;\r\n            public TW_TWAINDIRECT twtwaindirect;\r\n            public TW_USERINTERFACE twuserinterface;\r\n\r\n            // Result...\r\n            public STS sts;\r\n        }\r\n\r\n        /// <summary>\r\n        /// The Windows Point structure.\r\n        /// Needed for the PreFilterMessage function when we're\r\n        /// handling DAT_EVENT...\r\n        /// </summary>\r\n        [StructLayout(LayoutKind.Sequential, Pack = 1)]\r\n        private struct POINT\r\n        {\r\n            public int X;\r\n            public int Y;\r\n        }\r\n\r\n        /// <summary>\r\n        /// The Windows MSG structure.\r\n        /// Needed for the PreFilterMessage function when we're\r\n        /// handling DAT_EVENT...\r\n        /// </summary>\r\n        [StructLayout(LayoutKind.Sequential)]\r\n        private struct MESSAGE\r\n        {\r\n            public IntPtr hwnd;\r\n            public UInt32 message;\r\n            public IntPtr wParam;\r\n            public IntPtr lParam;\r\n            public UInt32 time;\r\n            public POINT pt;\r\n        }\r\n\r\n        /// <summary>\r\n        /// The header for a Bitmap file.\r\n        /// Needed for supporting DAT.IMAGENATIVEXFER...\r\n        /// </summary>\r\n        [StructLayout(LayoutKind.Sequential, Pack = 1)]\r\n        private struct BITMAPFILEHEADER\r\n        {\r\n            public ushort bfType;\r\n            public uint bfSize;\r\n            public ushort bfReserved1;\r\n            public ushort bfReserved2;\r\n            public uint bfOffBits;\r\n        }\r\n\r\n        /// <summary>\r\n        /// The header for a Device Independent Bitmap (DIB).\r\n        /// Needed for supporting DAT.IMAGENATIVEXFER...\r\n        /// </summary>\r\n        [StructLayout(LayoutKind.Sequential, Pack = 1)]\r\n        private struct BITMAPINFOHEADER\r\n        {\r\n            public uint biSize;\r\n            public int biWidth;\r\n            public int biHeight;\r\n            public ushort biPlanes;\r\n            public ushort biBitCount;\r\n            public uint biCompression;\r\n            public uint biSizeImage;\r\n            public int biXPelsPerMeter;\r\n            public int biYPelsPerMeter;\r\n            public uint biClrUsed;\r\n            public uint biClrImportant;\r\n\r\n            public void Init()\r\n            {\r\n                biSize = (uint)Marshal.SizeOf(this);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// The TIFF file header.\r\n        /// Needed for supporting DAT.IMAGENATIVEXFER...\r\n        /// </summary>\r\n        [StructLayout(LayoutKind.Sequential, Pack = 1)]\r\n        private struct TIFFHEADER\r\n        {\r\n            public ushort u8ByteOrder;\r\n            public ushort u16Version;\r\n            public uint u32OffsetFirstIFD;\r\n            public ushort u16u16IFD;\r\n        }\r\n\r\n        /// <summary>\r\n        /// An individual TIFF Tag.\r\n        /// Needed for supporting DAT.IMAGENATIVEXFER...\r\n        /// </summary>\r\n        [StructLayout(LayoutKind.Sequential, Pack = 1)]\r\n        private struct TIFFTAG\r\n        {\r\n            public ushort u16Tag;\r\n            public ushort u16Type;\r\n            public uint u32Count;\r\n            public uint u32Value;\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        // Private Attributes...\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        #region Private Attributes...\r\n\r\n        /// <summary>\r\n        /// Our application identity...\r\n        /// </summary>\r\n        private TW_IDENTITY m_twidentityApp;\r\n        private TW_IDENTITY_LEGACY m_twidentitylegacyApp;\r\n        private TW_IDENTITY_MACOSX m_twidentitymacosxApp;\r\n\r\n        /// <summary>\r\n        /// Our Data Source identity...\r\n        /// </summary>\r\n        private TW_IDENTITY m_twidentityDs;\r\n        private TW_IDENTITY_LEGACY m_twidentitylegacyDs;\r\n        private TW_IDENTITY_MACOSX m_twidentitymacosxDs;\r\n\r\n        /// <summary>\r\n        /// Our current TWAIN state...\r\n        /// </summary>\r\n        private STATE m_state;\r\n        private bool m_blAcceptXferReady;\r\n\r\n        /// <summary>\r\n        /// DAT_NULL flags that we've seen after entering into\r\n        /// state 5 through MSG_ENABLEDS or MSG_ENABLEDSUIONLY,\r\n        /// or coming down from DAT_PENDINGXFERS, either\r\n        /// MSG_ENDXFER or MSG_RESET...\r\n        /// </summary>\r\n        private bool m_blIsMsgxferready;\r\n        private bool m_blIsMsgclosedsreq;\r\n        private bool m_blIsMsgclosedsok;\r\n        private bool m_blIsMsgdeviceevent;\r\n        private bool m_blRunningDatUserinterface;\r\n        private Thread m_threadRunningDatUserinterface;\r\n\r\n        /// <summary>\r\n        /// Automatically issue DAT.STATUS on TWRC_FAILURE...\r\n        /// </summary>\r\n        private bool m_blAutoDatStatus;\r\n\r\n        /// <summary>\r\n        /// Windows, pick between TWAIN_32.DLL and TWAINDSM.DLL...\r\n        /// Mac OS X, pick between /System/Library/Frameworks/TWAIN.framework and /Library/Frameworks/TWAINDSM.framework\r\n        /// </summary>\r\n        private bool m_blUseLegacyDSM;\r\n\r\n        /// <summary>\r\n        /// Help us pick the right DSM for the current data source,\r\n        /// the first one is for the session, the second one is for\r\n        /// getfirst/getnext, and allows us to check for drivers\r\n        /// using either one or both DSMs, depending on what is\r\n        /// available...\r\n        /// </summary>\r\n        private LinuxDsm m_linuxdsm;\r\n        private LinuxDsm m_linux64bitdsmDatIdentity;\r\n        private bool m_blFoundLatestDsm;\r\n        private bool m_blFoundLatestDsm64;\r\n        private bool m_blFound020302Dsm64bit;\r\n\r\n        /// <summary>\r\n        /// Use the callback system (TWAINDSM.DLL only)...\r\n        /// </summary>\r\n        private bool m_blUseCallbacks;\r\n\r\n        /// <summary>\r\n        /// The platform we're running on...\r\n        /// </summary>\r\n        private static Platform ms_platform;\r\n        private static Processor ms_processor;\r\n        private static bool ms_blFirstPassGetPlatform = true;\r\n\r\n        /// <summary>\r\n        /// Delegates for DAT_CALLBACK...\r\n        /// </summary>\r\n        private NativeMethods.WindowsDsmEntryCallbackDelegate m_windowsdsmentrycontrolcallbackdelegate;\r\n        private NativeMethods.LinuxDsmEntryCallbackDelegate m_linuxdsmentrycontrolcallbackdelegate;\r\n        private NativeMethods.MacosxDsmEntryCallbackDelegate m_macosxdsmentrycontrolcallbackdelegate;\r\n\r\n        /// <summary>\r\n        /// We only allow one thread at a time to talk to the TWAIN driver...\r\n        /// </summary>\r\n        private Object m_lockTwain;\r\n\r\n        /// <summary>\r\n        /// Use this to wait for commands from the caller...\r\n        /// </summary>\r\n        private AutoResetEvent m_autoreseteventCaller;\r\n\r\n        /// <summary>\r\n        /// Use this to force the user's command to block until TWAIN has\r\n        /// a response...\r\n        /// </summary>\r\n        private AutoResetEvent m_autoreseteventThread;\r\n\r\n        /// <summary>\r\n        /// Use this to force the user's rollback to block until TWAIN has\r\n        /// a response...\r\n        /// </summary>\r\n        private AutoResetEvent m_autoreseteventRollback;\r\n\r\n        /// <summary>\r\n        /// One can get into a race condition with the thread, so we use\r\n        /// this event to confirm that it's started and ready for use...\r\n        /// </summary>\r\n        private AutoResetEvent m_autoreseteventThreadStarted;\r\n\r\n        /// <summary>\r\n        /// The data we share with the thread...\r\n        /// </summary>\r\n        //private ThreadData m_threaddata;\r\n\r\n        /// <summary>\r\n        /// Our callback for device events...\r\n        /// </summary>\r\n        private DeviceEventCallback m_deviceeventcallback;\r\n\r\n        /// <summary>\r\n        /// Our callback function for scanning...\r\n        /// </summary>\r\n        private ScanCallback m_scancallback;\r\n\r\n        /// <summary>\r\n        /// Run stuff in a caller's UI thread...\r\n        /// </summary>\r\n        private RunInUiThreadDelegate m_runinuithreaddelegate;\r\n\r\n        /// <summary>\r\n        /// The event calls don't go through the thread...\r\n        /// </summary>\r\n        private TW_EVENT m_tweventPreFilterMessage;\r\n\r\n        // Remember the window handle, so we can reuse it...\r\n        private IntPtr m_intptrHwnd;\r\n\r\n        /// <summary>\r\n        /// Our thread...\r\n        /// </summary>\r\n        private Thread m_threadTwain;\r\n\r\n        /// <summary>\r\n        /// How we talk to our thread...\r\n        /// </summary>\r\n        private TwainCommand m_twaincommand;\r\n\r\n        /// <summary>\r\n        ///  Indecies for commands that have to do something a\r\n        ///  bit more fancy, such as running the command in the\r\n        ///  context of a GUI thread.  And flags to help know\r\n        ///  when we are doing this...\r\n        /// </summary>\r\n        private ThreadData m_threaddataDatAudiofilexfer;\r\n        private ThreadData m_threaddataDatAudionativexfer;\r\n        private ThreadData m_threaddataDatCapability;\r\n        private ThreadData m_threaddataDatEvent;\r\n        private ThreadData m_threaddataDatExtimageinfo;\r\n        private ThreadData m_threaddataDatIdentity;\r\n        private ThreadData m_threaddataDatImagefilexfer;\r\n        private ThreadData m_threaddataDatImageinfo;\r\n        private ThreadData m_threaddataDatImagelayout;\r\n        private ThreadData m_threaddataDatImagememfilexfer;\r\n        private ThreadData m_threaddataDatImagememxfer;\r\n        private ThreadData m_threaddataDatImagenativexfer;\r\n        private ThreadData m_threaddataDatParent;\r\n        private ThreadData m_threaddataDatPendingxfers;\r\n        private ThreadData m_threaddataDatSetupfilexfer;\r\n        private ThreadData m_threaddataDatSetupmemxfer;\r\n        private ThreadData m_threaddataDatStatus;\r\n        private ThreadData m_threaddataDatUserinterface;\r\n\r\n        /// <summary>\r\n        /// Our helper functions from the DSM...\r\n        /// </summary>\r\n        private TW_ENTRYPOINT_DELEGATES m_twentrypointdelegates;\r\n\r\n        #endregion\r\n\r\n\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        // TwainCommand...\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        #region TwainCommand...\r\n\r\n        /// <summary>\r\n        /// We have TWAIN commands that can be called by the application from any\r\n        /// thread they want.  We do a lock, and then build a command and submit\r\n        /// it to the Main thread.  The Main thread runs without locks, so all it\r\n        /// is allowed to do is examine TwainCommands to see if it has work.  If\r\n        /// it finds an item, it takes care of it, and changes it to complete.\r\n        /// </summary>\r\n        private sealed class TwainCommand\r\n        {\r\n            ///////////////////////////////////////////////////////////////////////////\r\n            // Public Functions...\r\n            ///////////////////////////////////////////////////////////////////////////\r\n            #region Public Functions...\r\n\r\n            /// <summary>\r\n            /// Initialize an array that we'll be sharing between the TWAIN operations\r\n            /// and the Main thread...\r\n            /// </summary>\r\n            public TwainCommand()\r\n            {\r\n                m_athreaddata = new ThreadData[8];\r\n            }\r\n\r\n            /// <summary>\r\n            /// Complete a command\r\n            /// </summary>\r\n            /// <param name=\"a_lIndex\">index to update</param>\r\n            /// <param name=\"a_threaddata\">data to use</param>\r\n            public void Complete(long a_lIndex, ThreadData a_threaddata)\r\n            {\r\n                // If we're out of bounds, return an empty structure...\r\n                if ((a_lIndex < 0) || (a_lIndex >= m_athreaddata.Length))\r\n                {\r\n                    return;\r\n                }\r\n\r\n                // We're not really a command...\r\n                if (!m_athreaddata[a_lIndex].blIsInuse)\r\n                {\r\n                    return;\r\n                }\r\n\r\n                // Do the update and tag it complete...\r\n                m_athreaddata[a_lIndex] = a_threaddata;\r\n                m_athreaddata[a_lIndex].blIsComplete = true;\r\n            }\r\n\r\n            /// <summary>\r\n            /// Delete a command...\r\n            /// </summary>\r\n            /// <returns>the requested command</returns>\r\n            public void Delete(long a_lIndex)\r\n            {\r\n                // If we're out of bounds, return an empty structure...\r\n                if ((a_lIndex < 0) || (a_lIndex >= m_athreaddata.Length))\r\n                {\r\n                    return;\r\n                }\r\n\r\n                // Clear the record...\r\n                m_athreaddata[a_lIndex] = default(ThreadData);\r\n            }\r\n\r\n            /// <summary>\r\n            /// Get a command...\r\n            /// </summary>\r\n            /// <returns>the requested command</returns>\r\n            public ThreadData Get(long a_lIndex)\r\n            {\r\n                // If we're out of bounds, return an empty structure...\r\n                if ((a_lIndex < 0) || (a_lIndex >= m_athreaddata.Length))\r\n                {\r\n                    return (new ThreadData());\r\n                }\r\n\r\n                // Return what we found...\r\n                return (m_athreaddata[a_lIndex]);\r\n            }\r\n\r\n            /// <summary>\r\n            /// Get the next command in the list...\r\n            /// </summary>\r\n            /// <param name=\"a_lIndex\">the index of the data</param>\r\n            /// <param name=\"a_threaddata\">the command we'll return</param>\r\n            /// <returns>true if we found something</returns>\r\n            public bool GetNext(out long a_lIndex, out ThreadData a_threaddata)\r\n            {\r\n                long lIndex;\r\n\r\n                // Init stuff...\r\n                lIndex = m_lIndex;\r\n                a_lIndex = 0;\r\n                a_threaddata = default(ThreadData);\r\n\r\n                // Cycle once through the commands to see if we have any...\r\n                for (;;)\r\n                {\r\n                    // We found something, copy it out, point to the next\r\n                    // item (so we know we're looking at the whole list)\r\n                    // and return...\r\n                    if (m_athreaddata[lIndex].blIsInuse && !m_athreaddata[lIndex].blIsComplete)\r\n                    {\r\n                        a_threaddata = m_athreaddata[lIndex];\r\n                        a_lIndex = lIndex;\r\n                        m_lIndex = lIndex + 1;\r\n                        if (m_lIndex >= m_athreaddata.Length)\r\n                        {\r\n                            m_lIndex = 0;\r\n                        }\r\n                        return (true);\r\n                    }\r\n\r\n                    // Next item...\r\n                    lIndex += 1;\r\n                    if (lIndex >= m_athreaddata.Length)\r\n                    {\r\n                        lIndex = 0;\r\n                    }\r\n\r\n                    // We've cycled, and we didn't find anything...\r\n                    if (lIndex == m_lIndex)\r\n                    {\r\n                        a_lIndex = lIndex;\r\n                        return (false);\r\n                    }\r\n                }\r\n            }\r\n\r\n            /// <summary>\r\n            /// Submit a new command...\r\n            /// </summary>\r\n            /// <returns></returns>\r\n            public long Submit(ThreadData a_threadata)\r\n            {\r\n                long ll;\r\n\r\n                // We won't leave until we've submitted the beastie...\r\n                for (;;)\r\n                {\r\n                    // Look for a free slot...\r\n                    for (ll = 0; ll < m_athreaddata.Length; ll++)\r\n                    {\r\n                        if (!m_athreaddata[ll].blIsInuse)\r\n                        {\r\n                            m_athreaddata[ll] = a_threadata;\r\n                            m_athreaddata[ll].blIsInuse = true;\r\n                            return (ll);\r\n                        }\r\n                    }\r\n\r\n                    // Wait a little...\r\n                    Thread.Sleep(0);\r\n                }\r\n            }\r\n\r\n            /// <summary>\r\n            /// Update a command\r\n            /// </summary>\r\n            /// <param name=\"a_lIndex\">index to update</param>\r\n            /// <param name=\"a_threaddata\">data to use</param>\r\n            public void Update(long a_lIndex, ThreadData a_threaddata)\r\n            {\r\n                // If we're out of bounds, return an empty structure...\r\n                if ((a_lIndex < 0) || (a_lIndex >= m_athreaddata.Length))\r\n                {\r\n                    return;\r\n                }\r\n\r\n                // We're not really a command...\r\n                if (!m_athreaddata[a_lIndex].blIsInuse)\r\n                {\r\n                    return;\r\n                }\r\n\r\n                // Do the update...\r\n                m_athreaddata[a_lIndex] = a_threaddata;\r\n            }\r\n\r\n            #endregion\r\n\r\n\r\n            ///////////////////////////////////////////////////////////////////////////\r\n            // Private Attributes...\r\n            ///////////////////////////////////////////////////////////////////////////\r\n            #region Private Attributes...\r\n\r\n            /// <summary>\r\n            /// The data we're sharing.  A null in a position means its available for\r\n            /// use.  The Main thread only consumes items, it never creates or\r\n            /// destroys them, that's done by the various commands.\r\n            /// </summary>\r\n            private ThreadData[] m_athreaddata;\r\n\r\n            /// <summary>\r\n            /// Index for browsing m_athreaddata for work...\r\n            /// </summary>\r\n            private long m_lIndex;\r\n\r\n            #endregion\r\n        }\r\n\r\n        #endregion\r\n    }\r\n\r\n    /// <summary>\r\n    /// A quick and dirty CSV reader/writer...\r\n    /// </summary>\r\n    public class CSV\r\n    {\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        // Public Functions...\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        #region Public Functions...\r\n\r\n        /// <summary>\r\n        /// Start with an empty string...\r\n        /// </summary>\r\n        public CSV()\r\n        {\r\n            m_szCsv = \"\";\r\n        }\r\n\r\n        /// <summary>\r\n        /// Add an item to a CSV string...\r\n        /// </summary>\r\n        /// <param name=\"a_szItem\">Something to add to the CSV string</param>\r\n        public void Add(string a_szItem)\r\n        {\r\n            // If the item has commas, we need to do work...\r\n            if (a_szItem.Contains(\",\"))\r\n            {\r\n                // If the item has quotes, replace them with paired quotes, then\r\n                // quote it and add it...\r\n                if (a_szItem.Contains(\"\\\"\"))\r\n                {\r\n                    m_szCsv += ((m_szCsv != \"\") ? \",\" : \"\") + \"\\\"\" + a_szItem.Replace(\"\\\"\", \"\\\"\\\"\") + \"\\\"\";\r\n                }\r\n\r\n                // Otherwise, just quote it and add it...\r\n                else\r\n                {\r\n                    m_szCsv += ((m_szCsv != \"\") ? \",\" : \"\") + \"\\\"\" + a_szItem + \"\\\"\";\r\n                }\r\n            }\r\n\r\n            // If the item has quotes, replace them with escaped quotes, then\r\n            // quote it and add it...\r\n            else if (a_szItem.Contains(\"\\\"\"))\r\n            {\r\n                m_szCsv += ((m_szCsv != \"\") ? \",\" : \"\") + \"\\\"\" + a_szItem.Replace(\"\\\"\", \"\\\"\\\"\") + \"\\\"\";\r\n            }\r\n\r\n            // Otherwise, just add it...\r\n            else\r\n            {\r\n                m_szCsv += ((m_szCsv != \"\") ? \",\" : \"\") + a_szItem;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Clear the record...\r\n        /// </summary>\r\n        public void Clear()\r\n        {\r\n            m_szCsv = \"\";\r\n        }\r\n\r\n        /// <summary>\r\n        /// Get the current CSV string...\r\n        /// </summary>\r\n        /// <returns>The current value of the CSV string</returns>\r\n        public string Get()\r\n        {\r\n            return (m_szCsv);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Parse a CSV string...\r\n        /// </summary>\r\n        /// <param name=\"a_szCsv\">A CSV string to parse</param>\r\n        /// <returns>An array if items (some can be CSV themselves)</returns>\r\n        public static string[] Parse(string a_szCsv)\r\n        {\r\n            int ii;\r\n            bool blEnd;\r\n            string[] aszCsv;\r\n            string[] aszLeft;\r\n            string[] aszRight;\r\n\r\n            // Validate...\r\n            if ((a_szCsv == null) || (a_szCsv == \"\"))\r\n            {\r\n                return (new string[] { \"\" });\r\n            }\r\n\r\n            // If there are no quotes, then parse it fast...\r\n            if (!a_szCsv.Contains(\"\\\"\"))\r\n            {\r\n                return (a_szCsv.Split(new char[] { ',' }));\r\n            }\r\n\r\n            // There's no opening quote, so split and recurse...\r\n            if (a_szCsv[0] != '\"')\r\n            {\r\n                aszLeft = new string[] { a_szCsv.Substring(0, a_szCsv.IndexOf(',')) };\r\n                aszRight = Parse(a_szCsv.Remove(0, a_szCsv.IndexOf(',') + 1));\r\n                aszCsv = new string[aszLeft.Length + aszRight.Length];\r\n                aszLeft.CopyTo(aszCsv, 0);\r\n                aszRight.CopyTo(aszCsv, aszLeft.Length);\r\n                return (aszCsv);\r\n            }\r\n\r\n            // Handle the quoted string...\r\n            else\r\n            {\r\n                // Find the terminating quote...\r\n                blEnd = true;\r\n                for (ii = 0; ii < a_szCsv.Length; ii++)\r\n                {\r\n                    if (a_szCsv[ii] == '\"')\r\n                    {\r\n                        blEnd = !blEnd;\r\n                    }\r\n                    else if (blEnd && (a_szCsv[ii] == ','))\r\n                    {\r\n                        break;\r\n                    }\r\n                }\r\n                ii -= 1;\r\n\r\n                // We have a problem...\r\n                if (!blEnd)\r\n                {\r\n                    throw new Exception(\"Error in CSV string...\");\r\n                }\r\n\r\n                // This is the last item, remove any escaped quotes and return it...\r\n                if (((ii + 1) >= a_szCsv.Length))\r\n                {\r\n                    return (new string[] { a_szCsv.Substring(1, a_szCsv.Length - 2).Replace(\"\\\"\\\"\", \"\\\"\") });\r\n                }\r\n\r\n                // We have more data...\r\n                if (a_szCsv[ii + 1] == ',')\r\n                {\r\n                    aszLeft = new string[] { a_szCsv.Substring(1, ii - 1).Replace(\"\\\"\\\"\", \"\\\"\") };\r\n                    aszRight = Parse(a_szCsv.Remove(0, ii + 2));\r\n                    aszCsv = new string[aszLeft.Length + aszRight.Length];\r\n                    aszLeft.CopyTo(aszCsv, 0);\r\n                    aszRight.CopyTo(aszCsv, aszLeft.Length);\r\n                    return (aszCsv);\r\n                }\r\n\r\n                // We have a problem...\r\n                throw new Exception(\"Error in CSV string...\");\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        // Private Attributes...\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        #region Private Attributes...\r\n\r\n        /// <summary>\r\n        /// Our working string for creating or parsing...\r\n        /// </summary>\r\n        private string m_szCsv;\r\n\r\n        #endregion\r\n    }\r\n\r\n\r\n    /// <summary>\r\n    /// Our logger.  If we bump up to 4.5 (and if mono supports it at compile\r\n    /// time), then we'll be able to add the following to our traces, which\r\n    /// seems like it should be more than enough to locate log messages.  For\r\n    /// now we'll leave the log messages undecorated:\r\n    ///     [CallerFilePath] string file = \"\",\r\n    ///     [CallerMemberName] string member = \"\",\r\n    ///     [CallerLineNumber] int line = 0\r\n    /// </summary>\r\n    public static class Log\r\n    {\r\n        // Public Methods...\r\n        #region Public Methods...\r\n\r\n        /// <summary>\r\n        /// Initialize our delegates...\r\n        /// </summary>\r\n        static Log()\r\n        {\r\n            Close = CloseLocal;\r\n            GetLevel =  GetLevelLocal;\r\n            Open = OpenLocal;\r\n            RegisterTwain = RegisterTwainLocal;\r\n            SetFlush = SetFlushLocal;\r\n            SetLevel = SetLevelLocal;\r\n            WriteEntry = WriteEntryLocal;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Let the caller override our delegates with their own functions...\r\n        /// </summary>\r\n        /// <param name=\"a_closedelegate\">use this to close the logging session</param>\r\n        /// <param name=\"a_getleveldelegate\">get the current log level</param>\r\n        /// <param name=\"a_opendelegate\">open the logging session</param>\r\n        /// <param name=\"a_registertwaindelegate\">not needed at this time</param>\r\n        /// <param name=\"a_setflushdelegate\">turn flushing on and off</param>\r\n        /// <param name=\"a_setleveldelegate\">set the new log level</param>\r\n        /// <param name=\"a_writeentrydelegate\">the function that actually writes to the log</param>\r\n        /// <param name=\"a_getstatedelegate\">returns a way to get the current TWAIN state</param>\r\n        public static void Override\r\n        (\r\n            CloseDelegate a_closedelegate,\r\n            GetLevelDelegate a_getleveldelegate,\r\n            OpenDelegate a_opendelegate,\r\n            RegisterTwainDelegate a_registertwaindelegate,\r\n            SetFlushDelegate a_setflushdelegate,\r\n            SetLevelDelegate a_setleveldelegate,\r\n            WriteEntryDelegate a_writeentrydelegate,\r\n            out GetStateDelegate a_getstatedelegate\r\n        )\r\n        {\r\n            Close = (a_closedelegate != null) ? a_closedelegate : CloseLocal;\r\n            GetLevel = (a_getleveldelegate != null) ? a_getleveldelegate : GetLevelLocal;\r\n            Open = (a_opendelegate != null) ? a_opendelegate : OpenLocal;\r\n            RegisterTwain = (a_registertwaindelegate != null) ? a_registertwaindelegate : RegisterTwainLocal;\r\n            SetFlush = (a_setflushdelegate != null) ? a_setflushdelegate : SetFlushLocal;\r\n            SetLevel = (a_setleveldelegate != null) ? a_setleveldelegate : SetLevelLocal;\r\n            WriteEntry = (a_writeentrydelegate != null) ? a_writeentrydelegate : WriteEntryLocal;\r\n            a_getstatedelegate = GetStateLocal;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Write an assert message, but only throw with a debug build...\r\n        /// </summary>\r\n        /// <param name=\"a_szMessage\">message to log</param>\r\n        public static void Assert(string a_szMessage)\r\n        {\r\n            WriteEntry(\"A\", a_szMessage, true);\r\n            #if DEBUG\r\n                throw new Exception(a_szMessage);\r\n            #endif\r\n        }\r\n\r\n        /// <summary>\r\n        /// Write an error message...\r\n        /// </summary>\r\n        /// <param name=\"a_szMessage\">message to log</param>\r\n        public static void Error(string a_szMessage)\r\n        {\r\n            WriteEntry(\"E\", a_szMessage, true);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Write an informational message...\r\n        /// </summary>\r\n        /// <param name=\"a_szMessage\">message to log</param>\r\n        public static void Info(string a_szMessage)\r\n        {\r\n            WriteEntry(\".\", a_szMessage, ms_blFlush);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Log after sending to the TWAIN driver...\r\n        /// </summary>\r\n        /// <param name=\"a_sts\">status</param>\r\n        /// <param name=\"a_szMemref\">data</param>\r\n        public static void LogSendAfter(TWAIN.STS a_sts, string a_szMemref)\r\n        {\r\n            // The data argument type (DAT) stuff...\r\n            if ((a_szMemref != null) && (a_szMemref != \"\") && (a_szMemref[0] != '('))\r\n            {\r\n                Log.Info(\"twn> \" + a_szMemref);\r\n            }\r\n\r\n            // TWRC...\r\n            if ((int)a_sts < TWAIN.STSCC)\r\n            {\r\n                Log.Info(\"twn> \" + a_sts);\r\n            }\r\n            // TWCC...\r\n            else\r\n            {\r\n                Log.Info(\"twn> FAILURE/\" + a_sts);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Log before sending to the TWAIN driver...\r\n        /// </summary>\r\n        /// <param name=\"a_szDg\">data group</param>\r\n        /// <param name=\"a_szDat\">data argument type</param>\r\n        /// <param name=\"a_szMsg\">message</param>\r\n        /// <param name=\"a_szMemref\">data</param>\r\n        public static void LogSendBefore(string a_szDg, string a_szDat, string a_szMsg, string a_szMemref)\r\n        {\r\n            Log.Info(\"\");\r\n            Log.Info(\"twn> DG_\" + a_szDg + \"/DAT_\" + a_szDat + \"/MSG_\" + a_szMsg);\r\n            if ((a_szMemref != null) && (a_szMemref != \"\") && (a_szMemref[0] != '('))\r\n            {\r\n                Log.Info(\"twn> \" + a_szMemref);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Write a verbose message, this is extra info that isn't normally\r\n        /// needed to diagnose problems, but may provide insight into what\r\n        /// the code is doing...\r\n        /// </summary>\r\n        /// <param name=\"a_szMessage\">message to log</param>\r\n        public static void Verbose(string a_szMessage)\r\n        {\r\n            WriteEntry(\"V\", a_szMessage, ms_blFlush);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Write a verbose data message, this is extra info, specifically\r\n        /// data transfers, that isn't normally needed to diagnose problems.\r\n        /// Turning this one can really bloat the logs...\r\n        /// </summary>\r\n        /// <param name=\"a_szMessage\">message to log</param>\r\n        public static void VerboseData(string a_szMessage)\r\n        {\r\n            WriteEntry(\"D\", a_szMessage, ms_blFlush);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Write an warning message...\r\n        /// </summary>\r\n        /// <param name=\"a_szMessage\">message to log</param>\r\n        public static void Warn(string a_szMessage)\r\n        {\r\n            WriteEntry(\"W\", a_szMessage, ms_blFlush);\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        // Public Definitions...\r\n        #region Public Definitions...\r\n\r\n        // The public methods that need attributes, here offered\r\n        // as delegates, so that a caller will be able to override\r\n        // them...\r\n        public delegate void CloseDelegate();\r\n        public delegate int GetLevelDelegate();\r\n        public delegate string GetStateDelegate();\r\n        public delegate void OpenDelegate(string a_szName, string a_szPath, int a_iLevel);\r\n        public delegate void RegisterTwainDelegate(TWAIN a_twain);\r\n        public delegate void SetFlushDelegate(bool a_blFlush);\r\n        public delegate void SetLevelDelegate(int a_iLevel);\r\n        public delegate void WriteEntryDelegate(string a_szSeverity, string a_szMessage, bool a_blFlush);\r\n\r\n        #endregion\r\n\r\n\r\n        // Public Attributes...\r\n        #region Public Attributes...\r\n\r\n        // The public methods that need attributes, here offered\r\n        // as delegates, so that a caller will be able to override\r\n        // them...\r\n        public static CloseDelegate Close;\r\n        public static GetLevelDelegate GetLevel;\r\n        public static OpenDelegate Open;\r\n        public static RegisterTwainDelegate RegisterTwain;\r\n        public static SetFlushDelegate SetFlush;\r\n        public static SetLevelDelegate SetLevel;\r\n        public static WriteEntryDelegate WriteEntry;\r\n\r\n        #endregion\r\n\r\n\r\n        // Private Methods...\r\n        #region Private Methods...\r\n\r\n        /// <summary>\r\n        /// Close tracing...\r\n        /// </summary>\r\n        private static void CloseLocal()\r\n        {\r\n            if (!ms_blFirstPass)\r\n            {\r\n                Trace.Close();\r\n                ms_filestream.Close();\r\n                ms_filestream = null;\r\n            }\r\n            ms_blFirstPass = true;\r\n            ms_blOpened = false;\r\n            ms_blFlush = false;\r\n            ms_iMessageNumber = 0;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Get the debugging level...\r\n        /// </summary>\r\n        /// <returns>the level</returns>\r\n        private static int GetLevelLocal()\r\n        {\r\n            return (ms_iLevel);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Get the state...\r\n        /// </summary>\r\n        /// <returns>the level</returns>\r\n        private static string GetStateLocal()\r\n        {\r\n            return ((ms_twain == null) ? \"S1\" : ms_twain.GetState().ToString());\r\n        }\r\n\r\n        /// <summary>\r\n        /// Turn on the listener for our log file...\r\n        /// </summary>\r\n        /// <param name=\"a_szName\">the name of our log</param>\r\n        /// <param name=\"a_szPath\">the path where we want our log to go</param>\r\n        /// <param name=\"a_iLevel\">debug level</param>\r\n        private static void OpenLocal(string a_szName, string a_szPath, int a_iLevel)\r\n        {\r\n            string szLogFile;\r\n\r\n            // Init stuff...\r\n            ms_blFirstPass = true;\r\n            ms_blOpened = true;\r\n            ms_blFlush = false;\r\n            ms_iMessageNumber = 0;\r\n            ms_iLevel = a_iLevel;\r\n\r\n            // Ask for a TWAINDSM log...\r\n            if (a_iLevel > 0)\r\n            {\r\n                Environment.SetEnvironmentVariable(\"TWAINDSM_LOG\", Path.Combine(a_szPath, \"twaindsm.log\"));\r\n                Environment.SetEnvironmentVariable(\"TWAINDSM_MODE\", \"w\");\r\n            }\r\n\r\n            // Backup old stuff...\r\n            szLogFile = Path.Combine(a_szPath, a_szName);\r\n            try\r\n            {\r\n                if (File.Exists(szLogFile + \"_backup_2.log\"))\r\n                {\r\n                    File.Delete(szLogFile + \"_backup_2.log\");\r\n                }\r\n                if (File.Exists(szLogFile + \"_backup_1.log\"))\r\n                {\r\n                    File.Move(szLogFile + \"_backup_1.log\", szLogFile + \"_backup_2.log\");\r\n                }\r\n                if (File.Exists(szLogFile + \".log\"))\r\n                {\r\n                    File.Move(szLogFile + \".log\", szLogFile + \"_backup_1.log\");\r\n                }\r\n            }\r\n            catch\r\n            {\r\n                // Don't care, keep going...\r\n            }\r\n\r\n            // Turn on the listener, if we're reentering, we maybe have to retry a bit until the\r\n            // previous one is gone...\r\n            for (int iRetry = 0; iRetry < 5000; iRetry += 1000)\r\n            {\r\n                try\r\n                {\r\n                    ms_filestream = File.Open(szLogFile + \".log\", FileMode.Append, FileAccess.Write, FileShare.Read);\r\n                    Trace.Listeners.Add(new TextWriterTraceListener(ms_filestream, a_szName + \"Listener\"));\r\n                    break;\r\n                }\r\n                catch\r\n                {\r\n                    // Just keep retrying...\r\n                }\r\n                Thread.Sleep(1000);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Register the TWAIN object so we can get some extra info...\r\n        /// </summary>\r\n        /// <param name=\"a_twain\">twain object or null</param>\r\n        private static void RegisterTwainLocal(TWAIN a_twain)\r\n        {\r\n            ms_twain = a_twain;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Flush data to the file...\r\n        /// </summary>\r\n        private static void SetFlushLocal(bool a_blFlush)\r\n        {\r\n            ms_blFlush = a_blFlush;\r\n            if (a_blFlush)\r\n            {\r\n                Trace.Flush();\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Set the debugging level\r\n        /// </summary>\r\n        /// <param name=\"a_iLevel\"></param>\r\n        private static void SetLevelLocal(int a_iLevel)\r\n        {\r\n            // Squirrel this value away...\r\n            ms_iLevel = a_iLevel;\r\n\r\n            // One has to opt out of flushing, since the consequence\r\n            // of turning it off often involves losing log data...\r\n            if ((a_iLevel & c_iDebugNoFlush) == c_iDebugNoFlush)\r\n            {\r\n                SetFlush(false);\r\n            }\r\n            else\r\n            {\r\n                SetFlush(true);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Do this for all of them...\r\n        /// </summary>\r\n        /// <param name=\"a_szMessage\">The message</param>\r\n        /// <param name=\"a_szSeverity\">Message severity</param>\r\n        /// <param name=\"a_blFlush\">Flush it to disk</param>\r\n        private static void WriteEntryLocal(string a_szSeverity, string a_szMessage, bool a_blFlush)\r\n        {\r\n            long lThreadId;\r\n\r\n            // Filter...\r\n            switch (a_szSeverity)\r\n            {\r\n                // Always log these, and always flush them to disk...\r\n                case \"A\":\r\n                case \"E\":\r\n                case \"W\":\r\n                    a_blFlush = true;\r\n                    break;\r\n\r\n                // Log informationals when bit-0 is set...\r\n                case \".\":\r\n                    if ((ms_iLevel & c_iDebugInfo) != 0)\r\n                    {\r\n                        break;\r\n                    }\r\n                    return;\r\n\r\n                // Log verbose when bit-1 is set...\r\n                case \"V\":\r\n                    if ((ms_iLevel & c_iDebugVerbose) != 0)\r\n                    {\r\n                        a_szSeverity = \".\";\r\n                        break;\r\n                    }\r\n                    return;\r\n\r\n                // Log verbose data when bit-1 is set...\r\n                case \"D\":\r\n                    if ((ms_iLevel & c_iDebugVerboseData) != 0)\r\n                    {\r\n                        a_szSeverity = \".\";\r\n                        break;\r\n                    }\r\n                    return;\r\n            }\r\n\r\n            // Get our thread id...\r\n            if (ms_blIsWindows)\r\n            {\r\n                lThreadId = NativeMethods.GetCurrentThreadId();\r\n            }\r\n            else\r\n            {\r\n                lThreadId = Thread.CurrentThread.ManagedThreadId;\r\n            }\r\n\r\n            // First pass...\r\n            if (ms_blFirstPass)\r\n            {\r\n                string szPlatform;\r\n\r\n                // We're Windows...\r\n                if (Environment.OSVersion.ToString().Contains(\"Microsoft Windows\"))\r\n                {\r\n                    szPlatform = \"windows\";\r\n                }\r\n\r\n                // We're Mac OS X (this has to come before LINUX!!!)...\r\n                else if (Directory.Exists(\"/Library/Application Support\"))\r\n                {\r\n                    szPlatform = \"macosx\";\r\n                }\r\n\r\n                // We're Linux...\r\n                else if (Environment.OSVersion.ToString().Contains(\"Unix\"))\r\n                {\r\n                    szPlatform = \"linux\";\r\n                }\r\n\r\n                // We have a problem, Log will throw for us...\r\n                else\r\n                {\r\n                    szPlatform = \"unknown\";\r\n                }\r\n                if (!ms_blOpened)\r\n                {\r\n                    // We'll assume they want logging, since they didn't tell us...\r\n                    Open(\"Twain\", \".\", 1);\r\n                }\r\n                Trace.UseGlobalLock = true;\r\n                ms_blFirstPass = false;\r\n                Trace.WriteLine\r\n                (\r\n                    string.Format\r\n                    (\r\n                        \"{0:D6} {1} {2} T{3:D8} V{4} ts:{5} os:{6}\",\r\n                        ms_iMessageNumber++,\r\n                        DateTime.Now.ToString(\"HHmmssffffff\"),\r\n                        (ms_twain != null) ? ms_twain.GetState().ToString() : \"S1\",\r\n                        lThreadId,\r\n                        a_szSeverity.ToString(),\r\n                        DateTime.Now.ToString(\"yyyy/MM/dd HH:mm:ss.ffffff\"),\r\n                        szPlatform\r\n                    )\r\n                );\r\n            }\r\n\r\n            // And log it...\r\n            Trace.WriteLine\r\n            (\r\n                string.Format\r\n                (\r\n                    \"{0:D6} {1} {2} T{3:D8} V{4} {5}\",\r\n                    ms_iMessageNumber++,\r\n                    DateTime.Now.ToString(\"HHmmssffffff\"),\r\n                    (ms_twain != null) ? ms_twain.GetState().ToString() : \"S1\",\r\n                    lThreadId,\r\n                    a_szSeverity.ToString(),\r\n                    a_szMessage\r\n                )\r\n            );\r\n\r\n            // Flush it...\r\n            if (a_blFlush)\r\n            {\r\n                Trace.Flush();\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        // Private Definitions...\r\n        #region Private Definitions\r\n\r\n        /// <summary>\r\n        /// LogLevel bitmask...\r\n        /// </summary>\r\n        private const int c_iDebugInfo = 0x0001;\r\n        private const int c_iDebugVerbose = 0x0002;\r\n        private const int c_iDebugVerboseData = 0x0004;\r\n        private const int c_iDebugNoFlush = 0x0008;\r\n\r\n        #endregion\r\n\r\n\r\n        // Private Attributes...\r\n        #region Private Attributes\r\n\r\n        private static bool ms_blFirstPass = true;\r\n        private static bool ms_blOpened = false;\r\n        private static bool ms_blFlush = false;\r\n        private static int ms_iMessageNumber = 0;\r\n        private static int ms_iLevel = 0;\r\n        private static TWAIN ms_twain = null;\r\n        private static bool ms_blIsWindows = false;\r\n        private static FileStream ms_filestream;\r\n\r\n        #endregion\r\n    }\r\n}\r\n"
  },
  {
    "path": "twaincs/source/TWAINH.cs",
    "content": "﻿///////////////////////////////////////////////////////////////////////////////////////\r\n//\r\n//  TwainWorkingGroup.TWAIN\r\n//\r\n//  These are the definitions for TWAIN.  They're essentially the C/C++\r\n//  TWAIN.H file contents translated to C#, with modifications that\r\n//  recognize the differences between Windows, Linux and Mac OS X.\r\n//\r\n///////////////////////////////////////////////////////////////////////////////////////\r\n//  Author          Date            TWAIN       Comment\r\n//  M.McLaughlin    17-May-2021     2.5.0.0     Updated to latest spec\r\n//  M.McLaughlin    13-Mar-2019     2.4.0.3     Add language code page support for strings\r\n//  M.McLaughlin    13-Nov-2015     2.4.0.0     Updated to latest spec\r\n//  M.McLaughlin    13-Sep-2015     2.3.1.2     DsmMem bug fixes\r\n//  M.McLaughlin    26-Aug-2015     2.3.1.1     Log fix and sync with TWAIN Direct\r\n//  M.McLaughlin    13-Mar-2015     2.3.1.0     Numerous fixes\r\n//  M.McLaughlin    13-Oct-2014     2.3.0.4     Added logging\r\n//  M.McLaughlin    24-Jun-2014     2.3.0.3     Stability fixes\r\n//  M.McLaughlin    21-May-2014     2.3.0.2     64-Bit Linux\r\n//  M.McLaughlin    27-Feb-2014     2.3.0.1     AnyCPU support\r\n//  M.McLaughlin    21-Oct-2013     2.3.0.0     Initial Release\r\n///////////////////////////////////////////////////////////////////////////////////////\r\n//  Copyright (C) 2013-2021 Kodak Alaris Inc.\r\n//\r\n//  Permission is hereby granted, free of charge, to any person obtaining a\r\n//  copy of this software and associated documentation files (the \"Software\"),\r\n//  to deal in the Software without restriction, including without limitation\r\n//  the rights to use, copy, modify, merge, publish, distribute, sublicense,\r\n//  and/or sell copies of the Software, and to permit persons to whom the\r\n//  Software is furnished to do so, subject to the following conditions:\r\n//\r\n//  The above copyright notice and this permission notice shall be included in\r\n//  all copies or substantial portions of the Software.\r\n//\r\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\r\n//  THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\r\n//  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\r\n//  DEALINGS IN THE SOFTWARE.\r\n///////////////////////////////////////////////////////////////////////////////////////\r\n\r\nusing System;\r\nusing System.Diagnostics.CodeAnalysis;\r\nusing System.Runtime.InteropServices;\r\nusing System.Text;\r\n\r\nnamespace TWAINWorkingGroup\r\n{\r\n    /// <summary>\r\n    /// This file contains content gleaned from version 2.4 of the C/C++ TWAIN.H\r\n    /// header file released by the TWAIN Working Group.  It's organized like that\r\n    /// file to make it easier to maintain.\r\n    /// \r\n    /// Please do not add any code to this module, save for the minimum needed to\r\n    /// maintain a particular definition (such as TW_STR32)...\r\n    /// </summary>\r\n    public partial class TWAIN\r\n    {\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        // TWAIN Version...\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        #region Protocol Version...\r\n        public enum TWON_PROTOCOL\r\n        {\r\n            MAJOR = 2,\r\n            MINOR = 5 // Changed for Version 2.5\r\n        };\r\n        #endregion\r\n\r\n\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        // Type Definitions...\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        #region Type Definitions...\r\n\r\n        // Follow these rules\r\n        /******************************************************************************\r\n\r\n        TW_HANDLE...............IntPtr\r\n        TW_MEMREF...............IntPtr\r\n        TW_UINTPTR..............UIntPtr\r\n        \r\n        TW_INT8.................char\r\n        TW_INT16................short\r\n        TW_INT32................int (was long on Linux 64-bit)\r\n        \r\n        TW_UINT8................byte\r\n        TW_UINT16...............ushort\r\n        TW_UINT32...............uint (was ulong on Linux 64-bit)\r\n        TW_BOOL.................ushort\r\n        \r\n        ******************************************************************************/\r\n\r\n        /// <summary>\r\n        /// Our supported platforms...\r\n        /// </summary>\r\n        public enum Platform\r\n        {\r\n            UNKNOWN,\r\n            WINDOWS,\r\n            LINUX,\r\n            MACOSX\r\n        };\r\n\r\n        /// <summary>\r\n        /// Our supported processors...\r\n        /// </summary>\r\n        public enum Processor\r\n        {\r\n            UNKNOWN,\r\n            X86,\r\n            X86_64,\r\n            MIPS64EL\r\n        };\r\n\r\n        /// <summary>\r\n        /// Used for strings that go up to 32-bytes...\r\n        /// </summary>\r\n        [StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi)]\r\n        public struct TW_STR32\r\n        {\r\n            /// <summary>\r\n            /// We're stuck with this, because marshalling with packed alignment\r\n            /// can't handle arrays...\r\n            /// </summary>\r\n            private byte byItem000; private byte byItem001; private byte byItem002; private byte byItem003;\r\n            private byte byItem004; private byte byItem005; private byte byItem006; private byte byItem007;\r\n            private byte byItem008; private byte byItem009; private byte byItem010; private byte byItem011;\r\n            private byte byItem012; private byte byItem013; private byte byItem014; private byte byItem015;\r\n            private byte byItem016; private byte byItem017; private byte byItem018; private byte byItem019;\r\n            private byte byItem020; private byte byItem021; private byte byItem022; private byte byItem023;\r\n            private byte byItem024; private byte byItem025; private byte byItem026; private byte byItem027;\r\n            private byte byItem028; private byte byItem029; private byte byItem030; private byte byItem031;\r\n            private byte byItem032; private byte byItem033;\r\n\r\n            /// <summary>\r\n            /// The normal get...\r\n            /// </summary>\r\n            /// <returns></returns>\r\n            public string Get()\r\n            {\r\n                return (GetValue(true));\r\n            }\r\n\r\n            /// <summary>\r\n            /// Use this on Mac OS X if you have a call that uses a string\r\n            /// that doesn't include the prefix byte...\r\n            /// </summary>\r\n            /// <returns></returns>\r\n            public string GetNoPrefix()\r\n            {\r\n                return (GetValue(false));\r\n            }\r\n\r\n            /// <summary>\r\n            /// Get our value...\r\n            /// </summary>\r\n            /// <returns></returns>\r\n            private string GetValue(bool a_blMayHavePrefix)\r\n            {\r\n                // convert what we have into a byte array\r\n                byte[] abyItem = new byte[34];\r\n                abyItem[0]  = byItem000; abyItem[1]  = byItem001; abyItem[2]  = byItem002; abyItem[3]  = byItem003;\r\n                abyItem[4]  = byItem004; abyItem[5]  = byItem005; abyItem[6]  = byItem006; abyItem[7]  = byItem007;\r\n                abyItem[8]  = byItem008; abyItem[9]  = byItem009; abyItem[10] = byItem010; abyItem[11] = byItem011;\r\n                abyItem[12] = byItem012; abyItem[13] = byItem013; abyItem[14] = byItem014; abyItem[15] = byItem015;\r\n                abyItem[16] = byItem016; abyItem[17] = byItem017; abyItem[18] = byItem018; abyItem[19] = byItem019;\r\n                abyItem[20] = byItem020; abyItem[21] = byItem021; abyItem[22] = byItem022; abyItem[23] = byItem023;\r\n                abyItem[24] = byItem024; abyItem[25] = byItem025; abyItem[26] = byItem026; abyItem[27] = byItem027;\r\n                abyItem[28] = byItem028; abyItem[29] = byItem029; abyItem[30] = byItem030; abyItem[31] = byItem031;\r\n                abyItem[32] = byItem032; abyItem[33] = byItem033;\r\n\r\n                // Zero anything after the NUL...\r\n                bool blNul = false;\r\n                for (int ii = 0; ii < abyItem.Length; ii++)\r\n                {\r\n                    if (!blNul && (abyItem[ii] == 0))\r\n                    {\r\n                        blNul = true;\r\n                    }\r\n                    else if (blNul)\r\n                    {\r\n                        abyItem[ii] = 0;\r\n                    }\r\n                }\r\n\r\n                // change encoding of byte array, then convert the bytes array to a string\r\n                string sz = Encoding.Unicode.GetString(Encoding.Convert(Language.GetEncoding(), Encoding.Unicode, abyItem));\r\n\r\n                // If the first character is a NUL, then return the empty string...\r\n                while ((sz.Length > 0) && (sz[0] == '\\0'))\r\n                {\r\n                    sz = sz.Remove(0, 1);\r\n                }\r\n\r\n                // We have an emptry string...\r\n                if (sz.Length == 0)\r\n                {\r\n                    return (\"\");\r\n                }\r\n\r\n                // If we're running on a Mac, take off the prefix 'byte'...\r\n                if (a_blMayHavePrefix && (TWAIN.GetPlatform() == Platform.MACOSX))\r\n                {\r\n                    sz = sz.Remove(0, 1);\r\n                }\r\n\r\n                // If we detect a NUL, then split around it...\r\n                if (sz.IndexOf('\\0') >= 0)\r\n                {\r\n                    sz = sz.Split(new char[] { '\\0' })[0];\r\n                }\r\n\r\n                // All done...\r\n                return (sz);\r\n            }\r\n\r\n            /// <summary>\r\n            /// The normal set...\r\n            /// </summary>\r\n            /// <returns></returns>\r\n            public void Set(string a_sz)\r\n            {\r\n                SetValue(a_sz, true);\r\n            }\r\n\r\n            /// <summary>\r\n            /// Use this on Mac OS X if you have a call that uses a string\r\n            /// that doesn't include the prefix byte...\r\n            /// </summary>\r\n            /// <returns></returns>\r\n            public void SetNoPrefix(string a_sz)\r\n            {\r\n                SetValue(a_sz, false);\r\n            }\r\n\r\n            /// <summary>\r\n            /// Set our value...\r\n            /// </summary>\r\n            /// <param name=\"a_sz\"></param>\r\n            private void SetValue(string a_sz, bool a_blMayHavePrefix)\r\n            {\r\n                // If we're running on a Mac, tack on the prefix 'byte'...\r\n                if (a_sz == null)\r\n                {\r\n                    a_sz = \"\";\r\n                }\r\n                else if (a_blMayHavePrefix && (TWAIN.GetPlatform() == Platform.MACOSX))\r\n                {\r\n                    a_sz = (char)a_sz.Length + a_sz;\r\n                }\r\n\r\n                // Make sure that we're NUL padded...\r\n                string sz = a_sz +\r\n                    \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\" +\r\n                    \"\\0\\0\";\r\n                if (sz.Length > 34)\r\n                {\r\n                    sz = sz.Remove(34);\r\n                }\r\n\r\n                // convert string to byte array, then change the encoding of the byte array\r\n                byte[] abyItem = Encoding.Convert(Encoding.Unicode, Language.GetEncoding(), Encoding.Unicode.GetBytes(sz));\r\n\r\n                // convert byte array to bytes\r\n                if (abyItem.Length > 0)\r\n                {\r\n                    byItem000 = abyItem[0];  byItem001 = abyItem[1];  byItem002 = abyItem[2];  byItem003 = abyItem[3];\r\n                    byItem004 = abyItem[4];  byItem005 = abyItem[5];  byItem006 = abyItem[6];  byItem007 = abyItem[7];\r\n                    byItem008 = abyItem[8];  byItem009 = abyItem[9];  byItem010 = abyItem[10]; byItem011 = abyItem[11];\r\n                    byItem012 = abyItem[12]; byItem013 = abyItem[13]; byItem014 = abyItem[14]; byItem015 = abyItem[15];\r\n                    byItem016 = abyItem[16]; byItem017 = abyItem[17]; byItem018 = abyItem[18]; byItem019 = abyItem[19];\r\n                    byItem020 = abyItem[20]; byItem021 = abyItem[21]; byItem022 = abyItem[22]; byItem023 = abyItem[23];\r\n                    byItem024 = abyItem[24]; byItem025 = abyItem[25]; byItem026 = abyItem[26]; byItem027 = abyItem[27];\r\n                    byItem028 = abyItem[28]; byItem029 = abyItem[29]; byItem030 = abyItem[30]; byItem031 = abyItem[31];\r\n                    byItem032 = abyItem[32]; byItem033 = abyItem[33];\r\n                }\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Used for strings that go up to 64-bytes...\r\n        /// </summary>\r\n        [StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi)]\r\n        public struct TW_STR64\r\n        {\r\n            /// <summary>\r\n            /// We're stuck with this, because marshalling with packed alignment\r\n            /// can't handle arrays...\r\n            /// </summary>\r\n            private byte byItem000; private byte byItem001; private byte byItem002; private byte byItem003;\r\n            private byte byItem004; private byte byItem005; private byte byItem006; private byte byItem007;\r\n            private byte byItem008; private byte byItem009; private byte byItem010; private byte byItem011;\r\n            private byte byItem012; private byte byItem013; private byte byItem014; private byte byItem015;\r\n            private byte byItem016; private byte byItem017; private byte byItem018; private byte byItem019;\r\n            private byte byItem020; private byte byItem021; private byte byItem022; private byte byItem023;\r\n            private byte byItem024; private byte byItem025; private byte byItem026; private byte byItem027;\r\n            private byte byItem028; private byte byItem029; private byte byItem030; private byte byItem031;\r\n            private byte byItem032; private byte byItem033; private byte byItem034; private byte byItem035;\r\n            private byte byItem036; private byte byItem037; private byte byItem038; private byte byItem039;\r\n            private byte byItem040; private byte byItem041; private byte byItem042; private byte byItem043;\r\n            private byte byItem044; private byte byItem045; private byte byItem046; private byte byItem047;\r\n            private byte byItem048; private byte byItem049; private byte byItem050; private byte byItem051;\r\n            private byte byItem052; private byte byItem053; private byte byItem054; private byte byItem055;\r\n            private byte byItem056; private byte byItem057; private byte byItem058; private byte byItem059;\r\n            private byte byItem060; private byte byItem061; private byte byItem062; private byte byItem063;\r\n            private byte byItem064; private byte byItem065;\r\n\r\n            /// <summary>\r\n            /// The normal get...\r\n            /// </summary>\r\n            /// <returns></returns>\r\n            public string Get()\r\n            {\r\n                return (GetValue(true));\r\n            }\r\n\r\n            /// <summary>\r\n            /// Use this on Mac OS X if you have a call that uses a string\r\n            /// that doesn't include the prefix byte...\r\n            /// </summary>\r\n            /// <returns></returns>\r\n            public string GetNoPrefix()\r\n            {\r\n                return (GetValue(false));\r\n            }\r\n\r\n            /// <summary>\r\n            /// Get our value...\r\n            /// </summary>\r\n            /// <returns></returns>\r\n            private string GetValue(bool a_blMayHavePrefix)\r\n            {\r\n                // convert what we have into a byte array\r\n                byte[] abyItem = new byte[66];\r\n                abyItem[0]  = byItem000; abyItem[1]  = byItem001; abyItem[2]  = byItem002; abyItem[3]  = byItem003;\r\n                abyItem[4]  = byItem004; abyItem[5]  = byItem005; abyItem[6]  = byItem006; abyItem[7]  = byItem007;\r\n                abyItem[8]  = byItem008; abyItem[9]  = byItem009; abyItem[10] = byItem010; abyItem[11] = byItem011;\r\n                abyItem[12] = byItem012; abyItem[13] = byItem013; abyItem[14] = byItem014; abyItem[15] = byItem015;\r\n                abyItem[16] = byItem016; abyItem[17] = byItem017; abyItem[18] = byItem018; abyItem[19] = byItem019;\r\n                abyItem[20] = byItem020; abyItem[21] = byItem021; abyItem[22] = byItem022; abyItem[23] = byItem023;\r\n                abyItem[24] = byItem024; abyItem[25] = byItem025; abyItem[26] = byItem026; abyItem[27] = byItem027;\r\n                abyItem[28] = byItem028; abyItem[29] = byItem029; abyItem[30] = byItem030; abyItem[31] = byItem031;\r\n                abyItem[32] = byItem032; abyItem[33] = byItem033; abyItem[34] = byItem034; abyItem[35] = byItem035;\r\n                abyItem[36] = byItem036; abyItem[37] = byItem037; abyItem[38] = byItem038; abyItem[39] = byItem039;\r\n                abyItem[40] = byItem040; abyItem[41] = byItem041; abyItem[42] = byItem042; abyItem[43] = byItem043;\r\n                abyItem[44] = byItem044; abyItem[45] = byItem045; abyItem[46] = byItem046; abyItem[47] = byItem047;\r\n                abyItem[48] = byItem048; abyItem[49] = byItem049; abyItem[50] = byItem050; abyItem[51] = byItem051;\r\n                abyItem[52] = byItem052; abyItem[53] = byItem053; abyItem[54] = byItem054; abyItem[55] = byItem055;\r\n                abyItem[56] = byItem056; abyItem[57] = byItem057; abyItem[58] = byItem058; abyItem[59] = byItem059;\r\n                abyItem[60] = byItem060; abyItem[61] = byItem061; abyItem[62] = byItem062; abyItem[63] = byItem063;\r\n                abyItem[64] = byItem064; abyItem[65] = byItem065;\r\n\r\n                // Zero anything after the NUL...\r\n                bool blNul = false;\r\n                for (int ii = 0; ii < abyItem.Length; ii++)\r\n                {\r\n                    if (!blNul && (abyItem[ii] == 0))\r\n                    {\r\n                        blNul = true;\r\n                    }\r\n                    else if (blNul)\r\n                    {\r\n                        abyItem[ii] = 0;\r\n                    }\r\n                }\r\n\r\n                // change encoding of byte array, then convert the bytes array to a string\r\n                string sz = Encoding.Unicode.GetString(Encoding.Convert(Language.GetEncoding(), Encoding.Unicode, abyItem));\r\n\r\n                // If the first character is a NUL, then return the empty string...\r\n                if (sz[0] == '\\0')\r\n                {\r\n                    return (\"\");\r\n                }\r\n\r\n                // If we're running on a Mac, take off the prefix 'byte'...\r\n                if (a_blMayHavePrefix && (TWAIN.GetPlatform() == Platform.MACOSX))\r\n                {\r\n                    sz = sz.Remove(0, 1);\r\n                }\r\n\r\n                // If we detect a NUL, then split around it...\r\n                if (sz.IndexOf('\\0') >= 0)\r\n                {\r\n                    sz = sz.Split(new char[] { '\\0' })[0];\r\n                }\r\n\r\n                // All done...\r\n                return (sz);\r\n            }\r\n\r\n            /// <summary>\r\n            /// The normal set...\r\n            /// </summary>\r\n            /// <returns></returns>\r\n            public void Set(string a_sz)\r\n            {\r\n                SetValue(a_sz, true);\r\n            }\r\n\r\n            /// <summary>\r\n            /// Use this on Mac OS X if you have a call that uses a string\r\n            /// that doesn't include the prefix byte...\r\n            /// </summary>\r\n            /// <returns></returns>\r\n            public void SetNoPrefix(string a_sz)\r\n            {\r\n                SetValue(a_sz, false);\r\n            }\r\n\r\n            /// <summary>\r\n            /// Set our value...\r\n            /// </summary>\r\n            /// <param name=\"a_sz\"></param>\r\n            private void SetValue(string a_sz, bool a_blMayHavePrefix)\r\n            {\r\n                // If we're running on a Mac, tack on the prefix 'byte'...\r\n                if (a_sz == null)\r\n                {\r\n                    a_sz = \"\";\r\n                }\r\n                else if (a_blMayHavePrefix && (TWAIN.GetPlatform() == Platform.MACOSX))\r\n                {\r\n                    a_sz = (char)a_sz.Length + a_sz;\r\n                }\r\n\r\n                // Make sure that we're NUL padded...\r\n                string sz =\r\n                    a_sz +\r\n                    \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\" +\r\n                    \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\" +\r\n                    \"\\0\\0\";\r\n                if (sz.Length > 66)\r\n                {\r\n                    sz = sz.Remove(66);\r\n                }\r\n\r\n                // convert string to byte array, then change the encoding of the byte array\r\n                byte[] abyItem = Encoding.Convert(Encoding.Unicode, Language.GetEncoding(), Encoding.Unicode.GetBytes(sz));\r\n\r\n                // concert byte array to bytes\r\n                byItem000 = abyItem[0];  byItem001 = abyItem[1];  byItem002 = abyItem[2];  byItem003 = abyItem[3];\r\n                byItem004 = abyItem[4];  byItem005 = abyItem[5];  byItem006 = abyItem[6];  byItem007 = abyItem[7];\r\n                byItem008 = abyItem[8];  byItem009 = abyItem[9];  byItem010 = abyItem[10]; byItem011 = abyItem[11];\r\n                byItem012 = abyItem[12]; byItem013 = abyItem[13]; byItem014 = abyItem[14]; byItem015 = abyItem[15];\r\n                byItem016 = abyItem[16]; byItem017 = abyItem[17]; byItem018 = abyItem[18]; byItem019 = abyItem[19];\r\n                byItem020 = abyItem[20]; byItem021 = abyItem[21]; byItem022 = abyItem[22]; byItem023 = abyItem[23];\r\n                byItem024 = abyItem[24]; byItem025 = abyItem[25]; byItem026 = abyItem[26]; byItem027 = abyItem[27];\r\n                byItem028 = abyItem[28]; byItem029 = abyItem[29]; byItem030 = abyItem[30]; byItem031 = abyItem[31];\r\n                byItem032 = abyItem[32]; byItem033 = abyItem[33]; byItem034 = abyItem[34]; byItem035 = abyItem[35];\r\n                byItem036 = abyItem[36]; byItem037 = abyItem[37]; byItem038 = abyItem[38]; byItem039 = abyItem[39];\r\n                byItem040 = abyItem[40]; byItem041 = abyItem[41]; byItem042 = abyItem[42]; byItem043 = abyItem[43];\r\n                byItem044 = abyItem[44]; byItem045 = abyItem[45]; byItem046 = abyItem[46]; byItem047 = abyItem[47];\r\n                byItem048 = abyItem[48]; byItem049 = abyItem[49]; byItem050 = abyItem[50]; byItem051 = abyItem[51];\r\n                byItem052 = abyItem[52]; byItem053 = abyItem[53]; byItem054 = abyItem[54]; byItem055 = abyItem[55];\r\n                byItem056 = abyItem[56]; byItem057 = abyItem[57]; byItem058 = abyItem[58]; byItem059 = abyItem[59];\r\n                byItem060 = abyItem[60]; byItem061 = abyItem[61]; byItem062 = abyItem[62]; byItem063 = abyItem[63];\r\n                byItem064 = abyItem[64]; byItem065 = abyItem[65];\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Used for strings that go up to 128-bytes...\r\n        /// </summary>\r\n        [StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi)]\r\n        public struct TW_STR128\r\n        {\r\n            /// <summary>\r\n            /// We're stuck with this, because marshalling with packed alignment\r\n            /// can't handle arrays...\r\n            /// </summary>\r\n            private byte byItem000; private byte byItem001; private byte byItem002; private byte byItem003;\r\n            private byte byItem004; private byte byItem005; private byte byItem006; private byte byItem007;\r\n            private byte byItem008; private byte byItem009; private byte byItem010; private byte byItem011;\r\n            private byte byItem012; private byte byItem013; private byte byItem014; private byte byItem015;\r\n            private byte byItem016; private byte byItem017; private byte byItem018; private byte byItem019;\r\n            private byte byItem020; private byte byItem021; private byte byItem022; private byte byItem023;\r\n            private byte byItem024; private byte byItem025; private byte byItem026; private byte byItem027;\r\n            private byte byItem028; private byte byItem029; private byte byItem030; private byte byItem031;\r\n            private byte byItem032; private byte byItem033; private byte byItem034; private byte byItem035;\r\n            private byte byItem036; private byte byItem037; private byte byItem038; private byte byItem039;\r\n            private byte byItem040; private byte byItem041; private byte byItem042; private byte byItem043;\r\n            private byte byItem044; private byte byItem045; private byte byItem046; private byte byItem047;\r\n            private byte byItem048; private byte byItem049; private byte byItem050; private byte byItem051;\r\n            private byte byItem052; private byte byItem053; private byte byItem054; private byte byItem055;\r\n            private byte byItem056; private byte byItem057; private byte byItem058; private byte byItem059;\r\n            private byte byItem060; private byte byItem061; private byte byItem062; private byte byItem063;\r\n            private byte byItem064; private byte byItem065; private byte byItem066; private byte byItem067;\r\n            private byte byItem068; private byte byItem069; private byte byItem070; private byte byItem071;\r\n            private byte byItem072; private byte byItem073; private byte byItem074; private byte byItem075;\r\n            private byte byItem076; private byte byItem077; private byte byItem078; private byte byItem079;\r\n            private byte byItem080; private byte byItem081; private byte byItem082; private byte byItem083;\r\n            private byte byItem084; private byte byItem085; private byte byItem086; private byte byItem087;\r\n            private byte byItem088; private byte byItem089; private byte byItem090; private byte byItem091;\r\n            private byte byItem092; private byte byItem093; private byte byItem094; private byte byItem095;\r\n            private byte byItem096; private byte byItem097; private byte byItem098; private byte byItem099;\r\n            private byte byItem100; private byte byItem101; private byte byItem102; private byte byItem103;\r\n            private byte byItem104; private byte byItem105; private byte byItem106; private byte byItem107;\r\n            private byte byItem108; private byte byItem109; private byte byItem110; private byte byItem111;\r\n            private byte byItem112; private byte byItem113; private byte byItem114; private byte byItem115;\r\n            private byte byItem116; private byte byItem117; private byte byItem118; private byte byItem119;\r\n            private byte byItem120; private byte byItem121; private byte byItem122; private byte byItem123;\r\n            private byte byItem124; private byte byItem125; private byte byItem126; private byte byItem127;\r\n            private byte byItem128; private byte byItem129;\r\n\r\n            /// <summary>\r\n            /// The normal get...\r\n            /// </summary>\r\n            /// <returns></returns>\r\n            public string Get()\r\n            {\r\n                return (GetValue(true));\r\n            }\r\n\r\n            /// <summary>\r\n            /// Use this on Mac OS X if you have a call that uses a string\r\n            /// that doesn't include the prefix byte...\r\n            /// </summary>\r\n            /// <returns></returns>\r\n            public string GetNoPrefix()\r\n            {\r\n                return (GetValue(false));\r\n            }\r\n\r\n            /// <summary>\r\n            /// Get our value...\r\n            /// </summary>\r\n            /// <returns></returns>\r\n            private string GetValue(bool a_blMayHavePrefix)\r\n            {\r\n                // convert what we have into a byte array\r\n                byte[] abyItem = new byte[130];\r\n                abyItem[0]  = byItem000; abyItem[1]  = byItem001; abyItem[2]  = byItem002; abyItem[3]  = byItem003;\r\n                abyItem[4]  = byItem004; abyItem[5]  = byItem005; abyItem[6]  = byItem006; abyItem[7]  = byItem007;\r\n                abyItem[8]  = byItem008; abyItem[9]  = byItem009; abyItem[10] = byItem010; abyItem[11] = byItem011;\r\n                abyItem[12] = byItem012; abyItem[13] = byItem013; abyItem[14] = byItem014; abyItem[15] = byItem015;\r\n                abyItem[16] = byItem016; abyItem[17] = byItem017; abyItem[18] = byItem018; abyItem[19] = byItem019;\r\n                abyItem[20] = byItem020; abyItem[21] = byItem021; abyItem[22] = byItem022; abyItem[23] = byItem023;\r\n                abyItem[24] = byItem024; abyItem[25] = byItem025; abyItem[26] = byItem026; abyItem[27] = byItem027;\r\n                abyItem[28] = byItem028; abyItem[29] = byItem029; abyItem[30] = byItem030; abyItem[31] = byItem031;\r\n                abyItem[32] = byItem032; abyItem[33] = byItem033; abyItem[34] = byItem034; abyItem[35] = byItem035;\r\n                abyItem[36] = byItem036; abyItem[37] = byItem037; abyItem[38] = byItem038; abyItem[39] = byItem039;\r\n                abyItem[40] = byItem040; abyItem[41] = byItem041; abyItem[42] = byItem042; abyItem[43] = byItem043;\r\n                abyItem[44] = byItem044; abyItem[45] = byItem045; abyItem[46] = byItem046; abyItem[47] = byItem047;\r\n                abyItem[48] = byItem048; abyItem[49] = byItem049; abyItem[50] = byItem050; abyItem[51] = byItem051;\r\n                abyItem[52] = byItem052; abyItem[53] = byItem053; abyItem[54] = byItem054; abyItem[55] = byItem055;\r\n                abyItem[56] = byItem056; abyItem[57] = byItem057; abyItem[58] = byItem058; abyItem[59] = byItem059;\r\n                abyItem[60] = byItem060; abyItem[61] = byItem061; abyItem[62] = byItem062; abyItem[63] = byItem063;\r\n                abyItem[64] = byItem064; abyItem[65] = byItem065; abyItem[66] = byItem066; abyItem[67] = byItem067;\r\n                abyItem[68] = byItem068; abyItem[69] = byItem069; abyItem[70] = byItem070; abyItem[71] = byItem071;\r\n                abyItem[72] = byItem072; abyItem[73] = byItem073; abyItem[74] = byItem074; abyItem[75] = byItem075;\r\n                abyItem[76] = byItem076; abyItem[77] = byItem077; abyItem[78] = byItem078; abyItem[79] = byItem079;\r\n                abyItem[80] = byItem080; abyItem[81] = byItem081; abyItem[82] = byItem082; abyItem[83] = byItem083;\r\n                abyItem[84] = byItem084; abyItem[85] = byItem085; abyItem[86] = byItem086; abyItem[87] = byItem087;\r\n                abyItem[88] = byItem088; abyItem[89] = byItem089; abyItem[90] = byItem090; abyItem[91] = byItem091;\r\n                abyItem[92] = byItem092; abyItem[93] = byItem093; abyItem[94] = byItem094; abyItem[95] = byItem095;\r\n                abyItem[96] = byItem096; abyItem[97] = byItem097; abyItem[98] = byItem098; abyItem[99] = byItem099;\r\n                abyItem[100] = byItem100; abyItem[101] = byItem101; abyItem[102] = byItem102; abyItem[103] = byItem103;\r\n                abyItem[104] = byItem104; abyItem[105] = byItem105; abyItem[106] = byItem106; abyItem[107] = byItem107;\r\n                abyItem[108] = byItem108; abyItem[109] = byItem109; abyItem[110] = byItem110; abyItem[111] = byItem111;\r\n                abyItem[112] = byItem112; abyItem[113] = byItem113; abyItem[114] = byItem114; abyItem[115] = byItem115;\r\n                abyItem[116] = byItem116; abyItem[117] = byItem117; abyItem[118] = byItem118; abyItem[119] = byItem119;\r\n                abyItem[120] = byItem120; abyItem[121] = byItem121; abyItem[122] = byItem122; abyItem[123] = byItem123;\r\n                abyItem[124] = byItem124; abyItem[125] = byItem125; abyItem[126] = byItem126; abyItem[127] = byItem127;\r\n                abyItem[128] = byItem128; abyItem[129] = byItem129;\r\n\r\n                // Zero anything after the NUL...\r\n                bool blNul = false;\r\n                for (int ii = 0; ii < abyItem.Length; ii++)\r\n                {\r\n                    if (!blNul && (abyItem[ii] == 0))\r\n                    {\r\n                        blNul = true;\r\n                    }\r\n                    else if (blNul)\r\n                    {\r\n                        abyItem[ii] = 0;\r\n                    }\r\n                }\r\n\r\n                // change encoding of byte array, then convert the bytes array to a string\r\n                string sz = Encoding.Unicode.GetString(Encoding.Convert(Language.GetEncoding(), Encoding.Unicode, abyItem));\r\n\r\n                // If the first character is a NUL, then return the empty string...\r\n                if (sz[0] == '\\0')\r\n                {\r\n                    return (\"\");\r\n                }\r\n\r\n                // If we're running on a Mac, take off the prefix 'byte'...\r\n                if (a_blMayHavePrefix && (TWAIN.GetPlatform() == Platform.MACOSX))\r\n                {\r\n                    sz = sz.Remove(0, 1);\r\n                }\r\n\r\n                // If we detect a NUL, then split around it...\r\n                if (sz.IndexOf('\\0') >= 0)\r\n                {\r\n                    sz = sz.Split(new char[] { '\\0' })[0];\r\n                }\r\n\r\n                // All done...\r\n                return (sz);\r\n            }\r\n\r\n            /// <summary>\r\n            /// The normal set...\r\n            /// </summary>\r\n            /// <returns></returns>\r\n            public void Set(string a_sz)\r\n            {\r\n                SetValue(a_sz, true);\r\n            }\r\n\r\n            /// <summary>\r\n            /// Use this on Mac OS X if you have a call that uses a string\r\n            /// that doesn't include the prefix byte...\r\n            /// </summary>\r\n            /// <returns></returns>\r\n            public void SetNoPrefix(string a_sz)\r\n            {\r\n                SetValue(a_sz, false);\r\n            }\r\n\r\n            /// <summary>\r\n            /// Set our value...\r\n            /// </summary>\r\n            /// <param name=\"a_sz\"></param>\r\n            private void SetValue(string a_sz, bool a_blMayHavePrefix)\r\n            {\r\n                // If we're running on a Mac, tack on the prefix 'byte'...\r\n                if (a_sz == null)\r\n                {\r\n                    a_sz = \"\";\r\n                }\r\n                else if (a_blMayHavePrefix && (TWAIN.GetPlatform() == Platform.MACOSX))\r\n                {\r\n                    a_sz = (char)a_sz.Length + a_sz;\r\n                }\r\n\r\n                // Make sure that we're NUL padded...\r\n                string sz =\r\n                    a_sz +\r\n                    \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\" +\r\n                    \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\" +\r\n                    \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\" +\r\n                    \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\" +\r\n                    \"\\0\\0\";\r\n                if (sz.Length > 130)\r\n                {\r\n                    sz = sz.Remove(130);\r\n                }\r\n\r\n                // convert string to byte array, then change the encoding of the byte array\r\n                byte[] abyItem = Encoding.Convert(Encoding.Unicode, Language.GetEncoding(), Encoding.Unicode.GetBytes(sz));\r\n\r\n                // concert byte array to bytes\r\n                byItem000 = abyItem[0];  byItem001 = abyItem[1];  byItem002 = abyItem[2];  byItem003 = abyItem[3];\r\n                byItem004 = abyItem[4];  byItem005 = abyItem[5];  byItem006 = abyItem[6];  byItem007 = abyItem[7];\r\n                byItem008 = abyItem[8];  byItem009 = abyItem[9];  byItem010 = abyItem[10]; byItem011 = abyItem[11];\r\n                byItem012 = abyItem[12]; byItem013 = abyItem[13]; byItem014 = abyItem[14]; byItem015 = abyItem[15];\r\n                byItem016 = abyItem[16]; byItem017 = abyItem[17]; byItem018 = abyItem[18]; byItem019 = abyItem[19];\r\n                byItem020 = abyItem[20]; byItem021 = abyItem[21]; byItem022 = abyItem[22]; byItem023 = abyItem[23];\r\n                byItem024 = abyItem[24]; byItem025 = abyItem[25]; byItem026 = abyItem[26]; byItem027 = abyItem[27];\r\n                byItem028 = abyItem[28]; byItem029 = abyItem[29]; byItem030 = abyItem[30]; byItem031 = abyItem[31];\r\n                byItem032 = abyItem[32]; byItem033 = abyItem[33]; byItem034 = abyItem[34]; byItem035 = abyItem[35];\r\n                byItem036 = abyItem[36]; byItem037 = abyItem[37]; byItem038 = abyItem[38]; byItem039 = abyItem[39];\r\n                byItem040 = abyItem[40]; byItem041 = abyItem[41]; byItem042 = abyItem[42]; byItem043 = abyItem[43];\r\n                byItem044 = abyItem[44]; byItem045 = abyItem[45]; byItem046 = abyItem[46]; byItem047 = abyItem[47];\r\n                byItem048 = abyItem[48]; byItem049 = abyItem[49]; byItem050 = abyItem[50]; byItem051 = abyItem[51];\r\n                byItem052 = abyItem[52]; byItem053 = abyItem[53]; byItem054 = abyItem[54]; byItem055 = abyItem[55];\r\n                byItem056 = abyItem[56]; byItem057 = abyItem[57]; byItem058 = abyItem[58]; byItem059 = abyItem[59];\r\n                byItem060 = abyItem[60]; byItem061 = abyItem[61]; byItem062 = abyItem[62]; byItem063 = abyItem[63];\r\n                byItem064 = abyItem[64]; byItem065 = abyItem[65]; byItem066 = abyItem[66]; byItem067 = abyItem[67];\r\n                byItem068 = abyItem[68]; byItem069 = abyItem[69]; byItem070 = abyItem[70]; byItem071 = abyItem[71];\r\n                byItem072 = abyItem[72]; byItem073 = abyItem[73]; byItem074 = abyItem[74]; byItem075 = abyItem[75];\r\n                byItem076 = abyItem[76]; byItem077 = abyItem[77]; byItem078 = abyItem[78]; byItem079 = abyItem[79];\r\n                byItem080 = abyItem[80]; byItem081 = abyItem[81]; byItem082 = abyItem[82]; byItem083 = abyItem[83];\r\n                byItem084 = abyItem[84]; byItem085 = abyItem[85]; byItem086 = abyItem[86]; byItem087 = abyItem[87];\r\n                byItem088 = abyItem[88]; byItem089 = abyItem[89]; byItem090 = abyItem[90]; byItem091 = abyItem[91];\r\n                byItem092 = abyItem[92]; byItem093 = abyItem[93]; byItem094 = abyItem[94]; byItem095 = abyItem[95];\r\n                byItem096 = abyItem[96]; byItem097 = abyItem[97]; byItem098 = abyItem[98]; byItem099 = abyItem[99];\r\n                byItem100 = abyItem[100]; byItem101 = abyItem[101]; byItem102 = abyItem[102]; byItem103 = abyItem[103];\r\n                byItem104 = abyItem[104]; byItem105 = abyItem[105]; byItem106 = abyItem[106]; byItem107 = abyItem[107];\r\n                byItem108 = abyItem[108]; byItem109 = abyItem[109]; byItem110 = abyItem[110]; byItem111 = abyItem[111];\r\n                byItem112 = abyItem[112]; byItem113 = abyItem[113]; byItem114 = abyItem[114]; byItem115 = abyItem[115];\r\n                byItem116 = abyItem[116]; byItem117 = abyItem[117]; byItem118 = abyItem[118]; byItem119 = abyItem[119];\r\n                byItem120 = abyItem[120]; byItem121 = abyItem[121]; byItem122 = abyItem[122]; byItem123 = abyItem[123];\r\n                byItem124 = abyItem[124]; byItem125 = abyItem[125]; byItem126 = abyItem[126]; byItem127 = abyItem[127];\r\n                byItem128 = abyItem[128]; byItem129 = abyItem[129];\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Used for strings that go up to 256-bytes...\r\n        /// </summary>\r\n        [StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi)]\r\n        public struct TW_STR255\r\n        {\r\n            /// <summary>\r\n            /// We're stuck with this, because marshalling with packed alignment\r\n            /// can't handle arrays...\r\n            /// </summary>\r\n            private byte byItem000; private byte byItem001; private byte byItem002; private byte byItem003;\r\n            private byte byItem004; private byte byItem005; private byte byItem006; private byte byItem007;\r\n            private byte byItem008; private byte byItem009; private byte byItem010; private byte byItem011;\r\n            private byte byItem012; private byte byItem013; private byte byItem014; private byte byItem015;\r\n            private byte byItem016; private byte byItem017; private byte byItem018; private byte byItem019;\r\n            private byte byItem020; private byte byItem021; private byte byItem022; private byte byItem023;\r\n            private byte byItem024; private byte byItem025; private byte byItem026; private byte byItem027;\r\n            private byte byItem028; private byte byItem029; private byte byItem030; private byte byItem031;\r\n            private byte byItem032; private byte byItem033; private byte byItem034; private byte byItem035;\r\n            private byte byItem036; private byte byItem037; private byte byItem038; private byte byItem039;\r\n            private byte byItem040; private byte byItem041; private byte byItem042; private byte byItem043;\r\n            private byte byItem044; private byte byItem045; private byte byItem046; private byte byItem047;\r\n            private byte byItem048; private byte byItem049; private byte byItem050; private byte byItem051;\r\n            private byte byItem052; private byte byItem053; private byte byItem054; private byte byItem055;\r\n            private byte byItem056; private byte byItem057; private byte byItem058; private byte byItem059;\r\n            private byte byItem060; private byte byItem061; private byte byItem062; private byte byItem063;\r\n            private byte byItem064; private byte byItem065; private byte byItem066; private byte byItem067;\r\n            private byte byItem068; private byte byItem069; private byte byItem070; private byte byItem071;\r\n            private byte byItem072; private byte byItem073; private byte byItem074; private byte byItem075;\r\n            private byte byItem076; private byte byItem077; private byte byItem078; private byte byItem079;\r\n            private byte byItem080; private byte byItem081; private byte byItem082; private byte byItem083;\r\n            private byte byItem084; private byte byItem085; private byte byItem086; private byte byItem087;\r\n            private byte byItem088; private byte byItem089; private byte byItem090; private byte byItem091;\r\n            private byte byItem092; private byte byItem093; private byte byItem094; private byte byItem095;\r\n            private byte byItem096; private byte byItem097; private byte byItem098; private byte byItem099;\r\n            private byte byItem100; private byte byItem101; private byte byItem102; private byte byItem103;\r\n            private byte byItem104; private byte byItem105; private byte byItem106; private byte byItem107;\r\n            private byte byItem108; private byte byItem109; private byte byItem110; private byte byItem111;\r\n            private byte byItem112; private byte byItem113; private byte byItem114; private byte byItem115;\r\n            private byte byItem116; private byte byItem117; private byte byItem118; private byte byItem119;\r\n            private byte byItem120; private byte byItem121; private byte byItem122; private byte byItem123;\r\n            private byte byItem124; private byte byItem125; private byte byItem126; private byte byItem127;\r\n            private byte byItem128; private byte byItem129; private byte byItem130; private byte byItem131;\r\n            private byte byItem132; private byte byItem133; private byte byItem134; private byte byItem135;\r\n            private byte byItem136; private byte byItem137; private byte byItem138; private byte byItem139;\r\n            private byte byItem140; private byte byItem141; private byte byItem142; private byte byItem143;\r\n            private byte byItem144; private byte byItem145; private byte byItem146; private byte byItem147;\r\n            private byte byItem148; private byte byItem149; private byte byItem150; private byte byItem151;\r\n            private byte byItem152; private byte byItem153; private byte byItem154; private byte byItem155;\r\n            private byte byItem156; private byte byItem157; private byte byItem158; private byte byItem159;\r\n            private byte byItem160; private byte byItem161; private byte byItem162; private byte byItem163;\r\n            private byte byItem164; private byte byItem165; private byte byItem166; private byte byItem167;\r\n            private byte byItem168; private byte byItem169; private byte byItem170; private byte byItem171;\r\n            private byte byItem172; private byte byItem173; private byte byItem174; private byte byItem175;\r\n            private byte byItem176; private byte byItem177; private byte byItem178; private byte byItem179;\r\n            private byte byItem180; private byte byItem181; private byte byItem182; private byte byItem183;\r\n            private byte byItem184; private byte byItem185; private byte byItem186; private byte byItem187;\r\n            private byte byItem188; private byte byItem189; private byte byItem190; private byte byItem191;\r\n            private byte byItem192; private byte byItem193; private byte byItem194; private byte byItem195;\r\n            private byte byItem196; private byte byItem197; private byte byItem198; private byte byItem199;\r\n            private byte byItem200; private byte byItem201; private byte byItem202; private byte byItem203;\r\n            private byte byItem204; private byte byItem205; private byte byItem206; private byte byItem207;\r\n            private byte byItem208; private byte byItem209; private byte byItem210; private byte byItem211;\r\n            private byte byItem212; private byte byItem213; private byte byItem214; private byte byItem215;\r\n            private byte byItem216; private byte byItem217; private byte byItem218; private byte byItem219;\r\n            private byte byItem220; private byte byItem221; private byte byItem222; private byte byItem223;\r\n            private byte byItem224; private byte byItem225; private byte byItem226; private byte byItem227;\r\n            private byte byItem228; private byte byItem229; private byte byItem230; private byte byItem231;\r\n            private byte byItem232; private byte byItem233; private byte byItem234; private byte byItem235;\r\n            private byte byItem236; private byte byItem237; private byte byItem238; private byte byItem239;\r\n            private byte byItem240; private byte byItem241; private byte byItem242; private byte byItem243;\r\n            private byte byItem244; private byte byItem245; private byte byItem246; private byte byItem247;\r\n            private byte byItem248; private byte byItem249; private byte byItem250; private byte byItem251;\r\n            private byte byItem252; private byte byItem253; private byte byItem254; private byte byItem255;\r\n\r\n            /// <summary>\r\n            /// The normal get...\r\n            /// </summary>\r\n            /// <returns></returns>\r\n            public string Get()\r\n            {\r\n                return (GetValue(true));\r\n            }\r\n\r\n            /// <summary>\r\n            /// Use this on Mac OS X if you have a call that uses a string\r\n            /// that doesn't include the prefix byte...\r\n            /// </summary>\r\n            /// <returns></returns>\r\n            public string GetNoPrefix()\r\n            {\r\n                return (GetValue(false));\r\n            }\r\n\r\n            /// <summary>\r\n            /// Get our value...\r\n            /// </summary>\r\n            /// <returns></returns>\r\n            private string GetValue(bool a_blMayHavePrefix)\r\n            {\r\n                // convert what we have into a byte array\r\n                byte[] abyItem = new byte[256];\r\n                abyItem[0]  = byItem000; abyItem[1]  = byItem001; abyItem[2]  = byItem002; abyItem[3]  = byItem003;\r\n                abyItem[4]  = byItem004; abyItem[5]  = byItem005; abyItem[6]  = byItem006; abyItem[7]  = byItem007;\r\n                abyItem[8]  = byItem008; abyItem[9]  = byItem009; abyItem[10] = byItem010; abyItem[11] = byItem011;\r\n                abyItem[12] = byItem012; abyItem[13] = byItem013; abyItem[14] = byItem014; abyItem[15] = byItem015;\r\n                abyItem[16] = byItem016; abyItem[17] = byItem017; abyItem[18] = byItem018; abyItem[19] = byItem019;\r\n                abyItem[20] = byItem020; abyItem[21] = byItem021; abyItem[22] = byItem022; abyItem[23] = byItem023;\r\n                abyItem[24] = byItem024; abyItem[25] = byItem025; abyItem[26] = byItem026; abyItem[27] = byItem027;\r\n                abyItem[28] = byItem028; abyItem[29] = byItem029; abyItem[30] = byItem030; abyItem[31] = byItem031;\r\n                abyItem[32] = byItem032; abyItem[33] = byItem033; abyItem[34] = byItem034; abyItem[35] = byItem035;\r\n                abyItem[36] = byItem036; abyItem[37] = byItem037; abyItem[38] = byItem038; abyItem[39] = byItem039;\r\n                abyItem[40] = byItem040; abyItem[41] = byItem041; abyItem[42] = byItem042; abyItem[43] = byItem043;\r\n                abyItem[44] = byItem044; abyItem[45] = byItem045; abyItem[46] = byItem046; abyItem[47] = byItem047;\r\n                abyItem[48] = byItem048; abyItem[49] = byItem049; abyItem[50] = byItem050; abyItem[51] = byItem051;\r\n                abyItem[52] = byItem052; abyItem[53] = byItem053; abyItem[54] = byItem054; abyItem[55] = byItem055;\r\n                abyItem[56] = byItem056; abyItem[57] = byItem057; abyItem[58] = byItem058; abyItem[59] = byItem059;\r\n                abyItem[60] = byItem060; abyItem[61] = byItem061; abyItem[62] = byItem062; abyItem[63] = byItem063;\r\n                abyItem[64] = byItem064; abyItem[65] = byItem065; abyItem[66] = byItem066; abyItem[67] = byItem067;\r\n                abyItem[68] = byItem068; abyItem[69] = byItem069; abyItem[70] = byItem070; abyItem[71] = byItem071;\r\n                abyItem[72] = byItem072; abyItem[73] = byItem073; abyItem[74] = byItem074; abyItem[75] = byItem075;\r\n                abyItem[76] = byItem076; abyItem[77] = byItem077; abyItem[78] = byItem078; abyItem[79] = byItem079;\r\n                abyItem[80] = byItem080; abyItem[81] = byItem081; abyItem[82] = byItem082; abyItem[83] = byItem083;\r\n                abyItem[84] = byItem084; abyItem[85] = byItem085; abyItem[86] = byItem086; abyItem[87] = byItem087;\r\n                abyItem[88] = byItem088; abyItem[89] = byItem089; abyItem[90] = byItem090; abyItem[91] = byItem091;\r\n                abyItem[92] = byItem092; abyItem[93] = byItem093; abyItem[94] = byItem094; abyItem[95] = byItem095;\r\n                abyItem[96] = byItem096; abyItem[97] = byItem097; abyItem[98] = byItem098; abyItem[99] = byItem099;\r\n                abyItem[100] = byItem100; abyItem[101] = byItem101; abyItem[102] = byItem102; abyItem[103] = byItem103;\r\n                abyItem[104] = byItem104; abyItem[105] = byItem105; abyItem[106] = byItem106; abyItem[107] = byItem107;\r\n                abyItem[108] = byItem108; abyItem[109] = byItem109; abyItem[110] = byItem110; abyItem[111] = byItem111;\r\n                abyItem[112] = byItem112; abyItem[113] = byItem113; abyItem[114] = byItem114; abyItem[115] = byItem115;\r\n                abyItem[116] = byItem116; abyItem[117] = byItem117; abyItem[118] = byItem118; abyItem[119] = byItem119;\r\n                abyItem[120] = byItem120; abyItem[121] = byItem121; abyItem[122] = byItem122; abyItem[123] = byItem123;\r\n                abyItem[124] = byItem124; abyItem[125] = byItem125; abyItem[126] = byItem126; abyItem[127] = byItem127;\r\n                abyItem[128] = byItem128; abyItem[129] = byItem129; abyItem[130] = byItem130; abyItem[131] = byItem131;\r\n                abyItem[132] = byItem132; abyItem[133] = byItem133; abyItem[134] = byItem134; abyItem[135] = byItem135;\r\n                abyItem[136] = byItem136; abyItem[137] = byItem137; abyItem[138] = byItem138; abyItem[139] = byItem139;\r\n                abyItem[140] = byItem140; abyItem[141] = byItem141; abyItem[142] = byItem142; abyItem[143] = byItem143;\r\n                abyItem[144] = byItem144; abyItem[145] = byItem145; abyItem[146] = byItem146; abyItem[147] = byItem147;\r\n                abyItem[148] = byItem148; abyItem[149] = byItem149; abyItem[150] = byItem150; abyItem[151] = byItem151;\r\n                abyItem[152] = byItem152; abyItem[153] = byItem153; abyItem[154] = byItem154; abyItem[155] = byItem155;\r\n                abyItem[156] = byItem156; abyItem[157] = byItem157; abyItem[158] = byItem158; abyItem[159] = byItem159;\r\n                abyItem[160] = byItem160; abyItem[161] = byItem161; abyItem[162] = byItem162; abyItem[163] = byItem163;\r\n                abyItem[164] = byItem164; abyItem[165] = byItem165; abyItem[166] = byItem166; abyItem[167] = byItem167;\r\n                abyItem[168] = byItem168; abyItem[169] = byItem169; abyItem[170] = byItem170; abyItem[171] = byItem171;\r\n                abyItem[172] = byItem172; abyItem[173] = byItem173; abyItem[174] = byItem174; abyItem[175] = byItem175;\r\n                abyItem[176] = byItem176; abyItem[177] = byItem177; abyItem[178] = byItem178; abyItem[179] = byItem179;\r\n                abyItem[180] = byItem180; abyItem[181] = byItem181; abyItem[182] = byItem182; abyItem[183] = byItem183;\r\n                abyItem[184] = byItem184; abyItem[185] = byItem185; abyItem[186] = byItem186; abyItem[187] = byItem187;\r\n                abyItem[188] = byItem188; abyItem[189] = byItem189; abyItem[190] = byItem190; abyItem[191] = byItem191;\r\n                abyItem[192] = byItem192; abyItem[193] = byItem193; abyItem[194] = byItem194; abyItem[195] = byItem195;\r\n                abyItem[196] = byItem196; abyItem[197] = byItem197; abyItem[198] = byItem198; abyItem[199] = byItem199;\r\n                abyItem[200] = byItem200; abyItem[201] = byItem201; abyItem[202] = byItem202; abyItem[203] = byItem203;\r\n                abyItem[204] = byItem204; abyItem[205] = byItem205; abyItem[206] = byItem206; abyItem[207] = byItem207;\r\n                abyItem[208] = byItem208; abyItem[209] = byItem209; abyItem[210] = byItem210; abyItem[211] = byItem211;\r\n                abyItem[212] = byItem212; abyItem[213] = byItem213; abyItem[214] = byItem214; abyItem[215] = byItem215;\r\n                abyItem[216] = byItem216; abyItem[217] = byItem217; abyItem[218] = byItem218; abyItem[219] = byItem219;\r\n                abyItem[220] = byItem220; abyItem[221] = byItem221; abyItem[222] = byItem222; abyItem[223] = byItem223;\r\n                abyItem[224] = byItem224; abyItem[225] = byItem225; abyItem[226] = byItem226; abyItem[227] = byItem227;\r\n                abyItem[228] = byItem228; abyItem[229] = byItem229; abyItem[230] = byItem230; abyItem[231] = byItem231;\r\n                abyItem[232] = byItem232; abyItem[233] = byItem233; abyItem[234] = byItem234; abyItem[235] = byItem235;\r\n                abyItem[236] = byItem236; abyItem[237] = byItem237; abyItem[238] = byItem238; abyItem[239] = byItem239;\r\n                abyItem[240] = byItem240; abyItem[241] = byItem241; abyItem[242] = byItem242; abyItem[243] = byItem243;\r\n                abyItem[244] = byItem244; abyItem[245] = byItem245; abyItem[246] = byItem246; abyItem[247] = byItem247;\r\n                abyItem[248] = byItem248; abyItem[249] = byItem249; abyItem[250] = byItem250; abyItem[251] = byItem251;\r\n                abyItem[252] = byItem252; abyItem[253] = byItem253; abyItem[254] = byItem254; abyItem[255] = byItem255;\r\n\r\n                // Zero anything after the NUL...\r\n                bool blNul = false;\r\n                for (int ii = 0; ii < abyItem.Length; ii++)\r\n                {\r\n                    if (!blNul && (abyItem[ii] == 0))\r\n                    {\r\n                        blNul = true;\r\n                    }\r\n                    else if (blNul)\r\n                    {\r\n                        abyItem[ii] = 0;\r\n                    }\r\n                }\r\n\r\n                // change encoding of byte array, then convert the bytes array to a string\r\n                string sz = Encoding.Unicode.GetString(Encoding.Convert(Language.GetEncoding(), Encoding.Unicode, abyItem));\r\n\r\n                // If the first character is a NUL, then return the empty string...\r\n                if (sz[0] == '\\0')\r\n                {\r\n                    return (\"\");\r\n                }\r\n\r\n                // If we're running on a Mac, take off the prefix 'byte'...\r\n                if (a_blMayHavePrefix && (TWAIN.GetPlatform() == Platform.MACOSX))\r\n                {\r\n                    sz = sz.Remove(0, 1);\r\n                }\r\n\r\n                // If we detect a NUL, then split around it...\r\n                if (sz.IndexOf('\\0') >= 0)\r\n                {\r\n                    sz = sz.Split(new char[] { '\\0' })[0];\r\n                }\r\n\r\n                // All done...\r\n                return (sz);\r\n            }\r\n\r\n            /// <summary>\r\n            /// The normal set...\r\n            /// </summary>\r\n            /// <returns></returns>\r\n            public void Set(string a_sz)\r\n            {\r\n                SetValue(a_sz, true);\r\n            }\r\n\r\n            /// <summary>\r\n            /// Use this on Mac OS X if you have a call that uses a string\r\n            /// that doesn't include the prefix byte...\r\n            /// </summary>\r\n            /// <returns></returns>\r\n            public void SetNoPrefix(string a_sz)\r\n            {\r\n                SetValue(a_sz, false);\r\n            }\r\n\r\n            /// <summary>\r\n            /// Set our value...\r\n            /// </summary>\r\n            /// <param name=\"a_sz\"></param>\r\n            private void SetValue(string a_sz, bool a_blMayHavePrefix)\r\n            {\r\n                // If we're running on a Mac, tack on the prefix 'byte'...\r\n                if (a_sz == null)\r\n                {\r\n                    a_sz = \"\";\r\n                }\r\n                else if (a_blMayHavePrefix && (TWAIN.GetPlatform() == Platform.MACOSX))\r\n                {\r\n                    a_sz = (char)a_sz.Length + a_sz;\r\n                }\r\n\r\n                // Make sure that we're NUL padded...\r\n                string sz =\r\n                    a_sz +\r\n                    \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\" +\r\n                    \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\" +\r\n                    \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\" +\r\n                    \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\" +\r\n                    \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\" +\r\n                    \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\" +\r\n                    \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\" +\r\n                    \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\";\r\n                if (sz.Length > 256)\r\n                {\r\n                    sz = sz.Remove(256);\r\n                }\r\n\r\n                // convert string to byte array, then change the encoding of the byte array\r\n                byte[] abyItem = Encoding.Convert(Encoding.Unicode, Language.GetEncoding(), Encoding.Unicode.GetBytes(sz));\r\n\r\n                // concert byte array to bytes\r\n                byItem000 = abyItem[0];  byItem001 = abyItem[1];  byItem002 = abyItem[2];  byItem003 = abyItem[3];\r\n                byItem004 = abyItem[4];  byItem005 = abyItem[5];  byItem006 = abyItem[6];  byItem007 = abyItem[7];\r\n                byItem008 = abyItem[8];  byItem009 = abyItem[9];  byItem010 = abyItem[10]; byItem011 = abyItem[11];\r\n                byItem012 = abyItem[12]; byItem013 = abyItem[13]; byItem014 = abyItem[14]; byItem015 = abyItem[15];\r\n                byItem016 = abyItem[16]; byItem017 = abyItem[17]; byItem018 = abyItem[18]; byItem019 = abyItem[19];\r\n                byItem020 = abyItem[20]; byItem021 = abyItem[21]; byItem022 = abyItem[22]; byItem023 = abyItem[23];\r\n                byItem024 = abyItem[24]; byItem025 = abyItem[25]; byItem026 = abyItem[26]; byItem027 = abyItem[27];\r\n                byItem028 = abyItem[28]; byItem029 = abyItem[29]; byItem030 = abyItem[30]; byItem031 = abyItem[31];\r\n                byItem032 = abyItem[32]; byItem033 = abyItem[33]; byItem034 = abyItem[34]; byItem035 = abyItem[35];\r\n                byItem036 = abyItem[36]; byItem037 = abyItem[37]; byItem038 = abyItem[38]; byItem039 = abyItem[39];\r\n                byItem040 = abyItem[40]; byItem041 = abyItem[41]; byItem042 = abyItem[42]; byItem043 = abyItem[43];\r\n                byItem044 = abyItem[44]; byItem045 = abyItem[45]; byItem046 = abyItem[46]; byItem047 = abyItem[47];\r\n                byItem048 = abyItem[48]; byItem049 = abyItem[49]; byItem050 = abyItem[50]; byItem051 = abyItem[51];\r\n                byItem052 = abyItem[52]; byItem053 = abyItem[53]; byItem054 = abyItem[54]; byItem055 = abyItem[55];\r\n                byItem056 = abyItem[56]; byItem057 = abyItem[57]; byItem058 = abyItem[58]; byItem059 = abyItem[59];\r\n                byItem060 = abyItem[60]; byItem061 = abyItem[61]; byItem062 = abyItem[62]; byItem063 = abyItem[63];\r\n                byItem064 = abyItem[64]; byItem065 = abyItem[65]; byItem066 = abyItem[66]; byItem067 = abyItem[67];\r\n                byItem068 = abyItem[68]; byItem069 = abyItem[69]; byItem070 = abyItem[70]; byItem071 = abyItem[71];\r\n                byItem072 = abyItem[72]; byItem073 = abyItem[73]; byItem074 = abyItem[74]; byItem075 = abyItem[75];\r\n                byItem076 = abyItem[76]; byItem077 = abyItem[77]; byItem078 = abyItem[78]; byItem079 = abyItem[79];\r\n                byItem080 = abyItem[80]; byItem081 = abyItem[81]; byItem082 = abyItem[82]; byItem083 = abyItem[83];\r\n                byItem084 = abyItem[84]; byItem085 = abyItem[85]; byItem086 = abyItem[86]; byItem087 = abyItem[87];\r\n                byItem088 = abyItem[88]; byItem089 = abyItem[89]; byItem090 = abyItem[90]; byItem091 = abyItem[91];\r\n                byItem092 = abyItem[92]; byItem093 = abyItem[93]; byItem094 = abyItem[94]; byItem095 = abyItem[95];\r\n                byItem096 = abyItem[96]; byItem097 = abyItem[97]; byItem098 = abyItem[98]; byItem099 = abyItem[99];\r\n                byItem100 = abyItem[100]; byItem101 = abyItem[101]; byItem102 = abyItem[102]; byItem103 = abyItem[103];\r\n                byItem104 = abyItem[104]; byItem105 = abyItem[105]; byItem106 = abyItem[106]; byItem107 = abyItem[107];\r\n                byItem108 = abyItem[108]; byItem109 = abyItem[109]; byItem110 = abyItem[110]; byItem111 = abyItem[111];\r\n                byItem112 = abyItem[112]; byItem113 = abyItem[113]; byItem114 = abyItem[114]; byItem115 = abyItem[115];\r\n                byItem116 = abyItem[116]; byItem117 = abyItem[117]; byItem118 = abyItem[118]; byItem119 = abyItem[119];\r\n                byItem120 = abyItem[120]; byItem121 = abyItem[121]; byItem122 = abyItem[122]; byItem123 = abyItem[123];\r\n                byItem124 = abyItem[124]; byItem125 = abyItem[125]; byItem126 = abyItem[126]; byItem127 = abyItem[127];\r\n                byItem128 = abyItem[128]; byItem129 = abyItem[129]; byItem130 = abyItem[130]; byItem131 = abyItem[131];\r\n                byItem132 = abyItem[132]; byItem133 = abyItem[133]; byItem134 = abyItem[134]; byItem135 = abyItem[135];\r\n                byItem136 = abyItem[136]; byItem137 = abyItem[137]; byItem138 = abyItem[138]; byItem139 = abyItem[139];\r\n                byItem140 = abyItem[140]; byItem141 = abyItem[141]; byItem142 = abyItem[142]; byItem143 = abyItem[143];\r\n                byItem144 = abyItem[144]; byItem145 = abyItem[145]; byItem146 = abyItem[146]; byItem147 = abyItem[147];\r\n                byItem148 = abyItem[148]; byItem149 = abyItem[149]; byItem150 = abyItem[150]; byItem151 = abyItem[151];\r\n                byItem152 = abyItem[152]; byItem153 = abyItem[153]; byItem154 = abyItem[154]; byItem155 = abyItem[155];\r\n                byItem156 = abyItem[156]; byItem157 = abyItem[157]; byItem158 = abyItem[158]; byItem159 = abyItem[159];\r\n                byItem160 = abyItem[160]; byItem161 = abyItem[161]; byItem162 = abyItem[162]; byItem163 = abyItem[163];\r\n                byItem164 = abyItem[164]; byItem165 = abyItem[165]; byItem166 = abyItem[166]; byItem167 = abyItem[167];\r\n                byItem168 = abyItem[168]; byItem169 = abyItem[169]; byItem170 = abyItem[170]; byItem171 = abyItem[171];\r\n                byItem172 = abyItem[172]; byItem173 = abyItem[173]; byItem174 = abyItem[174]; byItem175 = abyItem[175];\r\n                byItem176 = abyItem[176]; byItem177 = abyItem[177]; byItem178 = abyItem[178]; byItem179 = abyItem[179];\r\n                byItem180 = abyItem[180]; byItem181 = abyItem[181]; byItem182 = abyItem[182]; byItem183 = abyItem[183];\r\n                byItem184 = abyItem[184]; byItem185 = abyItem[185]; byItem186 = abyItem[186]; byItem187 = abyItem[187];\r\n                byItem188 = abyItem[188]; byItem189 = abyItem[189]; byItem190 = abyItem[190]; byItem191 = abyItem[191];\r\n                byItem192 = abyItem[192]; byItem193 = abyItem[193]; byItem194 = abyItem[194]; byItem195 = abyItem[195];\r\n                byItem196 = abyItem[196]; byItem197 = abyItem[197]; byItem198 = abyItem[198]; byItem199 = abyItem[199];\r\n                byItem200 = abyItem[200]; byItem201 = abyItem[201]; byItem202 = abyItem[202]; byItem203 = abyItem[203];\r\n                byItem204 = abyItem[204]; byItem205 = abyItem[205]; byItem206 = abyItem[206]; byItem207 = abyItem[207];\r\n                byItem208 = abyItem[208]; byItem209 = abyItem[209]; byItem210 = abyItem[210]; byItem211 = abyItem[211];\r\n                byItem212 = abyItem[212]; byItem213 = abyItem[213]; byItem214 = abyItem[214]; byItem215 = abyItem[215];\r\n                byItem216 = abyItem[216]; byItem217 = abyItem[217]; byItem218 = abyItem[218]; byItem219 = abyItem[219];\r\n                byItem220 = abyItem[220]; byItem221 = abyItem[221]; byItem222 = abyItem[222]; byItem223 = abyItem[223];\r\n                byItem224 = abyItem[224]; byItem225 = abyItem[225]; byItem226 = abyItem[226]; byItem227 = abyItem[227];\r\n                byItem228 = abyItem[228]; byItem229 = abyItem[229]; byItem230 = abyItem[230]; byItem231 = abyItem[231];\r\n                byItem232 = abyItem[232]; byItem233 = abyItem[233]; byItem234 = abyItem[234]; byItem235 = abyItem[235];\r\n                byItem236 = abyItem[236]; byItem237 = abyItem[237]; byItem238 = abyItem[238]; byItem239 = abyItem[239];\r\n                byItem240 = abyItem[240]; byItem241 = abyItem[241]; byItem242 = abyItem[242]; byItem243 = abyItem[243];\r\n                byItem244 = abyItem[244]; byItem245 = abyItem[245]; byItem246 = abyItem[246]; byItem247 = abyItem[247];\r\n                byItem248 = abyItem[248]; byItem249 = abyItem[249]; byItem250 = abyItem[250]; byItem251 = abyItem[251];\r\n                byItem252 = abyItem[252]; byItem253 = abyItem[253]; byItem254 = abyItem[254]; byItem255 = abyItem[255];\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        // Structure Definitions...\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        #region Structure Definitions..\r\n\r\n        /// <summary>\r\n        /// Fixed point structure type.\r\n        /// </summary>\r\n        [StructLayout(LayoutKind.Sequential, Pack = 2)]\r\n        public struct TW_FIX32\r\n        {\r\n            public short Whole;\r\n            public ushort Frac;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Defines a frame rectangle in ICAP_UNITS coordinates.\r\n        /// </summary>\r\n        [StructLayout(LayoutKind.Sequential, Pack = 2)]\r\n        public struct TW_FRAME\r\n        {\r\n            public TW_FIX32 Left;\r\n            public TW_FIX32 Top;\r\n            public TW_FIX32 Right;\r\n            public TW_FIX32 Bottom;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Defines the parameters used for channel-specific transformation.\r\n        /// </summary>\r\n        [StructLayout(LayoutKind.Sequential, Pack = 2)]\r\n        public struct TW_DECODEFUNCTION\r\n        {\r\n            public TW_FIX32 StartIn;\r\n            public TW_FIX32 BreakIn;\r\n            public TW_FIX32 EndIn;\r\n            public TW_FIX32 StartOut;\r\n            public TW_FIX32 BreakOut;\r\n            public TW_FIX32 EndOut;\r\n            public TW_FIX32 Gamma;\r\n            public TW_FIX32 SampleCount;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Stores a Fixed point number in two parts, a whole and a fractional part.\r\n        /// </summary>\r\n        [StructLayout(LayoutKind.Sequential, Pack = 2)]\r\n        public struct TW_TRANSFORMSTAGE\r\n        {\r\n            public TW_DECODEFUNCTION Decode_0;\r\n            public TW_DECODEFUNCTION Decode_1;\r\n            public TW_DECODEFUNCTION Decode_2;\r\n            public TW_FIX32 Mix_0_0;\r\n            public TW_FIX32 Mix_0_1;\r\n            public TW_FIX32 Mix_0_2;\r\n            public TW_FIX32 Mix_1_0;\r\n            public TW_FIX32 Mix_1_1;\r\n            public TW_FIX32 Mix_1_2;\r\n            public TW_FIX32 Mix_2_0;\r\n            public TW_FIX32 Mix_2_1;\r\n            public TW_FIX32 Mix_2_2;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Stores a list of values for a capability, the ItemList is commented\r\n        /// out so that the caller can collect information about it with a\r\n        /// marshalling call...\r\n        /// </summary>\r\n        [StructLayout(LayoutKind.Sequential, Pack = 2)]\r\n        public struct TW_ARRAY\r\n        {\r\n            public TWTY ItemType;\r\n            public uint NumItems;\r\n            //public byte[] ItemList;\r\n        }\r\n        [StructLayout(LayoutKind.Sequential, Pack = 2)]\r\n        public struct TW_ARRAY_MACOSX\r\n        {\r\n            public uint ItemType;\r\n            public uint NumItems;\r\n            //public byte[] ItemList;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Information about audio data.\r\n        /// </summary>\r\n        [StructLayout(LayoutKind.Sequential, Pack = 2)]\r\n        public struct TW_AUDIOINFO\r\n        {\r\n            public TW_STR255 Name;\r\n            public uint Reserved;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Used to register callbacks.\r\n        /// </summary>\r\n        [SuppressMessage(\"Microsoft.Design\", \"CA1049:TypesThatOwnNativeResourcesShouldBeDisposable\")]\r\n        [StructLayout(LayoutKind.Sequential, Pack = 2)]\r\n        public struct TW_CALLBACK\r\n        {\r\n            [SuppressMessage(\"Microsoft.Security\", \"CA2111:PointersShouldNotBeVisible\")]\r\n            public IntPtr CallBackProc;\r\n            public uint RefCon;\r\n            public ushort Message;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Used to register callbacks.\r\n        /// </summary>\r\n        [StructLayout(LayoutKind.Sequential, Pack = 2)]\r\n        public struct TW_CALLBACK2\r\n        {\r\n            [SuppressMessage(\"Microsoft.Security\", \"CA2111:PointersShouldNotBeVisible\")]\r\n            public IntPtr CallBackProc;\r\n            [SuppressMessage(\"Microsoft.Security\", \"CA2111:PointersShouldNotBeVisible\")]\r\n            public UIntPtr RefCon;\r\n            public ushort Message;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Used by application to get/set capability from/in a data source.\r\n        /// </summary>\r\n        [StructLayout(LayoutKind.Sequential, Pack = 2, CharSet = CharSet.Ansi)]\r\n        public struct TW_CAPABILITY\r\n        {\r\n            public CAP Cap;\r\n            public TWON ConType;\r\n            [SuppressMessage(\"Microsoft.Security\", \"CA2111:PointersShouldNotBeVisible\")]\r\n            public IntPtr hContainer;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Defines a CIE XYZ space tri-stimulus value.\r\n        /// </summary>\r\n        [StructLayout(LayoutKind.Sequential, Pack = 2)]\r\n        public struct TW_CIEPOINT\r\n        {\r\n            public TW_FIX32 X;\r\n            public TW_FIX32 Y;\r\n            public TW_FIX32 Z;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Defines the mapping from an RGB color space device into CIE 1931 (XYZ) color space.\r\n        /// </summary>\r\n        [StructLayout(LayoutKind.Sequential, Pack = 2)]\r\n        public struct TW_CIECOLOR\r\n        {\r\n            public ushort ColorSpace;\r\n            public short LowEndian;\r\n            public short DeviceDependent;\r\n            public int VersionNumber;\r\n            public TW_TRANSFORMSTAGE StageABC;\r\n            public TW_TRANSFORMSTAGE StageLNM;\r\n            public TW_CIEPOINT WhitePoint;\r\n            public TW_CIEPOINT BlackPoint;\r\n            public TW_CIEPOINT WhitePaper;\r\n            public TW_CIEPOINT BlackInk;\r\n            public TW_FIX32 Samples;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Allows for a data source and application to pass custom data to each other.\r\n        /// </summary>\r\n        [StructLayout(LayoutKind.Sequential, Pack = 2)]\r\n        public struct TW_CUSTOMDSDATA\r\n        {\r\n            public uint InfoLength;\r\n            [SuppressMessage(\"Microsoft.Security\", \"CA2111:PointersShouldNotBeVisible\")]\r\n            public IntPtr hData;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Provides information about the Event that was raised by the Source.\r\n        /// </summary>\r\n        [StructLayout(LayoutKind.Sequential, Pack = 2)]\r\n        public struct TW_DEVICEEVENT\r\n        {\r\n            public uint Event;\r\n            public TW_STR255 DeviceName;\r\n            public uint BatteryMinutes;\r\n            public short BatteryPercentage;\r\n            public int PowerSupply;\r\n            public TW_FIX32 XResolution;\r\n            public TW_FIX32 YResolution;\r\n            public uint FlashUsed2;\r\n            public uint AutomaticCapture;\r\n            public uint TimeBeforeFirstCapture;\r\n            public uint TimeBetweenCaptures;\r\n        }\r\n\r\n        /// <summary>\r\n        /// This structure holds the tri-stimulus color palette information for TW_PALETTE8 structures.\r\n        /// </summary>\r\n        [StructLayout(LayoutKind.Sequential, Pack = 2)]\r\n        public struct TW_ELEMENT8\r\n        {\r\n            public byte Index;\r\n            public byte Channel1;\r\n            public byte Channel2;\r\n            public byte Channel3;\r\n        }\r\n\r\n        /// <summary>\r\n        /// DAT_ENTRYPOINT. returns essential entry points.\r\n        /// </summary>\r\n        [StructLayout(LayoutKind.Sequential, Pack = 2)]\r\n        public struct TW_ENTRYPOINT\r\n        {\r\n            public UInt32 Size;\r\n            [SuppressMessage(\"Microsoft.Security\", \"CA2111:PointersShouldNotBeVisible\")]\r\n            public IntPtr DSM_Entry;\r\n            [SuppressMessage(\"Microsoft.Security\", \"CA2111:PointersShouldNotBeVisible\")]\r\n            public IntPtr DSM_MemAllocate;\r\n            [SuppressMessage(\"Microsoft.Security\", \"CA2111:PointersShouldNotBeVisible\")]\r\n            public IntPtr DSM_MemFree;\r\n            [SuppressMessage(\"Microsoft.Security\", \"CA2111:PointersShouldNotBeVisible\")]\r\n            public IntPtr DSM_MemLock;\r\n            [SuppressMessage(\"Microsoft.Security\", \"CA2111:PointersShouldNotBeVisible\")]\r\n            public IntPtr DSM_MemUnlock;\r\n        }\r\n        [StructLayout(LayoutKind.Sequential, Pack = 2)]\r\n        public struct TW_ENTRYPOINT_LINUX64\r\n        {\r\n            public long Size;\r\n            [SuppressMessage(\"Microsoft.Security\", \"CA2111:PointersShouldNotBeVisible\")]\r\n            public IntPtr DSM_Entry;\r\n            [SuppressMessage(\"Microsoft.Security\", \"CA2111:PointersShouldNotBeVisible\")]\r\n            public IntPtr DSM_MemAllocate;\r\n            [SuppressMessage(\"Microsoft.Security\", \"CA2111:PointersShouldNotBeVisible\")]\r\n            public IntPtr DSM_MemFree;\r\n            [SuppressMessage(\"Microsoft.Security\", \"CA2111:PointersShouldNotBeVisible\")]\r\n            public IntPtr DSM_MemLock;\r\n            [SuppressMessage(\"Microsoft.Security\", \"CA2111:PointersShouldNotBeVisible\")]\r\n            public IntPtr DSM_MemUnlock;\r\n        }\r\n        public struct TW_ENTRYPOINT_DELEGATES\r\n        {\r\n            public UInt32 Size;\r\n            [SuppressMessage(\"Microsoft.Security\", \"CA2111:PointersShouldNotBeVisible\")]\r\n            public IntPtr DSM_Entry;\r\n            public DSM_MEMALLOC DSM_MemAllocate;\r\n            public DSM_MEMFREE DSM_MemFree;\r\n            public DSM_MEMLOCK DSM_MemLock;\r\n            public DSM_MEMUNLOCK DSM_MemUnlock;\r\n        }\r\n        public delegate IntPtr DSM_MEMALLOC(uint size);\r\n        public delegate void DSM_MEMFREE(IntPtr handle);\r\n        public delegate IntPtr DSM_MEMLOCK(IntPtr handle);\r\n        public delegate void DSM_MEMUNLOCK(IntPtr handle);\r\n\r\n        /// <summary>\r\n        /// Stores a group of enumerated values for a capability, the ItemList is\r\n        /// commented out so that the caller can collect information about it with\r\n        /// a marshalling call...\r\n        /// </summary>\r\n        [StructLayout(LayoutKind.Sequential, Pack = 2)]\r\n        public struct TW_ENUMERATION\r\n        {\r\n            public TWTY ItemType;\r\n            public uint NumItems;\r\n            public uint CurrentIndex;\r\n            public uint DefaultIndex;\r\n            //public byte[] ItemList;\r\n        }\r\n        [StructLayout(LayoutKind.Sequential, Pack = 2)]\r\n        public struct TW_ENUMERATION_LINUX64\r\n        {\r\n            public TWTY ItemType;\r\n            public ulong NumItems;\r\n            public ulong CurrentIndex;\r\n            public ulong DefaultIndex;\r\n            //public byte[] ItemList;\r\n        }\r\n        [StructLayout(LayoutKind.Sequential, Pack = 4)]\r\n        public struct TW_ENUMERATION_MACOSX\r\n        {\r\n            public uint ItemType;\r\n            public uint NumItems;\r\n            public uint CurrentIndex;\r\n            public uint DefaultIndex;\r\n            //public byte[] ItemList;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Used to pass application events/messages from the application to the Source.\r\n        /// </summary>\r\n        [SuppressMessage(\"Microsoft.Design\", \"CA1049:TypesThatOwnNativeResourcesShouldBeDisposable\")]\r\n        [StructLayout(LayoutKind.Sequential, Pack = 2)]\r\n        public struct TW_EVENT\r\n        {\r\n            [SuppressMessage(\"Microsoft.Security\", \"CA2111:PointersShouldNotBeVisible\")]\r\n            public IntPtr pEvent;\r\n            public ushort TWMessage;\r\n        }\r\n\r\n        /// <summary>\r\n        /// DAT_FILTER...\r\n        /// </summary>\r\n        [StructLayout(LayoutKind.Sequential, Pack = 2)]\r\n        public struct TW_FILTER_DESCRIPTOR\r\n        {\r\n            public UInt32 Size;\r\n            public UInt32 HueStart;\r\n            public UInt32 HueEnd;\r\n            public UInt32 SaturationStart;\r\n            public UInt32 SaturationEnd;\r\n            public UInt32 ValueStart;\r\n            public UInt32 ValueEnd;\r\n            public UInt32 Replacement;\r\n        }\r\n\r\n        /// <summary>\r\n        /// DAT_FILTER...\r\n        /// </summary>\r\n        [StructLayout(LayoutKind.Sequential, Pack = 2)]\r\n        public struct TW_FILTER\r\n        {\r\n            public UInt32 Size;\r\n            public UInt32 DescriptorCount;\r\n            public UInt32 MaxDescriptorCount;\r\n            public UInt32 Condition;\r\n            [SuppressMessage(\"Microsoft.Security\", \"CA2111:PointersShouldNotBeVisible\")]\r\n            public IntPtr hDescriptors;\r\n        }\r\n\r\n        /// <summary>\r\n        /// This structure is used to pass specific information between the data source and the application.\r\n        /// </summary>\r\n        [StructLayout(LayoutKind.Sequential, Pack = 2)]\r\n        public struct TW_INFO\r\n        {\r\n            public ushort InfoId;\r\n            public ushort ItemType;\r\n            public ushort NumItems;\r\n            public ushort ReturnCode;\r\n            [SuppressMessage(\"Microsoft.Security\", \"CA2111:PointersShouldNotBeVisible\")]\r\n            public UIntPtr Item;\r\n        }\r\n\r\n        /// <summary>\r\n        /// This structure is used to pass specific information between the data source and the application.\r\n        /// </summary>\r\n        [StructLayout(LayoutKind.Sequential, Pack = 2)]\r\n        public struct TW_EXTIMAGEINFO\r\n        {\r\n            public uint NumInfos;\r\n            public TW_INFO Info_000;\r\n            public TW_INFO Info_001;\r\n            public TW_INFO Info_002;\r\n            public TW_INFO Info_003;\r\n            public TW_INFO Info_004;\r\n            public TW_INFO Info_005;\r\n            public TW_INFO Info_006;\r\n            public TW_INFO Info_007;\r\n            public TW_INFO Info_008;\r\n            public TW_INFO Info_009;\r\n            public TW_INFO Info_010;\r\n            public TW_INFO Info_011;\r\n            public TW_INFO Info_012;\r\n            public TW_INFO Info_013;\r\n            public TW_INFO Info_014;\r\n            public TW_INFO Info_015;\r\n            public TW_INFO Info_016;\r\n            public TW_INFO Info_017;\r\n            public TW_INFO Info_018;\r\n            public TW_INFO Info_019;\r\n            public TW_INFO Info_020;\r\n            public TW_INFO Info_021;\r\n            public TW_INFO Info_022;\r\n            public TW_INFO Info_023;\r\n            public TW_INFO Info_024;\r\n            public TW_INFO Info_025;\r\n            public TW_INFO Info_026;\r\n            public TW_INFO Info_027;\r\n            public TW_INFO Info_028;\r\n            public TW_INFO Info_029;\r\n            public TW_INFO Info_030;\r\n            public TW_INFO Info_031;\r\n            public TW_INFO Info_032;\r\n            public TW_INFO Info_033;\r\n            public TW_INFO Info_034;\r\n            public TW_INFO Info_035;\r\n            public TW_INFO Info_036;\r\n            public TW_INFO Info_037;\r\n            public TW_INFO Info_038;\r\n            public TW_INFO Info_039;\r\n            public TW_INFO Info_040;\r\n            public TW_INFO Info_041;\r\n            public TW_INFO Info_042;\r\n            public TW_INFO Info_043;\r\n            public TW_INFO Info_044;\r\n            public TW_INFO Info_045;\r\n            public TW_INFO Info_046;\r\n            public TW_INFO Info_047;\r\n            public TW_INFO Info_048;\r\n            public TW_INFO Info_049;\r\n            public TW_INFO Info_050;\r\n            public TW_INFO Info_051;\r\n            public TW_INFO Info_052;\r\n            public TW_INFO Info_053;\r\n            public TW_INFO Info_054;\r\n            public TW_INFO Info_055;\r\n            public TW_INFO Info_056;\r\n            public TW_INFO Info_057;\r\n            public TW_INFO Info_058;\r\n            public TW_INFO Info_059;\r\n            public TW_INFO Info_060;\r\n            public TW_INFO Info_061;\r\n            public TW_INFO Info_062;\r\n            public TW_INFO Info_063;\r\n            public TW_INFO Info_064;\r\n            public TW_INFO Info_065;\r\n            public TW_INFO Info_066;\r\n            public TW_INFO Info_067;\r\n            public TW_INFO Info_068;\r\n            public TW_INFO Info_069;\r\n            public TW_INFO Info_070;\r\n            public TW_INFO Info_071;\r\n            public TW_INFO Info_072;\r\n            public TW_INFO Info_073;\r\n            public TW_INFO Info_074;\r\n            public TW_INFO Info_075;\r\n            public TW_INFO Info_076;\r\n            public TW_INFO Info_077;\r\n            public TW_INFO Info_078;\r\n            public TW_INFO Info_079;\r\n            public TW_INFO Info_080;\r\n            public TW_INFO Info_081;\r\n            public TW_INFO Info_082;\r\n            public TW_INFO Info_083;\r\n            public TW_INFO Info_084;\r\n            public TW_INFO Info_085;\r\n            public TW_INFO Info_086;\r\n            public TW_INFO Info_087;\r\n            public TW_INFO Info_088;\r\n            public TW_INFO Info_089;\r\n            public TW_INFO Info_090;\r\n            public TW_INFO Info_091;\r\n            public TW_INFO Info_092;\r\n            public TW_INFO Info_093;\r\n            public TW_INFO Info_094;\r\n            public TW_INFO Info_095;\r\n            public TW_INFO Info_096;\r\n            public TW_INFO Info_097;\r\n            public TW_INFO Info_098;\r\n            public TW_INFO Info_099;\r\n            public TW_INFO Info_100;\r\n            public TW_INFO Info_101;\r\n            public TW_INFO Info_102;\r\n            public TW_INFO Info_103;\r\n            public TW_INFO Info_104;\r\n            public TW_INFO Info_105;\r\n            public TW_INFO Info_106;\r\n            public TW_INFO Info_107;\r\n            public TW_INFO Info_108;\r\n            public TW_INFO Info_109;\r\n            public TW_INFO Info_110;\r\n            public TW_INFO Info_111;\r\n            public TW_INFO Info_112;\r\n            public TW_INFO Info_113;\r\n            public TW_INFO Info_114;\r\n            public TW_INFO Info_115;\r\n            public TW_INFO Info_116;\r\n            public TW_INFO Info_117;\r\n            public TW_INFO Info_118;\r\n            public TW_INFO Info_119;\r\n            public TW_INFO Info_120;\r\n            public TW_INFO Info_121;\r\n            public TW_INFO Info_122;\r\n            public TW_INFO Info_123;\r\n            public TW_INFO Info_124;\r\n            public TW_INFO Info_125;\r\n            public TW_INFO Info_126;\r\n            public TW_INFO Info_127;\r\n            public TW_INFO Info_128;\r\n            public TW_INFO Info_129;\r\n            public TW_INFO Info_130;\r\n            public TW_INFO Info_131;\r\n            public TW_INFO Info_132;\r\n            public TW_INFO Info_133;\r\n            public TW_INFO Info_134;\r\n            public TW_INFO Info_135;\r\n            public TW_INFO Info_136;\r\n            public TW_INFO Info_137;\r\n            public TW_INFO Info_138;\r\n            public TW_INFO Info_139;\r\n            public TW_INFO Info_140;\r\n            public TW_INFO Info_141;\r\n            public TW_INFO Info_142;\r\n            public TW_INFO Info_143;\r\n            public TW_INFO Info_144;\r\n            public TW_INFO Info_145;\r\n            public TW_INFO Info_146;\r\n            public TW_INFO Info_147;\r\n            public TW_INFO Info_148;\r\n            public TW_INFO Info_149;\r\n            public TW_INFO Info_150;\r\n            public TW_INFO Info_151;\r\n            public TW_INFO Info_152;\r\n            public TW_INFO Info_153;\r\n            public TW_INFO Info_154;\r\n            public TW_INFO Info_155;\r\n            public TW_INFO Info_156;\r\n            public TW_INFO Info_157;\r\n            public TW_INFO Info_158;\r\n            public TW_INFO Info_159;\r\n            public TW_INFO Info_160;\r\n            public TW_INFO Info_161;\r\n            public TW_INFO Info_162;\r\n            public TW_INFO Info_163;\r\n            public TW_INFO Info_164;\r\n            public TW_INFO Info_165;\r\n            public TW_INFO Info_166;\r\n            public TW_INFO Info_167;\r\n            public TW_INFO Info_168;\r\n            public TW_INFO Info_169;\r\n            public TW_INFO Info_170;\r\n            public TW_INFO Info_171;\r\n            public TW_INFO Info_172;\r\n            public TW_INFO Info_173;\r\n            public TW_INFO Info_174;\r\n            public TW_INFO Info_175;\r\n            public TW_INFO Info_176;\r\n            public TW_INFO Info_177;\r\n            public TW_INFO Info_178;\r\n            public TW_INFO Info_179;\r\n            public TW_INFO Info_180;\r\n            public TW_INFO Info_181;\r\n            public TW_INFO Info_182;\r\n            public TW_INFO Info_183;\r\n            public TW_INFO Info_184;\r\n            public TW_INFO Info_185;\r\n            public TW_INFO Info_186;\r\n            public TW_INFO Info_187;\r\n            public TW_INFO Info_188;\r\n            public TW_INFO Info_189;\r\n            public TW_INFO Info_190;\r\n            public TW_INFO Info_191;\r\n            public TW_INFO Info_192;\r\n            public TW_INFO Info_193;\r\n            public TW_INFO Info_194;\r\n            public TW_INFO Info_195;\r\n            public TW_INFO Info_196;\r\n            public TW_INFO Info_197;\r\n            public TW_INFO Info_198;\r\n            public TW_INFO Info_199;\r\n\r\n            public void Get(uint a_uIndex, ref TW_INFO a_twinfo)\r\n            {\r\n                switch (a_uIndex)\r\n                {\r\n                    default: return;\r\n                    case 0: a_twinfo = Info_000; return;\r\n                    case 1: a_twinfo = Info_001; return;\r\n                    case 2: a_twinfo = Info_002; return;\r\n                    case 3: a_twinfo = Info_003; return;\r\n                    case 4: a_twinfo = Info_004; return;\r\n                    case 5: a_twinfo = Info_005; return;\r\n                    case 6: a_twinfo = Info_006; return;\r\n                    case 7: a_twinfo = Info_007; return;\r\n                    case 8: a_twinfo = Info_008; return;\r\n                    case 9: a_twinfo = Info_009; return;\r\n                    case 10: a_twinfo = Info_010; return;\r\n                    case 11: a_twinfo = Info_011; return;\r\n                    case 12: a_twinfo = Info_012; return;\r\n                    case 13: a_twinfo = Info_013; return;\r\n                    case 14: a_twinfo = Info_014; return;\r\n                    case 15: a_twinfo = Info_015; return;\r\n                    case 16: a_twinfo = Info_016; return;\r\n                    case 17: a_twinfo = Info_017; return;\r\n                    case 18: a_twinfo = Info_018; return;\r\n                    case 19: a_twinfo = Info_019; return;\r\n                    case 20: a_twinfo = Info_020; return;\r\n                    case 21: a_twinfo = Info_021; return;\r\n                    case 22: a_twinfo = Info_022; return;\r\n                    case 23: a_twinfo = Info_023; return;\r\n                    case 24: a_twinfo = Info_024; return;\r\n                    case 25: a_twinfo = Info_025; return;\r\n                    case 26: a_twinfo = Info_026; return;\r\n                    case 27: a_twinfo = Info_027; return;\r\n                    case 28: a_twinfo = Info_028; return;\r\n                    case 29: a_twinfo = Info_029; return;\r\n                    case 30: a_twinfo = Info_030; return;\r\n                    case 31: a_twinfo = Info_031; return;\r\n                    case 32: a_twinfo = Info_032; return;\r\n                    case 33: a_twinfo = Info_033; return;\r\n                    case 34: a_twinfo = Info_034; return;\r\n                    case 35: a_twinfo = Info_035; return;\r\n                    case 36: a_twinfo = Info_036; return;\r\n                    case 37: a_twinfo = Info_037; return;\r\n                    case 38: a_twinfo = Info_038; return;\r\n                    case 39: a_twinfo = Info_039; return;\r\n                    case 40: a_twinfo = Info_040; return;\r\n                    case 41: a_twinfo = Info_041; return;\r\n                    case 42: a_twinfo = Info_042; return;\r\n                    case 43: a_twinfo = Info_043; return;\r\n                    case 44: a_twinfo = Info_044; return;\r\n                    case 45: a_twinfo = Info_045; return;\r\n                    case 46: a_twinfo = Info_046; return;\r\n                    case 47: a_twinfo = Info_047; return;\r\n                    case 48: a_twinfo = Info_048; return;\r\n                    case 49: a_twinfo = Info_049; return;\r\n                    case 50: a_twinfo = Info_050; return;\r\n                    case 51: a_twinfo = Info_051; return;\r\n                    case 52: a_twinfo = Info_052; return;\r\n                    case 53: a_twinfo = Info_053; return;\r\n                    case 54: a_twinfo = Info_054; return;\r\n                    case 55: a_twinfo = Info_055; return;\r\n                    case 56: a_twinfo = Info_056; return;\r\n                    case 57: a_twinfo = Info_057; return;\r\n                    case 58: a_twinfo = Info_058; return;\r\n                    case 59: a_twinfo = Info_059; return;\r\n                    case 60: a_twinfo = Info_060; return;\r\n                    case 61: a_twinfo = Info_061; return;\r\n                    case 62: a_twinfo = Info_062; return;\r\n                    case 63: a_twinfo = Info_063; return;\r\n                    case 64: a_twinfo = Info_064; return;\r\n                    case 65: a_twinfo = Info_065; return;\r\n                    case 66: a_twinfo = Info_066; return;\r\n                    case 67: a_twinfo = Info_067; return;\r\n                    case 68: a_twinfo = Info_068; return;\r\n                    case 69: a_twinfo = Info_069; return;\r\n                    case 70: a_twinfo = Info_070; return;\r\n                    case 71: a_twinfo = Info_071; return;\r\n                    case 72: a_twinfo = Info_072; return;\r\n                    case 73: a_twinfo = Info_073; return;\r\n                    case 74: a_twinfo = Info_074; return;\r\n                    case 75: a_twinfo = Info_075; return;\r\n                    case 76: a_twinfo = Info_076; return;\r\n                    case 77: a_twinfo = Info_077; return;\r\n                    case 78: a_twinfo = Info_078; return;\r\n                    case 79: a_twinfo = Info_079; return;\r\n                    case 80: a_twinfo = Info_080; return;\r\n                    case 81: a_twinfo = Info_081; return;\r\n                    case 82: a_twinfo = Info_082; return;\r\n                    case 83: a_twinfo = Info_083; return;\r\n                    case 84: a_twinfo = Info_084; return;\r\n                    case 85: a_twinfo = Info_085; return;\r\n                    case 86: a_twinfo = Info_086; return;\r\n                    case 87: a_twinfo = Info_087; return;\r\n                    case 88: a_twinfo = Info_088; return;\r\n                    case 89: a_twinfo = Info_089; return;\r\n                    case 90: a_twinfo = Info_090; return;\r\n                    case 91: a_twinfo = Info_091; return;\r\n                    case 92: a_twinfo = Info_092; return;\r\n                    case 93: a_twinfo = Info_093; return;\r\n                    case 94: a_twinfo = Info_094; return;\r\n                    case 95: a_twinfo = Info_095; return;\r\n                    case 96: a_twinfo = Info_096; return;\r\n                    case 97: a_twinfo = Info_097; return;\r\n                    case 98: a_twinfo = Info_098; return;\r\n                    case 99: a_twinfo = Info_099; return;\r\n                    case 100: a_twinfo = Info_100; return;\r\n                    case 101: a_twinfo = Info_101; return;\r\n                    case 102: a_twinfo = Info_102; return;\r\n                    case 103: a_twinfo = Info_103; return;\r\n                    case 104: a_twinfo = Info_104; return;\r\n                    case 105: a_twinfo = Info_105; return;\r\n                    case 106: a_twinfo = Info_106; return;\r\n                    case 107: a_twinfo = Info_107; return;\r\n                    case 108: a_twinfo = Info_108; return;\r\n                    case 109: a_twinfo = Info_109; return;\r\n                    case 110: a_twinfo = Info_110; return;\r\n                    case 111: a_twinfo = Info_111; return;\r\n                    case 112: a_twinfo = Info_112; return;\r\n                    case 113: a_twinfo = Info_113; return;\r\n                    case 114: a_twinfo = Info_114; return;\r\n                    case 115: a_twinfo = Info_115; return;\r\n                    case 116: a_twinfo = Info_116; return;\r\n                    case 117: a_twinfo = Info_117; return;\r\n                    case 118: a_twinfo = Info_118; return;\r\n                    case 119: a_twinfo = Info_119; return;\r\n                    case 120: a_twinfo = Info_120; return;\r\n                    case 121: a_twinfo = Info_121; return;\r\n                    case 122: a_twinfo = Info_122; return;\r\n                    case 123: a_twinfo = Info_123; return;\r\n                    case 124: a_twinfo = Info_124; return;\r\n                    case 125: a_twinfo = Info_125; return;\r\n                    case 126: a_twinfo = Info_126; return;\r\n                    case 127: a_twinfo = Info_127; return;\r\n                    case 128: a_twinfo = Info_128; return;\r\n                    case 129: a_twinfo = Info_129; return;\r\n                    case 130: a_twinfo = Info_130; return;\r\n                    case 131: a_twinfo = Info_131; return;\r\n                    case 132: a_twinfo = Info_132; return;\r\n                    case 133: a_twinfo = Info_133; return;\r\n                    case 134: a_twinfo = Info_134; return;\r\n                    case 135: a_twinfo = Info_135; return;\r\n                    case 136: a_twinfo = Info_136; return;\r\n                    case 137: a_twinfo = Info_137; return;\r\n                    case 138: a_twinfo = Info_138; return;\r\n                    case 139: a_twinfo = Info_139; return;\r\n                    case 140: a_twinfo = Info_140; return;\r\n                    case 141: a_twinfo = Info_141; return;\r\n                    case 142: a_twinfo = Info_142; return;\r\n                    case 143: a_twinfo = Info_143; return;\r\n                    case 144: a_twinfo = Info_144; return;\r\n                    case 145: a_twinfo = Info_145; return;\r\n                    case 146: a_twinfo = Info_146; return;\r\n                    case 147: a_twinfo = Info_147; return;\r\n                    case 148: a_twinfo = Info_148; return;\r\n                    case 149: a_twinfo = Info_149; return;\r\n                    case 150: a_twinfo = Info_150; return;\r\n                    case 151: a_twinfo = Info_151; return;\r\n                    case 152: a_twinfo = Info_152; return;\r\n                    case 153: a_twinfo = Info_153; return;\r\n                    case 154: a_twinfo = Info_154; return;\r\n                    case 155: a_twinfo = Info_155; return;\r\n                    case 156: a_twinfo = Info_156; return;\r\n                    case 157: a_twinfo = Info_157; return;\r\n                    case 158: a_twinfo = Info_158; return;\r\n                    case 159: a_twinfo = Info_159; return;\r\n                    case 160: a_twinfo = Info_160; return;\r\n                    case 161: a_twinfo = Info_161; return;\r\n                    case 162: a_twinfo = Info_162; return;\r\n                    case 163: a_twinfo = Info_163; return;\r\n                    case 164: a_twinfo = Info_164; return;\r\n                    case 165: a_twinfo = Info_165; return;\r\n                    case 166: a_twinfo = Info_166; return;\r\n                    case 167: a_twinfo = Info_167; return;\r\n                    case 168: a_twinfo = Info_168; return;\r\n                    case 169: a_twinfo = Info_169; return;\r\n                    case 170: a_twinfo = Info_170; return;\r\n                    case 171: a_twinfo = Info_171; return;\r\n                    case 172: a_twinfo = Info_172; return;\r\n                    case 173: a_twinfo = Info_173; return;\r\n                    case 174: a_twinfo = Info_174; return;\r\n                    case 175: a_twinfo = Info_175; return;\r\n                    case 176: a_twinfo = Info_176; return;\r\n                    case 177: a_twinfo = Info_177; return;\r\n                    case 178: a_twinfo = Info_178; return;\r\n                    case 179: a_twinfo = Info_179; return;\r\n                    case 180: a_twinfo = Info_180; return;\r\n                    case 181: a_twinfo = Info_181; return;\r\n                    case 182: a_twinfo = Info_182; return;\r\n                    case 183: a_twinfo = Info_183; return;\r\n                    case 184: a_twinfo = Info_184; return;\r\n                    case 185: a_twinfo = Info_185; return;\r\n                    case 186: a_twinfo = Info_186; return;\r\n                    case 187: a_twinfo = Info_187; return;\r\n                    case 188: a_twinfo = Info_188; return;\r\n                    case 189: a_twinfo = Info_189; return;\r\n                    case 190: a_twinfo = Info_190; return;\r\n                    case 191: a_twinfo = Info_191; return;\r\n                    case 192: a_twinfo = Info_192; return;\r\n                    case 193: a_twinfo = Info_193; return;\r\n                    case 194: a_twinfo = Info_194; return;\r\n                    case 195: a_twinfo = Info_195; return;\r\n                    case 196: a_twinfo = Info_196; return;\r\n                    case 197: a_twinfo = Info_197; return;\r\n                    case 198: a_twinfo = Info_198; return;\r\n                    case 199: a_twinfo = Info_199; return;\r\n                }\r\n            }\r\n\r\n            public void Set(uint a_uIndex, ref TW_INFO a_twinfo)\r\n            {\r\n                switch (a_uIndex)\r\n                {\r\n                    default: return;\r\n                    case 0: Info_000 = a_twinfo; return;\r\n                    case 1: Info_001 = a_twinfo; return;\r\n                    case 2: Info_002 = a_twinfo; return;\r\n                    case 3: Info_003 = a_twinfo; return;\r\n                    case 4: Info_004 = a_twinfo; return;\r\n                    case 5: Info_005 = a_twinfo; return;\r\n                    case 6: Info_006 = a_twinfo; return;\r\n                    case 7: Info_007 = a_twinfo; return;\r\n                    case 8: Info_008 = a_twinfo; return;\r\n                    case 9: Info_009 = a_twinfo; return;\r\n                    case 10: Info_010 = a_twinfo; return;\r\n                    case 11: Info_011 = a_twinfo; return;\r\n                    case 12: Info_012 = a_twinfo; return;\r\n                    case 13: Info_013 = a_twinfo; return;\r\n                    case 14: Info_014 = a_twinfo; return;\r\n                    case 15: Info_015 = a_twinfo; return;\r\n                    case 16: Info_016 = a_twinfo; return;\r\n                    case 17: Info_017 = a_twinfo; return;\r\n                    case 18: Info_018 = a_twinfo; return;\r\n                    case 19: Info_019 = a_twinfo; return;\r\n                    case 20: Info_020 = a_twinfo; return;\r\n                    case 21: Info_021 = a_twinfo; return;\r\n                    case 22: Info_022 = a_twinfo; return;\r\n                    case 23: Info_023 = a_twinfo; return;\r\n                    case 24: Info_024 = a_twinfo; return;\r\n                    case 25: Info_025 = a_twinfo; return;\r\n                    case 26: Info_026 = a_twinfo; return;\r\n                    case 27: Info_027 = a_twinfo; return;\r\n                    case 28: Info_028 = a_twinfo; return;\r\n                    case 29: Info_029 = a_twinfo; return;\r\n                    case 30: Info_030 = a_twinfo; return;\r\n                    case 31: Info_031 = a_twinfo; return;\r\n                    case 32: Info_032 = a_twinfo; return;\r\n                    case 33: Info_033 = a_twinfo; return;\r\n                    case 34: Info_034 = a_twinfo; return;\r\n                    case 35: Info_035 = a_twinfo; return;\r\n                    case 36: Info_036 = a_twinfo; return;\r\n                    case 37: Info_037 = a_twinfo; return;\r\n                    case 38: Info_038 = a_twinfo; return;\r\n                    case 39: Info_039 = a_twinfo; return;\r\n                    case 40: Info_040 = a_twinfo; return;\r\n                    case 41: Info_041 = a_twinfo; return;\r\n                    case 42: Info_042 = a_twinfo; return;\r\n                    case 43: Info_043 = a_twinfo; return;\r\n                    case 44: Info_044 = a_twinfo; return;\r\n                    case 45: Info_045 = a_twinfo; return;\r\n                    case 46: Info_046 = a_twinfo; return;\r\n                    case 47: Info_047 = a_twinfo; return;\r\n                    case 48: Info_048 = a_twinfo; return;\r\n                    case 49: Info_049 = a_twinfo; return;\r\n                    case 50: Info_050 = a_twinfo; return;\r\n                    case 51: Info_051 = a_twinfo; return;\r\n                    case 52: Info_052 = a_twinfo; return;\r\n                    case 53: Info_053 = a_twinfo; return;\r\n                    case 54: Info_054 = a_twinfo; return;\r\n                    case 55: Info_055 = a_twinfo; return;\r\n                    case 56: Info_056 = a_twinfo; return;\r\n                    case 57: Info_057 = a_twinfo; return;\r\n                    case 58: Info_058 = a_twinfo; return;\r\n                    case 59: Info_059 = a_twinfo; return;\r\n                    case 60: Info_060 = a_twinfo; return;\r\n                    case 61: Info_061 = a_twinfo; return;\r\n                    case 62: Info_062 = a_twinfo; return;\r\n                    case 63: Info_063 = a_twinfo; return;\r\n                    case 64: Info_064 = a_twinfo; return;\r\n                    case 65: Info_065 = a_twinfo; return;\r\n                    case 66: Info_066 = a_twinfo; return;\r\n                    case 67: Info_067 = a_twinfo; return;\r\n                    case 68: Info_068 = a_twinfo; return;\r\n                    case 69: Info_069 = a_twinfo; return;\r\n                    case 70: Info_070 = a_twinfo; return;\r\n                    case 71: Info_071 = a_twinfo; return;\r\n                    case 72: Info_072 = a_twinfo; return;\r\n                    case 73: Info_073 = a_twinfo; return;\r\n                    case 74: Info_074 = a_twinfo; return;\r\n                    case 75: Info_075 = a_twinfo; return;\r\n                    case 76: Info_076 = a_twinfo; return;\r\n                    case 77: Info_077 = a_twinfo; return;\r\n                    case 78: Info_078 = a_twinfo; return;\r\n                    case 79: Info_079 = a_twinfo; return;\r\n                    case 80: Info_080 = a_twinfo; return;\r\n                    case 81: Info_081 = a_twinfo; return;\r\n                    case 82: Info_082 = a_twinfo; return;\r\n                    case 83: Info_083 = a_twinfo; return;\r\n                    case 84: Info_084 = a_twinfo; return;\r\n                    case 85: Info_085 = a_twinfo; return;\r\n                    case 86: Info_086 = a_twinfo; return;\r\n                    case 87: Info_087 = a_twinfo; return;\r\n                    case 88: Info_088 = a_twinfo; return;\r\n                    case 89: Info_089 = a_twinfo; return;\r\n                    case 90: Info_090 = a_twinfo; return;\r\n                    case 91: Info_091 = a_twinfo; return;\r\n                    case 92: Info_092 = a_twinfo; return;\r\n                    case 93: Info_093 = a_twinfo; return;\r\n                    case 94: Info_094 = a_twinfo; return;\r\n                    case 95: Info_095 = a_twinfo; return;\r\n                    case 96: Info_096 = a_twinfo; return;\r\n                    case 97: Info_097 = a_twinfo; return;\r\n                    case 98: Info_098 = a_twinfo; return;\r\n                    case 99: Info_099 = a_twinfo; return;\r\n                    case 100: Info_100 = a_twinfo; return;\r\n                    case 101: Info_101 = a_twinfo; return;\r\n                    case 102: Info_102 = a_twinfo; return;\r\n                    case 103: Info_103 = a_twinfo; return;\r\n                    case 104: Info_104 = a_twinfo; return;\r\n                    case 105: Info_105 = a_twinfo; return;\r\n                    case 106: Info_106 = a_twinfo; return;\r\n                    case 107: Info_107 = a_twinfo; return;\r\n                    case 108: Info_108 = a_twinfo; return;\r\n                    case 109: Info_109 = a_twinfo; return;\r\n                    case 110: Info_110 = a_twinfo; return;\r\n                    case 111: Info_111 = a_twinfo; return;\r\n                    case 112: Info_112 = a_twinfo; return;\r\n                    case 113: Info_113 = a_twinfo; return;\r\n                    case 114: Info_114 = a_twinfo; return;\r\n                    case 115: Info_115 = a_twinfo; return;\r\n                    case 116: Info_116 = a_twinfo; return;\r\n                    case 117: Info_117 = a_twinfo; return;\r\n                    case 118: Info_118 = a_twinfo; return;\r\n                    case 119: Info_119 = a_twinfo; return;\r\n                    case 120: Info_120 = a_twinfo; return;\r\n                    case 121: Info_121 = a_twinfo; return;\r\n                    case 122: Info_122 = a_twinfo; return;\r\n                    case 123: Info_123 = a_twinfo; return;\r\n                    case 124: Info_124 = a_twinfo; return;\r\n                    case 125: Info_125 = a_twinfo; return;\r\n                    case 126: Info_126 = a_twinfo; return;\r\n                    case 127: Info_127 = a_twinfo; return;\r\n                    case 128: Info_128 = a_twinfo; return;\r\n                    case 129: Info_129 = a_twinfo; return;\r\n                    case 130: Info_130 = a_twinfo; return;\r\n                    case 131: Info_131 = a_twinfo; return;\r\n                    case 132: Info_132 = a_twinfo; return;\r\n                    case 133: Info_133 = a_twinfo; return;\r\n                    case 134: Info_134 = a_twinfo; return;\r\n                    case 135: Info_135 = a_twinfo; return;\r\n                    case 136: Info_136 = a_twinfo; return;\r\n                    case 137: Info_137 = a_twinfo; return;\r\n                    case 138: Info_138 = a_twinfo; return;\r\n                    case 139: Info_139 = a_twinfo; return;\r\n                    case 140: Info_140 = a_twinfo; return;\r\n                    case 141: Info_141 = a_twinfo; return;\r\n                    case 142: Info_142 = a_twinfo; return;\r\n                    case 143: Info_143 = a_twinfo; return;\r\n                    case 144: Info_144 = a_twinfo; return;\r\n                    case 145: Info_145 = a_twinfo; return;\r\n                    case 146: Info_146 = a_twinfo; return;\r\n                    case 147: Info_147 = a_twinfo; return;\r\n                    case 148: Info_148 = a_twinfo; return;\r\n                    case 149: Info_149 = a_twinfo; return;\r\n                    case 150: Info_150 = a_twinfo; return;\r\n                    case 151: Info_151 = a_twinfo; return;\r\n                    case 152: Info_152 = a_twinfo; return;\r\n                    case 153: Info_153 = a_twinfo; return;\r\n                    case 154: Info_154 = a_twinfo; return;\r\n                    case 155: Info_155 = a_twinfo; return;\r\n                    case 156: Info_156 = a_twinfo; return;\r\n                    case 157: Info_157 = a_twinfo; return;\r\n                    case 158: Info_158 = a_twinfo; return;\r\n                    case 159: Info_159 = a_twinfo; return;\r\n                    case 160: Info_160 = a_twinfo; return;\r\n                    case 161: Info_161 = a_twinfo; return;\r\n                    case 162: Info_162 = a_twinfo; return;\r\n                    case 163: Info_163 = a_twinfo; return;\r\n                    case 164: Info_164 = a_twinfo; return;\r\n                    case 165: Info_165 = a_twinfo; return;\r\n                    case 166: Info_166 = a_twinfo; return;\r\n                    case 167: Info_167 = a_twinfo; return;\r\n                    case 168: Info_168 = a_twinfo; return;\r\n                    case 169: Info_169 = a_twinfo; return;\r\n                    case 170: Info_170 = a_twinfo; return;\r\n                    case 171: Info_171 = a_twinfo; return;\r\n                    case 172: Info_172 = a_twinfo; return;\r\n                    case 173: Info_173 = a_twinfo; return;\r\n                    case 174: Info_174 = a_twinfo; return;\r\n                    case 175: Info_175 = a_twinfo; return;\r\n                    case 176: Info_176 = a_twinfo; return;\r\n                    case 177: Info_177 = a_twinfo; return;\r\n                    case 178: Info_178 = a_twinfo; return;\r\n                    case 179: Info_179 = a_twinfo; return;\r\n                    case 180: Info_180 = a_twinfo; return;\r\n                    case 181: Info_181 = a_twinfo; return;\r\n                    case 182: Info_182 = a_twinfo; return;\r\n                    case 183: Info_183 = a_twinfo; return;\r\n                    case 184: Info_184 = a_twinfo; return;\r\n                    case 185: Info_185 = a_twinfo; return;\r\n                    case 186: Info_186 = a_twinfo; return;\r\n                    case 187: Info_187 = a_twinfo; return;\r\n                    case 188: Info_188 = a_twinfo; return;\r\n                    case 189: Info_189 = a_twinfo; return;\r\n                    case 190: Info_190 = a_twinfo; return;\r\n                    case 191: Info_191 = a_twinfo; return;\r\n                    case 192: Info_192 = a_twinfo; return;\r\n                    case 193: Info_193 = a_twinfo; return;\r\n                    case 194: Info_194 = a_twinfo; return;\r\n                    case 195: Info_195 = a_twinfo; return;\r\n                    case 196: Info_196 = a_twinfo; return;\r\n                    case 197: Info_197 = a_twinfo; return;\r\n                    case 198: Info_198 = a_twinfo; return;\r\n                    case 199: Info_199 = a_twinfo; return;\r\n                }\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Provides information about the currently selected device.\r\n        /// TBD -- need a 32/64 bit solution for this mess\r\n        /// </summary>\r\n        [SuppressMessage(\"Microsoft.Portability\", \"CA1900:ValueTypeFieldsShouldBePortable\", MessageId = \"ModifiedTimeDate\")]\r\n        [SuppressMessage(\"Microsoft.Portability\", \"CA1900:ValueTypeFieldsShouldBePortable\", MessageId = \"CreateTimeDate\")]\r\n        [StructLayout(LayoutKind.Explicit, Pack = 2)]\r\n        public struct TW_FILESYSTEM\r\n        {\r\n            [FieldOffset(0)]\r\n            public TW_STR255 InputName;\r\n\r\n            [FieldOffset(256)]\r\n            public TW_STR255 OutputName;\r\n\r\n            [SuppressMessage(\"Microsoft.Security\", \"CA2111:PointersShouldNotBeVisible\")]\r\n            [FieldOffset(512)]\r\n            public IntPtr Context;\r\n\r\n            [FieldOffset(520)]\r\n            public Int32 Recursive;\r\n            [FieldOffset(520)]\r\n            public UInt16 Subdirectories;\r\n\r\n            [FieldOffset(524)]\r\n            public Int32 FileType;\r\n            [FieldOffset(524)]\r\n            public UInt32 FileSystemType;\r\n\r\n            [FieldOffset(528)]\r\n            public UInt32 Size;\r\n\r\n            [FieldOffset(532)]\r\n            public TW_STR32 CreateTimeDate;\r\n\r\n            [FieldOffset(566)]\r\n            public TW_STR32 ModifiedTimeDate;\r\n\r\n            [FieldOffset(600)]\r\n            public UInt32 FreeSpace;\r\n\r\n            [FieldOffset(604)]\r\n            public UInt32 NewImageSize;\r\n\r\n            [FieldOffset(608)]\r\n            public UInt32 NumberOfFiles;\r\n\r\n            [FieldOffset(612)]\r\n            public UInt32 NumberOfSnippets;\r\n\r\n            [FieldOffset(616)]\r\n            public UInt32 DeviceGroupMask;\r\n\r\n            [FieldOffset(620)]\r\n            public byte Reserved;\r\n\r\n            [FieldOffset(1127)] // 620 + 508 - 1\r\n            private byte ReservedEnd;\r\n        }\r\n        [SuppressMessage(\"Microsoft.Portability\", \"CA1900:ValueTypeFieldsShouldBePortable\", MessageId = \"ModifiedTimeDate\")]\r\n        [StructLayout(LayoutKind.Explicit, Pack = 2)]\r\n        public struct TW_FILESYSTEM_LEGACY\r\n        {\r\n            [FieldOffset(0)]\r\n            public TW_STR255 InputName;\r\n\r\n            [FieldOffset(256)]\r\n            public TW_STR255 OutputName;\r\n\r\n            [FieldOffset(512)]\r\n            public UInt32 Context;\r\n\r\n            [FieldOffset(516)]\r\n            public Int32 Recursive;\r\n            [FieldOffset(516)]\r\n            public UInt16 Subdirectories;\r\n\r\n            [FieldOffset(520)]\r\n            public Int32 FileType;\r\n            [FieldOffset(520)]\r\n            public UInt32 FileSystemType;\r\n\r\n            [FieldOffset(524)]\r\n            public UInt32 Size;\r\n\r\n            [FieldOffset(528)]\r\n            public TW_STR32 CreateTimeDate;\r\n\r\n            [FieldOffset(562)]\r\n            public TW_STR32 ModifiedTimeDate;\r\n\r\n            [FieldOffset(596)]\r\n            public UInt32 FreeSpace;\r\n\r\n            [FieldOffset(600)]\r\n            public UInt32 NewImageSize;\r\n\r\n            [FieldOffset(604)]\r\n            public UInt32 NumberOfFiles;\r\n\r\n            [FieldOffset(608)]\r\n            public UInt32 NumberOfSnippets;\r\n\r\n            [FieldOffset(612)]\r\n            public UInt32 DeviceGroupMask;\r\n\r\n            [FieldOffset(616)]\r\n            public byte Reserved;\r\n\r\n            [FieldOffset(1123)] // 616 + 508 - 1\r\n            private byte ReservedEnd;\r\n        }\r\n\r\n        /// <summary>\r\n        /// This structure is used by the application to specify a set of mapping values to be applied to grayscale data.\r\n        /// </summary>\r\n        [StructLayout(LayoutKind.Sequential, Pack = 2)]\r\n        public struct TW_GRAYRESPONSE\r\n        {\r\n            public TW_ELEMENT8 Response_00;\r\n        }\r\n\r\n        /// <summary>\r\n        /// A general way to describe the version of software that is running.\r\n        /// </summary>\r\n        [StructLayout(LayoutKind.Sequential, Pack = 2, CharSet = CharSet.Ansi)]\r\n        public struct TW_VERSION\r\n        {\r\n            public ushort MajorNum;\r\n            public ushort MinorNum;\r\n            public TWLG Language;\r\n            public TWCY Country;\r\n            public TW_STR32 Info;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Provides identification information about a TWAIN entity.\r\n        /// The use of Padding is there to allow us to use the structure\r\n        /// with Linux 64-bit systems where the TW_INT32 and TW_UINT32\r\n        /// types were long, and therefore 64-bits in size.  This should\r\n        /// have no impact with well-behaved systems that have these types\r\n        /// as 32-bit, but should prevent memory corruption in all other\r\n        /// situations...\r\n        /// </summary>\r\n        [StructLayout(LayoutKind.Sequential, Pack = 2, CharSet = CharSet.Ansi)]\r\n        public struct TW_IDENTITY\r\n        {\r\n            public ulong Id;\r\n            public TW_VERSION Version;\r\n            public ushort ProtocolMajor;\r\n            public ushort ProtocolMinor;\r\n            public uint SupportedGroups;\r\n            public TW_STR32 Manufacturer;\r\n            public TW_STR32 ProductFamily;\r\n            public TW_STR32 ProductName;\r\n        }\r\n        [StructLayout(LayoutKind.Sequential, Pack = 2, CharSet = CharSet.Ansi)]\r\n        public struct TW_IDENTITY_LEGACY\r\n        {\r\n            public uint Id;\r\n            public TW_VERSION Version;\r\n            public ushort ProtocolMajor;\r\n            public ushort ProtocolMinor;\r\n            public uint SupportedGroups;\r\n            public TW_STR32 Manufacturer;\r\n            public TW_STR32 ProductFamily;\r\n            public TW_STR32 ProductName;\r\n            private UInt64 Padding; // accounts for Id and SupportedGroups\r\n        }\r\n        [StructLayout(LayoutKind.Sequential, Pack = 2, CharSet = CharSet.Ansi)]\r\n        public struct TW_IDENTITY_LINUX64\r\n        {\r\n            public ulong Id;\r\n            public TW_VERSION Version;\r\n            public ushort ProtocolMajor;\r\n            public ushort ProtocolMinor;\r\n            public ulong SupportedGroups;\r\n            public TW_STR32 Manufacturer;\r\n            public TW_STR32 ProductFamily;\r\n            public TW_STR32 ProductName;\r\n        }\r\n        [StructLayout(LayoutKind.Sequential, Pack = 2, CharSet = CharSet.Ansi)]\r\n        public struct TW_IDENTITY_MACOSX\r\n        {\r\n            public uint Id;\r\n            public TW_VERSION Version;\r\n            public ushort ProtocolMajor;\r\n            public ushort ProtocolMinor;\r\n            private ushort padding;\r\n            public uint SupportedGroups;\r\n            public TW_STR32 Manufacturer;\r\n            public TW_STR32 ProductFamily;\r\n            public TW_STR32 ProductName;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Describes the “real” image data, that is, the complete image being transferred between the Source and application.\r\n        /// </summary>\r\n        [StructLayout(LayoutKind.Sequential, Pack = 2)]\r\n        public struct TW_IMAGEINFO\r\n        {\r\n            public TW_FIX32 XResolution;\r\n            public TW_FIX32 YResolution;\r\n            public int ImageWidth;\r\n            public int ImageLength;\r\n            public short SamplesPerPixel;\r\n            public short BitsPerSample_0;\r\n            public short BitsPerSample_1;\r\n            public short BitsPerSample_2;\r\n            public short BitsPerSample_3;\r\n            public short BitsPerSample_4;\r\n            public short BitsPerSample_5;\r\n            public short BitsPerSample_6;\r\n            public short BitsPerSample_7;\r\n            public short BitsPerPixel;\r\n            public ushort Planar;\r\n            public short PixelType;\r\n            public ushort Compression;\r\n        }\r\n        [StructLayout(LayoutKind.Sequential, Pack = 2)]\r\n        public struct TW_IMAGEINFO_LINUX64\r\n        {\r\n            public TW_FIX32 XResolution;\r\n            public TW_FIX32 YResolution;\r\n            public int ImageWidth;\r\n            public int ImageLength;\r\n            public short SamplesPerPixel;\r\n            public short BitsPerSample_0;\r\n            public short BitsPerSample_1;\r\n            public short BitsPerSample_2;\r\n            public short BitsPerSample_3;\r\n            public short BitsPerSample_4;\r\n            public short BitsPerSample_5;\r\n            public short BitsPerSample_6;\r\n            public short BitsPerSample_7;\r\n            public short BitsPerPixel;\r\n            public ushort Planar;\r\n            public short PixelType;\r\n            public ushort Compression;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Involves information about the original size of the acquired image.\r\n        /// </summary>\r\n        [StructLayout(LayoutKind.Sequential, Pack = 2)]\r\n        public struct TW_IMAGELAYOUT\r\n        {\r\n            public TW_FRAME Frame;\r\n            public uint DocumentNumber;\r\n            public uint PageNumber;\r\n            public uint FrameNumber;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Provides information for managing memory buffers.\r\n        /// </summary>\r\n        [StructLayout(LayoutKind.Sequential, Pack = 2)]\r\n        public struct TW_MEMORY\r\n        {\r\n            public uint Flags;\r\n            public uint Length;\r\n            [SuppressMessage(\"Microsoft.Security\", \"CA2111:PointersShouldNotBeVisible\")]\r\n            public IntPtr TheMem;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Describes the form of the acquired data being passed from the Source to the application.\r\n        /// </summary>\r\n        [StructLayout(LayoutKind.Sequential, Pack = 2)]\r\n        public struct TW_IMAGEMEMXFER\r\n        {\r\n            public ushort Compression;\r\n            public uint BytesPerRow;\r\n            public uint Columns;\r\n            public uint Rows;\r\n            public uint XOffset;\r\n            public uint YOffset;\r\n            public uint BytesWritten;\r\n            public TW_MEMORY Memory;\r\n        }\r\n        [StructLayout(LayoutKind.Sequential, Pack = 2)]\r\n        public struct TW_IMAGEMEMXFER_LINUX64\r\n        {\r\n            public ushort Compression;\r\n            public UInt64 BytesPerRow;\r\n            public UInt64 Columns;\r\n            public UInt64 Rows;\r\n            public UInt64 XOffset;\r\n            public UInt64 YOffset;\r\n            public UInt64 BytesWritten;\r\n            public UInt64 MemoryFlags;\r\n            public UInt64 MemoryLength;\r\n            [SuppressMessage(\"Microsoft.Security\", \"CA2111:PointersShouldNotBeVisible\")]\r\n            public IntPtr MemoryTheMem;\r\n        }\r\n        [StructLayout(LayoutKind.Sequential, Pack = 2)]\r\n        public struct TW_IMAGEMEMXFER_MACOSX\r\n        {\r\n            public uint Compression;\r\n            public uint BytesPerRow;\r\n            public uint Columns;\r\n            public uint Rows;\r\n            public uint XOffset;\r\n            public uint YOffset;\r\n            public uint BytesWritten;\r\n            public TW_MEMORY Memory;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Describes the information necessary to transfer a JPEG-compressed image.\r\n        /// </summary>\r\n        [StructLayout(LayoutKind.Sequential, Pack = 2)]\r\n        public struct TW_JPEGCOMPRESSION\r\n        {\r\n            public ushort ColorSpace;\r\n            public uint SubSampling;\r\n            public ushort NumComponents;\r\n            public ushort QuantMap_0;\r\n            public ushort QuantMap_1;\r\n            public ushort QuantMap_2;\r\n            public ushort QuantMap_3;\r\n            public TW_MEMORY QuantTable_0;\r\n            public TW_MEMORY QuantTable_1;\r\n            public TW_MEMORY QuantTable_2;\r\n            public TW_MEMORY QuantTable_3;\r\n            public ushort HuffmanMap_0;\r\n            public ushort HuffmanMap_1;\r\n            public ushort HuffmanMap_2;\r\n            public ushort HuffmanMap_3;\r\n            public TW_MEMORY HuffmanDC_0;\r\n            public TW_MEMORY HuffmanDC_1;\r\n            public TW_MEMORY HuffmanAC_0;\r\n            public TW_MEMORY HuffmanAC_2;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Collects scanning metrics after returning to state 4\r\n        /// </summary>\r\n        [StructLayout(LayoutKind.Sequential, Pack = 2)]\r\n        public struct TW_METRICS\r\n        {\r\n            public uint SizeOf;\r\n            public uint ImageCount;\r\n            public uint SheetCount;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Stores a single value (item) which describes a capability.\r\n        /// </summary>\r\n        [StructLayout(LayoutKind.Sequential, Pack = 2)]\r\n        public struct TW_ONEVALUE\r\n        {\r\n            public TWTY ItemType;\r\n            // public uint Item;\r\n        }\r\n        [StructLayout(LayoutKind.Sequential, Pack = 4)]\r\n        public struct TW_ONEVALUE_MACOSX\r\n        {\r\n            public uint ItemType;\r\n            // public uint Item;\r\n        }\r\n\r\n        /// <summary>\r\n        /// This structure holds the color palette information.\r\n        /// </summary>\r\n        [StructLayout(LayoutKind.Sequential, Pack = 2)]\r\n        public struct TW_PALETTE8\r\n        {\r\n            public ushort Flags;\r\n            public ushort Length;\r\n            public TW_ELEMENT8 Colors_000;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Used to bypass the TWAIN protocol when communicating with a device.\r\n        /// </summary>\r\n        [StructLayout(LayoutKind.Sequential, Pack = 2)]\r\n        public struct TW_PASSTHRU\r\n        {\r\n            [SuppressMessage(\"Microsoft.Security\", \"CA2111:PointersShouldNotBeVisible\")]\r\n            public IntPtr pCommand;\r\n            public uint CommandBytes;\r\n            public int Direction;\r\n            [SuppressMessage(\"Microsoft.Security\", \"CA2111:PointersShouldNotBeVisible\")]\r\n            public IntPtr pData;\r\n            public uint DataBytes;\r\n            public uint DataBytesXfered;\r\n        }\r\n\r\n        /// <summary>\r\n        /// This structure tells the application how many more complete transfers the Source currently has available.\r\n        /// </summary>\r\n        [StructLayout(LayoutKind.Sequential, Pack = 2)]\r\n        public struct TW_PENDINGXFERS\r\n        {\r\n            public ushort Count;\r\n            public uint EOJ;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Stores a range of individual values describing a capability.\r\n        /// </summary>\r\n        [StructLayout(LayoutKind.Sequential, Pack = 2)]\r\n        public struct TW_RANGE\r\n        {\r\n            public TWTY ItemType;\r\n            public uint MinValue;\r\n            public uint MaxValue;\r\n            public uint StepSize;\r\n            public uint DefaultValue;\r\n            public uint CurrentValue;\r\n        }\r\n        [StructLayout(LayoutKind.Sequential, Pack = 2)]\r\n        public struct TW_RANGE_LINUX64\r\n        {\r\n            public TWTY ItemType;\r\n            public ulong MinValue;\r\n            public ulong MaxValue;\r\n            public ulong StepSize;\r\n            public ulong DefaultValue;\r\n            public ulong CurrentValue;\r\n        }\r\n        [StructLayout(LayoutKind.Sequential, Pack = 4)]\r\n        public struct TW_RANGE_MACOSX\r\n        {\r\n            public uint ItemType;\r\n            public uint MinValue;\r\n            public uint MaxValue;\r\n            public uint StepSize;\r\n            public uint DefaultValue;\r\n            public uint CurrentValue;\r\n        }\r\n        [StructLayout(LayoutKind.Sequential, Pack = 2)]\r\n        private struct TW_RANGE_FIX32\r\n        {\r\n            public TWTY ItemType;\r\n            public TW_FIX32 MinValue;\r\n            public TW_FIX32 MaxValue;\r\n            public TW_FIX32 StepSize;\r\n            public TW_FIX32 DefaultValue;\r\n            public TW_FIX32 CurrentValue;\r\n        }\r\n        [StructLayout(LayoutKind.Sequential, Pack = 4)]\r\n        private struct TW_RANGE_FIX32_MACOSX\r\n        {\r\n            public uint ItemType;\r\n            public TW_FIX32 MinValue;\r\n            public TW_FIX32 MaxValue;\r\n            public TW_FIX32 StepSize;\r\n            public TW_FIX32 DefaultValue;\r\n            public TW_FIX32 CurrentValue;\r\n        }\r\n\r\n        /// <summary>\r\n        /// This structure is used by the application to specify a set of mapping values to be applied to RGB color data.\r\n        /// </summary>\r\n        [StructLayout(LayoutKind.Sequential, Pack = 2)]\r\n        public struct TW_RGBRESPONSE\r\n        {\r\n            public TW_ELEMENT8 Response_00;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Describes the file format and file specification information for a transfer through a disk file.\r\n        /// </summary>\r\n        [StructLayout(LayoutKind.Sequential, Pack = 2)]\r\n        public struct TW_SETUPFILEXFER\r\n        {\r\n            public TW_STR255 FileName;\r\n            public TWFF Format;\r\n            public short VRefNum;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Provides the application information about the Source’s requirements and preferences regarding allocation of transfer buffer(s).\r\n        /// </summary>\r\n        [StructLayout(LayoutKind.Sequential, Pack = 2)]\r\n        public struct TW_SETUPMEMXFER\r\n        {\r\n            public uint MinBufSize;\r\n            public uint MaxBufSize;\r\n            public uint Preferred;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Describes the status of a source.\r\n        /// </summary>\r\n        [StructLayout(LayoutKind.Sequential, Pack = 2)]\r\n        public struct TW_STATUS\r\n        {\r\n            public ushort ConditionCode;\r\n            public ushort Data;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Translates the contents of Status into a localized UTF8string.\r\n        /// </summary>\r\n        [StructLayout(LayoutKind.Sequential, Pack = 2)]\r\n        public struct TW_STATUSUTF8\r\n        {\r\n            public TW_STATUS Status;\r\n            public uint Size;\r\n            [SuppressMessage(\"Microsoft.Security\", \"CA2111:PointersShouldNotBeVisible\")]\r\n            public IntPtr UTF8string;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Passthru for TWAIN Direct tasks.\r\n        /// </summary>\r\n        [StructLayout(LayoutKind.Sequential, Pack = 2, CharSet = CharSet.Ansi)]\r\n        public struct TW_TWAINDIRECT\r\n        {\r\n            public uint SizeOf;\r\n            public ushort CommunicationManager;\r\n            [SuppressMessage(\"Microsoft.Security\", \"CA2111:PointersShouldNotBeVisible\")]\r\n            public IntPtr Send;\r\n            public uint SendSize;\r\n            [SuppressMessage(\"Microsoft.Security\", \"CA2111:PointersShouldNotBeVisible\")]\r\n            public IntPtr Receive;\r\n            public uint ReceiveSize;\r\n        }\r\n\r\n        /// <summary>\r\n        /// This structure is used to handle the user interface coordination between an application and a Source.\r\n        /// </summary>\r\n        [StructLayout(LayoutKind.Sequential, Pack = 2, CharSet = CharSet.Ansi)]\r\n        public struct TW_USERINTERFACE\r\n        {\r\n            public ushort ShowUI;\r\n            public ushort ModalUI;\r\n            [SuppressMessage(\"Microsoft.Security\", \"CA2111:PointersShouldNotBeVisible\")]\r\n            public IntPtr hParent;\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        // Generic Constants...\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        #region Generic Constants...\r\n\r\n        /// <summary>\r\n        /// Container Types...\r\n        /// </summary>\r\n        public enum TWON : ushort\r\n        {\r\n            ARRAY = 3,\r\n            ENUMERATION = 4,\r\n            ONEVALUE = 5,\r\n            RANGE = 6,\r\n\r\n            ICONID = 962,\r\n            DSMID = 461,\r\n            DSMCODEID = 63\r\n        }\r\n\r\n        /// <summary>\r\n        /// Don't care values...\r\n        /// </summary>\r\n        public const byte TWON_DONTCARE8 = 0xff;\r\n        public const ushort TWON_DONTCARE16 = 0xffff;\r\n        public const uint TWON_DONTCARE32 = 0xffffffff;\r\n\r\n        /// <summary>\r\n        /// Flags used in TW_MEMORY structure.\r\n        /// </summary>\r\n        public enum TWMF : ushort\r\n        {\r\n            APPOWNS = 0x0001,\r\n            DSMOWNS = 0x0002,\r\n            DSOWNS = 0x0004,\r\n            POINTER = 0x0008,\r\n            HANDLE = 0x0010\r\n        }\r\n\r\n        /// <summary>\r\n        /// Type values...\r\n        /// </summary>\r\n        public enum TWTY : ushort\r\n        {\r\n            INT8 = 0x0000,\r\n            INT16 = 0x0001,\r\n            INT32 = 0x0002,\r\n\r\n            UINT8 = 0x0003,\r\n            UINT16 = 0x0004,\r\n            UINT32 = 0x0005,\r\n\r\n            BOOL = 0x0006,\r\n\r\n            FIX32 = 0x0007,\r\n\r\n            FRAME = 0x0008,\r\n\r\n            STR32 = 0x0009,\r\n            STR64 = 0x000a,\r\n            STR128 = 0x000b,\r\n            STR255 = 0x000c,\r\n            HANDLE = 0x000f\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        // Capability Constants...\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        #region Capability Constants...\r\n\r\n        /// <summary>\r\n        /// CAP_ALARMS values\r\n        /// </summary>\r\n        public enum TWAL : ushort\r\n        {\r\n            ALARM = 0,\r\n            FEEDERERROR = 1,\r\n            FEEDERWARNING = 2,\r\n            BARCODE = 3,\r\n            DOUBLEFEED = 4,\r\n            JAM = 5,\r\n            PATCHCODE = 6,\r\n            POWER = 7,\r\n            SKEW = 8\r\n        }\r\n\r\n        /// <summary>\r\n        /// ICAP_AUTOSIZE values\r\n        /// </summary>\r\n        public enum TWAS : ushort\r\n        {\r\n            NONE = 0,\r\n            AUTO = 1,\r\n            CURRENT = 2\r\n        }\r\n\r\n        /// <summary>\r\n        /// TWEI_BARCODEROTATION values\r\n        /// </summary>\r\n        public enum TWBCOR : ushort\r\n        {\r\n            ROT0 = 0,\r\n            ROT90 = 1,\r\n            ROT180 = 2,\r\n            ROT270 = 3,\r\n            ROTX = 4\r\n        }\r\n\r\n        /// <summary>\r\n        /// ICAP_BARCODESEARCHMODE values\r\n        /// </summary>\r\n        public enum TWBD : ushort\r\n        {\r\n            HORZ = 0,\r\n            VERT = 1,\r\n            HORZVERT = 2,\r\n            VERTHORZ = 3\r\n        }\r\n\r\n        /// <summary>\r\n        /// ICAP_BITORDER values\r\n        /// </summary>\r\n        public enum TWBO : ushort\r\n        {\r\n            LSBFIRST = 0,\r\n            MSBFIRST = 1\r\n        }\r\n\r\n        /// <summary>\r\n        /// ICAP_AUTODISCARDBLANKPAGES values\r\n        /// </summary>\r\n        public enum TWBP : short\r\n        {\r\n            DISABLE = -2,\r\n            AUTO = -1\r\n        }\r\n\r\n        /// <summary>\r\n        /// ICAP_BITDEPTHREDUCTION values\r\n        /// </summary>\r\n        public enum TWBR : ushort\r\n        {\r\n            THRESHOLD = 0,\r\n            HALFTONE = 1,\r\n            CUSTHALFTONE = 2,\r\n            DIFFUSION = 3,\r\n            DYNAMICTHRESHOLD = 4\r\n        }\r\n\r\n        /// <summary>\r\n        /// ICAP_SUPPORTEDBARCODETYPES and TWEI_BARCODETYPE values\r\n        /// </summary>\r\n        public enum TWBT : ushort\r\n        {\r\n            X3OF9 = 0, // 3OF9 in TWAIN.H\r\n            X2OF5INTERLEAVED = 1, // 2OF5INTERLEAVED in TWAIN.H\r\n            X2OF5NONINTERLEAVED = 2, // 2OF5NONINTERLEAVED in TWAIN.H\r\n            CODE93 = 3,\r\n            CODE128 = 4,\r\n            UCC128 = 5,\r\n            CODABAR = 6,\r\n            UPCA = 7,\r\n            UPCE = 8,\r\n            EAN8 = 9,\r\n            EAN13 = 10,\r\n            POSTNET = 11,\r\n            PDF417 = 12,\r\n            X2OF5INDUSTRIAL = 13, // 2OF5INDUSTRIAL in TWAIN.H\r\n            X2OF5MATRIX = 14, // 2OF5MATRIX in TWAIN.H\r\n            X2OF5DATALOGIC = 15, // 2OF5DATALOGIC in TWAIN.H\r\n            X2OF5IATA = 16, // 2OF5IATA in TWAIN.H\r\n            X3OF9FULLASCII = 17, // 3OF9FULLASCII in TWAIN.H\r\n            CODABARWITHSTARTSTOP = 18,\r\n            MAXICODE = 19,\r\n            QRCODE = 20\r\n        }\r\n\r\n        /// <summary>\r\n        /// ICAP_COMPRESSION values\r\n        /// </summary>\r\n        public enum TWCP : ushort\r\n        {\r\n            NONE = 0,\r\n            PACKBITS = 1,\r\n            GROUP31D = 2,\r\n            GROUP31DEOL = 3,\r\n            GROUP32D = 4,\r\n            GROUP4 = 5,\r\n            JPEG = 6,\r\n            LZW = 7,\r\n            JBIG = 8,\r\n            PNG = 9,\r\n            RLE4 = 10,\r\n            RLE8 = 11,\r\n            BITFIELDS = 12,\r\n            ZIP = 13,\r\n            JPEG2000 = 14\r\n        }\r\n\r\n        /// <summary>\r\n        /// CAP_CAMERASIDE and TWEI_PAGESIDE values\r\n        /// </summary>\r\n        public enum TWCS : ushort\r\n        {\r\n            BOTH = 0,\r\n            TOP = 1,\r\n            BOTTOM = 2\r\n        }\r\n\r\n        /// <summary>\r\n        /// CAP_CLEARBUFFERS values\r\n        /// </summary>\r\n        public enum TWCB : ushort\r\n        {\r\n            AUTO = 0,\r\n            CLEAR = 1,\r\n            NOCLEAR = 2\r\n        }\r\n\r\n        /// <summary>\r\n        /// CAP_DEVICEEVENT values\r\n        /// </summary>\r\n        public enum TWDE : ushort\r\n        {\r\n            CUSTOMEVENTS = 0x8000,\r\n            CHECKAUTOMATICCAPTURE = 0,\r\n            CHECKBATTERY = 1,\r\n            CHECKDEVICEONLINE = 2,\r\n            CHECKFLASH = 3,\r\n            CHECKPOWERSUPPLY = 4,\r\n            CHECKRESOLUTION = 5,\r\n            DEVICEADDED = 6,\r\n            DEVICEOFFLINE = 7,\r\n            DEVICEREADY = 8,\r\n            DEVICEREMOVED = 9,\r\n            IMAGECAPTURED = 10,\r\n            IMAGEDELETED = 11,\r\n            PAPERDOUBLEFEED = 12,\r\n            PAPERJAM = 13,\r\n            LAMPFAILURE = 14,\r\n            POWERSAVE = 15,\r\n            POWERSAVENOTIFY = 16\r\n        }\r\n\r\n        /// <summary>\r\n        /// TW_PASSTHRU.Direction values\r\n        /// </summary>\r\n        public enum TWDR : ushort\r\n        {\r\n            GET = 1,\r\n            SET = 2\r\n        }\r\n\r\n        /// <summary>\r\n        /// TWEI_DESKEWSTATUS values\r\n        /// </summary>\r\n        public enum TWDSK : ushort\r\n        {\r\n            SUCCESS = 0,\r\n            REPORTONLY = 1,\r\n            FAIL = 2,\r\n            DISABLED = 3\r\n        }\r\n\r\n        /// <summary>\r\n        /// CAP_DUPLEX values\r\n        /// </summary>\r\n        public enum TWDX : ushort\r\n        {\r\n            NONE = 0,\r\n            X1PASSDUPLEX = 1, // 1PASSDUPLEX in TWAIN.H\r\n            X2PASSDUPLEX = 2  // 2PASSDUPLEX in TWAIN.H\r\n        }\r\n\r\n        /// <summary>\r\n        /// CAP_FEEDERALIGNMENT values\r\n        /// </summary>\r\n        public enum TWFA : ushort\r\n        {\r\n            NONE = 0,\r\n            LEFT = 1,\r\n            CENTER = 2,\r\n            RIGHT = 3\r\n        }\r\n\r\n        /// <summary>\r\n        /// ICAP_FEEDERTYPE values\r\n        /// </summary>\r\n        public enum TWFE : ushort\r\n        {\r\n            GENERAL = 0,\r\n            PHOTO = 1\r\n        }\r\n\r\n        /// <summary>\r\n        /// ICAP_IMAGEFILEFORMAT values\r\n        /// </summary>\r\n        public enum TWFF : ushort\r\n        {\r\n            TIFF = 0,\r\n            PICT = 1,\r\n            BMP = 2,\r\n            XBM = 3,\r\n            JFIF = 4,\r\n            FPX = 5,\r\n            TIFFMULTI = 6,\r\n            PNG = 7,\r\n            SPIFF = 8,\r\n            EXIF = 9,\r\n            PDF = 10,\r\n            JP2 = 11,\r\n            JPX = 13,\r\n            DEJAVU = 14,\r\n            PDFA = 15,\r\n            PDFA2 = 16,\r\n            PDFRASTER = 17\r\n        }\r\n\r\n        /// <summary>\r\n        /// ICAP_FLASHUSED2 values\r\n        /// </summary>\r\n        public enum TWFL : ushort\r\n        {\r\n            NONE = 0,\r\n            OFF = 1,\r\n            ON = 2,\r\n            AUTO = 3,\r\n            REDEYE = 4\r\n        }\r\n\r\n        /// <summary>\r\n        /// CAP_FEEDERORDER values\r\n        /// </summary>\r\n        public enum TWFO : ushort\r\n        {\r\n            FIRSTPAGEFIRST = 0,\r\n            LASTPAGEFIRST = 1\r\n        }\r\n\r\n        /// <summary>\r\n        /// CAP_FEEDERPOCKET values\r\n        /// </summary>\r\n        public enum TWFP : ushort\r\n        {\r\n            POCKETERROR = 0,\r\n            POCKET1 = 1,\r\n            POCKET2 = 2,\r\n            POCKET3 = 3,\r\n            POCKET4 = 4,\r\n            POCKET5 = 5,\r\n            POCKET6 = 6,\r\n            POCKET7 = 7,\r\n            POCKET8 = 8,\r\n            POCKET9 = 9,\r\n            POCKET10 = 10,\r\n            POCKET11 = 11,\r\n            POCKET12 = 12,\r\n            POCKET13 = 13,\r\n            POCKET14 = 14,\r\n            POCKET15 = 15,\r\n            POCKET16 = 16\r\n        }\r\n\r\n        /// <summary>\r\n        /// ICAP_FLIPROTATION values\r\n        /// </summary>\r\n        public enum TWFR : ushort\r\n        {\r\n            BOOK = 0,\r\n            FANFOLD = 1\r\n        }\r\n\r\n        /// <summary>\r\n        /// ICAP_FILTER values\r\n        /// </summary>\r\n        public enum TWFT : ushort\r\n        {\r\n            RED = 0,\r\n            GREEN = 1,\r\n            BLUE = 2,\r\n            NONE = 3,\r\n            WHITE = 4,\r\n            CYAN = 5,\r\n            MAGENTA = 6,\r\n            YELLOW = 7,\r\n            BLACK = 8\r\n        }\r\n\r\n        /// <summary>\r\n        /// TW_FILESYSTEM.FileType values\r\n        /// </summary>\r\n        public enum TWFY : ushort\r\n        {\r\n            CAMERA = 0,\r\n            CAMERATOP = 1,\r\n            CAMERABOTTOM = 2,\r\n            CAMERAPREVIEW = 3,\r\n            DOMAIN = 4,\r\n            HOST = 5,\r\n            DIRECTORY = 6,\r\n            IMAGE = 7,\r\n            UNKNOWN = 8\r\n        }\r\n\r\n        ///\r\n        /// CAP_IAFIELD*_LEVEL values\r\n        ///\r\n        public enum TWIA : ushort\r\n        {\r\n            UNUSED = 0,\r\n            FIXED = 1,\r\n            LEVEL1 = 2,\r\n            LEVEL2 = 3,\r\n            LEVEL3 = 4,\r\n            LEVEL4 = 5\r\n        }\r\n\r\n        /// <summary>\r\n        /// ICAP_ICCPROFILE values\r\n        /// </summary>\r\n        public enum TWIC : ushort\r\n        {\r\n            NONE = 0,\r\n            LINK = 1,\r\n            EMBED = 2\r\n        }\r\n\r\n        /// <summary>\r\n        /// ICAP_IMAGEFILTER values\r\n        /// </summary>\r\n        public enum TWIF : ushort\r\n        {\r\n            NONE = 0,\r\n            AUTO = 1,\r\n            LOWPASS = 2,\r\n            BANDPASS = 3,\r\n            HIGHPASS = 4,\r\n            TEXT = BANDPASS,\r\n            FINELINE = HIGHPASS\r\n        }\r\n\r\n        /// <summary>\r\n        /// ICAP_IMAGEMERGE values\r\n        /// </summary>\r\n        public enum TWIM : ushort\r\n        {\r\n            NONE = 0,\r\n            FRONTONTOP = 1,\r\n            FRONTONBOTTOM = 2,\r\n            FRONTONLEFT = 3,\r\n            FRONTONRIGHT = 4\r\n        }\r\n\r\n        /// <summary>\r\n        /// CAP_JOBCONTROL values\r\n        /// </summary>\r\n        public enum TWJC : ushort\r\n        {\r\n            NONE = 0,\r\n            JSIC = 1,\r\n            JSIS = 2,\r\n            JSXC = 3,\r\n            JSXS = 4\r\n        }\r\n\r\n        /// <summary>\r\n        /// ICAP_JPEGQUALITY values\r\n        /// </summary>\r\n        public enum TWJQ : short\r\n        {\r\n            UNKNOWN = -4,\r\n            LOW = -3,\r\n            MEDIUM = -2,\r\n            HIGH = -1\r\n        }\r\n\r\n        /// <summary>\r\n        /// ICAP_LIGHTPATH values\r\n        /// </summary>\r\n        public enum TWLP : ushort\r\n        {\r\n            REFLECTIVE = 0,\r\n            TRANSMISSIVE = 1\r\n        }\r\n\r\n        /// <summary>\r\n        /// ICAP_LIGHTSOURCE values\r\n        /// </summary>\r\n        public enum TWLS : ushort\r\n        {\r\n            RED = 0,\r\n            GREEN = 1,\r\n            BLUE = 2,\r\n            NONE = 3,\r\n            WHITE = 4,\r\n            UV = 5,\r\n            IR = 6\r\n        }\r\n\r\n        /// <summary>\r\n        /// TWEI_MAGTYPE values\r\n        /// </summary>\r\n        public enum TWMD : ushort\r\n        {\r\n            MICR = 0,\r\n            RAW = 1,\r\n            INVALID = 2\r\n        }\r\n\r\n        /// <summary>\r\n        /// ICAP_NOISEFILTER values\r\n        /// </summary>\r\n        public enum TWNF : ushort\r\n        {\r\n            NONE = 0,\r\n            AUTO = 1,\r\n            LONEPIXEL = 2,\r\n            MAJORITYRULE = 3\r\n        }\r\n\r\n        /// <summary>\r\n        /// ICAP_ORIENTATION values\r\n        /// </summary>\r\n        public enum TWOR : ushort\r\n        {\r\n            ROT0 = 0,\r\n            ROT90 = 1,\r\n            ROT180 = 2,\r\n            ROT270 = 3,\r\n            PORTRAIT = ROT0,\r\n            LANDSCAPE = ROT270,\r\n            AUTO = 4,\r\n            AUTOTEXT = 5,\r\n            AUTOPICTURE = 6\r\n        }\r\n\r\n        /// <summary>\r\n        /// ICAP_OVERSCAN values\r\n        /// </summary>\r\n        public enum TWOV : ushort\r\n        {\r\n            NONE = 0,\r\n            AUTO = 1,\r\n            TOPBOTTOM = 2,\r\n            LEFTRIGHT = 3,\r\n            ALL = 4\r\n        }\r\n\r\n        /// <summary>\r\n        /// Palette types for TW_PALETTE8\r\n        /// </summary>\r\n        public enum TWPA : ushort\r\n        {\r\n            RGB = 0,\r\n            GRAY = 1,\r\n            CMY = 2\r\n        }\r\n\r\n        /// <summary>\r\n        /// ICAP_PLANARCHUNKY values\r\n        /// </summary>\r\n        public enum TWPC : ushort\r\n        {\r\n            CHUNKY = 0,\r\n            PLANAR = 1\r\n        }\r\n\r\n        /// <summary>\r\n        /// TWEI_PATCHCODE values\r\n        /// </summary>\r\n        public enum TWPCH : ushort\r\n        {\r\n            PATCH1 = 0,\r\n            PATCH2 = 1,\r\n            PATCH3 = 2,\r\n            PATCH4 = 3,\r\n            PATCH6 = 4,\r\n            PATCHT = 5\r\n        }\r\n\r\n        /// <summary>\r\n        /// ICAP_PIXELFLAVOR values\r\n        /// </summary>\r\n        public enum TWPF : ushort\r\n        {\r\n            CHOCOLATE = 0,\r\n            VANILLA = 1\r\n        }\r\n\r\n        /// <summary>\r\n        /// CAP_PRINTERMODE values\r\n        /// </summary>\r\n        public enum TWPM : ushort\r\n        {\r\n            SINGLESTRING = 0,\r\n            MULTISTRING = 1,\r\n            COMPOUNDSTRING = 2,\r\n            IMAGEADDRESSSTRING = 3\r\n        }\r\n\r\n        /// <summary>\r\n        /// CAP_PRINTER values\r\n        /// </summary>\r\n        public enum TWPR : ushort\r\n        {\r\n            IMPRINTERTOPBEFORE = 0,\r\n            IMPRINTERTOPAFTER = 1,\r\n            IMPRINTERBOTTOMBEFORE = 2,\r\n            IMPRINTERBOTTOMAFTER = 3,\r\n            ENDORSERTOPBEFORE = 4,\r\n            ENDORSERTOPAFTER = 5,\r\n            ENDORSERBOTTOMBEFORE = 6,\r\n            ENDORSERBOTTOMAFTER = 7\r\n        }\r\n\r\n        /// <summary>\r\n        /// CAP_PRINTERFONTSTYLE Added 2.3 (TWPF in TWAIN.H)\r\n        /// </summary>\r\n        public enum TWPFS : ushort\r\n        {\r\n            NORMAL = 0,\r\n            BOLD = 1,\r\n            ITALIC = 2,\r\n            LARGESIZE = 3,\r\n            SMALLSIZE = 4\r\n        }\r\n\r\n        /// <summary>\r\n        /// CAP_PRINTERINDEXTRIGGER Added 2.3\r\n        /// </summary>\r\n        public enum TWCT : ushort\r\n        {\r\n            PAGE = 0,\r\n            PATCH1 = 1,\r\n            PATCH2 = 2,\r\n            PATCH3 = 3,\r\n            PATCH4 = 4,\r\n            PATCHT = 5,\r\n            PATCH6 = 6\r\n        }\r\n\r\n        /// <summary>\r\n        /// CAP_POWERSUPPLY values\r\n        /// </summary>\r\n        public enum TWPS : ushort\r\n        {\r\n            EXTERNAL = 0,\r\n            BATTERY = 1\r\n        }\r\n\r\n        /// <summary>\r\n        /// ICAP_PIXELTYPE values (PT_ means Pixel Type)\r\n        /// </summary>\r\n        public enum TWPT : ushort\r\n        {\r\n            BW = 0,\r\n            GRAY = 1,\r\n            RGB = 2,\r\n            PALETTE = 3,\r\n            CMY = 4,\r\n            CMYK = 5,\r\n            YUV = 6,\r\n            YUVK = 7,\r\n            CIEXYZ = 8,\r\n            LAB = 9,\r\n            SRGB = 10,\r\n            SCRGB = 11,\r\n            INFRARED = 16\r\n        }\r\n\r\n        /// <summary>\r\n        /// CAP_SEGMENTED values\r\n        /// </summary>\r\n        public enum TWSG : ushort\r\n        {\r\n            NONE = 0,\r\n            AUTO = 1,\r\n            MANUAL = 2\r\n        }\r\n\r\n        /// <summary>\r\n        /// ICAP_FILMTYPE values\r\n        /// </summary>\r\n        public enum TWFM : ushort\r\n        {\r\n            POSITIVE = 0,\r\n            NEGATIVE = 1\r\n        }\r\n\r\n        /// <summary>\r\n        /// CAP_DOUBLEFEEDDETECTION values\r\n        /// </summary>\r\n        public enum TWDF : ushort\r\n        {\r\n            ULTRASONIC = 0,\r\n            BYLENGTH = 1,\r\n            INFRARED = 2\r\n        }\r\n\r\n        /// <summary>\r\n        /// CAP_DOUBLEFEEDDETECTIONSENSITIVITY values\r\n        /// </summary>\r\n        public enum TWUS : ushort\r\n        {\r\n            LOW = 0,\r\n            MEDIUM = 1,\r\n            HIGH = 2\r\n        }\r\n\r\n        /// <summary>\r\n        /// CAP_DOUBLEFEEDDETECTIONRESPONSE values\r\n        /// </summary>\r\n        public enum TWDP : ushort\r\n        {\r\n            STOP = 0,\r\n            STOPANDWAIT = 1,\r\n            SOUND = 2,\r\n            DONOTIMPRINT = 3\r\n        }\r\n\r\n        /// <summary>\r\n        /// ICAP_MIRROR values\r\n        /// </summary>\r\n        public enum TWMR : ushort\r\n        {\r\n            NONE = 0,\r\n            VERTICAL = 1,\r\n            HORIZONTAL = 2\r\n        }\r\n\r\n        /// <summary>\r\n        /// ICAP_JPEGSUBSAMPLING values\r\n        /// </summary>\r\n        public enum TWJS : ushort\r\n        {\r\n            X444YCBCR = 0, // 444YCBCR in TWAIN.H\r\n            X444RGB = 1, // 444RGB in TWAIN.H\r\n            X422 = 2, // 422 in TWAIN.H\r\n            X421 = 3, // 421 in TWAIN.H\r\n            X411 = 4, // 411 in TWAIN.H\r\n            X420 = 5, // 420 in TWAIN.H\r\n            X410 = 6, // 410 in TWAIN.H\r\n            X311 = 7  // 311 in TWAIN.H\r\n        }\r\n\r\n        /// <summary>\r\n        /// CAP_PAPERHANDLING values\r\n        /// </summary>\r\n        public enum TWPH : ushort\r\n        {\r\n            NORMAL = 0,\r\n            FRAGILE = 1,\r\n            THICK = 2,\r\n            TRIFOLD = 3,\r\n            PHOTOGRAPH = 4\r\n        }\r\n\r\n        /// <summary>\r\n        /// CAP_INDICATORSMODE values\r\n        /// </summary>\r\n        public enum TWCI : ushort\r\n        {\r\n            INFO = 0,\r\n            WARNING = 1,\r\n            ERROR = 2,\r\n            WARMUP = 3\r\n        }\r\n\r\n        /// <summary>\r\n        /// ICAP_SUPPORTEDSIZES values (SS_ means Supported Sizes)\r\n        /// </summary>\r\n        public enum TWSS : ushort\r\n        {\r\n            NONE = 0,\r\n            A4 = 1,\r\n            JISB5 = 2,\r\n            USLETTER = 3,\r\n            USLEGAL = 4,\r\n            A5 = 5,\r\n            ISOB4 = 6,\r\n            ISOB6 = 7,\r\n            USLEDGER = 9,\r\n            USEXECUTIVE = 10,\r\n            A3 = 11,\r\n            ISOB3 = 12,\r\n            A6 = 13,\r\n            C4 = 14,\r\n            C5 = 15,\r\n            C6 = 16,\r\n            X4A0 = 17, // 4A0 in TWAIN.H\r\n            X2A0 = 18, // 2A0 in TWAIN.H\r\n            A0 = 19,\r\n            A1 = 20,\r\n            A2 = 21,\r\n            A7 = 22,\r\n            A8 = 23,\r\n            A9 = 24,\r\n            A10 = 25,\r\n            ISOB0 = 26,\r\n            ISOB1 = 27,\r\n            ISOB2 = 28,\r\n            ISOB5 = 29,\r\n            ISOB7 = 30,\r\n            ISOB8 = 31,\r\n            ISOB9 = 32,\r\n            ISOB10 = 33,\r\n            JISB0 = 34,\r\n            JISB1 = 35,\r\n            JISB2 = 36,\r\n            JISB3 = 37,\r\n            JISB4 = 38,\r\n            JISB6 = 39,\r\n            JISB7 = 40,\r\n            JISB8 = 41,\r\n            JISB9 = 42,\r\n            JISB10 = 43,\r\n            C0 = 44,\r\n            C1 = 45,\r\n            C2 = 46,\r\n            C3 = 47,\r\n            C7 = 48,\r\n            C8 = 49,\r\n            C9 = 50,\r\n            C10 = 51,\r\n            USSTATEMENT = 52,\r\n            BUSINESSCARD = 53,\r\n            MAXSIZE = 54\r\n        }\r\n\r\n        /// <summary>\r\n        /// ICAP_XFERMECH values (SX_ means Setup XFer)\r\n        /// </summary>\r\n        public enum TWSX : ushort\r\n        {\r\n            NATIVE = 0,\r\n            FILE = 1,\r\n            MEMORY = 2,\r\n            MEMFILE = 4\r\n        }\r\n\r\n        /// <summary>\r\n        /// ICAP_UNITS values (UN_ means UNits)\r\n        /// </summary>\r\n        public enum TWUN : ushort\r\n        {\r\n            INCHES = 0,\r\n            CENTIMETERS = 1,\r\n            PICAS = 2,\r\n            POINTS = 3,\r\n            TWIPS = 4,\r\n            PIXELS = 5,\r\n            MILLIMETERS = 6\r\n        }\r\n\r\n        /// <summary>\r\n        /// Country Constants\r\n        /// </summary>\r\n        public enum TWCY : ushort\r\n        {\r\n            AFGHANISTAN = 1001,\r\n            ALGERIA = 213,\r\n            AMERICANSAMOA = 684,\r\n            ANDORRA = 33,\r\n            ANGOLA = 1002,\r\n            ANGUILLA = 8090,\r\n            ANTIGUA = 8091,\r\n            ARGENTINA = 54,\r\n            ARUBA = 297,\r\n            ASCENSIONI = 247,\r\n            AUSTRALIA = 61,\r\n            AUSTRIA = 43,\r\n            BAHAMAS = 8092,\r\n            BAHRAIN = 973,\r\n            BANGLADESH = 880,\r\n            BARBADOS = 8093,\r\n            BELGIUM = 32,\r\n            BELIZE = 501,\r\n            BENIN = 229,\r\n            BERMUDA = 8094,\r\n            BHUTAN = 1003,\r\n            BOLIVIA = 591,\r\n            BOTSWANA = 267,\r\n            BRITAIN = 6,\r\n            BRITVIRGINIS = 8095,\r\n            BRAZIL = 55,\r\n            BRUNEI = 673,\r\n            BULGARIA = 359,\r\n            BURKINAFASO = 1004,\r\n            BURMA = 1005,\r\n            BURUNDI = 1006,\r\n            CAMAROON = 237,\r\n            CANADA = 2,\r\n            CAPEVERDEIS = 238,\r\n            CAYMANIS = 8096,\r\n            CENTRALAFREP = 1007,\r\n            CHAD = 1008,\r\n            CHILE = 56,\r\n            CHINA = 86,\r\n            CHRISTMASIS = 1009,\r\n            COCOSIS = 1009,\r\n            COLOMBIA = 57,\r\n            COMOROS = 1010,\r\n            CONGO = 1011,\r\n            COOKIS = 1012,\r\n            COSTARICA = 506,\r\n            CUBA = 5,\r\n            CYPRUS = 357,\r\n            CZECHOSLOVAKIA = 42,\r\n            DENMARK = 45,\r\n            DJIBOUTI = 1013,\r\n            DOMINICA = 8097,\r\n            DOMINCANREP = 8098,\r\n            EASTERIS = 1014,\r\n            ECUADOR = 593,\r\n            EGYPT = 20,\r\n            ELSALVADOR = 503,\r\n            EQGUINEA = 1015,\r\n            ETHIOPIA = 251,\r\n            FALKLANDIS = 1016,\r\n            FAEROEIS = 298,\r\n            FIJIISLANDS = 679,\r\n            FINLAND = 358,\r\n            FRANCE = 33,\r\n            FRANTILLES = 596,\r\n            FRGUIANA = 594,\r\n            FRPOLYNEISA = 689,\r\n            FUTANAIS = 1043,\r\n            GABON = 241,\r\n            GAMBIA = 220,\r\n            GERMANY = 49,\r\n            GHANA = 233,\r\n            GIBRALTER = 350,\r\n            GREECE = 30,\r\n            GREENLAND = 299,\r\n            GRENADA = 8099,\r\n            GRENEDINES = 8015,\r\n            GUADELOUPE = 590,\r\n            GUAM = 671,\r\n            GUANTANAMOBAY = 5399,\r\n            GUATEMALA = 502,\r\n            GUINEA = 224,\r\n            GUINEABISSAU = 1017,\r\n            GUYANA = 592,\r\n            HAITI = 509,\r\n            HONDURAS = 504,\r\n            HONGKONG = 852,\r\n            HUNGARY = 36,\r\n            ICELAND = 354,\r\n            INDIA = 91,\r\n            INDONESIA = 62,\r\n            IRAN = 98,\r\n            IRAQ = 964,\r\n            IRELAND = 353,\r\n            ISRAEL = 972,\r\n            ITALY = 39,\r\n            IVORYCOAST = 225,\r\n            JAMAICA = 8010,\r\n            JAPAN = 81,\r\n            JORDAN = 962,\r\n            KENYA = 254,\r\n            KIRIBATI = 1018,\r\n            KOREA = 82,\r\n            KUWAIT = 965,\r\n            LAOS = 1019,\r\n            LEBANON = 1020,\r\n            LIBERIA = 231,\r\n            LIBYA = 218,\r\n            LIECHTENSTEIN = 41,\r\n            LUXENBOURG = 352,\r\n            MACAO = 853,\r\n            MADAGASCAR = 1021,\r\n            MALAWI = 265,\r\n            MALAYSIA = 60,\r\n            MALDIVES = 960,\r\n            MALI = 1022,\r\n            MALTA = 356,\r\n            MARSHALLIS = 692,\r\n            MAURITANIA = 1023,\r\n            MAURITIUS = 230,\r\n            MEXICO = 3,\r\n            MICRONESIA = 691,\r\n            MIQUELON = 508,\r\n            MONACO = 33,\r\n            MONGOLIA = 1024,\r\n            MONTSERRAT = 8011,\r\n            MOROCCO = 212,\r\n            MOZAMBIQUE = 1025,\r\n            NAMIBIA = 264,\r\n            NAURU = 1026,\r\n            NEPAL = 977,\r\n            NETHERLANDS = 31,\r\n            NETHANTILLES = 599,\r\n            NEVIS = 8012,\r\n            NEWCALEDONIA = 687,\r\n            NEWZEALAND = 64,\r\n            NICARAGUA = 505,\r\n            NIGER = 227,\r\n            NIGERIA = 234,\r\n            NIUE = 1027,\r\n            NORFOLKI = 1028,\r\n            NORWAY = 47,\r\n            OMAN = 968,\r\n            PAKISTAN = 92,\r\n            PALAU = 1029,\r\n            PANAMA = 507,\r\n            PARAGUAY = 595,\r\n            PERU = 51,\r\n            PHILLIPPINES = 63,\r\n            PITCAIRNIS = 1030,\r\n            PNEWGUINEA = 675,\r\n            POLAND = 48,\r\n            PORTUGAL = 351,\r\n            QATAR = 974,\r\n            REUNIONI = 1031,\r\n            ROMANIA = 40,\r\n            RWANDA = 250,\r\n            SAIPAN = 670,\r\n            SANMARINO = 39,\r\n            SAOTOME = 1033,\r\n            SAUDIARABIA = 966,\r\n            SENEGAL = 221,\r\n            SEYCHELLESIS = 1034,\r\n            SIERRALEONE = 1035,\r\n            SINGAPORE = 65,\r\n            SOLOMONIS = 1036,\r\n            SOMALI = 1037,\r\n            SOUTHAFRICA = 27,\r\n            SPAIN = 34,\r\n            SRILANKA = 94,\r\n            STHELENA = 1032,\r\n            STKITTS = 8013,\r\n            STLUCIA = 8014,\r\n            STPIERRE = 508,\r\n            STVINCENT = 8015,\r\n            SUDAN = 1038,\r\n            SURINAME = 597,\r\n            SWAZILAND = 268,\r\n            SWEDEN = 46,\r\n            SWITZERLAND = 41,\r\n            SYRIA = 1039,\r\n            TAIWAN = 886,\r\n            TANZANIA = 255,\r\n            THAILAND = 66,\r\n            TOBAGO = 8016,\r\n            TOGO = 228,\r\n            TONGAIS = 676,\r\n            TRINIDAD = 8016,\r\n            TUNISIA = 216,\r\n            TURKEY = 90,\r\n            TURKSCAICOS = 8017,\r\n            TUVALU = 1040,\r\n            UGANDA = 256,\r\n            USSR = 7,\r\n            UAEMIRATES = 971,\r\n            UNITEDKINGDOM = 44,\r\n            USA = 1,\r\n            URUGUAY = 598,\r\n            VANUATU = 1041,\r\n            VATICANCITY = 39,\r\n            VENEZUELA = 58,\r\n            WAKE = 1042,\r\n            WALLISIS = 1043,\r\n            WESTERNSAHARA = 1044,\r\n            WESTERNSAMOA = 1045,\r\n            YEMEN = 1046,\r\n            YUGOSLAVIA = 38,\r\n            ZAIRE = 243,\r\n            ZAMBIA = 260,\r\n            ZIMBABWE = 263,\r\n            ALBANIA = 355,\r\n            ARMENIA = 374,\r\n            AZERBAIJAN = 994,\r\n            BELARUS = 375,\r\n            BOSNIAHERZGO = 387,\r\n            CAMBODIA = 855,\r\n            CROATIA = 385,\r\n            CZECHREPUBLIC = 420,\r\n            DIEGOGARCIA = 246,\r\n            ERITREA = 291,\r\n            ESTONIA = 372,\r\n            GEORGIA = 995,\r\n            LATVIA = 371,\r\n            LESOTHO = 266,\r\n            LITHUANIA = 370,\r\n            MACEDONIA = 389,\r\n            MAYOTTEIS = 269,\r\n            MOLDOVA = 373,\r\n            MYANMAR = 95,\r\n            NORTHKOREA = 850,\r\n            PUERTORICO = 787,\r\n            RUSSIA = 7,\r\n            SERBIA = 381,\r\n            SLOVAKIA = 421,\r\n            SLOVENIA = 386,\r\n            SOUTHKOREA = 82,\r\n            UKRAINE = 380,\r\n            USVIRGINIS = 340,\r\n            VIETNAM = 84\r\n        }\r\n\r\n        /// <summary>\r\n        /// Language Constants\r\n        /// </summary>\r\n        public enum TWLG : short\r\n        {\r\n            USERLOCALE = -1,\r\n            DAN = 0,\r\n            DUT = 1,\r\n            ENG = 2,\r\n            FCF = 3,\r\n            FIN = 4,\r\n            FRN = 5,\r\n            GER = 6,\r\n            ICE = 7,\r\n            ITN = 8,\r\n            NOR = 9,\r\n            POR = 10,\r\n            SPA = 11,\r\n            SWE = 12,\r\n            USA = 13,\r\n            AFRIKAANS = 14,\r\n            ALBANIA = 15,\r\n            ARABIC = 16,\r\n            ARABIC_ALGERIA = 17,\r\n            ARABIC_BAHRAIN = 18,\r\n            ARABIC_EGYPT = 19,\r\n            ARABIC_IRAQ = 20,\r\n            ARABIC_JORDAN = 21,\r\n            ARABIC_KUWAIT = 22,\r\n            ARABIC_LEBANON = 23,\r\n            ARABIC_LIBYA = 24,\r\n            ARABIC_MOROCCO = 25,\r\n            ARABIC_OMAN = 26,\r\n            ARABIC_QATAR = 27,\r\n            ARABIC_SAUDIARABIA = 28,\r\n            ARABIC_SYRIA = 29,\r\n            ARABIC_TUNISIA = 30,\r\n            ARABIC_UAE = 31,\r\n            ARABIC_YEMEN = 32,\r\n            BASQUE = 33,\r\n            BYELORUSSIAN = 34,\r\n            BULGARIAN = 35,\r\n            CATALAN = 36,\r\n            CHINESE = 37,\r\n            CHINESE_HONGKONG = 38,\r\n            CHINESE_PRC = 39,\r\n            CHINESE_SINGAPORE = 40,\r\n            CHINESE_SIMPLIFIED = 41,\r\n            CHINESE_TAIWAN = 42,\r\n            CHINESE_TRADITIONAL = 43,\r\n            CROATIA = 44,\r\n            CZECH = 45,\r\n            DANISH = DAN,\r\n            DUTCH = DUT,\r\n            DUTCH_BELGIAN = 46,\r\n            ENGLISH = ENG,\r\n            ENGLISH_AUSTRALIAN = 47,\r\n            ENGLISH_CANADIAN = 48,\r\n            ENGLISH_IRELAND = 49,\r\n            ENGLISH_NEWZEALAND = 50,\r\n            ENGLISH_SOUTHAFRICA = 51,\r\n            ENGLISH_UK = 52,\r\n            ENGLISH_USA = USA,\r\n            ESTONIAN = 53,\r\n            FAEROESE = 54,\r\n            FARSI = 55,\r\n            FINNISH = FIN,\r\n            FRENCH = FRN,\r\n            FRENCH_BELGIAN = 56,\r\n            FRENCH_CANADIAN = FCF,\r\n            FRENCH_LUXEMBOURG = 57,\r\n            FRENCH_SWISS = 58,\r\n            GERMAN = GER,\r\n            GERMAN_AUSTRIAN = 59,\r\n            GERMAN_LUXEMBOURG = 60,\r\n            GERMAN_LIECHTENSTEIN = 61,\r\n            GERMAN_SWISS = 62,\r\n            GREEK = 63,\r\n            HEBREW = 64,\r\n            HUNGARIAN = 65,\r\n            ICELANDIC = ICE,\r\n            INDONESIAN = 66,\r\n            ITALIAN = ITN,\r\n            ITALIAN_SWISS = 67,\r\n            JAPANESE = 68,\r\n            KOREAN = 69,\r\n            KOREAN_JOHAB = 70,\r\n            LATVIAN = 71,\r\n            LITHUANIAN = 72,\r\n            NORWEGIAN = NOR,\r\n            NORWEGIAN_BOKMAL = 73,\r\n            NORWEGIAN_NYNORSK = 74,\r\n            POLISH = 75,\r\n            PORTUGUESE = POR,\r\n            PORTUGUESE_BRAZIL = 76,\r\n            ROMANIAN = 77,\r\n            RUSSIAN = 78,\r\n            SERBIAN_LATIN = 79,\r\n            SLOVAK = 80,\r\n            SLOVENIAN = 81,\r\n            SPANISH = TWLG.SPA,\r\n            SPANISH_MEXICAN = 82,\r\n            SPANISH_MODERN = 83,\r\n            SWEDISH = TWLG.SWE,\r\n            THAI = 84,\r\n            TURKISH = 85,\r\n            UKRANIAN = 86,\r\n            ASSAMESE = 87,\r\n            BENGALI = 88,\r\n            BIHARI = 89,\r\n            BODO = 90,\r\n            DOGRI = 91,\r\n            GUJARATI = 92,\r\n            HARYANVI = 93,\r\n            HINDI = 94,\r\n            KANNADA = 95,\r\n            KASHMIRI = 96,\r\n            MALAYALAM = 97,\r\n            MARATHI = 98,\r\n            MARWARI = 99,\r\n            MEGHALAYAN = 100,\r\n            MIZO = 101,\r\n            NAGA = 102,\r\n            ORISSI = 103,\r\n            PUNJABI = 104,\r\n            PUSHTU = 105,\r\n            SERBIAN_CYRILLIC = 106,\r\n            SIKKIMI = 107,\r\n            SWEDISH_FINLAND = 108,\r\n            TAMIL = 109,\r\n            TELUGU = 110,\r\n            TRIPURI = 111,\r\n            URDU = 112,\r\n            VIETNAMESE = 113\r\n            //NOTE: when adding to this list, also update Language->Set()\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        // Data Groups...\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        #region Data Groups...\r\n\r\n        /// <summary>\r\n        /// Data Groups...\r\n        /// </summary>\r\n        public enum DG : uint\r\n        {\r\n            CONTROL = 0x1,\r\n            IMAGE = 0x2,\r\n            AUDIO = 0x4,\r\n\r\n            // More Data Functionality may be added in the future.\r\n            // These are for items that need to be determined before DS is opened.\r\n            // NOTE: Supported Functionality constants must be powers of 2 as they are\r\n            //       used as bitflags when Application asks DSM to present a list of DSs.\r\n            //       to support backward capability the App and DS will not use the fields\r\n            DSM2 = 0x10000000,\r\n            APP2 = 0x20000000,\r\n            DS2 = 0x40000000,\r\n            MASK = 0xFFFF\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        // Data Argument Types...\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        #region Data Argument Types...\r\n\r\n        /// <summary>\r\n        /// Data Argument Types...\r\n        /// </summary>\r\n        public enum DAT : ushort\r\n        {\r\n            // NULL and Custom Base...\r\n            NULL = 0x0,\r\n            CUSTOM = 0x8000,\r\n\r\n            // Data Argument Types for the DG_CONTROL Data Group.\r\n            CAPABILITY = 0x1,\r\n            EVENT = 0x2,\r\n            IDENTITY = 0x3,\r\n            PARENT = 0x4,\r\n            PENDINGXFERS = 0x5,\r\n            SETUPMEMXFER = 0x6,\r\n            SETUPFILEXFER = 0x7,\r\n            STATUS = 0x8,\r\n            USERINTERFACE = 0x9,\r\n            XFERGROUP = 0xa,\r\n            CUSTOMDSDATA = 0xc,\r\n            DEVICEEVENT = 0xd,\r\n            FILESYSTEM = 0xe,\r\n            PASSTHRU = 0xf,\r\n            CALLBACK = 0x10,\r\n            STATUSUTF8 = 0x11,\r\n            CALLBACK2 = 0x12,\r\n            METRICS = 0x13,\r\n            TWAINDIRECT = 0x14,\r\n\r\n            // Data Argument Types for the DG_IMAGE Data Group.\r\n            IMAGEINFO = 0x0101,\r\n            IMAGELAYOUT = 0x0102,\r\n            IMAGEMEMXFER = 0x0103,\r\n            IMAGENATIVEXFER = 0x0104,\r\n            IMAGEFILEXFER = 0x105,\r\n            CIECOLOR = 0x106,\r\n            GRAYRESPONSE = 0x107,\r\n            RGBRESPONSE = 0x108,\r\n            JPEGCOMPRESSION = 0x109,\r\n            PALETTE8 = 0x10a,\r\n            EXTIMAGEINFO = 0x10b,\r\n            FILTER = 0x10c,\r\n\r\n            /* Data Argument Types for the DG_AUDIO Data Group. */\r\n            AUDIOFILEXFER = 0x201,\r\n            AUDIOINFO = 0x202,\r\n            AUDIONATIVEXFER = 0x203,\r\n\r\n            /* misplaced */\r\n            ICCPROFILE = 0x401,\r\n            IMAGEMEMFILEXFER = 0x402,\r\n            ENTRYPOINT = 0x403\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        // Messages...\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        #region Messages...\r\n\r\n        /// <summary>\r\n        /// All message constants are unique.\r\n        /// Messages are grouped according to which DATs they are used with.\r\n        /// </summary>\r\n        public enum MSG : ushort\r\n        {\r\n            // Only used to clear fields...\r\n            NULL = 0x0,\r\n\r\n            // Generic messages may be used with any of several DATs.\r\n            GET = 0x1,\r\n            GETCURRENT = 0x2,\r\n            GETDEFAULT = 0x3,\r\n            GETFIRST = 0x4,\r\n            GETNEXT = 0x5,\r\n            SET = 0x6,\r\n            RESET = 0x7,\r\n            QUERYSUPPORT = 0x8,\r\n            GETHELP = 0x9,\r\n            GETLABEL = 0xa,\r\n            GETLABELENUM = 0xb,\r\n            SETCONSTRAINT = 0xc,\r\n\r\n            // Messages used with DAT_NULL.\r\n            XFERREADY = 0x101,\r\n            CLOSEDSREQ = 0x102,\r\n            CLOSEDSOK = 0x103,\r\n            DEVICEEVENT = 0x104,\r\n\r\n            // Messages used with a pointer to DAT_PARENT data.\r\n            OPENDSM = 0x301,\r\n            CLOSEDSM = 0x302,\r\n\r\n            // Messages used with a pointer to a DAT_IDENTITY structure.\r\n            OPENDS = 0x401,\r\n            CLOSEDS = 0x402,\r\n            USERSELECT = 0x403,\r\n\r\n            // Messages used with a pointer to a DAT_USERINTERFACE structure.\r\n            DISABLEDS = 0x501,\r\n            ENABLEDS = 0x502,\r\n            ENABLEDSUIONLY = 0x503,\r\n\r\n            // Messages used with a pointer to a DAT_EVENT structure.\r\n            PROCESSEVENT = 0x601,\r\n\r\n            // Messages used with a pointer to a DAT_PENDINGXFERS structure\r\n            ENDXFER = 0x701,\r\n            STOPFEEDER = 0x702,\r\n\r\n            // Messages used with a pointer to a DAT_FILESYSTEM structure\r\n            CHANGEDIRECTORY = 0x0801,\r\n            CREATEDIRECTORY = 0x0802,\r\n            DELETE = 0x0803,\r\n            FORMATMEDIA = 0x0804,\r\n            GETCLOSE = 0x0805,\r\n            GETFIRSTFILE = 0x0806,\r\n            GETINFO = 0x0807,\r\n            GETNEXTFILE = 0x0808,\r\n            RENAME = 0x0809,\r\n            COPY = 0x080A,\r\n            AUTOMATICCAPTUREDIRECTORY = 0x080B,\r\n\r\n            // Messages used with a pointer to a DAT_PASSTHRU structure\r\n            PASSTHRU = 0x0901,\r\n\r\n            // used with DAT_CALLBACK\r\n            REGISTER_CALLBACK = 0x0902,\r\n\r\n            // used with DAT_CAPABILITY\r\n            RESETALL = 0x0A01,\r\n\r\n            // used with DAT_TWAINDIRECT\r\n            SETTASK = 0x0B01\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        // Capabilities...\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        #region Capabilities...\r\n\r\n        /// <summary>\r\n        /// The naming convention is a little awkward, but it allows us to\r\n        /// achieve a unified capability type...\r\n        /// </summary>\r\n        public enum CAP : ushort\r\n        {\r\n            // Base of custom capabilities.\r\n            CAP_CUSTOMBASE = 0x8000,\r\n\r\n            /* all data sources are REQUIRED to support these caps */\r\n            CAP_XFERCOUNT = 0x0001,\r\n\r\n            /* image data sources are REQUIRED to support these caps */\r\n            ICAP_COMPRESSION = 0x0100,\r\n            ICAP_PIXELTYPE = 0x0101,\r\n            ICAP_UNITS = 0x0102,\r\n            ICAP_XFERMECH = 0x0103,\r\n\r\n            // all data sources MAY support these caps.\r\n            CAP_AUTHOR = 0x1000,\r\n            CAP_CAPTION = 0x1001,\r\n            CAP_FEEDERENABLED = 0x1002,\r\n            CAP_FEEDERLOADED = 0x1003,\r\n            CAP_TIMEDATE = 0x1004,\r\n            CAP_SUPPORTEDCAPS = 0x1005,\r\n            CAP_EXTENDEDCAPS = 0x1006,\r\n            CAP_AUTOFEED = 0x1007,\r\n            CAP_CLEARPAGE = 0x1008,\r\n            CAP_FEEDPAGE = 0x1009,\r\n            CAP_REWINDPAGE = 0x100a,\r\n            CAP_INDICATORS = 0x100b,\r\n            CAP_PAPERDETECTABLE = 0x100d,\r\n            CAP_UICONTROLLABLE = 0x100e,\r\n            CAP_DEVICEONLINE = 0x100f,\r\n            CAP_AUTOSCAN = 0x1010,\r\n            CAP_THUMBNAILSENABLED = 0x1011,\r\n            CAP_DUPLEX = 0x1012,\r\n            CAP_DUPLEXENABLED = 0x1013,\r\n            CAP_ENABLEDSUIONLY = 0x1014,\r\n            CAP_CUSTOMDSDATA = 0x1015,\r\n            CAP_ENDORSER = 0x1016,\r\n            CAP_JOBCONTROL = 0x1017,\r\n            CAP_ALARMS = 0x1018,\r\n            CAP_ALARMVOLUME = 0x1019,\r\n            CAP_AUTOMATICCAPTURE = 0x101a,\r\n            CAP_TIMEBEFOREFIRSTCAPTURE = 0x101b,\r\n            CAP_TIMEBETWEENCAPTURES = 0x101c,\r\n            CAP_CLEARBUFFERS = 0x101d,\r\n            CAP_MAXBATCHBUFFERS = 0x101e,\r\n            CAP_DEVICETIMEDATE = 0x101f,\r\n            CAP_POWERSUPPLY = 0x1020,\r\n            CAP_CAMERAPREVIEWUI = 0x1021,\r\n            CAP_DEVICEEVENT = 0x1022,\r\n            CAP_SERIALNUMBER = 0x1024,\r\n            CAP_PRINTER = 0x1026,\r\n            CAP_PRINTERENABLED = 0x1027,\r\n            CAP_PRINTERINDEX = 0x1028,\r\n            CAP_PRINTERMODE = 0x1029,\r\n            CAP_PRINTERSTRING = 0x102a,\r\n            CAP_PRINTERSUFFIX = 0x102b,\r\n            CAP_LANGUAGE = 0x102c,\r\n            CAP_FEEDERALIGNMENT = 0x102d,\r\n            CAP_FEEDERORDER = 0x102e,\r\n            CAP_REACQUIREALLOWED = 0x1030,\r\n            CAP_BATTERYMINUTES = 0x1032,\r\n            CAP_BATTERYPERCENTAGE = 0x1033,\r\n            CAP_CAMERASIDE = 0x1034,\r\n            CAP_SEGMENTED = 0x1035,\r\n            CAP_CAMERAENABLED = 0x1036,\r\n            CAP_CAMERAORDER = 0x1037,\r\n            CAP_MICRENABLED = 0x1038,\r\n            CAP_FEEDERPREP = 0x1039,\r\n            CAP_FEEDERPOCKET = 0x103a,\r\n            CAP_AUTOMATICSENSEMEDIUM = 0x103b,\r\n            CAP_CUSTOMINTERFACEGUID = 0x103c,\r\n            CAP_SUPPORTEDCAPSSEGMENTUNIQUE = 0x103d,\r\n            CAP_SUPPORTEDDATS = 0x103e,\r\n            CAP_DOUBLEFEEDDETECTION = 0x103f,\r\n            CAP_DOUBLEFEEDDETECTIONLENGTH = 0x1040,\r\n            CAP_DOUBLEFEEDDETECTIONSENSITIVITY = 0x1041,\r\n            CAP_DOUBLEFEEDDETECTIONRESPONSE = 0x1042,\r\n            CAP_PAPERHANDLING = 0x1043,\r\n            CAP_INDICATORSMODE = 0x1044,\r\n            CAP_PRINTERVERTICALOFFSET = 0x1045,\r\n            CAP_POWERSAVETIME = 0x1046,\r\n            CAP_PRINTERCHARROTATION = 0x1047,\r\n            CAP_PRINTERFONTSTYLE = 0x1048,\r\n            CAP_PRINTERINDEXLEADCHAR = 0x1049,\r\n            CAP_PRINTERINDEXMAXVALUE = 0x104A,\r\n            CAP_PRINTERINDEXNUMDIGITS = 0x104B,\r\n            CAP_PRINTERINDEXSTEP = 0x104C,\r\n            CAP_PRINTERINDEXTRIGGER = 0x104D,\r\n            CAP_PRINTERSTRINGPREVIEW = 0x104E,\r\n            CAP_SHEETCOUNT = 0x104F,\r\n            CAP_IMAGEADDRESSENABLED = 0x1050,\r\n            CAP_IAFIELDA_LEVEL = 0x1051,\r\n            CAP_IAFIELDB_LEVEL = 0x1052,\r\n            CAP_IAFIELDC_LEVEL = 0x1053,\r\n            CAP_IAFIELDD_LEVEL = 0x1054,\r\n            CAP_IAFIELDE_LEVEL = 0x1055,\r\n            CAP_IAFIELDA_PRINTFORMAT = 0x1056,\r\n            CAP_IAFIELDB_PRINTFORMAT = 0x1057,\r\n            CAP_IAFIELDC_PRINTFORMAT = 0x1058,\r\n            CAP_IAFIELDD_PRINTFORMAT = 0x1059,\r\n            CAP_IAFIELDE_PRINTFORMAT = 0x105A,\r\n            CAP_IAFIELDA_VALUE = 0x105B,\r\n            CAP_IAFIELDB_VALUE = 0x105C,\r\n            CAP_IAFIELDC_VALUE = 0x105D,\r\n            CAP_IAFIELDD_VALUE = 0x105E,\r\n            CAP_IAFIELDE_VALUE = 0x105F,\r\n            CAP_IAFIELDA_LASTPAGE = 0x1060,\r\n            CAP_IAFIELDB_LASTPAGE = 0x1061,\r\n            CAP_IAFIELDC_LASTPAGE = 0x1062,\r\n            CAP_IAFIELDD_LASTPAGE = 0x1063,\r\n            CAP_IAFIELDE_LASTPAGE = 0x1064,\r\n\r\n            // image data sources MAY support these caps.\r\n            ICAP_AUTOBRIGHT = 0x1100,\r\n            ICAP_BRIGHTNESS = 0x1101,\r\n            ICAP_CONTRAST = 0x1103,\r\n            ICAP_CUSTHALFTONE = 0x1104,\r\n            ICAP_EXPOSURETIME = 0x1105,\r\n            ICAP_FILTER = 0x1106,\r\n            ICAP_FLASHUSED = 0x1107,\r\n            ICAP_GAMMA = 0x1108,\r\n            ICAP_HALFTONES = 0x1109,\r\n            ICAP_HIGHLIGHT = 0x110a,\r\n            ICAP_IMAGEFILEFORMAT = 0x110c,\r\n            ICAP_LAMPSTATE = 0x110d,\r\n            ICAP_LIGHTSOURCE = 0x110e,\r\n            ICAP_ORIENTATION = 0x1110,\r\n            ICAP_PHYSICALWIDTH = 0x1111,\r\n            ICAP_PHYSICALHEIGHT = 0x1112,\r\n            ICAP_SHADOW = 0x1113,\r\n            ICAP_FRAMES = 0x1114,\r\n            ICAP_XNATIVERESOLUTION = 0x1116,\r\n            ICAP_YNATIVERESOLUTION = 0x1117,\r\n            ICAP_XRESOLUTION = 0x1118,\r\n            ICAP_YRESOLUTION = 0x1119,\r\n            ICAP_MAXFRAMES = 0x111a,\r\n            ICAP_TILES = 0x111b,\r\n            ICAP_BITORDER = 0x111c,\r\n            ICAP_CCITTKFACTOR = 0x111d,\r\n            ICAP_LIGHTPATH = 0x111e,\r\n            ICAP_PIXELFLAVOR = 0x111f,\r\n            ICAP_PLANARCHUNKY = 0x1120,\r\n            ICAP_ROTATION = 0x1121,\r\n            ICAP_SUPPORTEDSIZES = 0x1122,\r\n            ICAP_THRESHOLD = 0x1123,\r\n            ICAP_XSCALING = 0x1124,\r\n            ICAP_YSCALING = 0x1125,\r\n            ICAP_BITORDERCODES = 0x1126,\r\n            ICAP_PIXELFLAVORCODES = 0x1127,\r\n            ICAP_JPEGPIXELTYPE = 0x1128,\r\n            ICAP_TIMEFILL = 0x112a,\r\n            ICAP_BITDEPTH = 0x112b,\r\n            ICAP_BITDEPTHREDUCTION = 0x112c,\r\n            ICAP_UNDEFINEDIMAGESIZE = 0x112d,\r\n            ICAP_IMAGEDATASET = 0x112e,\r\n            ICAP_EXTIMAGEINFO = 0x112f,\r\n            ICAP_MINIMUMHEIGHT = 0x1130,\r\n            ICAP_MINIMUMWIDTH = 0x1131,\r\n            ICAP_AUTODISCARDBLANKPAGES = 0x1134,\r\n            ICAP_FLIPROTATION = 0x1136,\r\n            ICAP_BARCODEDETECTIONENABLED = 0x1137,\r\n            ICAP_SUPPORTEDBARCODETYPES = 0x1138,\r\n            ICAP_BARCODEMAXSEARCHPRIORITIES = 0x1139,\r\n            ICAP_BARCODESEARCHPRIORITIES = 0x113a,\r\n            ICAP_BARCODESEARCHMODE = 0x113b,\r\n            ICAP_BARCODEMAXRETRIES = 0x113c,\r\n            ICAP_BARCODETIMEOUT = 0x113d,\r\n            ICAP_ZOOMFACTOR = 0x113e,\r\n            ICAP_PATCHCODEDETECTIONENABLED = 0x113f,\r\n            ICAP_SUPPORTEDPATCHCODETYPES = 0x1140,\r\n            ICAP_PATCHCODEMAXSEARCHPRIORITIES = 0x1141,\r\n            ICAP_PATCHCODESEARCHPRIORITIES = 0x1142,\r\n            ICAP_PATCHCODESEARCHMODE = 0x1143,\r\n            ICAP_PATCHCODEMAXRETRIES = 0x1144,\r\n            ICAP_PATCHCODETIMEOUT = 0x1145,\r\n            ICAP_FLASHUSED2 = 0x1146,\r\n            ICAP_IMAGEFILTER = 0x1147,\r\n            ICAP_NOISEFILTER = 0x1148,\r\n            ICAP_OVERSCAN = 0x1149,\r\n            ICAP_AUTOMATICBORDERDETECTION = 0x1150,\r\n            ICAP_AUTOMATICDESKEW = 0x1151,\r\n            ICAP_AUTOMATICROTATE = 0x1152,\r\n            ICAP_JPEGQUALITY = 0x1153,\r\n            ICAP_FEEDERTYPE = 0x1154,\r\n            ICAP_ICCPROFILE = 0x1155,\r\n            ICAP_AUTOSIZE = 0x1156,\r\n            ICAP_AUTOMATICCROPUSESFRAME = 0x1157,\r\n            ICAP_AUTOMATICLENGTHDETECTION = 0x1158,\r\n            ICAP_AUTOMATICCOLORENABLED = 0x1159,\r\n            ICAP_AUTOMATICCOLORNONCOLORPIXELTYPE = 0x115a,\r\n            ICAP_COLORMANAGEMENTENABLED = 0x115b,\r\n            ICAP_IMAGEMERGE = 0x115c,\r\n            ICAP_IMAGEMERGEHEIGHTTHRESHOLD = 0x115d,\r\n            ICAP_SUPPORTEDEXTIMAGEINFO = 0x115e,\r\n            ICAP_FILMTYPE = 0x115f,\r\n            ICAP_MIRROR = 0x1160,\r\n            ICAP_JPEGSUBSAMPLING = 0x1161,\r\n\r\n            // image data sources MAY support these audio caps.\r\n            ACAP_XFERMECH = 0x1202\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        // Extended Image Info Attributes section  Added 1.7...\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        #region Extended Image Info Attributes section  Added 1.7...\r\n\r\n        /// <summary>\r\n        /// Extended Image Info Attributes...\r\n        /// </summary>\r\n        public enum TWEI : ushort\r\n        {\r\n            BARCODEX = 0x1200,\r\n            BARCODEY = 0x1201,\r\n            BARCODETEXT = 0x1202,\r\n            BARCODETYPE = 0x1203,\r\n            DESHADETOP = 0x1204,\r\n            DESHADELEFT = 0x1205,\r\n            DESHADEHEIGHT = 0x1206,\r\n            DESHADEWIDTH = 0x1207,\r\n            DESHADESIZE = 0x1208,\r\n            SPECKLESREMOVED = 0x1209,\r\n            HORZLINEXCOORD = 0x120A,\r\n            HORZLINEYCOORD = 0x120B,\r\n            HORZLINELENGTH = 0x120C,\r\n            HORZLINETHICKNESS = 0x120D,\r\n            VERTLINEXCOORD = 0x120E,\r\n            VERTLINEYCOORD = 0x120F,\r\n            VERTLINELENGTH = 0x1210,\r\n            VERTLINETHICKNESS = 0x1211,\r\n            PATCHCODE = 0x1212,\r\n            ENDORSEDTEXT = 0x1213,\r\n            FORMCONFIDENCE = 0x1214,\r\n            FORMTEMPLATEMATCH = 0x1215,\r\n            FORMTEMPLATEPAGEMATCH = 0x1216,\r\n            FORMHORZDOCOFFSET = 0x1217,\r\n            FORMVERTDOCOFFSET = 0x1218,\r\n            BARCODECOUNT = 0x1219,\r\n            BARCODECONFIDENCE = 0x121A,\r\n            BARCODEROTATION = 0x121B,\r\n            BARCODETEXTLENGTH = 0x121C,\r\n            DESHADECOUNT = 0x121D,\r\n            DESHADEBLACKCOUNTOLD = 0x121E,\r\n            DESHADEBLACKCOUNTNEW = 0x121F,\r\n            DESHADEBLACKRLMIN = 0x1220,\r\n            DESHADEBLACKRLMAX = 0x1221,\r\n            DESHADEWHITECOUNTOLD = 0x1222,\r\n            DESHADEWHITECOUNTNEW = 0x1223,\r\n            DESHADEWHITERLMIN = 0x1224,\r\n            DESHADEWHITERLAVE = 0x1225,\r\n            DESHADEWHITERLMAX = 0x1226,\r\n            BLACKSPECKLESREMOVED = 0x1227,\r\n            WHITESPECKLESREMOVED = 0x1228,\r\n            HORZLINECOUNT = 0x1229,\r\n            VERTLINECOUNT = 0x122A,\r\n            DESKEWSTATUS = 0x122B,\r\n            SKEWORIGINALANGLE = 0x122C,\r\n            SKEWFINALANGLE = 0x122D,\r\n            SKEWCONFIDENCE = 0x122E,\r\n            SKEWWINDOWX1 = 0x122F,\r\n            SKEWWINDOWY1 = 0x1230,\r\n            SKEWWINDOWX2 = 0x1231,\r\n            SKEWWINDOWY2 = 0x1232,\r\n            SKEWWINDOWX3 = 0x1233,\r\n            SKEWWINDOWY3 = 0x1234,\r\n            SKEWWINDOWX4 = 0x1235,\r\n            SKEWWINDOWY4 = 0x1236,\r\n            BOOKNAME = 0x1238,\r\n            CHAPTERNUMBER = 0x1239,\r\n            DOCUMENTNUMBER = 0x123A,\r\n            PAGENUMBER = 0x123B,\r\n            CAMERA = 0x123C,\r\n            FRAMENUMBER = 0x123D,\r\n            FRAME = 0x123E,\r\n            PIXELFLAVOR = 0x123F,\r\n            ICCPROFILE = 0x1240,\r\n            LASTSEGMENT = 0x1241,\r\n            SEGMENTNUMBER = 0x1242,\r\n            MAGDATA = 0x1243,\r\n            MAGTYPE = 0x1244,\r\n            PAGESIDE = 0x1245,\r\n            FILESYSTEMSOURCE = 0x1246,\r\n            IMAGEMERGED = 0x1247,\r\n            MAGDATALENGTH = 0x1248,\r\n            PAPERCOUNT = 0x1249,\r\n            PRINTERTEXT = 0x124A,\r\n            TWAINDIRECTMETADATA = 0x124B,\r\n            IAFIELDA_VALUE = 0x124C,\r\n            IAFIELDB_VALUE = 0x124D,\r\n            IAFIELDC_VALUE = 0x124E,\r\n            IAFIELDD_VALUE = 0x124F,\r\n            IAFIELDE_VALUE = 0x1250,\r\n            IALEVEL = 0x1251,\r\n            PRINTER = 0x1252,\r\n            BARCODETEXT2 = 0x1253\r\n        }\r\n\r\n        public enum TWEJ : ushort\r\n        {\r\n            NONE = 0x0000,\r\n            MIDSEPARATOR = 0x0001,\r\n            PATCH1 = 0x0002,\r\n            PATCH2 = 0x0003,\r\n            PATCH3 = 0x0004,\r\n            PATCH4 = 0x0005,\r\n            PATCH6 = 0x0006,\r\n            PATCHT = 0x0007\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        // Return Codes and Condition Codes section...\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        #region Return Codes and Condition Codes section...\r\n\r\n        /// <summary>\r\n        /// We're departing from a strict translation of TWAIN.H so that\r\n        /// we can achieve a unified status return type.  \r\n        /// </summary>\r\n        public const int STSCC = 0x10000; // get us past the custom space\r\n        public enum STS\r\n        {\r\n            // Custom base (same for TWRC and TWCC)...\r\n            CUSTOMBASE = 0x8000,\r\n\r\n            // Return codes...\r\n            SUCCESS = 0,\r\n            FAILURE = 1,\r\n            CHECKSTATUS = 2,\r\n            CANCEL = 3,\r\n            DSEVENT = 4,\r\n            NOTDSEVENT = 5,\r\n            XFERDONE = 6,\r\n            ENDOFLIST = 7,\r\n            INFONOTSUPPORTED = 8,\r\n            DATANOTAVAILABLE = 9,\r\n            BUSY = 10,\r\n            SCANNERLOCKED = 11,\r\n\r\n            // Condition codes (always associated with TWRC_FAILURE)...\r\n            BUMMER = STSCC + 1,\r\n            LOWMEMORY = STSCC + 2,\r\n            NODS = STSCC + 3,\r\n            MAXCONNECTIONS = STSCC + 4,\r\n            OPERATIONERROR = STSCC + 5,\r\n            BADCAP = STSCC + 6,\r\n            BADPROTOCOL = STSCC + 9,\r\n            BADVALUE = STSCC + 10,\r\n            SEQERROR = STSCC + 11,\r\n            BADDEST = STSCC + 12,\r\n            CAPUNSUPPORTED = STSCC + 13,\r\n            CAPBADOPERATION = STSCC + 14,\r\n            CAPSEQERROR = STSCC + 15,\r\n            DENIED = STSCC + 16,\r\n            FILEEXISTS = STSCC + 17,\r\n            FILENOTFOUND = STSCC + 18,\r\n            NOTEMPTY = STSCC + 19,\r\n            PAPERJAM = STSCC + 20,\r\n            PAPERDOUBLEFEED = STSCC + 21,\r\n            FILEWRITEERROR = STSCC + 22,\r\n            CHECKDEVICEONLINE = STSCC + 23,\r\n            INTERLOCK = STSCC + 24,\r\n            DAMAGEDCORNER = STSCC + 25,\r\n            FOCUSERROR = STSCC + 26,\r\n            DOCTOOLIGHT = STSCC + 27,\r\n            DOCTOODARK = STSCC + 28,\r\n            NOMEDIA = STSCC + 29\r\n        }\r\n\r\n        /// <summary>\r\n        /// bit patterns: for query the operation that are supported by the data source on a capability\r\n        /// Application gets these through DG_CONTROL/DAT_CAPABILITY/MSG_QUERYSUPPORT\r\n        /// </summary>\r\n        public enum TWQC : ushort\r\n        {\r\n            GET = 0x0001,\r\n            SET = 0x0002,\r\n            GETDEFAULT = 0x0004,\r\n            GETCURRENT = 0x0008,\r\n            RESET = 0x0010,\r\n            SETCONSTRAINT = 0x0020,\r\n            CONSTRAINABLE = 0x0040\r\n        }\r\n\r\n        /// <summary>\r\n        /// The TWAIN States...\r\n        /// </summary>\r\n        public enum STATE\r\n        {\r\n            S1 = 1, // Nothing loaded or open\r\n            S2 = 2, // DSM loaded\r\n            S3 = 3, // DSM open\r\n            S4 = 4, // Data Source open, programmatic mode (no GUI)\r\n            S5 = 5, // GUI up or waiting to transfer first image\r\n            S6 = 6, // ready to start transferring image\r\n            S7 = 7  // transferring image or transfer done\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        // Language section...\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        #region Language section...\r\n\r\n        /// <summary>\r\n        /// Handle encoding between C# and what the DS is currently set to.\r\n        /// NOTE: this is static for users of this object do not have to track\r\n        ///       the encoding (i.e. let TWAIN.cs deal with all of this). This\r\n        ///       means there is one language for all open DSes, so the last one wins.\r\n        /// </summary>\r\n        private static class Language\r\n        {\r\n            /// <summary>\r\n            /// The encoding to use for strings to/from the DS\r\n            /// </summary>\r\n            /// <returns></returns>\r\n            public static Encoding GetEncoding()\r\n            {\r\n                return (m_encoding);\r\n            }\r\n\r\n            /// <summary>\r\n            /// The current language of the DS\r\n            /// </summary>\r\n            /// <returns></returns>\r\n            public static void Set(TWLG a_twlg)\r\n            {\r\n                switch (a_twlg)\r\n                {\r\n                    default:\r\n                        // NOTE: can only get here if a TWLG was added, but it wasn't added here\r\n                        m_encoding = Encoding.GetEncoding(1252);\r\n                        break;\r\n\r\n                    case TWLG.USERLOCALE:\r\n                        // NOTE: this should never come back from the DS. only here for completeness\r\n                        m_encoding = Encoding.GetEncoding(1252);\r\n                        break;\r\n\r\n                    case TWLG.THAI:\r\n                        m_encoding = Encoding.GetEncoding(874);\r\n                        break;\r\n\r\n                    case TWLG.JAPANESE:\r\n                        m_encoding = Encoding.GetEncoding(932);\r\n                        break;\r\n\r\n                    case TWLG.CHINESE:\r\n                    case TWLG.CHINESE_PRC:\r\n                    case TWLG.CHINESE_SINGAPORE:\r\n                    case TWLG.CHINESE_SIMPLIFIED:\r\n                        m_encoding = Encoding.GetEncoding(936);\r\n                        break;\r\n\r\n                    case TWLG.KOREAN:\r\n                    case TWLG.KOREAN_JOHAB:\r\n                        m_encoding = Encoding.GetEncoding(949);\r\n                        break;\r\n\r\n                    case TWLG.CHINESE_HONGKONG:\r\n                    case TWLG.CHINESE_TAIWAN:\r\n                    case TWLG.CHINESE_TRADITIONAL:\r\n                        m_encoding = Encoding.GetEncoding(950);\r\n                        break;\r\n\r\n                    case TWLG.ALBANIA:\r\n                    case TWLG.CROATIA:\r\n                    case TWLG.CZECH:\r\n                    case TWLG.HUNGARIAN:\r\n                    case TWLG.POLISH:\r\n                    case TWLG.ROMANIAN:\r\n                    case TWLG.SERBIAN_LATIN:\r\n                    case TWLG.SLOVAK:\r\n                    case TWLG.SLOVENIAN:\r\n                        m_encoding = Encoding.GetEncoding(1250);\r\n                        break;\r\n\r\n                    case TWLG.BYELORUSSIAN:\r\n                    case TWLG.BULGARIAN:\r\n                    case TWLG.RUSSIAN:\r\n                    case TWLG.SERBIAN_CYRILLIC:\r\n                    case TWLG.UKRANIAN:\r\n                        m_encoding = Encoding.GetEncoding(1251);\r\n                        break;\r\n\r\n                    case TWLG.AFRIKAANS:\r\n                    case TWLG.BASQUE:\r\n                    case TWLG.CATALAN:\r\n                    case TWLG.DAN: // DANISH\r\n                    case TWLG.DUT: // DUTCH\r\n                    case TWLG.DUTCH_BELGIAN:\r\n                    case TWLG.ENG: // ENGLISH\r\n                    case TWLG.ENGLISH_AUSTRALIAN:\r\n                    case TWLG.ENGLISH_CANADIAN:\r\n                    case TWLG.ENGLISH_IRELAND:\r\n                    case TWLG.ENGLISH_NEWZEALAND:\r\n                    case TWLG.ENGLISH_SOUTHAFRICA:\r\n                    case TWLG.ENGLISH_UK:\r\n                    case TWLG.USA:\r\n                    case TWLG.FAEROESE:\r\n                    case TWLG.FIN: // FINNISH\r\n                    case TWLG.FRN: // FRENCH\r\n                    case TWLG.FRENCH_BELGIAN:\r\n                    case TWLG.FCF: // FRENCH_CANADIAN\r\n                    case TWLG.FRENCH_LUXEMBOURG:\r\n                    case TWLG.FRENCH_SWISS:\r\n                    case TWLG.GER: // GERMAN\r\n                    case TWLG.GERMAN_AUSTRIAN:\r\n                    case TWLG.GERMAN_LIECHTENSTEIN:\r\n                    case TWLG.GERMAN_LUXEMBOURG:\r\n                    case TWLG.GERMAN_SWISS:\r\n                    case TWLG.ICE: // ICELANDIC\r\n                    case TWLG.INDONESIAN:\r\n                    case TWLG.ITN: // ITALIAN\r\n                    case TWLG.ITALIAN_SWISS:\r\n                    case TWLG.NOR: // NORWEGIAN\r\n                    case TWLG.NORWEGIAN_BOKMAL:\r\n                    case TWLG.NORWEGIAN_NYNORSK:\r\n                    case TWLG.POR: // PORTUGUESE\r\n                    case TWLG.PORTUGUESE_BRAZIL:\r\n                    case TWLG.SPA: // SPANISH\r\n                    case TWLG.SPANISH_MEXICAN:\r\n                    case TWLG.SPANISH_MODERN:\r\n                    case TWLG.SWE: // SWEDISH\r\n                    case TWLG.SWEDISH_FINLAND:\r\n                        m_encoding = Encoding.GetEncoding(1252);\r\n                        break;\r\n\r\n                    case TWLG.GREEK:\r\n                        m_encoding = Encoding.GetEncoding(1253);\r\n                        break;\r\n\r\n                    case TWLG.TURKISH:\r\n                        m_encoding = Encoding.GetEncoding(1254);\r\n                        break;\r\n\r\n                    case TWLG.HEBREW:\r\n                        m_encoding = Encoding.GetEncoding(1255);\r\n                        break;\r\n\r\n                    case TWLG.ARABIC:\r\n                    case TWLG.ARABIC_ALGERIA:\r\n                    case TWLG.ARABIC_BAHRAIN:\r\n                    case TWLG.ARABIC_EGYPT:\r\n                    case TWLG.ARABIC_IRAQ:\r\n                    case TWLG.ARABIC_JORDAN:\r\n                    case TWLG.ARABIC_KUWAIT:\r\n                    case TWLG.ARABIC_LEBANON:\r\n                    case TWLG.ARABIC_LIBYA:\r\n                    case TWLG.ARABIC_MOROCCO:\r\n                    case TWLG.ARABIC_OMAN:\r\n                    case TWLG.ARABIC_QATAR:\r\n                    case TWLG.ARABIC_SAUDIARABIA:\r\n                    case TWLG.ARABIC_SYRIA:\r\n                    case TWLG.ARABIC_TUNISIA:\r\n                    case TWLG.ARABIC_UAE:\r\n                    case TWLG.ARABIC_YEMEN:\r\n                    case TWLG.FARSI:\r\n                    case TWLG.URDU:\r\n                        m_encoding = Encoding.GetEncoding(1256);\r\n                        break;\r\n\r\n                    case TWLG.ESTONIAN:\r\n                    case TWLG.LATVIAN:\r\n                    case TWLG.LITHUANIAN:\r\n                        m_encoding = Encoding.GetEncoding(1257);\r\n                        break;\r\n\r\n                    case TWLG.VIETNAMESE:\r\n                        m_encoding = Encoding.GetEncoding(1258);\r\n                        break;\r\n\r\n                    case TWLG.ASSAMESE:\r\n                    case TWLG.BENGALI:\r\n                    case TWLG.BIHARI:\r\n                    case TWLG.BODO:\r\n                    case TWLG.DOGRI:\r\n                    case TWLG.GUJARATI:\r\n                    case TWLG.HARYANVI:\r\n                    case TWLG.HINDI:\r\n                    case TWLG.KANNADA:\r\n                    case TWLG.KASHMIRI:\r\n                    case TWLG.MALAYALAM:\r\n                    case TWLG.MARATHI:\r\n                    case TWLG.MARWARI:\r\n                    case TWLG.MEGHALAYAN:\r\n                    case TWLG.MIZO:\r\n                    case TWLG.NAGA:\r\n                    case TWLG.ORISSI:\r\n                    case TWLG.PUNJABI:\r\n                    case TWLG.PUSHTU:\r\n                    case TWLG.SIKKIMI:\r\n                    case TWLG.TAMIL:\r\n                    case TWLG.TELUGU:\r\n                    case TWLG.TRIPURI:\r\n                        // NOTE: there are no known code pages for these, so we will use English\r\n                        m_encoding = Encoding.GetEncoding(1252);\r\n                        break;\r\n                }\r\n            }\r\n\r\n            private static Encoding m_encoding = Encoding.GetEncoding(1252);\r\n        }\r\n\r\n        #endregion\r\n\r\n    }\r\n\r\n\r\n    /// <summary>\r\n    /// All of our DllImports live here...\r\n    /// </summary>\r\n    internal sealed class NativeMethods\r\n    {\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        // Windows\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        #region Windows\r\n\r\n        /// <summary>\r\n        /// Get the ID for the current thread...\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        [DllImport(\"kernel32.dll\")]\r\n        internal static extern uint GetCurrentThreadId();\r\n\r\n        /// <summary>\r\n        /// Allocate a handle to memory...\r\n        /// </summary>\r\n        /// <param name=\"uFlags\"></param>\r\n        /// <param name=\"dwBytes\"></param>\r\n        /// <returns></returns>\r\n        [DllImport(\"kernel32.dll\")]\r\n        internal static extern IntPtr GlobalAlloc(uint uFlags, UIntPtr dwBytes);\r\n\r\n        /// <summary>\r\n        /// Free a memory handle...\r\n        /// </summary>\r\n        /// <param name=\"hMem\"></param>\r\n        /// <returns></returns>\r\n        [DllImport(\"kernel32.dll\")]\r\n        internal static extern IntPtr GlobalFree(IntPtr hMem);\r\n\r\n        /// <summary>\r\n        /// Lock a memory handle...\r\n        /// </summary>\r\n        /// <param name=\"hMem\"></param>\r\n        /// <returns></returns>\r\n        [DllImport(\"kernel32.dll\")]\r\n        internal static extern IntPtr GlobalLock(IntPtr hMem);\r\n\r\n        /// <summary>\r\n        /// Unlock a memory handle...\r\n        /// </summary>\r\n        /// <param name=\"hMem\"></param>\r\n        /// <returns></returns>\r\n        [DllImport(\"kernel32.dll\")]\r\n        [return: MarshalAs(UnmanagedType.Bool)]\r\n        internal static extern bool GlobalUnlock(IntPtr hMem);\r\n\r\n        [DllImport(\"kernel32.dll\")]\r\n        internal static extern UIntPtr GlobalSize(IntPtr hMem);\r\n\r\n        [DllImport(\"msvcrt.dll\")]\r\n        internal static extern UIntPtr _msize(IntPtr ptr);\r\n\r\n        [DllImport(\"libc.so\")]\r\n        internal static extern UIntPtr malloc_usable_size(IntPtr ptr);\r\n\r\n        [DllImport(\"libSystem.dylib\")]\r\n        internal static extern UIntPtr malloc_size(IntPtr ptr);\r\n\r\n        [DllImport(\"kernel32.dll\", EntryPoint = \"CopyMemory\", SetLastError = false)]\r\n        internal static extern void CopyMemory(IntPtr dest, IntPtr src, uint count);\r\n\r\n        [DllImport(\"libc\", EntryPoint = \"memcpy\", SetLastError = false)]\r\n        internal static extern void memcpy(IntPtr dest, IntPtr src, IntPtr count);\r\n\r\n        [DllImport(\"kernel32.dll\", EntryPoint = \"MoveMemory\", SetLastError = false)]\r\n        internal static extern void MoveMemory(IntPtr dest, IntPtr src, uint count);\r\n\r\n        [DllImport(\"libc\", EntryPoint = \"memmove\", SetLastError = false)]\r\n        internal static extern void memmove(IntPtr dest, IntPtr src, IntPtr count);\r\n\r\n        [DllImport(\"msvcrt.dll\", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode, SetLastError = true)]\r\n        internal static extern Int32 _wfopen_s(out IntPtr pFile, string filename, string mode);\r\n\r\n        [DllImport(\"libc\", CharSet = CharSet.Ansi, SetLastError = true, BestFitMapping = false, ThrowOnUnmappableChar = true)]\r\n        internal static extern IntPtr fopen([MarshalAs(UnmanagedType.LPStr)] string filename, [MarshalAs(UnmanagedType.LPStr)] string mode);\r\n\r\n        [DllImport(\"msvcrt.dll\", EntryPoint = \"fwrite\", CallingConvention = CallingConvention.Cdecl, SetLastError = true)]\r\n        internal static extern IntPtr fwriteWin(IntPtr buffer, IntPtr size, IntPtr number, IntPtr file);\r\n\r\n        [DllImport(\"libc\", EntryPoint = \"fwrite\", SetLastError = true)]\r\n        internal static extern IntPtr fwrite(IntPtr buffer, IntPtr size, IntPtr number, IntPtr file);\r\n\r\n        [DllImport(\"msvcrt.dll\", EntryPoint = \"fclose\", CallingConvention = CallingConvention.Cdecl, SetLastError = true)]\r\n        internal static extern IntPtr fcloseWin(IntPtr file);\r\n\r\n        [DllImport(\"libc\", EntryPoint = \"fclose\", SetLastError = true)]\r\n        internal static extern IntPtr fclose(IntPtr file);\r\n\r\n        #endregion\r\n\r\n\r\n        // We're supporting every DSM that we can...\r\n\r\n        /// <summary>\r\n        /// Use this entry for generic access to the DSM where the\r\n        /// destination must be IntPtr.Zero (null)...\r\n        /// </summary>\r\n        /// <param name=\"origin\"></param>\r\n        /// <param name=\"dest\"></param>\r\n        /// <param name=\"dg\"></param>\r\n        /// <param name=\"dat\"></param>\r\n        /// <param name=\"msg\"></param>\r\n        /// <param name=\"memref\"></param>\r\n        /// <returns></returns>\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twain_32.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwain32DsmEntryNullDest\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            IntPtr zero,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            IntPtr memref\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twaindsm.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwaindsmDsmEntryNullDest\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            IntPtr zero,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            IntPtr memref\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 LinuxDsmEntryNullDest\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            IntPtr zero,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            IntPtr memref\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib64/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux64DsmEntryNullDest\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            IntPtr zero,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            IntPtr memref\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so.2.3.2\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux020302Dsm64bitEntryNullDest\r\n        (\r\n            ref TWAIN.TW_IDENTITY origin,\r\n            IntPtr zero,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            IntPtr memref\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/System/Library/Frameworks/TWAIN.framework/TWAIN\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwainDsmEntryNullDest\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            IntPtr zero,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            IntPtr memref\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/Library/Frameworks/TWAINDSM.framework/TWAINDSM\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwaindsmDsmEntryNullDest\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            IntPtr zero,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            IntPtr memref\r\n        );\r\n\r\n\r\n        /// <summary>\r\n        /// Use for generic access to the DSM where the destination must\r\n        /// reference a data source...\r\n        /// </summary>\r\n        /// <param name=\"origin\"></param>\r\n        /// <param name=\"dest\"></param>\r\n        /// <param name=\"dg\"></param>\r\n        /// <param name=\"dat\"></param>\r\n        /// <param name=\"msg\"></param>\r\n        /// <param name=\"memref\"></param>\r\n        /// <returns></returns>\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twain_32.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwain32DsmEntry\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            IntPtr memref\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twaindsm.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwaindsmDsmEntry\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            IntPtr memref\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 LinuxDsmEntry\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            IntPtr memref\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib64/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux64DsmEntry\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            IntPtr memref\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so.2.3.2\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux020302Dsm64bitEntry\r\n        (\r\n            ref TWAIN.TW_IDENTITY origin,\r\n            ref TWAIN.TW_IDENTITY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            IntPtr memref\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/System/Library/Frameworks/TWAIN.framework/TWAIN\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwainDsmEntry\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            IntPtr memref\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/Library/Frameworks/TWAINDSM.framework/TWAINDSM\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwaindsmDsmEntry\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            IntPtr memref\r\n        );\r\n\r\n\r\n        /// <summary>\r\n        /// Use this for DG_AUDIO / DAT.AUDIOFILEXFER / MSG.GET calls...\r\n        /// </summary>\r\n        /// <param name=\"origin\"></param>\r\n        /// <param name=\"dest\"></param>\r\n        /// <param name=\"dg\"></param>\r\n        /// <param name=\"dat\"></param>\r\n        /// <param name=\"msg\"></param>\r\n        /// <param name=\"memref\"></param>\r\n        /// <returns></returns>\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twain_32.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwain32DsmEntryAudioAudiofilexfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            IntPtr memref\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twaindsm.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwaindsmDsmEntryAudioAudiofilexfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            IntPtr memref\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 LinuxDsmEntryAudioAudiofilexfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            IntPtr memref\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib64/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux64DsmEntryAudioAudiofilexfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            IntPtr memref\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so.2.3.2\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux020302Dsm64bitEntryAudioAudiofilexfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY origin,\r\n            ref TWAIN.TW_IDENTITY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            IntPtr memref\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/System/Library/Frameworks/TWAIN.framework/TWAIN\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwainDsmEntryAudioAudiofilexfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            IntPtr memref\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/Library/Frameworks/TWAINDSM.framework/TWAINDSM\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwaindsmDsmEntryAudioAudiofilexfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            IntPtr memref\r\n        );\r\n\r\n        /// <summary>\r\n        /// Use this for DG_AUDIO / DAT.AUDIOINFO / MSG.GET calls...\r\n        /// </summary>\r\n        /// <param name=\"origin\"></param>\r\n        /// <param name=\"dest\"></param>\r\n        /// <param name=\"dg\"></param>\r\n        /// <param name=\"dat\"></param>\r\n        /// <param name=\"msg\"></param>\r\n        /// <param name=\"twaudioinfo\"></param>\r\n        /// <returns></returns>\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twain_32.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwain32DsmEntryAudioAudioinfo\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_AUDIOINFO twaudioinfo\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twaindsm.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwaindsmDsmEntryAudioAudioinfo\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_AUDIOINFO twaudioinfo\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 LinuxDsmEntryAudioAudioinfo\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_AUDIOINFO twaudioinfo\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib64/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux64DsmEntryAudioAudioinfo\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_AUDIOINFO twaudioinfo\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so.2.3.2\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux020302Dsm64bitEntryAudioAudioinfo\r\n        (\r\n            ref TWAIN.TW_IDENTITY origin,\r\n            ref TWAIN.TW_IDENTITY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_AUDIOINFO twaudioinfo\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/System/Library/Frameworks/TWAIN.framework/TWAIN\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwainDsmEntryAudioAudioinfo\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_AUDIOINFO twaudioinfo\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/Library/Frameworks/TWAINDSM.framework/TWAINDSM\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwaindsmDsmEntryAudioAudioinfo\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_AUDIOINFO twaudioinfo\r\n        );\r\n\r\n        /// <summary>\r\n        /// Use this for DG_AUDIO / DAT.AUDIONATIVEXFER / MSG.GET...\r\n        /// </summary>\r\n        /// <param name=\"origin\"></param>\r\n        /// <param name=\"dest\"></param>\r\n        /// <param name=\"dg\"></param>\r\n        /// <param name=\"dat\"></param>\r\n        /// <param name=\"msg\"></param>\r\n        /// <param name=\"hWav\"></param>\r\n        /// <returns></returns>\r\n        /// *** We'll add this later...maybe***\r\n\r\n        /// <summary>\r\n        /// Use this for DG_CONTROL / DAT.CALLBACK / MSG.* calls...\r\n        /// </summary>\r\n        /// <param name=\"origin\"></param>\r\n        /// <param name=\"dest\"></param>\r\n        /// <param name=\"dg\"></param>\r\n        /// <param name=\"dat\"></param>\r\n        /// <param name=\"msg\"></param>\r\n        /// <param name=\"twcallback\"></param>\r\n        /// <returns></returns>\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twain_32.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwain32DsmEntryCallback\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_CALLBACK twcallback\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twaindsm.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwaindsmDsmEntryCallback\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_CALLBACK twcallback\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 LinuxDsmEntryCallback\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_CALLBACK twcallback\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib64/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux64DsmEntryCallback\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_CALLBACK twcallback\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so.2.3.2\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux020302Dsm64bitEntryCallback\r\n        (\r\n            ref TWAIN.TW_IDENTITY origin,\r\n            ref TWAIN.TW_IDENTITY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_CALLBACK twcallback\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/System/Library/Frameworks/TWAIN.framework/TWAIN\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwainDsmEntryCallback\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            IntPtr dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_CALLBACK twcallback\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/Library/Frameworks/TWAINDSM.framework/TWAINDSM\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwaindsmDsmEntryCallback\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_CALLBACK twcallback\r\n        );\r\n        public delegate UInt16 WindowsDsmEntryCallbackDelegate\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            IntPtr twnull\r\n        );\r\n        public delegate UInt16 LinuxDsmEntryCallbackDelegate\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            IntPtr twnull\r\n        );\r\n        public delegate UInt16 Linux020302Dsm64bitEntryCallbackDelegate\r\n        (\r\n            ref TWAIN.TW_IDENTITY origin,\r\n            ref TWAIN.TW_IDENTITY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            IntPtr twnull\r\n        );\r\n        public delegate UInt16 MacosxDsmEntryCallbackDelegate\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            IntPtr twnull\r\n        );\r\n\r\n        /// <summary>\r\n        /// Use this for DG_CONTROL / DAT.CALLBACK2 / MSG.* calls...\r\n        /// </summary>\r\n        /// <param name=\"origin\"></param>\r\n        /// <param name=\"dest\"></param>\r\n        /// <param name=\"dg\"></param>\r\n        /// <param name=\"dat\"></param>\r\n        /// <param name=\"msg\"></param>\r\n        /// <param name=\"twcallback\"></param>\r\n        /// <returns></returns>\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twain_32.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwain32DsmEntryCallback2\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_CALLBACK2 twcallback2\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twaindsm.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwaindsmDsmEntryCallback2\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_CALLBACK2 twcallback2\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 LinuxDsmEntryCallback2\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_CALLBACK2 twcallback2\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib64/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux64DsmEntryCallback2\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_CALLBACK2 twcallback2\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so.2.3.2\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux020302Dsm64bitEntryCallback2\r\n        (\r\n            ref TWAIN.TW_IDENTITY origin,\r\n            ref TWAIN.TW_IDENTITY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_CALLBACK2 twcallback2\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/System/Library/Frameworks/TWAIN.framework/TWAIN\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwainDsmEntryCallback2\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            IntPtr dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_CALLBACK2 twcallback\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/Library/Frameworks/TWAINDSM.framework/TWAINDSM\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwaindsmDsmEntryCallback2\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY des,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_CALLBACK2 twcallback\r\n        );\r\n        private delegate UInt16 WindowsDsmEntryCallback2Delegate\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            IntPtr twnull\r\n        );\r\n        private delegate UInt16 LinuxDsmEntryCallback2Delegate\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            IntPtr twnull\r\n        );\r\n        private delegate UInt16 Linux020302Dsm64bitEntryCallback2Delegate\r\n        (\r\n            ref TWAIN.TW_IDENTITY origin,\r\n            ref TWAIN.TW_IDENTITY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            IntPtr twnull\r\n        );\r\n        private delegate UInt16 MacosxDsmEntryCallback2Delegate\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            IntPtr twnull\r\n        );\r\n\r\n        /// <summary>\r\n        /// Use this for DG_CONTROL / DAT.CAPABILITY / MSG.* calls...\r\n        /// </summary>\r\n        /// <param name=\"origin\"></param>\r\n        /// <param name=\"dest\"></param>\r\n        /// <param name=\"dg\"></param>\r\n        /// <param name=\"dat\"></param>\r\n        /// <param name=\"msg\"></param>\r\n        /// <param name=\"twcapability\"></param>\r\n        /// <returns></returns>\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twain_32.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwain32DsmEntryCapability\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_CAPABILITY twcapability\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twaindsm.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwaindsmDsmEntryCapability\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_CAPABILITY twcapability\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 LinuxDsmEntryCapability\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_CAPABILITY twcapability\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib64/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux64DsmEntryCapability\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_CAPABILITY twcapability\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so.2.3.2\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux020302Dsm64bitEntryCapability\r\n        (\r\n            ref TWAIN.TW_IDENTITY origin,\r\n            ref TWAIN.TW_IDENTITY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_CAPABILITY twcapability\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/System/Library/Frameworks/TWAIN.framework/TWAIN\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwainDsmEntryCapability\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_CAPABILITY twcapability\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/Library/Frameworks/TWAINDSM.framework/TWAINDSM\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwaindsmDsmEntryCapability\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_CAPABILITY twcapability\r\n        );\r\n\r\n        /// <summary>\r\n        /// Use this for DG_CONTROL / DAT.CUSTOMDSDATA / MSG.* calls...\r\n        /// </summary>\r\n        /// <param name=\"origin\"></param>\r\n        /// <param name=\"dest\"></param>\r\n        /// <param name=\"dg\"></param>\r\n        /// <param name=\"dat\"></param>\r\n        /// <param name=\"msg\"></param>\r\n        /// <param name=\"twcustomdsdata\"></param>\r\n        /// <returns></returns>\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twain_32.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwain32DsmEntryCustomdsdata\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_CUSTOMDSDATA twcustomedsdata\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twaindsm.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwaindsmDsmEntryCustomdsdata\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_CUSTOMDSDATA twcustomdsdata\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 LinuxDsmEntryCustomdsdata\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_CUSTOMDSDATA twcustomdsdata\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib64/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux64DsmEntryCustomdsdata\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_CUSTOMDSDATA twcustomdsdata\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so.2.3.2\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux020302Dsm64bitEntryCustomdsdata\r\n        (\r\n            ref TWAIN.TW_IDENTITY origin,\r\n            ref TWAIN.TW_IDENTITY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_CUSTOMDSDATA twcustomdsdata\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/System/Library/Frameworks/TWAIN.framework/TWAIN\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwainDsmEntryCustomdsdata\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_CUSTOMDSDATA twcustomedsdata\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/Library/Frameworks/TWAINDSM.framework/TWAINDSM\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwaindsmDsmEntryCustomdsdata\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_CUSTOMDSDATA twcustomedsdata\r\n        );\r\n\r\n        /// <summary>\r\n        /// Use this for DG_CONTROL / DAT.DEVICEEVENT / MSG.* calls...\r\n        /// </summary>\r\n        /// <param name=\"origin\"></param>\r\n        /// <param name=\"dest\"></param>\r\n        /// <param name=\"dg\"></param>\r\n        /// <param name=\"dat\"></param>\r\n        /// <param name=\"msg\"></param>\r\n        /// <param name=\"twdeviceevent\"></param>\r\n        /// <returns></returns>\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twain_32.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwain32DsmEntryDeviceevent\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_DEVICEEVENT twdeviceevent\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twaindsm.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwaindsmDsmEntryDeviceevent\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_DEVICEEVENT twdeviceevent\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 LinuxDsmEntryDeviceevent\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_DEVICEEVENT twdeviceevent\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib64/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux64DsmEntryDeviceevent\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_DEVICEEVENT twdeviceevent\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so.2.3.2\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux020302Dsm64bitEntryDeviceevent\r\n        (\r\n            ref TWAIN.TW_IDENTITY origin,\r\n            ref TWAIN.TW_IDENTITY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_DEVICEEVENT twdeviceevent\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/System/Library/Frameworks/TWAIN.framework/TWAIN\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwainDsmEntryDeviceevent\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_DEVICEEVENT twdeviceevent\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/Library/Frameworks/TWAINDSM.framework/TWAINDSM\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwaindsmDsmEntryDeviceevent\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_DEVICEEVENT twdeviceevent\r\n        );\r\n\r\n        /// <summary>\r\n        /// Use this for DG_CONTROL / DAT.EVENT / MSG.* calls...\r\n        /// </summary>\r\n        /// <param name=\"origin\"></param>\r\n        /// <param name=\"dest\"></param>\r\n        /// <param name=\"dg\"></param>\r\n        /// <param name=\"dat\"></param>\r\n        /// <param name=\"msg\"></param>\r\n        /// <param name=\"twevent\"></param>\r\n        /// <returns></returns>\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twain_32.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwain32DsmEntryEvent\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_EVENT twevent\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twaindsm.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwaindsmDsmEntryEvent\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_EVENT twevent\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 LinuxDsmEntryEvent\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_EVENT twevent\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib64/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux64DsmEntryEvent\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_EVENT twevent\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so.2.3.2\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux020302Dsm64bitEntryEvent\r\n        (\r\n            ref TWAIN.TW_IDENTITY origin,\r\n            ref TWAIN.TW_IDENTITY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_EVENT twevent\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/System/Library/Frameworks/TWAIN.framework/TWAIN\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwainDsmEntryEvent\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_EVENT twevent\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/Library/Frameworks/TWAINDSM.framework/TWAINDSM\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwaindsmDsmEntryEvent\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_EVENT twevent\r\n        );\r\n\r\n        /// <summary>\r\n        /// Use this for DG_CONTROL / DAT.ENTRYPOINT / MSG.* calls...\r\n        /// </summary>\r\n        /// <param name=\"origin\"></param>\r\n        /// <param name=\"dest\"></param>\r\n        /// <param name=\"dg\"></param>\r\n        /// <param name=\"dat\"></param>\r\n        /// <param name=\"msg\"></param>\r\n        /// <param name=\"twentrypoint\"></param>\r\n        /// <returns></returns>\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twain_32.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwain32DsmEntryEntrypoint\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_ENTRYPOINT twentrypoint\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twaindsm.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwaindsmDsmEntryEntrypoint\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_ENTRYPOINT twentrypoint\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 LinuxDsmEntryEntrypoint\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_ENTRYPOINT twentrypoint\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib64/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux64DsmEntryEntrypoint\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_ENTRYPOINT twentrypoint\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so.2.3.2\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux020302Dsm64bitEntryEntrypoint\r\n        (\r\n            ref TWAIN.TW_IDENTITY origin,\r\n            ref TWAIN.TW_IDENTITY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_ENTRYPOINT_LINUX64 twentrypoint\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/System/Library/Frameworks/TWAIN.framework/TWAIN\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwainDsmEntryEntrypoint\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_ENTRYPOINT twentrypoint\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/Library/Frameworks/TWAINDSM.framework/TWAINDSM\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwaindsmDsmEntryEntrypoint\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_ENTRYPOINT twentrypoint\r\n        );\r\n\r\n        /// <summary>\r\n        /// Use this for DG_CONTROL / DAT.FILESYSTEM / MSG.* calls...\r\n        /// </summary>\r\n        /// <param name=\"origin\"></param>\r\n        /// <param name=\"dest\"></param>\r\n        /// <param name=\"dg\"></param>\r\n        /// <param name=\"dat\"></param>\r\n        /// <param name=\"msg\"></param>\r\n        /// <param name=\"twentrypoint\"></param>\r\n        /// <returns></returns>\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twain_32.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwain32DsmEntryFilesystem\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_FILESYSTEM twfilesystem\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twaindsm.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwaindsmDsmEntryFilesystem\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_FILESYSTEM twfilesystem\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 LinuxDsmEntryFilesystem\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_FILESYSTEM twfilesystem\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib64/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux64DsmEntryFilesystem\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_FILESYSTEM twfilesystem\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so.2.3.2\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux020302Dsm64bitEntryFilesystem\r\n        (\r\n            ref TWAIN.TW_IDENTITY origin,\r\n            ref TWAIN.TW_IDENTITY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_FILESYSTEM twfilesystem\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/System/Library/Frameworks/TWAIN.framework/TWAIN\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwainDsmEntryFilesystem\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_FILESYSTEM twfilesystem\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/Library/Frameworks/TWAINDSM.framework/TWAINDSM\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwaindsmDsmEntryFilesystem\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_FILESYSTEM twfilesystem\r\n        );\r\n\r\n        /// <summary>\r\n        /// Use this for DG_CONTROL / DAT.IDENTITY / MSG.* calls...\r\n        /// </summary>\r\n        /// <param name=\"origin\"></param>\r\n        /// <param name=\"dest\"></param>\r\n        /// <param name=\"dg\"></param>\r\n        /// <param name=\"dat\"></param>\r\n        /// <param name=\"msg\"></param>\r\n        /// <param name=\"twidentity\"></param>\r\n        /// <returns></returns>\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twain_32.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwain32DsmEntryIdentity\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            IntPtr dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_IDENTITY_LEGACY twidentity\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twain_32.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwain32DsmEntryIdentityState4\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_IDENTITY_LEGACY twidentity\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twaindsm.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwaindsmDsmEntryIdentity\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            IntPtr dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_IDENTITY_LEGACY twidentity\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 LinuxDsmEntryIdentity\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            IntPtr dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_IDENTITY_LEGACY twidentity\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib64/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux64DsmEntryIdentity\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            IntPtr dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_IDENTITY_LEGACY twidentity\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so.2.3.2\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux020302Dsm64bitEntryIdentity\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LINUX64 origin,\r\n            IntPtr dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_IDENTITY_LINUX64 twidentity\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/System/Library/Frameworks/TWAIN.framework/TWAIN\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwainDsmEntryIdentity\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            IntPtr dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_IDENTITY_MACOSX twidentity\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/Library/Frameworks/TWAINDSM.framework/TWAINDSM\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwaindsmDsmEntryIdentity\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            IntPtr dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_IDENTITY_MACOSX twidentity\r\n        );\r\n\r\n        /// <summary>\r\n        /// Use this for DG_CONTROL / DAT.NULL / MSG.* calls...\r\n        /// </summary>\r\n        /// <param name=\"origin\"></param>\r\n        /// <param name=\"dest\"></param>\r\n        /// <param name=\"dg\"></param>\r\n        /// <param name=\"dat\"></param>\r\n        /// <param name=\"msg\"></param>\r\n        /// <param name=\"memref\"></param>\r\n        /// <returns></returns>\r\n        /// ***Only needed for drivers, so we don't have it***\r\n\r\n        /// <summary>\r\n        /// Use this for DG_CONTROL / DAT.PARENT / MSG.* calls...\r\n        /// </summary>\r\n        /// <param name=\"origin\"></param>\r\n        /// <param name=\"dest\"></param>\r\n        /// <param name=\"dg\"></param>\r\n        /// <param name=\"dat\"></param>\r\n        /// <param name=\"msg\"></param>\r\n        /// <param name=\"hbitmap\"></param>\r\n        /// <returns></returns>\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twain_32.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwain32DsmEntryParent\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            IntPtr dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref IntPtr hwnd\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twaindsm.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwaindsmDsmEntryParent\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            IntPtr dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref IntPtr hwnd\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 LinuxDsmEntryParent\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            IntPtr dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref IntPtr hwnd\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib64/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux64DsmEntryParent\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            IntPtr dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref IntPtr hwnd\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so.2.3.2\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux020302Dsm64bitEntryParent\r\n        (\r\n            ref TWAIN.TW_IDENTITY origin,\r\n            IntPtr dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref IntPtr hwnd\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/System/Library/Frameworks/TWAIN.framework/TWAIN\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwainDsmEntryParent\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            IntPtr dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref IntPtr hwnd\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/Library/Frameworks/TWAINDSM.framework/TWAINDSM\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwaindsmDsmEntryParent\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            IntPtr dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref IntPtr hwnd\r\n        );\r\n\r\n        /// <summary>\r\n        /// Use this for DG_CONTROL / DAT.PASSTHRU / MSG.* calls...\r\n        /// </summary>\r\n        /// <param name=\"origin\"></param>\r\n        /// <param name=\"dest\"></param>\r\n        /// <param name=\"dg\"></param>\r\n        /// <param name=\"dat\"></param>\r\n        /// <param name=\"msg\"></param>\r\n        /// <param name=\"twpassthru\"></param>\r\n        /// <returns></returns>\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twain_32.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwain32DsmEntryPassthru\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_PASSTHRU twpassthru\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twaindsm.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwaindsmDsmEntryPassthru\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_PASSTHRU twpassthru\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 LinuxDsmEntryPassthru\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_PASSTHRU twpassthru\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib64/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux64DsmEntryPassthru\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_PASSTHRU twpassthru\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so.2.3.2\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux020302Dsm64bitEntryPassthru\r\n        (\r\n            ref TWAIN.TW_IDENTITY origin,\r\n            ref TWAIN.TW_IDENTITY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_PASSTHRU twpassthru\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/System/Library/Frameworks/TWAIN.framework/TWAIN\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwainDsmEntryPassthru\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_PASSTHRU twpassthru\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/Library/Frameworks/TWAINDSM.framework/TWAINDSM\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwaindsmDsmEntryPassthru\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_PASSTHRU twpassthru\r\n        );\r\n\r\n        /// <summary>\r\n        /// Use this for DG_CONTROL / DAT.PENDINGXFERS / MSG.* calls...\r\n        /// </summary>\r\n        /// <param name=\"origin\"></param>\r\n        /// <param name=\"dest\"></param>\r\n        /// <param name=\"dg\"></param>\r\n        /// <param name=\"dat\"></param>\r\n        /// <param name=\"msg\"></param>\r\n        /// <param name=\"twpendingxfers\"></param>\r\n        /// <returns></returns>\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twain_32.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwain32DsmEntryPendingxfers\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_PENDINGXFERS twpendingxfers\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twaindsm.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwaindsmDsmEntryPendingxfers\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_PENDINGXFERS twpendingxfers\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 LinuxDsmEntryPendingxfers\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_PENDINGXFERS twpendingxfers\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib64/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux64DsmEntryPendingxfers\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_PENDINGXFERS twpendingxfers\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so.2.3.2\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux020302Dsm64bitEntryPendingxfers\r\n        (\r\n            ref TWAIN.TW_IDENTITY origin,\r\n            ref TWAIN.TW_IDENTITY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_PENDINGXFERS twpendingxfers\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/System/Library/Frameworks/TWAIN.framework/TWAIN\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwainDsmEntryPendingxfers\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_PENDINGXFERS twpendingxfers\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/Library/Frameworks/TWAINDSM.framework/TWAINDSM\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwaindsmDsmEntryPendingxfers\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_PENDINGXFERS twpendingxfers\r\n        );\r\n\r\n        /// <summary>\r\n        /// Use this for DG_IMAGE / DAT.SETUPFILEXFER / MSG.* calls...\r\n        /// </summary>\r\n        /// <param name=\"origin\"></param>\r\n        /// <param name=\"dest\"></param>\r\n        /// <param name=\"dg\"></param>\r\n        /// <param name=\"dat\"></param>\r\n        /// <param name=\"msg\"></param>\r\n        /// <param name=\"twsetupfilexfer\"></param>\r\n        /// <returns></returns>\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twain_32.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwain32DsmEntrySetupfilexfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_SETUPFILEXFER twsetupfilexfer\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twaindsm.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwaindsmDsmEntrySetupfilexfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_SETUPFILEXFER twsetupfilexfer\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 LinuxDsmEntrySetupfilexfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_SETUPFILEXFER twsetupfilexfer\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib64/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux64DsmEntrySetupfilexfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_SETUPFILEXFER twsetupfilexfer\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so.2.3.2\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux020302Dsm64bitEntrySetupfilexfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY origin,\r\n            ref TWAIN.TW_IDENTITY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_SETUPFILEXFER twsetupfilexfer\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/System/Library/Frameworks/TWAIN.framework/TWAIN\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwainDsmEntrySetupfilexfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_SETUPFILEXFER twsetupfilexfer\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/Library/Frameworks/TWAINDSM.framework/TWAINDSM\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwaindsmDsmEntrySetupfilexfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_SETUPFILEXFER twsetupfilexfer\r\n        );\r\n\r\n        /// <summary>\r\n        /// Use this for DG_IMAGE / DAT.SETUPMEMXFER / MSG.* calls...\r\n        /// </summary>\r\n        /// <param name=\"origin\"></param>\r\n        /// <param name=\"dest\"></param>\r\n        /// <param name=\"dg\"></param>\r\n        /// <param name=\"dat\"></param>\r\n        /// <param name=\"msg\"></param>\r\n        /// <param name=\"twsetupmemxfer\"></param>\r\n        /// <returns></returns>\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twain_32.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwain32DsmEntrySetupmemxfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_SETUPMEMXFER twsetupmemxfer\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twaindsm.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwaindsmDsmEntrySetupmemxfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_SETUPMEMXFER twsetupmemxfer\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 LinuxDsmEntrySetupmemxfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_SETUPMEMXFER twsetupmemxfer\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib64/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux64DsmEntrySetupmemxfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_SETUPMEMXFER twsetupmemxfer\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so.2.3.2\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux020302Dsm64bitEntrySetupmemxfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY origin,\r\n            ref TWAIN.TW_IDENTITY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_SETUPMEMXFER twsetupmemxfer\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/System/Library/Frameworks/TWAIN.framework/TWAIN\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwainDsmEntrySetupmemxfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_SETUPMEMXFER twsetupmemxfer\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/Library/Frameworks/TWAINDSM.framework/TWAINDSM\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwaindsmDsmEntrySetupmemxfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_SETUPMEMXFER twsetupmemxfer\r\n        );\r\n\r\n        /// <summary>\r\n        /// Use this for DG_CONTROL / DAT.STATUS / MSG.* calls...\r\n        /// </summary>\r\n        /// <param name=\"origin\"></param>\r\n        /// <param name=\"dest\"></param>\r\n        /// <param name=\"dg\"></param>\r\n        /// <param name=\"dat\"></param>\r\n        /// <param name=\"msg\"></param>\r\n        /// <param name=\"twstatus\"></param>\r\n        /// <returns></returns>\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twain_32.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwain32DsmEntryStatus\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_STATUS twstatus\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twain_32.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwain32DsmEntryStatusState3\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            IntPtr dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_STATUS twstatus\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twaindsm.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwaindsmDsmEntryStatus\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_STATUS twstatus\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twaindsm.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwaindsmDsmEntryStatusState3\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            IntPtr dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_STATUS twstatus\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 LinuxDsmEntryStatus\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_STATUS twstatus\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 LinuxDsmEntryStatusState3\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            IntPtr dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_STATUS twstatus\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib64/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux64DsmEntryStatus\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_STATUS twstatus\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib64/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux64DsmEntryStatusState3\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            IntPtr dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_STATUS twstatus\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so.2.3.2\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux020302Dsm64bitEntryStatus\r\n        (\r\n            ref TWAIN.TW_IDENTITY origin,\r\n            ref TWAIN.TW_IDENTITY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_STATUS twstatus\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so.2.3.2\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux020302Dsm64bitEntryStatusState3\r\n        (\r\n            ref TWAIN.TW_IDENTITY origin,\r\n            IntPtr dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_STATUS twstatus\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/System/Library/Frameworks/TWAIN.framework/TWAIN\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwainDsmEntryStatus\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_STATUS twstatus\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/System/Library/Frameworks/TWAIN.framework/TWAIN\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwainDsmEntryStatusState3\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            IntPtr dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_STATUS twstatus\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/Library/Frameworks/TWAINDSM.framework/TWAINDSM\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwaindsmDsmEntryStatus\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_STATUS twstatus\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/Library/Frameworks/TWAINDSM.framework/TWAINDSM\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwaindsmDsmEntryStatusState3\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            IntPtr dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_STATUS twstatus\r\n        );\r\n\r\n        /// <summary>\r\n        /// Use this for DG_CONTROL / DAT.STATUSUTF8 / MSG.* calls...\r\n        /// </summary>\r\n        /// <param name=\"origin\"></param>\r\n        /// <param name=\"dest\"></param>\r\n        /// <param name=\"dg\"></param>\r\n        /// <param name=\"dat\"></param>\r\n        /// <param name=\"msg\"></param>\r\n        /// <param name=\"twstatusutf8\"></param>\r\n        /// <returns></returns>\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twain_32.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwain32DsmEntryStatusutf8\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_STATUSUTF8 twstatusutf8\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twaindsm.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwaindsmDsmEntryStatusutf8\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_STATUSUTF8 twstatusutf8\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 LinuxDsmEntryStatusutf8\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_STATUSUTF8 twstatusutf8\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib64/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux64DsmEntryStatusutf8\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_STATUSUTF8 twstatusutf8\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so.2.3.2\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux020302Dsm64bitEntryStatusutf8\r\n        (\r\n            ref TWAIN.TW_IDENTITY origin,\r\n            ref TWAIN.TW_IDENTITY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_STATUSUTF8 twstatusutf8\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/System/Library/Frameworks/TWAIN.framework/TWAIN\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwainDsmEntryStatusutf8\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_STATUSUTF8 twstatusutf8\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/Library/Frameworks/TWAINDSM.framework/TWAINDSM\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwaindsmDsmEntryStatusutf8\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_STATUSUTF8 twstatusutf8\r\n        );\r\n\r\n        /// <summary>\r\n        /// Use this for DG.CONTROL / DAT.TWAINDIRECT / MSG.* calls...\r\n        /// </summary>\r\n        /// <param name=\"origin\"></param>\r\n        /// <param name=\"dest\"></param>\r\n        /// <param name=\"dg\"></param>\r\n        /// <param name=\"dat\"></param>\r\n        /// <param name=\"msg\"></param>\r\n        /// <param name=\"twtwaindirect\"></param>\r\n        /// <returns></returns>\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twain_32.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwain32DsmEntryTwaindirect\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_TWAINDIRECT twtwaindirect\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twaindsm.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwaindsmDsmEntryTwaindirect\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_TWAINDIRECT twtwaindirect\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 LinuxDsmEntryTwaindirect\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_TWAINDIRECT twtwaindirect\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib64/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux64DsmEntryTwaindirect\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_TWAINDIRECT twtwaindirect\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so.2.3.2\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux020302Dsm64bitEntryTwaindirect\r\n        (\r\n            ref TWAIN.TW_IDENTITY origin,\r\n            ref TWAIN.TW_IDENTITY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_TWAINDIRECT twtwaindirect\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/System/Library/Frameworks/TWAIN.framework/TWAIN\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwainDsmEntryTwaindirect\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_TWAINDIRECT twtwaindirect\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/Library/Frameworks/TWAINDSM.framework/TWAINDSM\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwaindsmDsmEntryTwaindirect\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_TWAINDIRECT twtwaindirect\r\n        );\r\n\r\n        /// <summary>\r\n        /// Use this for DG_CONTROL / DAT.USERINTERFACE / MSG.* calls...\r\n        /// </summary>\r\n        /// <param name=\"origin\"></param>\r\n        /// <param name=\"dest\"></param>\r\n        /// <param name=\"dg\"></param>\r\n        /// <param name=\"dat\"></param>\r\n        /// <param name=\"msg\"></param>\r\n        /// <param name=\"twuserinterface\"></param>\r\n        /// <returns></returns>\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twain_32.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwain32DsmEntryUserinterface\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_USERINTERFACE twuserinterface\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twaindsm.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwaindsmDsmEntryUserinterface\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_USERINTERFACE twuserinterface\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 LinuxDsmEntryUserinterface\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_USERINTERFACE twuserinterface\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib64/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux64DsmEntryUserinterface\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_USERINTERFACE twuserinterface\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so.2.3.2\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux020302Dsm64bitEntryUserinterface\r\n        (\r\n            ref TWAIN.TW_IDENTITY origin,\r\n            ref TWAIN.TW_IDENTITY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_USERINTERFACE twuserinterface\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/System/Library/Frameworks/TWAIN.framework/TWAIN\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwainDsmEntryUserinterface\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_USERINTERFACE twuserinterface\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/Library/Frameworks/TWAINDSM.framework/TWAINDSM\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwaindsmDsmEntryUserinterface\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_USERINTERFACE twuserinterface\r\n        );\r\n\r\n        /// <summary>\r\n        /// Use this for DG_CONTROL / DAT.XFERGROUP / MSG.* calls...\r\n        /// </summary>\r\n        /// <param name=\"origin\"></param>\r\n        /// <param name=\"dest\"></param>\r\n        /// <param name=\"dg\"></param>\r\n        /// <param name=\"dat\"></param>\r\n        /// <param name=\"msg\"></param>\r\n        /// <param name=\"twuint32\"></param>\r\n        /// <returns></returns>\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twain_32.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwain32DsmEntryXfergroup\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref UInt32 twuint32\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twaindsm.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwaindsmDsmEntryXfergroup\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref UInt32 twuint32\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 LinuxDsmEntryXfergroup\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref UInt32 twuint32\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib64/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux64DsmEntryXfergroup\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref UInt32 twuint32\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so.2.3.2\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux020302Dsm64bitEntryXfergroup\r\n        (\r\n            ref TWAIN.TW_IDENTITY origin,\r\n            ref TWAIN.TW_IDENTITY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref UInt32 twuint32\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/System/Library/Frameworks/TWAIN.framework/TWAIN\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwainDsmEntryXfergroup\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref UInt32 twuint32\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/Library/Frameworks/TWAINDSM.framework/TWAINDSM\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwaindsmDsmEntryXfergroup\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref UInt32 twuint32\r\n        );\r\n\r\n        /// <summary>\r\n        /// Use this for DG_AUDIO / DAT.AUDIOFILEXFER / MSG.* calls...\r\n        /// </summary>\r\n        /// <param name=\"origin\"></param>\r\n        /// <param name=\"dest\"></param>\r\n        /// <param name=\"dg\"></param>\r\n        /// <param name=\"dat\"></param>\r\n        /// <param name=\"msg\"></param>\r\n        /// <param name=\"twmemref\"></param>\r\n        /// <returns></returns>\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twain_32.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwain32DsmEntryAudiofilexfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            IntPtr twmemref\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twaindsm.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwaindsmDsmEntryAudiofilexfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            IntPtr twmemref\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 LinuxDsmEntryAudiofilexfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            IntPtr twmemref\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib64/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux64DsmEntryAudiofilexfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            IntPtr twmemref\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so.2.3.2\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux020302Dsm64bitEntryAudiofilexfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY origin,\r\n            ref TWAIN.TW_IDENTITY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            IntPtr twmemref\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/System/Library/Frameworks/TWAIN.framework/TWAIN\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwainDsmEntryAudiofilexfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            IntPtr twmemref\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/Library/Frameworks/TWAINDSM.framework/TWAINDSM\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwaindsmDsmEntryAudiofilexfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            IntPtr twmemref\r\n        );\r\n\r\n        /// <summary>\r\n        /// Use this for DG_AUDIO / DAT.AUDIONATIVEXFER / MSG.* calls...\r\n        /// </summary>\r\n        /// <param name=\"origin\"></param>\r\n        /// <param name=\"dest\"></param>\r\n        /// <param name=\"dg\"></param>\r\n        /// <param name=\"dat\"></param>\r\n        /// <param name=\"msg\"></param>\r\n        /// <param name=\"intptr\"></param>\r\n        /// <returns></returns>\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twain_32.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwain32DsmEntryAudionativexfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref IntPtr intptrWav\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twaindsm.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwaindsmDsmEntryAudionativexfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref IntPtr intptrWav\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 LinuxDsmEntryAudionativexfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref IntPtr intptrWav\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib64/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux64DsmEntryAudionativexfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref IntPtr intptrWav\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so.2.3.2\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux020302Dsm64bitEntryAudionativexfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY origin,\r\n            ref TWAIN.TW_IDENTITY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref IntPtr intptrWav\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/System/Library/Frameworks/TWAIN.framework/TWAIN\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwainDsmEntryAudionativexfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref IntPtr intptrAiff\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/Library/Frameworks/TWAINDSM.framework/TWAINDSM\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwaindsmDsmEntryAudionativexfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref IntPtr intptrAiff\r\n        );\r\n\r\n        /// <summary>\r\n        /// Use this for DG_IMAGE / DAT.CIECOLOR / MSG.* calls...\r\n        /// </summary>\r\n        /// <param name=\"origin\"></param>\r\n        /// <param name=\"dest\"></param>\r\n        /// <param name=\"dg\"></param>\r\n        /// <param name=\"dat\"></param>\r\n        /// <param name=\"msg\"></param>\r\n        /// <param name=\"twciecolor\"></param>\r\n        /// <returns></returns>\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twain_32.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwain32DsmEntryCiecolor\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_CIECOLOR twciecolor\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twaindsm.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwaindsmDsmEntryCiecolor\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_CIECOLOR twciecolor\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 LinuxDsmEntryCiecolor\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_CIECOLOR twciecolor\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib64/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux64DsmEntryCiecolor\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_CIECOLOR twciecolor\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so.2.3.2\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux020302Dsm64bitEntryCiecolor\r\n        (\r\n            ref TWAIN.TW_IDENTITY origin,\r\n            ref TWAIN.TW_IDENTITY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_CIECOLOR twciecolor\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/System/Library/Frameworks/TWAIN.framework/TWAIN\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwainDsmEntryCiecolor\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_CIECOLOR twciecolor\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/Library/Frameworks/TWAINDSM.framework/TWAINDSM\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwaindsmDsmEntryCiecolor\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_CIECOLOR twciecolor\r\n        );\r\n\r\n        /// <summary>\r\n        /// Use this for DG_IMAGE / DAT.EXTIMAGEINFO / MSG.* calls...\r\n        /// </summary>\r\n        /// <param name=\"origin\"></param>\r\n        /// <param name=\"dest\"></param>\r\n        /// <param name=\"dg\"></param>\r\n        /// <param name=\"dat\"></param>\r\n        /// <param name=\"msg\"></param>\r\n        /// <param name=\"twextimageinfo\"></param>\r\n        /// <returns></returns>\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twain_32.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwain32DsmEntryExtimageinfo\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_EXTIMAGEINFO twextimageinfo\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twaindsm.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwaindsmDsmEntryExtimageinfo\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_EXTIMAGEINFO twextimageinfo\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 LinuxDsmEntryExtimageinfo\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_EXTIMAGEINFO twextimageinfo\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib64/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux64DsmEntryExtimageinfo\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_EXTIMAGEINFO twextimageinfo\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so.2.3.2\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux020302Dsm64bitEntryExtimageinfo\r\n        (\r\n            ref TWAIN.TW_IDENTITY origin,\r\n            ref TWAIN.TW_IDENTITY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_EXTIMAGEINFO twextimageinfo\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/System/Library/Frameworks/TWAIN.framework/TWAIN\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwainDsmEntryExtimageinfo\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_EXTIMAGEINFO twextimageinfo\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/Library/Frameworks/TWAINDSM.framework/TWAINDSM\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwaindsmDsmEntryExtimageinfo\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_EXTIMAGEINFO twextimageinfo\r\n        );\r\n\r\n        /// <summary>\r\n        /// Use this for DG_IMAGE / DAT.FILTER / MSG.* calls...\r\n        /// </summary>\r\n        /// <param name=\"origin\"></param>\r\n        /// <param name=\"dest\"></param>\r\n        /// <param name=\"dg\"></param>\r\n        /// <param name=\"dat\"></param>\r\n        /// <param name=\"msg\"></param>\r\n        /// <param name=\"twfilter\"></param>\r\n        /// <returns></returns>\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twain_32.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwain32DsmEntryFilter\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_FILTER twfilter\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twaindsm.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwaindsmDsmEntryFilter\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_FILTER twfilter\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 LinuxDsmEntryFilter\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_FILTER twfilter\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib64/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux64DsmEntryFilter\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_FILTER twfilter\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so.2.3.2\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux020302Dsm64bitEntryFilter\r\n        (\r\n            ref TWAIN.TW_IDENTITY origin,\r\n            ref TWAIN.TW_IDENTITY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_FILTER twfilter\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/System/Library/Frameworks/TWAIN.framework/TWAIN\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwainDsmEntryFilter\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_FILTER twfilter\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/Library/Frameworks/TWAINDSM.framework/TWAINDSM\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwaindsmDsmEntryFilter\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_FILTER twfilter\r\n        );\r\n\r\n        /// <summary>\r\n        /// Use this for DG_IMAGE / DAT.GRAYRESPONSE / MSG.* calls...\r\n        /// </summary>\r\n        /// <param name=\"origin\"></param>\r\n        /// <param name=\"dest\"></param>\r\n        /// <param name=\"dg\"></param>\r\n        /// <param name=\"dat\"></param>\r\n        /// <param name=\"msg\"></param>\r\n        /// <param name=\"twgrayresponse\"></param>\r\n        /// <returns></returns>\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twain_32.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwain32DsmEntryGrayresponse\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_GRAYRESPONSE twgrayresponse\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twaindsm.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwaindsmDsmEntryGrayresponse\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_GRAYRESPONSE twgrayresponse\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 LinuxDsmEntryGrayresponse\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_GRAYRESPONSE twgrayresponse\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib64/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux64DsmEntryGrayresponse\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_GRAYRESPONSE twgrayresponse\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so.2.3.2\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux020302Dsm64bitEntryGrayresponse\r\n        (\r\n            ref TWAIN.TW_IDENTITY origin,\r\n            ref TWAIN.TW_IDENTITY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_GRAYRESPONSE twgrayresponse\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/System/Library/Frameworks/TWAIN.framework/TWAIN\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwainDsmEntryGrayresponse\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_GRAYRESPONSE twgrayresponse\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/Library/Frameworks/TWAINDSM.framework/TWAINDSM\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwaindsmDsmEntryGrayresponse\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_GRAYRESPONSE twgrayresponse\r\n        );\r\n\r\n        /// <summary>\r\n        /// Use this for DG_IMAGE / DAT.ICCPROFILE / MSG.* calls...\r\n        /// </summary>\r\n        /// <param name=\"origin\"></param>\r\n        /// <param name=\"dest\"></param>\r\n        /// <param name=\"dg\"></param>\r\n        /// <param name=\"dat\"></param>\r\n        /// <param name=\"msg\"></param>\r\n        /// <param name=\"twmemory\"></param>\r\n        /// <returns></returns>\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twain_32.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwain32DsmEntryIccprofile\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_MEMORY twmemory\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twaindsm.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwaindsmDsmEntryIccprofile\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_MEMORY twmemory\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 LinuxDsmEntryIccprofile\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_MEMORY twmemory\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib64/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux64DsmEntryIccprofile\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_MEMORY twmemory\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so.2.3.2\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux020302Dsm64bitEntryIccprofile\r\n        (\r\n            ref TWAIN.TW_IDENTITY origin,\r\n            ref TWAIN.TW_IDENTITY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_MEMORY twmemory\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/System/Library/Frameworks/TWAIN.framework/TWAIN\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwainDsmEntryIccprofile\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_MEMORY twmemory\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/Library/Frameworks/TWAINDSM.framework/TWAINDSM\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwaindsmDsmEntryIccprofile\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_MEMORY twmemory\r\n        );\r\n\r\n        /// <summary>\r\n        /// Use this for DG_IMAGE / DAT.IMAGEFILEXFER / MSG.* calls...\r\n        /// </summary>\r\n        /// <param name=\"origin\"></param>\r\n        /// <param name=\"dest\"></param>\r\n        /// <param name=\"dg\"></param>\r\n        /// <param name=\"dat\"></param>\r\n        /// <param name=\"msg\"></param>\r\n        /// <param name=\"twmemref\"></param>\r\n        /// <returns></returns>\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twain_32.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwain32DsmEntryImagefilexfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            IntPtr twmemref\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twaindsm.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwaindsmDsmEntryImagefilexfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            IntPtr twmemref\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 LinuxDsmEntryImagefilexfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            IntPtr twmemref\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib64/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux64DsmEntryImagefilexfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            IntPtr twmemref\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so.2.3.2\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux020302Dsm64bitEntryImagefilexfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY origin,\r\n            ref TWAIN.TW_IDENTITY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            IntPtr twmemref\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/System/Library/Frameworks/TWAIN.framework/TWAIN\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwainDsmEntryImagefilexfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            IntPtr twmemref\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/Library/Frameworks/TWAINDSM.framework/TWAINDSM\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwaindsmDsmEntryImagefilexfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            IntPtr twmemref\r\n        );\r\n\r\n        /// <summary>\r\n        /// Use this for DG_IMAGE / DAT.IMAGEINFO / MSG.* calls...\r\n        /// </summary>\r\n        /// <param name=\"origin\"></param>\r\n        /// <param name=\"dest\"></param>\r\n        /// <param name=\"dg\"></param>\r\n        /// <param name=\"dat\"></param>\r\n        /// <param name=\"msg\"></param>\r\n        /// <param name=\"twimageinfo\"></param>\r\n        /// <returns></returns>\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twain_32.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwain32DsmEntryImageinfo\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_IMAGEINFO twimageinfo\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twaindsm.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwaindsmDsmEntryImageinfo\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_IMAGEINFO twimageinfo\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 LinuxDsmEntryImageinfo\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_IMAGEINFO twimageinfo\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib64/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux64DsmEntryImageinfo\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_IMAGEINFO twimageinfo\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so.2.3.2\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux020302Dsm64bitEntryImageinfo\r\n        (\r\n            ref TWAIN.TW_IDENTITY origin,\r\n            ref TWAIN.TW_IDENTITY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_IMAGEINFO_LINUX64 twimageinfolinux64\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/System/Library/Frameworks/TWAIN.framework/TWAIN\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwainDsmEntryImageinfo\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_IMAGEINFO twimageinfo\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/Library/Frameworks/TWAINDSM.framework/TWAINDSM\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwaindsmDsmEntryImageinfo\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_IMAGEINFO twimageinfo\r\n        );\r\n\r\n        /// <summary>\r\n        /// Use this for DG_IMAGE / DAT.IMAGELAYOUT / MSG.* calls...\r\n        /// </summary>\r\n        /// <param name=\"origin\"></param>\r\n        /// <param name=\"dest\"></param>\r\n        /// <param name=\"dg\"></param>\r\n        /// <param name=\"dat\"></param>\r\n        /// <param name=\"msg\"></param>\r\n        /// <param name=\"twimagelayout\"></param>\r\n        /// <returns></returns>\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twain_32.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwain32DsmEntryImagelayout\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_IMAGELAYOUT twimagelayout\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twaindsm.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwaindsmDsmEntryImagelayout\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_IMAGELAYOUT twimagelayout\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 LinuxDsmEntryImagelayout\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_IMAGELAYOUT twimagelayout\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib64/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux64DsmEntryImagelayout\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_IMAGELAYOUT twimagelayout\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so.2.3.2\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux020302Dsm64bitEntryImagelayout\r\n        (\r\n            ref TWAIN.TW_IDENTITY origin,\r\n            ref TWAIN.TW_IDENTITY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_IMAGELAYOUT twimagelayout\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/System/Library/Frameworks/TWAIN.framework/TWAIN\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwainDsmEntryImagelayout\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_IMAGELAYOUT twimagelayout\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/Library/Frameworks/TWAINDSM.framework/TWAINDSM\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwaindsmDsmEntryImagelayout\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_IMAGELAYOUT twimagelayout\r\n        );\r\n\r\n        /// <summary>\r\n        /// Use this for DG_IMAGE / DAT.IMAGEMEMFILEXFER / MSG.* calls...\r\n        /// </summary>\r\n        /// <param name=\"origin\"></param>\r\n        /// <param name=\"dest\"></param>\r\n        /// <param name=\"dg\"></param>\r\n        /// <param name=\"dat\"></param>\r\n        /// <param name=\"msg\"></param>\r\n        /// <param name=\"twimagememxfer\"></param>\r\n        /// <returns></returns>\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twain_32.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwain32DsmEntryImagememfilexfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_IMAGEMEMXFER twimagememxfer\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twaindsm.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwaindsmDsmEntryImagememfilexfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_IMAGEMEMXFER twimagememxfer\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 LinuxDsmEntryImagememfilexfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_IMAGEMEMXFER twimagememxfer\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib64/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux64DsmEntryImagememfilexfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_IMAGEMEMXFER twimagememxfer\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so.2.3.2\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux020302Dsm64bitEntryImagememfilexfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY origin,\r\n            ref TWAIN.TW_IDENTITY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_IMAGEMEMXFER_LINUX64 twimagememxferlinux64\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/System/Library/Frameworks/TWAIN.framework/TWAIN\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwainDsmEntryImagememfilexfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_IMAGEMEMXFER_MACOSX twimagememxfer\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/Library/Frameworks/TWAINDSM.framework/TWAINDSM\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwaindsmDsmEntryImagememfilexfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_IMAGEMEMXFER_MACOSX twimagememxfer\r\n        );\r\n\r\n        /// <summary>\r\n        /// Use this for DG_IMAGE / DAT.IMAGEMEMXFER / MSG.* calls...\r\n        /// </summary>\r\n        /// <param name=\"origin\"></param>\r\n        /// <param name=\"dest\"></param>\r\n        /// <param name=\"dg\"></param>\r\n        /// <param name=\"dat\"></param>\r\n        /// <param name=\"msg\"></param>\r\n        /// <param name=\"twimagememxfer\"></param>\r\n        /// <returns></returns>\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twain_32.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwain32DsmEntryImagememxfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_IMAGEMEMXFER twimagememxfer\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twaindsm.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwaindsmDsmEntryImagememxfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_IMAGEMEMXFER twimagememxfer\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 LinuxDsmEntryImagememxfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_IMAGEMEMXFER twimagememxfer\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib64/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux64DsmEntryImagememxfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_IMAGEMEMXFER twimagememxfer\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so.2.3.2\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux020302Dsm64bitEntryImagememxfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY origin,\r\n            ref TWAIN.TW_IDENTITY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_IMAGEMEMXFER_LINUX64 twimagememxferlinux64\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/System/Library/Frameworks/TWAIN.framework/TWAIN\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwainDsmEntryImagememxfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_IMAGEMEMXFER_MACOSX twimagememxfer\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/Library/Frameworks/TWAINDSM.framework/TWAINDSM\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwaindsmDsmEntryImagememxfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_IMAGEMEMXFER_MACOSX twimagememxfer\r\n        );\r\n\r\n        /// <summary>\r\n        /// Use this for DG_IMAGE / DAT.IMAGENATIVEXFER / MSG.* calls...\r\n        /// </summary>\r\n        /// <param name=\"origin\"></param>\r\n        /// <param name=\"dest\"></param>\r\n        /// <param name=\"dg\"></param>\r\n        /// <param name=\"dat\"></param>\r\n        /// <param name=\"msg\"></param>\r\n        /// <param name=\"bitmap\"></param>\r\n        /// <returns></returns>\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twain_32.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwain32DsmEntryImagenativexfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref IntPtr intptrBitmap\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twaindsm.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwaindsmDsmEntryImagenativexfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref IntPtr intptrBitmap\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 LinuxDsmEntryImagenativexfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref IntPtr intptrBitmap\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib64/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux64DsmEntryImagenativexfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref IntPtr intptrBitmap\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so.2.3.2\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux020302Dsm64bitEntryImagenativexfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY origin,\r\n            ref TWAIN.TW_IDENTITY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref IntPtr intptrBitmap\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/System/Library/Frameworks/TWAIN.framework/TWAIN\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwainDsmEntryImagenativexfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref IntPtr intptrBitmap\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/Library/Frameworks/TWAINDSM.framework/TWAINDSM\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwaindsmDsmEntryImagenativexfer\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref IntPtr intptrBitmap\r\n        );\r\n\r\n        /// <summary>\r\n        /// Use this for DG_IMAGE / DAT.JPEGCOMPRESSION / MSG.* calls...\r\n        /// </summary>\r\n        /// <param name=\"origin\"></param>\r\n        /// <param name=\"dest\"></param>\r\n        /// <param name=\"dg\"></param>\r\n        /// <param name=\"dat\"></param>\r\n        /// <param name=\"msg\"></param>\r\n        /// <param name=\"twjpegcompression\"></param>\r\n        /// <returns></returns>\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twain_32.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwain32DsmEntryJpegcompression\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_JPEGCOMPRESSION twjpegcompression\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twaindsm.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwaindsmDsmEntryJpegcompression\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_JPEGCOMPRESSION twjpegcompression\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 LinuxDsmEntryJpegcompression\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_JPEGCOMPRESSION twjpegcompression\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib64/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux64DsmEntryJpegcompression\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_JPEGCOMPRESSION twjpegcompression\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so.2.3.2\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux020302Dsm64bitEntryJpegcompression\r\n        (\r\n            ref TWAIN.TW_IDENTITY origin,\r\n            ref TWAIN.TW_IDENTITY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_JPEGCOMPRESSION twjpegcompression\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/System/Library/Frameworks/TWAIN.framework/TWAIN\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwainDsmEntryJpegcompression\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_JPEGCOMPRESSION twjpegcompression\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/Library/Frameworks/TWAINDSM.framework/TWAINDSM\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwaindsmDsmEntryJpegcompression\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_JPEGCOMPRESSION twjpegcompression\r\n        );\r\n\r\n        /// <summary>\r\n        /// Use this for DG_CONTROL / DAT.METRICS / MSG.* calls...\r\n        /// </summary>\r\n        /// <param name=\"origin\"></param>\r\n        /// <param name=\"dest\"></param>\r\n        /// <param name=\"dg\"></param>\r\n        /// <param name=\"dat\"></param>\r\n        /// <param name=\"msg\"></param>\r\n        /// <param name=\"twmetrics\"></param>\r\n        /// <returns></returns>\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twain_32.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwain32DsmEntryMetrics\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_METRICS twmetrics\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twaindsm.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwaindsmDsmEntryMetrics\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_METRICS twmetrics\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 LinuxDsmEntryMetrics\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_METRICS twmetrics\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib64/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux64DsmEntryMetrics\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_METRICS twmetrics\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so.2.3.2\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux020302Dsm64bitEntryMetrics\r\n        (\r\n            ref TWAIN.TW_IDENTITY origin,\r\n            ref TWAIN.TW_IDENTITY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_METRICS twmetrics\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/System/Library/Frameworks/TWAIN.framework/TWAIN\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwainDsmEntryMetrics\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_METRICS twmetrics\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/Library/Frameworks/TWAINDSM.framework/TWAINDSM\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwaindsmDsmEntryMetrics\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_METRICS twmetrics\r\n        );\r\n\r\n        /// <summary>\r\n        /// Use this for DG_IMAGE / DAT.PALETTE8 / MSG.* calls...\r\n        /// </summary>\r\n        /// <param name=\"origin\"></param>\r\n        /// <param name=\"dest\"></param>\r\n        /// <param name=\"dg\"></param>\r\n        /// <param name=\"dat\"></param>\r\n        /// <param name=\"msg\"></param>\r\n        /// <param name=\"twpalette8\"></param>\r\n        /// <returns></returns>\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twain_32.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwain32DsmEntryPalette8\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_PALETTE8 twpalette8\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twaindsm.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwaindsmDsmEntryPalette8\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_PALETTE8 twpalette8\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 LinuxDsmEntryPalette8\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_PALETTE8 twpalette8\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib64/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux64DsmEntryPalette8\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_PALETTE8 twpalette8\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so.2.3.2\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux020302Dsm64bitEntryPalette8\r\n        (\r\n            ref TWAIN.TW_IDENTITY origin,\r\n            ref TWAIN.TW_IDENTITY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_PALETTE8 twpalette8\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/System/Library/Frameworks/TWAIN.framework/TWAIN\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwainDsmEntryPalette8\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_PALETTE8 twpalette8\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/Library/Frameworks/TWAINDSM.framework/TWAINDSM\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwaindsmDsmEntryPalette8\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_PALETTE8 twpalette8\r\n        );\r\n\r\n        /// <summary>\r\n        /// Use this for DG_IMAGE / DAT.RGBRESPONSE / MSG.* calls...\r\n        /// </summary>\r\n        /// <param name=\"origin\"></param>\r\n        /// <param name=\"dest\"></param>\r\n        /// <param name=\"dg\"></param>\r\n        /// <param name=\"dat\"></param>\r\n        /// <param name=\"msg\"></param>\r\n        /// <param name=\"twrgbresponse\"></param>\r\n        /// <returns></returns>\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twain_32.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwain32DsmEntryRgbresponse\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_RGBRESPONSE twrgbresponse\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"twaindsm.dll\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 WindowsTwaindsmDsmEntryRgbresponse\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_RGBRESPONSE twrgbresponse\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 LinuxDsmEntryRgbresponse\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_RGBRESPONSE twrgbresponse\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib64/libtwaindsm.so\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux64DsmEntryRgbresponse\r\n        (\r\n            ref TWAIN.TW_IDENTITY_LEGACY origin,\r\n            ref TWAIN.TW_IDENTITY_LEGACY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_RGBRESPONSE twrgbresponse\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/usr/local/lib/libtwaindsm.so.2.3.2\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 Linux020302Dsm64bitEntryRgbresponse\r\n        (\r\n            ref TWAIN.TW_IDENTITY origin,\r\n            ref TWAIN.TW_IDENTITY dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_RGBRESPONSE twrgbresponse\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/System/Library/Frameworks/TWAIN.framework/TWAIN\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwainDsmEntryRgbresponse\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_RGBRESPONSE twrgbresponse\r\n        );\r\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\")]\r\n        [DllImport(\"/Library/Frameworks/TWAINDSM.framework/TWAINDSM\", EntryPoint = \"DSM_Entry\", CharSet = CharSet.Ansi)]\r\n        internal static extern UInt16 MacosxTwaindsmDsmEntryRgbresponse\r\n        (\r\n            ref TWAIN.TW_IDENTITY_MACOSX origin,\r\n            ref TWAIN.TW_IDENTITY_MACOSX dest,\r\n            TWAIN.DG dg,\r\n            TWAIN.DAT dat,\r\n            TWAIN.MSG msg,\r\n            ref TWAIN.TW_RGBRESPONSE twrgbresponse\r\n        );\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "twaincs/source/twaincs.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <PropertyGroup>\r\n    <ProductVersion>15.0.27428.2005</ProductVersion>\r\n    <ImplicitlyExpandNETStandardFacades>false</ImplicitlyExpandNETStandardFacades>\r\n    <DisableHandlePackageFileConflicts>true</DisableHandlePackageFileConflicts>\r\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\r\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\r\n    <ProjectGuid>{E00DEC90-0A85-47D5-B0E4-39940AF8C141}</ProjectGuid>\r\n    <OutputType>Library</OutputType>\r\n    <NoStandardLibraries>false</NoStandardLibraries>\r\n    <AppDesignerFolder>Properties</AppDesignerFolder>\r\n    <AssemblyName>TWAIN</AssemblyName>\r\n    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>\r\n    <FileAlignment>512</FileAlignment>\r\n    <TargetFrameworkProfile />\r\n    <SccProjectName>\r\n    </SccProjectName>\r\n    <SccLocalPath>\r\n    </SccLocalPath>\r\n    <SccAuxPath>\r\n    </SccAuxPath>\r\n    <SccProvider>\r\n    </SccProvider>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <DebugType>full</DebugType>\r\n    <Optimize>false</Optimize>\r\n    <OutputPath>bin\\AnyCPU\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n    <RunCodeAnalysis>true</RunCodeAnalysis>\r\n    <Prefer32Bit>false</Prefer32Bit>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\r\n    <DebugType>pdbonly</DebugType>\r\n    <Optimize>true</Optimize>\r\n    <OutputPath>bin\\AnyCPU\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n    <RunCodeAnalysis>true</RunCodeAnalysis>\r\n    <Prefer32Bit>false</Prefer32Bit>\r\n  </PropertyGroup>\r\n  <PropertyGroup>\r\n    <RootNamespace>TWAINWorkingGroup</RootNamespace>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|x64'\">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <OutputPath>bin\\x64\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <DebugType>full</DebugType>\r\n    <PlatformTarget>x64</PlatformTarget>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>\r\n    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>\r\n    <RunCodeAnalysis>true</RunCodeAnalysis>\r\n    <Prefer32Bit>false</Prefer32Bit>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|x64'\">\r\n    <OutputPath>bin\\x64\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <Optimize>true</Optimize>\r\n    <DebugType>pdbonly</DebugType>\r\n    <PlatformTarget>x64</PlatformTarget>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>\r\n    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>\r\n    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>\r\n    <RunCodeAnalysis>true</RunCodeAnalysis>\r\n    <Prefer32Bit>false</Prefer32Bit>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|x86'\">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <OutputPath>bin\\x86\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <DebugType>full</DebugType>\r\n    <PlatformTarget>x86</PlatformTarget>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>\r\n    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>\r\n    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>\r\n    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>\r\n    <RunCodeAnalysis>true</RunCodeAnalysis>\r\n    <Prefer32Bit>false</Prefer32Bit>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|x86'\">\r\n    <OutputPath>bin\\x86\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <Optimize>true</Optimize>\r\n    <DebugType>pdbonly</DebugType>\r\n    <PlatformTarget>x86</PlatformTarget>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>\r\n    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>\r\n    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>\r\n    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>\r\n    <RunCodeAnalysis>true</RunCodeAnalysis>\r\n    <Prefer32Bit>false</Prefer32Bit>\r\n  </PropertyGroup>\r\n  <ItemGroup>\r\n    <Reference Include=\"Microsoft.CSharp\" />\r\n    <Reference Include=\"System\" />\r\n    <Reference Include=\"System.Drawing\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\r\n    <Compile Include=\"TWAIN.cs\" />\r\n    <Compile Include=\"TWAINH.cs\" />\r\n  </ItemGroup>\r\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSHARP.Targets\" />\r\n  <ProjectExtensions>\r\n    <VisualStudio AllowExistingFolder=\"true\" />\r\n  </ProjectExtensions>\r\n  <PropertyGroup>\r\n    <PostBuildEvent>\r\n    </PostBuildEvent>\r\n  </PropertyGroup>\r\n</Project>"
  },
  {
    "path": "twaincs/source/twaincs.sln",
    "content": "﻿\r\nMicrosoft Visual Studio Solution File, Format Version 12.00\r\n# Visual Studio 15\r\nVisualStudioVersion = 15.0.28307.572\r\nMinimumVisualStudioVersion = 10.0.40219.1\r\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"twaincs\", \"twaincs.csproj\", \"{E00DEC90-0A85-47D5-B0E4-39940AF8C141}\"\r\nEndProject\r\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"twaincstst\", \"twaincstst\\source\\twaincstst.csproj\", \"{7D3F078C-BAE8-4975-9EBA-F162ABD64BBD}\"\r\n\tProjectSection(ProjectDependencies) = postProject\r\n\t\t{E00DEC90-0A85-47D5-B0E4-39940AF8C141} = {E00DEC90-0A85-47D5-B0E4-39940AF8C141}\r\n\tEndProjectSection\r\nEndProject\r\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"twaincsscan\", \"twaincsscan\\source\\twaincsscan.csproj\", \"{DE8AC167-CFF1-446D-9145-29179CA1B472}\"\r\n\tProjectSection(ProjectDependencies) = postProject\r\n\t\t{E00DEC90-0A85-47D5-B0E4-39940AF8C141} = {E00DEC90-0A85-47D5-B0E4-39940AF8C141}\r\n\tEndProjectSection\r\nEndProject\r\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"twaincscert\", \"twaincscert\\source\\twaincscert.csproj\", \"{ED11A4C1-1C03-4092-B1FA-F1D35C47D59E}\"\r\n\tProjectSection(ProjectDependencies) = postProject\r\n\t\t{E00DEC90-0A85-47D5-B0E4-39940AF8C141} = {E00DEC90-0A85-47D5-B0E4-39940AF8C141}\r\n\tEndProjectSection\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|Any CPU = Debug|Any CPU\r\n\t\tDebug|x64 = Debug|x64\r\n\t\tDebug|x86 = Debug|x86\r\n\t\tRelease|Any CPU = Release|Any CPU\r\n\t\tRelease|x64 = Release|x64\r\n\t\tRelease|x86 = Release|x86\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{E00DEC90-0A85-47D5-B0E4-39940AF8C141}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\r\n\t\t{E00DEC90-0A85-47D5-B0E4-39940AF8C141}.Debug|Any CPU.Build.0 = Debug|Any CPU\r\n\t\t{E00DEC90-0A85-47D5-B0E4-39940AF8C141}.Debug|x64.ActiveCfg = Debug|x64\r\n\t\t{E00DEC90-0A85-47D5-B0E4-39940AF8C141}.Debug|x64.Build.0 = Debug|x64\r\n\t\t{E00DEC90-0A85-47D5-B0E4-39940AF8C141}.Debug|x86.ActiveCfg = Debug|x86\r\n\t\t{E00DEC90-0A85-47D5-B0E4-39940AF8C141}.Debug|x86.Build.0 = Debug|x86\r\n\t\t{E00DEC90-0A85-47D5-B0E4-39940AF8C141}.Release|Any CPU.ActiveCfg = Release|Any CPU\r\n\t\t{E00DEC90-0A85-47D5-B0E4-39940AF8C141}.Release|Any CPU.Build.0 = Release|Any CPU\r\n\t\t{E00DEC90-0A85-47D5-B0E4-39940AF8C141}.Release|x64.ActiveCfg = Release|x64\r\n\t\t{E00DEC90-0A85-47D5-B0E4-39940AF8C141}.Release|x64.Build.0 = Release|x64\r\n\t\t{E00DEC90-0A85-47D5-B0E4-39940AF8C141}.Release|x86.ActiveCfg = Release|x86\r\n\t\t{E00DEC90-0A85-47D5-B0E4-39940AF8C141}.Release|x86.Build.0 = Release|x86\r\n\t\t{7D3F078C-BAE8-4975-9EBA-F162ABD64BBD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\r\n\t\t{7D3F078C-BAE8-4975-9EBA-F162ABD64BBD}.Debug|Any CPU.Build.0 = Debug|Any CPU\r\n\t\t{7D3F078C-BAE8-4975-9EBA-F162ABD64BBD}.Debug|x64.ActiveCfg = Debug|x64\r\n\t\t{7D3F078C-BAE8-4975-9EBA-F162ABD64BBD}.Debug|x64.Build.0 = Debug|x64\r\n\t\t{7D3F078C-BAE8-4975-9EBA-F162ABD64BBD}.Debug|x86.ActiveCfg = Debug|x86\r\n\t\t{7D3F078C-BAE8-4975-9EBA-F162ABD64BBD}.Debug|x86.Build.0 = Debug|x86\r\n\t\t{7D3F078C-BAE8-4975-9EBA-F162ABD64BBD}.Release|Any CPU.ActiveCfg = Release|Any CPU\r\n\t\t{7D3F078C-BAE8-4975-9EBA-F162ABD64BBD}.Release|Any CPU.Build.0 = Release|Any CPU\r\n\t\t{7D3F078C-BAE8-4975-9EBA-F162ABD64BBD}.Release|x64.ActiveCfg = Release|x64\r\n\t\t{7D3F078C-BAE8-4975-9EBA-F162ABD64BBD}.Release|x64.Build.0 = Release|x64\r\n\t\t{7D3F078C-BAE8-4975-9EBA-F162ABD64BBD}.Release|x86.ActiveCfg = Release|x86\r\n\t\t{7D3F078C-BAE8-4975-9EBA-F162ABD64BBD}.Release|x86.Build.0 = Release|x86\r\n\t\t{DE8AC167-CFF1-446D-9145-29179CA1B472}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\r\n\t\t{DE8AC167-CFF1-446D-9145-29179CA1B472}.Debug|Any CPU.Build.0 = Debug|Any CPU\r\n\t\t{DE8AC167-CFF1-446D-9145-29179CA1B472}.Debug|x64.ActiveCfg = Debug|x64\r\n\t\t{DE8AC167-CFF1-446D-9145-29179CA1B472}.Debug|x64.Build.0 = Debug|x64\r\n\t\t{DE8AC167-CFF1-446D-9145-29179CA1B472}.Debug|x86.ActiveCfg = Debug|x86\r\n\t\t{DE8AC167-CFF1-446D-9145-29179CA1B472}.Debug|x86.Build.0 = Debug|x86\r\n\t\t{DE8AC167-CFF1-446D-9145-29179CA1B472}.Release|Any CPU.ActiveCfg = Release|Any CPU\r\n\t\t{DE8AC167-CFF1-446D-9145-29179CA1B472}.Release|Any CPU.Build.0 = Release|Any CPU\r\n\t\t{DE8AC167-CFF1-446D-9145-29179CA1B472}.Release|x64.ActiveCfg = Release|x64\r\n\t\t{DE8AC167-CFF1-446D-9145-29179CA1B472}.Release|x64.Build.0 = Release|x64\r\n\t\t{DE8AC167-CFF1-446D-9145-29179CA1B472}.Release|x86.ActiveCfg = Release|x86\r\n\t\t{DE8AC167-CFF1-446D-9145-29179CA1B472}.Release|x86.Build.0 = Release|x86\r\n\t\t{ED11A4C1-1C03-4092-B1FA-F1D35C47D59E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\r\n\t\t{ED11A4C1-1C03-4092-B1FA-F1D35C47D59E}.Debug|Any CPU.Build.0 = Debug|Any CPU\r\n\t\t{ED11A4C1-1C03-4092-B1FA-F1D35C47D59E}.Debug|x64.ActiveCfg = Debug|x64\r\n\t\t{ED11A4C1-1C03-4092-B1FA-F1D35C47D59E}.Debug|x64.Build.0 = Debug|x64\r\n\t\t{ED11A4C1-1C03-4092-B1FA-F1D35C47D59E}.Debug|x86.ActiveCfg = Debug|x86\r\n\t\t{ED11A4C1-1C03-4092-B1FA-F1D35C47D59E}.Debug|x86.Build.0 = Debug|x86\r\n\t\t{ED11A4C1-1C03-4092-B1FA-F1D35C47D59E}.Release|Any CPU.ActiveCfg = Release|Any CPU\r\n\t\t{ED11A4C1-1C03-4092-B1FA-F1D35C47D59E}.Release|Any CPU.Build.0 = Release|Any CPU\r\n\t\t{ED11A4C1-1C03-4092-B1FA-F1D35C47D59E}.Release|x64.ActiveCfg = Release|x64\r\n\t\t{ED11A4C1-1C03-4092-B1FA-F1D35C47D59E}.Release|x64.Build.0 = Release|x64\r\n\t\t{ED11A4C1-1C03-4092-B1FA-F1D35C47D59E}.Release|x86.ActiveCfg = Release|x86\r\n\t\t{ED11A4C1-1C03-4092-B1FA-F1D35C47D59E}.Release|x86.Build.0 = Release|x86\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\n\tGlobalSection(ExtensibilityGlobals) = postSolution\r\n\t\tSolutionGuid = {9B80A60B-1770-4684-B075-19CC3FDAEB35}\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/FormMain.Designer.cs",
    "content": "﻿namespace twaincscert\n{\n    partial class FormMain\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.SuspendLayout();\n            // \n            // FormMain\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.ClientSize = new System.Drawing.Size(285, 193);\n            this.Name = \"FormMain\";\n            this.Opacity = 0D;\n            this.ShowInTaskbar = false;\n            this.Text = \"FormMain\";\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n    }\n}"
  },
  {
    "path": "twaincs/source/twaincscert/source/FormMain.cs",
    "content": "﻿using System;\nusing System.Security.Permissions;\nusing System.Threading;\nusing System.Windows.Forms;\nusing TWAINWorkingGroup;\n\nnamespace twaincscert\n{\n    public partial class FormMain : Form, IMessageFilter\n    {\n        /// <summary>\n        /// Our constructor...\n        /// </summary>\n        public FormMain()\n        {\n            // Not much going on here, because we never show this form...\n            InitializeComponent();\n            SetMessageFilter(true);\n        }\n\n        /// <summary>\n        /// Prevent us from getting the focus, so we don't steal it from\n        /// our console...\n        /// </summary>\n        protected override bool ShowWithoutActivation\n        {\n            get\n            {\n                return (true);\n            }\n        }\n\n        /// <summary>\n        /// Monitor for DG_CONTROL / DAT_NULL / MSG_* stuff (ex MSG_XFERREADY), this\n        /// function is only triggered when SetMessageFilter() is called with 'true'...\n        /// </summary>\n        /// <param name=\"a_message\">Message to process</param>\n        /// <returns>Result of the processing</returns>\n        [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]\n        public bool PreFilterMessage(ref Message a_message)\n        {\n            if (m_terminal != null)\n            {\n                return (m_terminal.PreFilterMessage(a_message.HWnd, a_message.Msg, a_message.WParam, a_message.LParam));\n            }\n            return (true);\n        }\n\n        /// <summary>\n        /// Turn message filtering on or off, we use this to capture stuff\n        /// like MSG_XFERREADY.  If it's off, then it's assumed we're getting\n        /// this info through DAT_CALLBACK2...\n        /// </summary>\n        /// <param name=\"a_blAdd\">True to turn it on</param>\n        public void SetMessageFilter(bool a_blAdd)\n        {\n            if (a_blAdd)\n            {\n                Application.AddMessageFilter(this);\n            }\n            else\n            {\n                Application.RemoveMessageFilter(this);\n            }\n        }\n\n        /// <summary>\n        /// Link us to our terminal object...\n        /// </summary>\n        /// <param name=\"a_terminal\">our terminal object</param>\n        public void SetTerminal(Terminal a_terminal)\n        {\n            m_terminal = a_terminal;\n        }\n\n        /// <summary>\n        /// Our event handler for the scan callback event.  This will be\n        /// called once by ScanCallbackTrigger on receipt of an event\n        /// like MSG_XFERREADY, and then will be reissued on every call\n        /// into ScanCallback until we're done and get back to state 4.\n        ///  \n        /// This helps to make sure we're always running in the context\n        /// of FormMain on Windows, which is critical if we want drivers\n        /// to work properly.  It also gives a way to break up the calls\n        /// so the message pump is still responsive.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        public void ScanCallbackEventHandler(object sender, EventArgs e)\n        {\n            m_terminal.ScanCallback((m_terminal.GetTwain() == null) ? true : (m_terminal.GetTwain().GetState() <= TWAIN.STATE.S3));\n        }\n\n        /// <summary>\n        /// Private attributes...\n        /// </summary>\n        private Terminal m_terminal = null;\n    }\n}\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/FormMain.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "twaincs/source/twaincscert/source/MsBuildAL1073WarningWorkaround.targets",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n    <Target Name=\"MsBuildAL1073WarningWorkaround\" BeforeTargets=\"BeforeBuild\" >\n        <PropertyGroup Condition=\"'$(Platform)' == 'x64'\">\n            <TargetFrameworkSDKToolsDirectory>$(TargetFrameworkSDKToolsDirectory)$(Platform)\\</TargetFrameworkSDKToolsDirectory>\n        </PropertyGroup>\n    </Target>\n</Project>"
  },
  {
    "path": "twaincs/source/twaincscert/source/Program.cs",
    "content": "﻿///////////////////////////////////////////////////////////////////////////////////////\n//\n//  twaincscert.Program\n//\n//  Our entry point.\n//\n///////////////////////////////////////////////////////////////////////////////////////\n//  Author          Date            Comment\n//  M.McLaughlin    13-Jan-2020     Initial Release\n///////////////////////////////////////////////////////////////////////////////////////\n//  Copyright (C) 2020-2021 Kodak Alaris Inc.\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a\n//  copy of this software and associated documentation files (the \"Software\"),\n//  to deal in the Software without restriction, including without limitation\n//  the rights to use, copy, modify, merge, publish, distribute, sublicense,\n//  and/or sell copies of the Software, and to permit persons to whom the\n//  Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\n//  THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n//  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n//  DEALINGS IN THE SOFTWARE.\n///////////////////////////////////////////////////////////////////////////////////////\n\n// Helpers...\nusing System;\nusing System.Threading;\nusing System.Windows.Forms;\nusing TWAINWorkingGroup;\n\nnamespace twaincscert\n{\n    static class Program\n    {\n        /// <summary>\n        /// The main entry point for the application.\n        /// </summary>\n        /// <param name=\"a_aszArgs\">interesting arguments</param>\n        [STAThread]\n        static void Main(string[] a_aszArgs)\n        {\n            string szExecutableName;\n            string szWriteFolder;\n\n            // Load our configuration information and our arguments,\n            // so that we can access them from anywhere in the code...\n            if (!Config.Load(System.Reflection.Assembly.GetEntryAssembly().Location, a_aszArgs, \"appdata.txt\"))\n            {\n                Console.Out.WriteLine(\"Error starting.  Try uninstalling and reinstalling this software.\");\n                Environment.Exit(1);\n            }\n\n            // Set up our data folders...\n            szWriteFolder = Config.Get(\"writeFolder\", \"\");\n            szExecutableName = Config.Get(\"executableName\", \"\");\n\n            // Turn on logging...\n            Log.Open(szExecutableName, szWriteFolder, 1);\n            Log.SetLevel((int)Config.Get(\"logLevel\", 0));\n            Log.Info(szExecutableName + \" Log Started...\");\n\n            // Windows needs a window, we need our console and window\n            // in different threads for full control...\n            if (TWAIN.GetPlatform() == TWAIN.Platform.WINDOWS)\n            {\n                // Init our form...\n                Application.EnableVisualStyles();\n                Application.SetCompatibleTextRenderingDefault(false);\n                FormMain formmain = new FormMain();\n\n                // Launch the terminal window, we're doing this in\n                // a thread so we can have a console and a form.  When\n                // the thread is done there's no reason to be subtle,\n                // we can exit the application...\n                Terminal terminal = new twaincscert.Terminal(formmain);\n                Thread threadTerminal = new Thread(\n                    new ThreadStart(\n                        delegate ()\n                        {\n                            terminal.Run();\n                            Environment.Exit(0);\n                        }\n                    )\n                );\n                threadTerminal.Start();\n\n                // Run our form, the exit above will kill it off...\n                formmain.SetTerminal(terminal);\n                Application.Run(formmain);\n            }\n\n            // Linux and Mac come here, life is much simpler for them...\n            else\n            {\n                Terminal terminal = new twaincscert.Terminal(null);\n                terminal.Run();\n            }\n\n            // All done...\n            Log.Info(szExecutableName + \" Log Ended...\");\n            Log.Close();\n            Environment.Exit(0);\n        }\n    }\n}\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/Properties/AssemblyInfo.cs",
    "content": "﻿///////////////////////////////////////////////////////////////////////////////////////\n//\n// twaincscert AssemblyInfo\n//\n///////////////////////////////////////////////////////////////////////////////////////\n//  Author          Date            Comment\n//  M.McLaughlin    13-Jan-2020     Initial Release\n///////////////////////////////////////////////////////////////////////////////////////\n//  Copyright (C) 2020-2021 Kodak Alaris Inc.\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a\n//  copy of this software and associated documentation files (the \"Software\"),\n//  to deal in the Software without restriction, including without limitation\n//  the rights to use, copy, modify, merge, publish, distribute, sublicense,\n//  and/or sell copies of the Software, and to permit persons to whom the\n//  Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\n//  THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n//  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n//  DEALINGS IN THE SOFTWARE.\n///////////////////////////////////////////////////////////////////////////////////////\n\nusing System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"twaincscert\")]\n[assembly: AssemblyDescription(\"TWAIN Certification\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"Kodak Alaris Inc.\")]\n[assembly: AssemblyProduct(\"twaincscert\")]\n[assembly: AssemblyCopyright(\"Copyright © 2020-2020, Kodak Alaris Inc.\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"18d8384f-90a8-4fc1-aca9-60ec4c86b3a2\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n[assembly: AssemblyVersion(\"2.5.*\")]\n[assembly: AssemblyFileVersion(\"2.5.0.0\")]\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/Properties/Resources.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace twaincscert.Properties {\n    using System;\n    \n    \n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"15.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    internal class Resources {\n        \n        private static global::System.Resources.ResourceManager resourceMan;\n        \n        private static global::System.Globalization.CultureInfo resourceCulture;\n        \n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal Resources() {\n        }\n        \n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if (object.ReferenceEquals(resourceMan, null)) {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"twaincscert.Properties.Resources\", typeof(Resources).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n        \n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Byte[].\n        /// </summary>\n        internal static byte[] data {\n            get {\n                object obj = ResourceManager.GetObject(\"data\", resourceCulture);\n                return ((byte[])(obj));\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/Properties/Resources.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Windows.Forms\" name=\"System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" />\n  <data name=\"data\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>data.zip;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </data>\n</root>"
  },
  {
    "path": "twaincs/source/twaincscert/source/Properties/Settings.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace twaincscert.Properties {\n    \n    \n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator\", \"15.7.0.0\")]\n    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {\n        \n        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));\n        \n        public static Settings Default {\n            get {\n                return defaultInstance;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/Properties/Settings.settings",
    "content": "﻿<?xml version='1.0' encoding='utf-8'?>\n<SettingsFile xmlns=\"http://schemas.microsoft.com/VisualStudio/2004/01/settings\" CurrentProfile=\"(Default)\">\n  <Profiles>\n    <Profile Name=\"(Default)\" />\n  </Profiles>\n  <Settings />\n</SettingsFile>\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/app.config",
    "content": "<?xml version=\"1.0\"?>\n<configuration>\n  <startup>\n    <supportedRuntime version=\"v4.5\" />\n    <supportedRuntime version=\"v4.0.30319\" />\n    <supportedRuntime version=\"v4.0\" />\n    <supportedRuntime version=\"v2.0.50727\" />\n  </startup>\n</configuration>\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/010 - TWAIN Standard Capability Tests/CAP_SUPPORTEDCAPS.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; CAP_SUPPORTEDCAPS\n;   Confirm Basic Negotiation with CAP_SUPPORTEDCAPS\n;\n; Arguments\n;   arg:1 - TW_IDENTITY.ProductName of scanner to test\n;\n; Globals\n;   sys_capabilitytable - from LoadTables.tc\n;\n; Locals\n;   name - current test being done\n;   certifyresult - result of the tests\n;   supportedcaps - data from MSG_GET for CAP_SUPPORTEDCAPS\n;   capabilitytable.index - index of current value\n;   capabilitytable.value - current value based on capabilitytable.index\n;   capabilitytable.flags - current value's flags\n;\n; Returns\n;   pass or fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize...\n;\necho.titletest 'CAP_SUPPORTEDCAPS'\nsetlocal supportedcaps ''\nsetlocal certifyresult 'pass' ; assume success\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Check for TWAIN protocol 2.4 or higher\n; We won't abort on this, since it may be useful for folks to run the\n; tests, but we won't let it pass...\n;\nsetlocal name 'Check for TWAIN 2.4 protocol or higher'\nif '${ds:${get:TW_IDENTITY.ProtocolMajor}}' >= 3 goto MAIN.PROTOCOLVERSION.PASS ; >=3 is good\nif '${ds:${get:TW_IDENTITY.ProtocolMajor}}' < 2 goto MAIN.PROTOCOLVERSION.FAIL ; <2 is bad\nif '${ds:${get:TW_IDENTITY.ProtocolMinor}}' < 4 goto MAIN.PROTOCOLVERSION.FAIL ; <2.4 is bad\ngoto MAIN.PROTOCOLVERSION.PASS\n;\n:MAIN.PROTOCOLVERSION.FAIL\necho.passfail '${get:name}' 'fail - ${ds:${get:TW_IDENTITY.ProtocolMajor}}.${ds:${get:TW_IDENTITY.ProtocolMinor}}'\nsetlocal certifyresult 'fail'\ngoto MAIN.PROTOCOLVERSION.DONE\n;\n:MAIN.PROTOCOLVERSION.PASS\necho.passfail '${get:name}' 'pass'\n:MAIN.PROTOCOLVERSION.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; MSG_GET CAP_SUPPORTEDCAPS\n; If result is not TWRC_SUCCESS, then end with error\n;\nsetlocal name 'MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'CAP_SUPPORTEDCAPS,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:name}' 'pass'\nsetlocal supportedcaps '${ret:}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; If TW_CAPABILITY.Cap is not CAP_SUPPORTEDCAPS, then end with error\n;\nsetlocal name 'TW_CAPABILITY.Cap is CAP_SUPPORTEDCAPS'\nif '${getindex:supportedcaps:${get:TW_CAPABILITY.Cap}}' != 'CAP_SUPPORTEDCAPS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; If TW_CAPABILITY.ConType is not TWON_ARRAY, then end with error\n;\nsetlocal name 'TW_CAPABILITY.ConType is TWON_ARRAY'\nif '${getindex:supportedcaps:${get:TW_CAPABILITY.ConType}}' != 'TWON_ARRAY' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; If TW_ARRAY.ItemType is not TWTY_UINT16, then end with error\n;\nsetlocal name 'TW_ARRAY.ItemType is TWTY_UINT16'\nif '${getindex:supportedcaps:${get:TW_ARRAY.ItemType}}' != 'TWTY_UINT16' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; If TW_ARRAY.NumItems is equal to zero, then end with error\n;\nsetlocal name 'TW_ARRAY.NumItems > 0'\nif '${getindex:supportedcaps:${get:TW_ARRAY.NumItems}}' <= '0' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; SPECNOTE: the tests ask that CAP_SUPPORTEDCAPS, ICAP_PIXELTYPE, ICAP_XFERMECH be\n; confirmed, but the spec lists many manadatory capabilities.  So we'll go through\n; the table to identify them all.  Note the use of the extra commas to make sure we\n; correctly identify full items, and not substrings...\n;\nsetlocal name 'Check for mandatory capabilities'\nsetlocal capabilitytable.index '-1'\n;\n:MAIN.SUPPORTEDCAPS.NEXT\nincrement capabilitytable.index '${get:capabilitytable.index}' 1\nsetlocal capabilitytable.value '${getindex:sys_capabilitytable:${get:capabilitytable.index}}'\nif '${get:capabilitytable.value}' == '' goto MAIN.SUPPORTEDCAPS.DONE\nsetlocal capabilitytable.flags '${get:${get:capabilitytable.value}.Flags}' ; ex: ICAP_PIXELTYPE.Flags\nif '${get:capabilitytable.flags}' !~contains 'mandatory' goto MAIN.SUPPORTEDCAPS.NEXT ; if not mandatory, skip it\nif ',${get:supportedcaps},' !~contains ',${get:capabilitytable.value},' goto MAIN.ERROR.ECHOPASSFAIL\ngoto MAIN.SUPPORTEDCAPS.NEXT\n;\n:MAIN.SUPPORTEDCAPS.DONE\necho.passfail '${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Summary and cleanup...\n;\n; Did we pass?\nif '${get:certifyresult}' != 'pass' goto MAIN.ERROR\necho.passfail 'SUMMARY' 'pass'\nreturn 'pass'\n;\n; Ruh-roh...\n:MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:name}' 'fail - ${sts:} ${ret:}'\n:MAIN.ERROR\necho.passfail 'SUMMARY' 'fail'\nreturn 'fail'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/010 - TWAIN Standard Capability Tests/Certification.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; TWAIN Standard Capability Tests\n;   Test for capabilties described in the specification.\n;\n; Arguments\n;   arg:1 - TW_IDENTITY.ProductName of scanner to test\n;   arg:2 - global to set on fail\n;\n; Globals\n;   (none)\n;\n; Locals\n;   twidentity.productname - product name of scanner to test\n;   certifyresult - global to set on fail\n;\n; Returns\n;   (none)\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize stuff, load tables if not already done for us...\n;\necho.titlesuite 'TWAIN Standard Capability Tests v1.0 23-Feb-2020'\nsetlocal twidentity.productname '${arg:1}'\nsetlocal certifyresult '${arg:2}'\nif '${get:TW_ARRAY.ItemType}' != '' goto MAIN.LOADTABLES.SKIP\nrun '${folder:certification}/LoadTables'\n:MAIN.LOADTABLES.SKIP\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Run the tests...\n;\ncall CERTIFY '${folder:certification}/Opends'  '${get:twidentity.productname}' '${get:certifyresult}'\nif '${get:${get:certifyresult}}' == 'fail' goto MAIN.CLOSEDS\ncall CERTIFY 'CAP_SUPPORTEDCAPS'               '${get:twidentity.productname}' '${get:certifyresult}'\ncall CERTIFY 'ICAP_PIXELTYPE'                  '${get:twidentity.productname}' '${get:certifyresult}'\ncall CERTIFY 'ICAP_XFERMECH'                   '${get:twidentity.productname}' '${get:certifyresult}'\ncall CERTIFY 'DAT_CAPABILITY'                  '${get:twidentity.productname}' '${get:certifyresult}'\n:MAIN.CLOSEDS\ncall CERTIFY '${folder:certification}/Closeds' '${get:twidentity.productname}' '${get:certifyresult}'\nreturn\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Function: Certify\n; arg:1 - script to run\n; arg:2 - TW_IDENTITY.ProductName of scanner to test\n; arg:3 - global value to update on fail\n; returns: (none)\n;\n:CERTIFY\n;\nrun '${arg:1}' '${arg:2}'\nif '${ret:}' != 'pass' goto CERTIFY.FAIL\nreturn 'pass'\n;\n:CERTIFY.FAIL\nsetglobal '${arg:3}' 'fail'\nreturn 'fail'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/010 - TWAIN Standard Capability Tests/DAT_CAPABILITY.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DAT_CAPABILITY\n;   Exercise DAT_CAPABILITY for the standard TWAIN capabilities\n;\n; Arguments\n;   arg:1 - TW_IDENTITY.ProductName of scanner to test\n;\n; Globals\n;   g_datcapabilityresult - pass/fail for the entire test\n;   g_querysupport - numeric value of query support for a capability\n;   g_pixeltype.value - for restoring pixel type\n;\n; Locals\n;   name - current test being done\n;   indent - amount to indent echo.passfail\n;\n;   pixeltype.itemlist - list of pixeltypes to check\n;   pixeltype.index - index of current pixeltype being checked\n;\n;   supportedcaps - data from MSG_GET for CAP_SUPPORTEDCAPS\n;   supportedcaps.index - index of capability from supportedcaps\n;   supportedcaps.value - current cap value for supportedcaps.index\n;\n; Returns\n;   pass or fail\n;\n; History\n;   v1.0 21-Feb-2020 - first version\n;   v1.1 29-Apr-2020 - fixed MSG_SET test to use TW_ONEVALUE, per the spec\n;   v1.2 03-Jun-2020 - skip MSG_SET if any previous test failed\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize...\n;\necho.titletest 'DAT_CAPABILITY'\nsetlocal indent ''\nsetlocal pixeltype.itemlist 'TWPT_BW,TWPT_GRAY,TWPT_RGB'\nsetlocal pixeltype.index '-1'\nsetglobal g_datcapabilityresult 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; MSG_RESETALL\n; If return code is not TWRC_SUCCESS, end with an error\n;\nsetlocal name 'MSG_RESETALL'\ndsmentry src ds dg_control dat_capability msg_resetall '0,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Repeat this section for each enumerated value found inside of ICAP_PIXELTYPE, \n; (testing is done for each value of ICAP_PIXELTYPE, to provide the best chance\n; of exercising every available capability).  Remember the pixeltype setting,\n; because we have to restore it as part of the MSG_RESET and MSG_SET tests.\n;\n:MAIN.NEXTTWPT\nsetlocal indent ''\nincrement pixeltype.index '${get:pixeltype.index}'\nsetglobal g_pixeltype.value '${getindex:pixeltype.itemlist:${get:pixeltype.index}}'\nif '${get:g_pixeltype.value}' != '' goto MAIN.TWPTSET\ngoto MAIN.PASS\n:MAIN.TWPTSET\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_PIXELTYPE,TWON_ONEVALUE,TWTY_UINT16,${get:g_pixeltype.value}'\nif '${sts:}' == 'SUCCESS' goto MAIN.TWPTCONTINUE\necho.passfail '${get:indent}${get:g_pixeltype.value}' 'skip'\ngoto MAIN.NEXTTWPT\n:MAIN.TWPTCONTINUE\necho.passfail '${get:indent}${get:g_pixeltype.value}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Repeat this section for Standard TWAIN array values found inside of\n; CAP_SUPPORTEDCAPS (each Standard TWAIN capability ID is referred to as #CAP#\n; for the rest of this section)\n;\nsetlocal indent '  '\nsetlocal name 'CAP_SUPPORTEDCAPS MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'CAP_SUPPORTEDCAPS,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal supportedcaps '${ret:}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Turn on capabilities that enable the use of other capabilities\n; SPECNOTE: this isn't described in the tests, but it seems like a good idea\n;\ncall ENABLECAPABILITIES '${get:supportedcaps}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Grab a standard TWAIN capability from CAP_SUPPORTEDCAPS, we know it's\n; supported if we have a name for it (it's not a number).\n;\nsetlocal supportedcaps.index '${get:TW_ARRAY.ItemList}'\nincrement supportedcaps.index '${get:supportedcaps.index}' -1\n:MAIN.NEXTCAP\n;\nincrement supportedcaps.index '${get:supportedcaps.index}'\nsetlocal supportedcaps.value '${getindex:supportedcaps:${get:supportedcaps.index}}'\nif '${get:supportedcaps.value}' == '' goto MAIN.NEXTTWPT ; we've run out of supportedcaps values\nif '${get:supportedcaps.value}' ~contains '0x' goto MAIN.NEXTCAP ; not a standard cap\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Perform these tests on each capability...\n; SPECNOTE: because we're referencing the querysupport value we don't have to accept\n; TWCC_CAPSEQERROR as a valid value, so it'll be an error just like everything else...\n;\ncall MSGQUERYSUPPORT '${get:supportedcaps.value}' g_querysupport          g_datcapabilityresult\ncall MSGGET          '${get:supportedcaps.value}' '${get:g_querysupport}' g_datcapabilityresult\ncall MSGGETCURRENT   '${get:supportedcaps.value}' '${get:g_querysupport}' g_datcapabilityresult\ncall MSGGETDEFAULT   '${get:supportedcaps.value}' '${get:g_querysupport}' g_datcapabilityresult\ncall MSGRESET        '${get:supportedcaps.value}' '${get:g_querysupport}' g_datcapabilityresult\ncall MSGSET          '${get:supportedcaps.value}' '${get:g_querysupport}' g_datcapabilityresult\ngoto MAIN.NEXTCAP\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Summary and cleanup...\n;\n; Did we pass? (do an extra check)\n:MAIN.PASS\nif '${get:g_datcapabilityresult}' != 'pass' goto MAIN.ERROR\necho.passfail 'SUMMARY' 'pass'\nreturn 'pass'\n;\n; Ruh-roh...\n:MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'fail - ${sts:} ${ret:}'\n:MAIN.ERROR\necho.passfail 'SUMMARY' 'fail'\nreturn 'fail'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Function: MSGQUERYSUPPORT\n;\n; Arguments\n;   arg:1 - capability to check\n;   arg:2 - value returned\n;   arg:3 - only updated on fail\n;\n; Globals\n;   (none)\n;\n; Locals\n;   name - name of current test\n;   indent - amount to indent echo.passfail\n;   capability - MSG_QUERYSUPPORT on arg:1\n;\n; Returns\n;   (none)\n;\n:MSGQUERYSUPPORT\n;\n; Header...\nsetlocal indent '    '\necho ' '\necho '  ${arg:1}'\n;\n; Check if it's deprecated...\nsetlocal capabilitytable.flags '${get:${arg:1}.Flags}' ; ex: ICAP_PIXELTYPE.Flags\nif '${get:capabilitytable.flags}' ~contains 'deprecated' goto MSGQUERYSUPPORT.DEPRECATED\n;\n; Send the command...\nsetlocal name 'Send MSG_QUERYSUPPORT'\ndsmentry src ds dg_control dat_capability msg_querysupport '${arg:1},0,0,0'\nif '${sts:}' != 'SUCCESS' goto MSGQUERYSUPPORT.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal capability '${ret:}'\n;\n; If TW_CAPABILITY.Cap is not #CAP#, then end with error\nsetlocal name 'Verify Cap'\nsetlocal failinfo ' (found ${getindex:capability:${get:TW_CAPABILITY.Cap}})'\nif '${getindex:capability:${get:TW_CAPABILITY.Cap}}' != '${arg:1}' goto MSGQUERYSUPPORT.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n; If TW_CAPABILITY.ConType is not TWON_ONEVALUE, then end with error.\nsetlocal name 'Verify ConType is TWON_ONEVALUE'\nsetlocal failinfo ' (found ${getindex:capability:${get:TW_CAPABILITY.ConType}})'\nif '${getindex:capability:${get:TW_CAPABILITY.ConType}}' != 'TWON_ONEVALUE' goto MSGQUERYSUPPORT.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n; If TW_ONEVALUE.ItemType is not TWTY_UINT32, then end with error\n; SPECNOTE: spec says TWTY_INT32, test says TWTY_UINT32...spec wins...\nsetlocal name 'Verify ItemType is TWTY_INT32'\nsetlocal failinfo ' (found ${getindex:capability:${get:TW_ONEVALUE.ItemType}}'\nif '${getindex:capability:${get:TW_ONEVALUE.ItemType}}' != 'TWTY_INT32' goto MSGQUERYSUPPORT.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n; If TWQC_GET, TWQC_GETCURRENT or TWQC_GETDEFAULT is detected, then\n; all three must be present, if any are missing end with error\nsetlocal name 'Verify GET, GETCURRENT, GETDEFAULT'\nsetlocal failinfo ' (found ${getindex:capability:${get:TW_ONEVALUE.Item}}'\nif '${getindex:capability:${get:TW_ONEVALUE.Item}}' & '0x000D' == '0' goto MSGQUERYSUPPORT.VERIFYSET\nif '${getindex:capability:${get:TW_ONEVALUE.Item}}' & '0x000D' != '0x000D' goto MSGQUERYSUPPORT.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n; If TWQC_RESET or TWQC_SET is detected, then both must be present,\n; plus TWQC_GET, TWQC_GETCURRENT and TWQC_GETDEFAULT, if not true\n; then end with error\n:MSGQUERYSUPPORT.VERIFYSET\nsetlocal name 'Verify SET, RESET with GETs'\nsetlocal failinfo ' (found ${getindex:capability:${get:TW_ONEVALUE.Item}}'\nif '${getindex:capability:${get:TW_ONEVALUE.Item}}' & '0x0012' == '0' goto MSGQUERYSUPPORT.PASS\nif '${getindex:capability:${get:TW_ONEVALUE.Item}}' & '0x001F' != '0x001F' goto MSGQUERYSUPPORT.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\ngoto MSGQUERYSUPPORT.PASS\n;\n; All done...\n:MSGQUERYSUPPORT.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'woof${get:failinfo}'\nsetglobal '${arg:2}' '0'\nsetglobal '${arg:3}' 'fail'\nreturn\n;\n:MSGQUERYSUPPORT.PASS\nsetglobal '${arg:2}' '${getindex:capability:${get:TW_ONEVALUE.Item}}' ; the value for this capability\nreturn\n;\n:MSGQUERYSUPPORT.DEPRECATED\necho.passfail '${get:indent}Note' 'deprecated (this is not a failure)'\nsetglobal '${arg:2}' '0' ; the value for this capability\nreturn\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Function: MSGGET\n;\n; Arguments\n;   arg:1 - capability to check\n;   arg:2 - value from MSG_QUERYSUPPORT\n;   arg:3 - only updated on fail\n;\n; Globals\n;   (none)\n;\n; Locals\n;   name - name of current test\n;   indent - amount to indent echo.passfail\n;   capability - MSG_QUERYSUPPORT on arg:1\n;\n; Returns\n;   (none)\n;\n:MSGGET\n;\n; Skip if not supported (TWQC_GET)...\nif '${arg:2}' & '0x0001' == '0' goto MSGGET.SKIP\nsetlocal indent '    '\n;\n; Send the command...\nsetlocal name 'Send MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get '${arg:1},0,0,0'\nif '${sts:}' != 'SUCCESS' goto MSGGET.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal capability '${ret:}'\n;\n; If TW_CAPABILITY.Cap is not #CAP#, then end with error\nsetlocal name 'Verify Cap'\nif '${getindex:capability:${get:TW_CAPABILITY.Cap}}' != '${arg:1}' goto MSGGET.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n; If the value of TW_CAPABILITY.ConType doesn’t match the Specification’s\n; MSG_GET container for this capability, then end with error\nsetlocal name 'Verify ConType contains ${get:${arg:1}.ConType}'\nif '${get:${arg:1}.ConType}' !~contains '${getindex:capability:${get:TW_CAPABILITY.ConType}}' goto MSGGET.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n; If container’s ItemType doesn’t match the Specification’s ItemType for\n; this capability, then end with error.  Note that the index for ItemType\n; is the same for all containers, so it doesn't matter which one we use\n; to check this...\nsetlocal name 'Verify ItemType contains ${get:${arg:1}.ItemType}'\nif '${get:${arg:1}.ItemType}' !~contains '${getindex:capability:${get:TW_ONEVALUE.ItemType}}' goto MSGGET.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n; All done...\ngoto MSGGET.PASS\n:MSGGET.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'fail'\nsetglobal '${arg:3}' 'fail'\nreturn\n:MSGGET.SKIP\nreturn\n:MSGGET.PASS\nreturn\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Function: MSGGETCURRENT\n;\n; Arguments\n;   arg:1 - capability to check\n;   arg:2 - value from MSG_QUERYSUPPORT\n;   arg:3 - only updated on fail\n;\n; Globals\n;   (none)\n;\n; Locals\n;   name - name of current test\n;   indent - amount to indent echo.passfail\n;   capability - MSG_QUERYSUPPORT on arg:1\n;\n; Returns\n;   (none)\n;\n:MSGGETCURRENT\n;\n; Skip if not supported (TWQC_GETCURRENT)...\nif '${arg:2}' & '0x0008' == '0' goto MSGGETCURRENT.SKIP\nsetlocal indent '    '\n;\n; Send the command...\nsetlocal name 'Send MSG_GETCURRENT'\ndsmentry src ds dg_control dat_capability msg_getcurrent '${arg:1},0,0,0'\nif '${sts:}' != 'SUCCESS' goto MSGGETCURRENT.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal capability '${ret:}'\n;\n; If TW_CAPABILITY.Cap is not #CAP#, then end with error\nsetlocal name 'Verify Cap'\nif '${getindex:capability:${get:TW_CAPABILITY.Cap}}' != '${arg:1}' goto MSGGETCURRENT.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n; If the TW_CAPABILITY.ConType for MSG_GET was TWON_ENUMERATION, TWON_ONEVALUE\n; or TWON_RANGE, then the TW_CAPABILITY.ConType for MSG_GETCURRENT must be\n; TWTY_ONEVALUE, if not then end with error\n; SPECNOTE: we're testing for array, which gives us the same result...\nif '${get:${arg:1}.ConType}' contains 'TWON_ARRAY' goto MSGGETCURRENT.ARRAY\nsetlocal name 'Verify ConType contains TWON_ONEVALUE'\nif '${getindex:capability:${get:TW_CAPABILITY.ConType}}' != 'TWON_ONEVALUE' goto MSGGETCURRENT.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\ngoto MSGGETCURRENT.ITEMTYPE\n:MSGGETCURRENT.ARRAY\nsetlocal name 'Verify ConType contains TWON_ARRAY'\nif '${getindex:capability:${get:TW_CAPABILITY.ConType}}' != 'TWON_ARRAY' goto MSGGETCURRENT.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n; If container’s ItemType doesn’t match the Specification’s ItemType for\n; this capability, then end with error.  Note that the index for ItemType\n; is the same for all containers, so it doesn't matter which one we use\n; to check this...\n:MSGGETCURRENT.ITEMTYPE\nsetlocal name 'Verify ItemType contains ${get:${arg:1}.ItemType}'\nif '${get:${arg:1}.ItemType}' !~contains '${getindex:capability:${get:TW_ONEVALUE.ItemType}}' goto MSGGETCURRENT.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n; All done...\ngoto MSGGETCURRENT.PASS\n:MSGGETCURRENT.ERROR.ECHOPASSFAIL\necho.passfail '  ${get:name}' 'fail'\nsetglobal '${arg:3}' 'fail'\nreturn\n:MSGGETCURRENT.SKIP\nreturn\n:MSGGETCURRENT.PASS\nreturn\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Function: MSGGETDEFAULT\n;\n; Arguments\n;   arg:1 - capability to check\n;   arg:2 - value from MSG_QUERYSUPPORT\n;   arg:3 - only updated on fail\n;\n; Globals\n;   (none)\n;\n; Locals\n;   name - name of current test\n;   indent - amount to indent echo.passfail\n;   capability - MSG_QUERYSUPPORT on arg:1\n;\n; Returns\n;   (none)\n;\n:MSGGETDEFAULT\n;\n; Skip if not supported (TWQC_GETDEFAULT)...\nif '${arg:2}' & '0x0004' == '0' goto MSGGETDEFAULT.SKIP\nsetlocal indent '    '\n;\n; Send the command...\nsetlocal name 'Send MSG_GETDEFAULT'\ndsmentry src ds dg_control dat_capability msg_getdefault '${arg:1},0,0,0'\nif '${sts:}' != 'SUCCESS' goto MSGGETDEFAULT.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal capability '${ret:}'\n;\n; If TW_CAPABILITY.Cap is not #CAP#, then end with error\nsetlocal name 'Verify Cap'\nif '${getindex:capability:${get:TW_CAPABILITY.Cap}}' != '${arg:1}' goto MSGGETDEFAULT.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n; If the TW_CAPABILITY.ConType for MSG_GET was TWON_ENUMERATION, TWON_ONEVALUE\n; or TWON_RANGE, then the TW_CAPABILITY.ConType for MSG_GETDEFAULT must be\n; TWTY_ONEVALUE, if not then end with error\n; SPECNOTE: we're testing for array, which gives us the same result...\nif '${get:${arg:1}.ConType}' contains 'TWON_ARRAY' goto MSGGETDEFAULT.ARRAY\nsetlocal name 'Verify ConType contains TWON_ONEVALUE'\nif '${getindex:capability:${get:TW_CAPABILITY.ConType}}' != 'TWON_ONEVALUE' goto MSGGETDEFAULT.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\ngoto MSGGETDEFAULT.ITEMTYPE\n:MSGGETDEFAULT.ARRAY\nsetlocal name 'Verify ConType contains TWON_ARRAY'\nif '${getindex:capability:${get:TW_CAPABILITY.ConType}}' != 'TWON_ARRAY' goto MSGGETDEFAULT.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n; If container’s ItemType doesn’t match the Specification’s ItemType for\n; this capability, then end with error.  Note that the index for ItemType\n; is the same for all containers, so it doesn't matter which one we use\n; to check this...\n:MSGGETDEFAULT.ITEMTYPE\nsetlocal name 'Verify ItemType contains ${get:${arg:1}.ItemType}'\nif '${get:${arg:1}.ItemType}' !~contains '${getindex:capability:${get:TW_ONEVALUE.ItemType}}' goto MSGGETDEFAULT.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n; All done...\ngoto MSGGETDEFAULT.PASS\n:MSGGETDEFAULT.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'fail'\nsetglobal '${arg:3}' 'fail'\nreturn\n:MSGGETDEFAULT.SKIP\nreturn\n:MSGGETDEFAULT.PASS\nreturn\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Function: MSGRESET\n;\n; Arguments\n;   arg:1 - capability to check\n;   arg:2 - value from MSG_QUERYSUPPORT\n;   arg:3 - only updated on fail\n;\n; Globals\n;   (none)\n;\n; Locals\n;   name - name of current test\n;   indent - amount to indent echo.passfail\n;   capability - MSG_QUERYSUPPORT on arg:1\n;\n; Returns\n;   (none)\n;\n:MSGRESET\n;\n; Skip if not supported (TWQC_RESET)...\nif '${arg:2}' & '0x0010' == '0' goto MSGRESET.SKIP\nsetlocal indent '    '\n;\n; Send the command...\nsetlocal name 'Send MSG_RESET'\ndsmentry src ds dg_control dat_capability msg_reset '${arg:1},0,0,0'\nif '${sts:}' != 'SUCCESS' goto MSGRESET.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal capability '${ret:}'\n;\n; If TW_CAPABILITY.Cap is not #CAP#, then end with error\nsetlocal name 'Verify Cap'\nif '${getindex:capability:${get:TW_CAPABILITY.Cap}}' != '${arg:1}' goto MSGRESET.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n; If the TW_CAPABILITY.ConType for MSG_GET was TWON_ENUMERATION, TWON_ONEVALUE\n; or TWON_RANGE, then the TW_CAPABILITY.ConType for MSG_GETDEFAULT must be\n; TWTY_ONEVALUE, if not then end with error\n; SPECNOTE: the test implies that the MSG_GET container should returned, this is wrong...\n; SPECNOTE: we're testing for array, which gives us the same result...\nif '${get:${arg:1}.ConType}' contains 'TWON_ARRAY' goto MSGRESET.ARRAY\nsetlocal name 'Verify ConType contains TWON_ONEVALUE'\nif '${getindex:capability:${get:TW_CAPABILITY.ConType}}' != 'TWON_ONEVALUE' goto MSGRESET.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\ngoto MSGRESET.ITEMTYPE\n:MSGRESET.ARRAY\nsetlocal name 'Verify ConType contains TWON_ARRAY'\nif '${getindex:capability:${get:TW_CAPABILITY.ConType}}' != 'TWON_ARRAY' goto MSGRESET.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n; If container’s ItemType doesn’t match the Specification’s ItemType for\n; this capability, then end with error.  Note that the index for ItemType\n; is the same for all containers, so it doesn't matter which one we use\n; to check this...\n:MSGRESET.ITEMTYPE\nsetlocal name 'Verify ItemType contains ${get:${arg:1}.ItemType}'\nif '${get:${arg:1}.ItemType}' !~contains '${getindex:capability:${get:TW_ONEVALUE.ItemType}}' goto MSGRESET.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n; All done...\ngoto MSGRESET.PASS\n:MSGRESET.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'fail'\ncall RESTORECAPABILITY '${arg:1}'\nsetglobal '${arg:3}' 'fail'\nreturn\n:MSGRESET.SKIP\nreturn\n:MSGRESET.PASS\ncall RESTORECAPABILITY '${arg:1}'\nreturn\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Function: MSGSET\n;   First we're going to do a MSG_GET followed by a MSG_SET with either a TW_ARRAY or a\n;   TW_ONEVALUE, as indicated by the spec.  Note that prior to 2.4 MSG_SET allowed one\n;   to send any container.  For the second round we do a MSG_GETCURRENT and set with that\n;   value, which also must be a TW_ARRAY or TW_ONEVALUE.\n;\n; Arguments\n;   arg:1 - capability to check\n;   arg:2 - value from MSG_QUERYSUPPORT\n;   arg:3 - only updated on fail\n;\n; Globals\n;   (none)\n;\n; Locals\n;   name - name of current test\n;   indent - amount to indent echo.passfail\n;   capability - MSG_QUERYSUPPORT on arg:1\n;\n; Returns\n;   (none)\n;\n:MSGSET\n;\n; Skip if not supported (TWQC_SET)...\nif '${arg:2}' & '0x0002' == '0' goto MSGSET.SKIP\nif '${arg:3}' != 'pass' goto MSGSET.SKIP\nsetlocal indent '    '\n;\n; Explain what's going on...\nsetlocal name 'Test MSG_SET'\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n; GET -> SET, and check they match with a final GET\n; We'll accept SUCCESS or CHECKSTATUS\nsetlocal name 'Send MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get '${arg:1},0,0,0'\nif '${sts:}' != 'SUCCESS' goto MSGSET.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal capability '${ret:}'\nsetlocal name 'Send MSG_SET with that GET'\nif '${getindex:capability:${get:TW_CAPABILITY.ConType}}' == 'TWON_ONEVALUE' goto MSGSET.SET ; ready to go as-is\nif '${getindex:capability:${get:TW_CAPABILITY.ConType}}' == 'TWON_ARRAY' goto MSGSET.SET  ; ready to go as-is\nif '${getindex:capability:${get:TW_CAPABILITY.ConType}}' == 'TWON_RANGE' goto MSGSET.SETRANGE ; the rest must convert to TW_ONEVALUE\n;\nincrement currentindex '${get:TW_ENUMERATION.ItemList}' '${getindex:capability:${get:TW_ENUMERATION.CurrentIndex}}'\nsetlocal currentvalue '${getindex:capability:${get:currentindex}}'\nif '${get:currentvalue}' contains ',' goto MSGSET.NEEDQUOTES ; if the data has a comma in it, we're going to need quotes\n;\nsetlocal capability '${getindex:capability:${get:TW_CAPABILITY.Cap}},TWON_ONEVALUE,${getindex:capability:${get:TW_ENUMERATION.ItemType}},${get:currentvalue}'\ngoto MSGSET.SET\n;\n:MSGSET.NEEDQUOTES\nsetlocal capability '${getindex:capability:${get:TW_CAPABILITY.Cap}},TWON_ONEVALUE,${getindex:capability:${get:TW_ENUMERATION.ItemType}},\"${get:currentvalue}\"'\ngoto MSGSET.SET\n;\n:MSGSET.SETRANGE\nsetlocal capability '${getindex:capability:${get:TW_CAPABILITY.Cap}},TWON_ONEVALUE,${getindex:capability:${get:TW_RANGE.ItemType}},${getindex:capability:${get:TW_RANGE.CurrentValue}}'\n;\n:MSGSET.SET\ndsmentry src ds dg_control dat_capability msg_set '${get:capability}'\nif '/CHECKSTATUS/SUCCESS/' !~contains '/${sts:}/' goto MSGSET.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal name 'Send MSG_GETCURRENTpability msg_getcurrent '${arg:1},0,0,0'\nsetlocal value '${ret:}'\nif '${sts:}' != 'SUCCESS' goto MSGSET.ERROR.ECHOPASSFAIL\nif '${get:value}' != '${get:capability}' goto MSGSET.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n; GETGURRENT -> SET, and check they match with a final GETCURRENT\nsetlocal name 'Send MSG_GETCURRENT'\ndsmentry src ds dg_control dat_capability msg_getcurrent '${arg:1},0,0,0'\nif '${sts:}' != 'SUCCESS' goto MSGSET.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal capability '${ret:}'\nsetlocal name 'Send MSG_SET with that GETCURRENT'\ndsmentry src ds dg_control dat_capability msg_set '${get:capability}'\nif '${sts:}' != 'SUCCESS' goto MSGSET.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal name 'Send MSG_GETCURRENT to confirm MSG_SET'\ndsmentry src ds dg_control dat_capability msg_getcurrent '${arg:1},0,0,0'\nsetlocal value '${ret:}'\nif '${sts:}' != 'SUCCESS' goto MSGSET.ERROR.ECHOPASSFAIL\nif '${get:value}' != '${get:capability}' goto MSGSET.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n; GETDEFAULT -> SET, and check they match with a final GETCURRENT\nsetlocal name 'Send MSG_GETDEFAULT'\ndsmentry src ds dg_control dat_capability msg_getdefault '${arg:1},0,0,0'\nif '${sts:}' != 'SUCCESS' goto MSGSET.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal capability '${ret:}'\nsetlocal name 'Send MSG_SET with that GETDEFAULT'\ndsmentry src ds dg_control dat_capability msg_set '${get:capability}'\nif '${sts:}' != 'SUCCESS' goto MSGSET.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal name 'Send MSG_GETCURRENT to confirm MSG_SET'\ndsmentry src ds dg_control dat_capability msg_getcurrent '${arg:1},0,0,0'\nsetlocal value '${ret:}'\nif '${sts:}' != 'SUCCESS' goto MSGSET.ERROR.ECHOPASSFAIL\nif '${get:value}' != '${get:capability}' goto MSGSET.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n; RESET -> SET, and check they match with a final GETCURRENT\nsetlocal name 'Send MSG_RESET'\ndsmentry src ds dg_control dat_capability msg_reset '${arg:1},0,0,0'\nif '${sts:}' != 'SUCCESS' goto MSGSET.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal capability '${ret:}'\nsetlocal name 'Send MSG_SET with that RESET'\ndsmentry src ds dg_control dat_capability msg_set '${get:capability}'\nif '${sts:}' != 'SUCCESS' goto MSGSET.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal name 'Send MSG_GETCURRENT to confirm MSG_SET'\ndsmentry src ds dg_control dat_capability msg_getcurrent '${arg:1},0,0,0'\nsetlocal value '${ret:}'\nif '${sts:}' != 'SUCCESS' goto MSGSET.ERROR.ECHOPASSFAIL\nif '${get:value}' != '${get:capability}' goto MSGSET.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n; All done...\ngoto MSGSET.PASS\n:MSGSET.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'fail ${sts:} <${get:capability}> <${get:value}>'\ncall RESTORECAPABILITY '${arg:1}'\nsetglobal '${arg:3}' 'fail'\nreturn\n;\n:MSGSET.SKIP\nreturn\n;\n:MSGSET.PASS\ncall RESTORECAPABILITY '${arg:1}'\nreturn\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Function: ENABLECAPABILITIES\n;   Turn on stuff that we find in the list, we don't care if it fails,\n;   we'll keep on going...\n;\n; Arguments\n;   arg:1 - supportedcaps\n;\n; Globals\n;   (none)\n;\n; Locals\n;   (none)\n;\n; Returns\n;   (none)\n;\n:ENABLECAPABILITIES\nsetlocal indent '  '\n;\n; CAP_PRINTERENABLED\n:ENABLECAPABILITIES.CAP_PRINTERENABLED\nif '${arg:1}' !~contains 'CAP_PRINTERENABLED' goto ENABLECAPABILITIES.ICAP_BARCODEDETECTIONENABLED\ndsmentry src ds dg_control dat_capability msg_set 'CAP_PRINTERENABLED,TWON_ONEVALUE,TWTY_BOOL,TRUE'\nif '${sts:}' != 'SUCCESS' goto ENABLECAPABILITIES.CAP_PRINTERENABLED.ECHOPASSFAIL\necho.passfail '${get:indent}Enable CAP_PRINTERENABLED' 'pass'\ngoto ENABLECAPABILITIES.ICAP_BARCODEDETECTIONENABLED\n:ENABLECAPABILITIES.CAP_PRINTERENABLED.ECHOPASSFAIL\necho.passfail '${get:indent}Enable CAP_PRINTERENABLED' 'fail (but we won't fail on it here)'\n;\n; ICAP_BARCODEDETECTIONENABLED\n:ENABLECAPABILITIES.ICAP_BARCODEDETECTIONENABLED\nif '${arg:1}' !~contains 'ICAP_BARCODEDETECTIONENABLED' goto ENABLECAPABILITIES.ICAP_PATCHCODEDETECTIONENABLED\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_BARCODEDETECTIONENABLED,TWON_ONEVALUE,TWTY_BOOL,TRUE'\nif '${sts:}' != 'SUCCESS' goto ENABLECAPABILITIES.ICAP_BARCODEDETECTIONENABLED.ECHOPASSFAIL\necho.passfail '${get:indent}Enable ICAP_BARCODEDETECTIONENABLED' 'pass'\ngoto ENABLECAPABILITIES.ICAP_PATCHCODEDETECTIONENABLED\n:ENABLECAPABILITIES.ICAP_BARCODEDETECTIONENABLED.ECHOPASSFAIL\necho.passfail '${get:indent}Enable ICAP_BARCODEDETECTIONENABLED' 'fail (but we won't fail on it here)'\n;\n; ICAP_PATCHCODEDETECTIONENABLED\n:ENABLECAPABILITIES.ICAP_PATCHCODEDETECTIONENABLED\nif '${arg:1}' !~contains 'CAP_PATCHCODEDETECTIONENABLED' goto ENABLECAPABILITIES.DONE\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_PATCHCODEDETECTIONENABLED,TWON_ONEVALUE,TWTY_BOOL,TRUE'\nif '${sts:}' != 'SUCCESS' goto ENABLECAPABILITIES.ICAP_PATCHCODEDETECTIONENABLED.ECHOPASSFAIL\necho.passfail '${get:indent}Enable CAP_PATCHCODEDETECTIONENABLED' 'pass'\ngoto ENABLECAPABILITIES.DONE\n:ENABLECAPABILITIES.ICAP_PATCHCODEDETECTIONENABLED.ECHOPASSFAIL\necho.passfail '${get:indent}Enable CAP_PATCHCODEDETECTIONENABLED' 'fail (but we won't fail on it here)'\n;\n; All done...\n:ENABLECAPABILITIES.DONE\nreturn\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Function: RESTORECAPABILITY \n;   If we recognize it and need to maintain it, restore it.  Note that to get into\n;   this function we're assuming the capability exists, so it's okay to set it.\n;   SPECNOTE: the concept of restoring isn't described in the tests\n;\n; Arguments\n;   arg:1 - the current capability\n;\n; Globals\n;   g_pixeltype.value - using it to make life easier\n;\n; Locals\n;   indent - amount to indent echo.passfail\n;\n; Returns\n;   (none)\n;\n:RESTORECAPABILITY\nsetlocal indent '  '\nif '${arg:1}' == 'CAP_PRINTERENABLED' goto RESTORECAPABILITY.CAP_PRINTERENABLED\nif '${arg:1}' == 'ICAP_BARCODEDETECTIONENABLED' goto RESTORECAPABILITY.ICAP_BARCODEDETECTIONENABLED\nif '${arg:1}' == 'ICAP_PATCHCODEDETECTIONENABLED' goto RESTORECAPABILITY.ICAP_PATCHCODEDETECTIONENABLED\nif '${arg:1}' == 'ICAP_PIXELTYPE' goto RESTORECAPABILITY.ICAP_PIXELTYPE\nreturn\n;\n; CAP_PRINTERENABLED\n:RESTORECAPABILITY.CAP_PRINTERENABLED\ndsmentry src ds dg_control dat_capability msg_set 'CAP_PRINTERENABLED,TWON_ONEVALUE,TWTY_BOOL,TRUE'\nif '${sts:}' != 'SUCCESS' goto RESTORECAPABILITY.CAP_PRINTERENABLED.ECHOPASSFAIL\necho.passfail '${get:indent}Restore CAP_PRINTERENABLED value to TRUE' 'pass'\nreturn\n:RESTORECAPABILITY.CAP_PRINTERENABLED.ECHOPASSFAIL\necho.passfail '${get:indent}Restore CAP_PRINTERENABLED value to TRUE' 'fail (but we won't fail on it here)'\nreturn\n;\n; ICAP_BARCODEDETECTIONENABLED\n:RESTORECAPABILITY.ICAP_BARCODEDETECTIONENABLED\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_BARCODEDETECTIONENABLED,TWON_ONEVALUE,TWTY_UINT16,TRUE'\nif '${sts:}' != 'SUCCESS' goto RESTORECAPABILITY.ICAP_BARCODEDETECTIONENABLED.ECHOPASSFAIL\necho.passfail '${get:indent}Restore ICAP_BARCODEDETECTIONENABLED value to TRUE' 'pass'\nreturn\n:RESTORECAPABILITY.ICAP_BARCODEDETECTIONENABLED.ECHOPASSFAIL\necho.passfail '${get:indent}Restore ICAP_BARCODEDETECTIONENABLED value to TRUE' 'fail (but we won't fail on it here)'\nreturn\n;\n; ICAP_PATCHCODEDETECTIONENABLED\n:RESTORECAPABILITY.ICAP_PATCHCODEDETECTIONENABLED\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_PATCHCODEDETECTIONENABLED,TWON_ONEVALUE,TWTY_UINT16,TRUE'\nif '${sts:}' != 'SUCCESS' goto RESTORECAPABILITY.ICAP_PATCHCODEDETECTIONENABLED.ECHOPASSFAIL\necho.passfail '${get:indent}Restore ICAP_PATCHCODEDETECTIONENABLED value to TRUE' 'pass'\nreturn\n:RESTORECAPABILITY.ICAP_PATCHCODEDETECTIONENABLED.ECHOPASSFAIL\necho.passfail '${get:indent}Restore ICAP_PATCHCODEDETECTIONENABLED value to TRUE' 'fail (but we won't fail on it here)'\nreturn\n;\n; ICAP_PIXELTYPE\n:RESTORECAPABILITY.ICAP_PIXELTYPE\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_PIXELTYPE,TWON_ONEVALUE,TWTY_UINT16,${get:g_pixeltype.value}'\nif '${sts:}' != 'SUCCESS' goto RESTORECAPABILITY.ICAP_PIXELTYPE.ECHOPASSFAIL\necho.passfail '${get:indent}Restore ICAP_PIXELTYPE value to ${get:g_pixeltype.value}' 'pass'\nreturn\n:RESTORECAPABILITY.ICAP_PIXELTYPE.ECHOPASSFAIL\necho.passfail '${get:indent}Restore ICAP_PIXELTYPE value to ${get:g_pixeltype.value}' 'fail (but we won't fail on it here)'\nreturn\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/010 - TWAIN Standard Capability Tests/ICAP_PIXELTYPE.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; ICAP_PIXELTYPE/ICAP_BITDEPTH\n;   Confirm Basic Negotiation with ICAP_PIXELTYPE/ICAP_BITDEPTH\n;\n; Arguments\n;   arg:1 - TW_IDENTITY.ProductName of scanner to test\n;\n; Globals\n;   (none)\n;\n; Locals\n;   name - current test being done\n;   bitdepth - data from MSG_GET for ICAP_BITDEPTH\n;\n; Returns\n;   pass or fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize...\n;\necho.titletest 'ICAP_PIXELTYPE/ICAP_BITDEPTH'\nsetlocal bitdepth ''\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; TWPT_BW MSG_SET\n; If result is not TWRC_SUCCESS, then proceed to the TWPT_GRAY test\n;\nsetlocal name 'TWPT_BW MSG_SET'\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_PIXELTYPE,TWON_ONEVALUE,TWTY_UINT16,TWPT_BW'\nif '${sts:}' != 'SUCCESS' goto MAIN.TWPTGRAY\necho.passfail '${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; TWPT_BW MSG_GET ICAP_BITDEPTH\n;\nsetlocal name 'TWPT_BW MSG_GET ICAP_BITDEPTH'\ndsmentry src ds dg_control dat_capability msg_get 'ICAP_BITDEPTH,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:name}' 'pass'\nsetlocal bitdepth '${ret:}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; If TW_CAPABILITY.ConType is not TWON_ENUMERATION, then proceed to the TWPT_RGB test below\n; SPECNOTE: well, this is wrong, goto TWPT_GRAY\n;\nsetlocal name 'TWPT_BW TW_CAPABILITY.ConType is TWON_ENUMERATION'\nif '${getindex:bitdepth:${get:TW_CAPABILITY.ConType}}' != 'TWON_ENUMERATION' goto MAIN.TWPTGRAY\necho.passfail '${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; If TW_ENUMERATION.ItemType is not TWTY_UINT16, then end with error\n;\nsetlocal name 'TWPT_BW TW_ENUMERATION.ItemType is TWTY_UINT16'\nif '${getindex:bitdepth:${get:TW_ENUMERATION.ItemType}}' != 'TWTY_UINT16' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; If the TW_ENUMERATION.ItemList includes a value of 8 or 24, then end with error\n;\nsetlocal name 'TWPT_BW TW_ENUMERATION does not contain 8 or 24'\ncall CHECKENUMERATION '${get:bitdepth}' '8' '24'\nif '${ret:}' == 'pass' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; TWPT_GRAY MSG_SET\n; If result is not TWRC_SUCCESS, then proceed to the TWPT_RGB test\n;\n:MAIN.TWPTGRAY\nsetlocal name 'TWPT_GRAY MSG_SET'\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_PIXELTYPE,TWON_ONEVALUE,TWTY_UINT16,TWPT_GRAY'\nif '${sts:}' != 'SUCCESS' goto MAIN.TWPTRGB\necho.passfail '${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; TWPT_GRAY MSG_GET ICAP_BITDEPTH\n;\nsetlocal name 'TWPT_GRAY MSG_GET ICAP_BITDEPTH'\ndsmentry src ds dg_control dat_capability msg_get 'ICAP_BITDEPTH,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:name}' 'pass'\nsetlocal bitdepth '${ret:}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; If TW_CAPABILITY.ConType is not TWON_ENUMERATION, then proceed to the TWPT_RGB test below\n;\nsetlocal name 'TWPT_GRAY TW_CAPABILITY.ConType is TWON_ENUMERATION'\nif '${getindex:bitdepth:${get:TW_CAPABILITY.ConType}}' != 'TWON_ENUMERATION' goto MAIN.TWPTRGB\necho.passfail '${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; If TW_ENUMERATION.ItemType is not TWTY_UINT16, then end with error\n;\nsetlocal name 'TWPT_GRAY TW_ENUMERATION.ItemType is TWTY_UINT16'\nif '${getindex:bitdepth:${get:TW_ENUMERATION.ItemType}}' != 'TWTY_UINT16' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; If the TW_ENUMERATION.ItemList includes a value of 1 or 24, then end with error\n;\nsetlocal name 'TWPT_GRAY TW_ENUMERATION does not contain 1 or 24'\ncall CHECKENUMERATION '${get:bitdepth}' '1' '24'\nif '${ret:}' == 'pass' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; TWPT_RGB MSG_SET\n; If result is not TWRC_SUCCESS, then pass\n;\n:MAIN.TWPTRGB\nsetlocal name 'TWPT_RGB MSG_SET'\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_PIXELTYPE,TWON_ONEVALUE,TWTY_UINT16,TWPT_RGB'\nif '${sts:}' != 'SUCCESS' goto MAIN.PASS\necho.passfail '${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; TWPT_RGB MSG_GET ICAP_BITDEPTH\n;\nsetlocal name 'TWPT_RGB MSG_GET ICAP_BITDEPTH'\ndsmentry src ds dg_control dat_capability msg_get 'ICAP_BITDEPTH,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:name}' 'pass'\nsetlocal bitdepth '${ret:}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; If TW_CAPABILITY.ConType is not TWON_ENUMERATION, then pass\n;\nsetlocal name 'TWPT_RGB TW_CAPABILITY.ConType is TWON_ENUMERATION'\nif '${getindex:bitdepth:${get:TW_CAPABILITY.ConType}}' != 'TWON_ENUMERATION' goto MAIN.PASS\necho.passfail '${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; If TW_ENUMERATION.ItemType is not TWTY_UINT16, then end with error\n;\nsetlocal name 'TWPT_RGB TW_ENUMERATION.ItemType is TWTY_UINT16'\nif '${getindex:bitdepth:${get:TW_ENUMERATION.ItemType}}' != 'TWTY_UINT16' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; If the TW_ENUMERATION.ItemList includes a value of 1 or 8, then end with error\n;\nsetlocal name 'TWPT_RGB TW_ENUMERATION does not contain 1 or 8'\ncall CHECKENUMERATION '${get:bitdepth}' '1' '8'\nif '${ret:}' == 'pass' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Summary and cleanup...\n;\n; We passed...\n:MAIN.PASS\necho.passfail 'SUMMARY' 'pass'\nreturn 'pass'\n;\n; Ruh-roh...\n:MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:name}' 'fail - ${sts:} ${ret:}'\n:MAIN.ERROR\necho.passfail 'SUMMARY' 'fail'\nreturn 'fail'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Function: Check Enumeration\n; arg:1 - enumeration to check\n; arg:2/n - values to check for\n; returns: pass/fail\n;\n:CHECKENUMERATION\n;\nsetlocal enum '${arg:1}'\nsetlocal ee '5'\n:NEXTENUM\nincrement ee '${get:ee}'\nif '${getindex:enum:${get:ee}}' == '' goto CHECKENUMERATION.FAIL\nsetlocal aa '2'\n:NEXTARG\nif '${arg:${get:aa}}' == '' goto NEXTENUM\nif '${arg:${get:aa}}' == '${getindex:enum:${get:ee}}' goto CHECKENUMERATION.PASS\nincrement aa '${get:aa}'\ngoto NEXTARG\n:CHECKENUMERATION.FAIL\nreturn 'fail'\n:CHECKENUMERATION.PASS\nreturn 'pass'"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/010 - TWAIN Standard Capability Tests/ICAP_XFERMECH.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; ICAP_XFERMECH\n;   Confirm Basic Negotiation with ICAP_XFERMECH\n;\n; Arguments\n;   arg:1 - TW_IDENTITY.ProductName of scanner to test\n;\n; Globals\n;   (none)\n;\n; Locals\n;   name - current test being done\n;   xfermech - data from MSG_GET for ICAP_XFERMECH\n;\n; Returns\n;   pass or fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize...\n;\necho.titletest 'ICAP_XFERMECH'\nsetlocal xfermech ''\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; MSG_GET ICAP_XFERMECH\n; If result is not TWRC_SUCCESS, then end with error\n;\nsetlocal name 'MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'ICAP_XFERMECH,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:name}' 'pass'\nsetlocal xfermech '${ret:}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; If TW_CAPABILITY.Cap is not ICAP_XFERMECH, then end with error\n;\nsetlocal name 'TW_CAPABILITY.Cap is ICAP_XFERMECH'\nif '${getindex:xfermech:${get:TW_CAPABILITY.Cap}}' != 'ICAP_XFERMECH' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; If TW_CAPABILITY.ConType is not TWON_ENUMERATION, then end with error\n;\nsetlocal name 'TW_CAPABILITY.ConType is TWON_ENUMERATION'\nif '${getindex:xfermech:${get:TW_CAPABILITY.ConType}}' != 'TWON_ENUMERATION' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; If TW_ENUMERATION.ItemType is not TWTY_UINT16, then end with error\n;\nsetlocal name 'TW_ENUMERATION.ItemType is TWTY_UINT16'\nif '${getindex:xfermech:${get:TW_ENUMERATION.ItemType}}' != 'TWTY_UINT16' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; If TW_ENUMERATION contains TWSX_NATIVE (0)...\n;\nsetlocal name 'TW_ENUMERATION contains TWSX_NATIVE'\ncall CHECKENUMERATION '${get:xfermech}' '0'\nif '${ret:}' == 'pass' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; If TW_ENUMERATION contains TWSX_MEMORY (2)...\n;\nsetlocal name 'TW_ENUMERATION contains TWSX_MEMORY'\ncall CHECKENUMERATION '${get:xfermech}' '2'\nif '${ret:}' == 'pass' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Summary and cleanup...\n;\n; We passed...\n:MAIN.PASS\necho.passfail 'SUMMARY' 'pass'\nreturn 'pass'\n;\n; Ruh-roh...\n:MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:name}' 'fail - ${sts:} ${ret:}'\n:MAIN.ERROR\necho.passfail 'SUMMARY' 'fail'\nreturn 'fail'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Function: Check Enumeration\n; arg:1 - enumeration to check\n; arg:2/n - values to check for\n; returns: pass/fail\n;\n:CHECKENUMERATION\n;\nsetlocal enum '${arg:1}'\nsetlocal ee '5'\n:NEXTENUM\nincrement ee '${get:ee}'\nif '${getindex:enum:${get:ee}}' == '' goto CHECKENUMERATION.FAIL\nsetlocal aa '2'\n:NEXTARG\nif '${arg:${get:aa}}' == '' goto NEXTENUM\nif '${arg:${get:aa}}' == '${getindex:enum:${get:ee}}' goto CHECKENUMERATION.PASS\nincrement aa '${get:aa}'\ngoto NEXTARG\n:CHECKENUMERATION.FAIL\nreturn 'fail'\n:CHECKENUMERATION.PASS\nreturn 'pass'"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/020 - Vendor Custom Capability Tests/Certification.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Vendor Custom Capability Tests\n;   Test for capabilties in the custom space 0x8000 and higher\n;\n; Arguments\n;   arg:1 - TW_IDENTITY.ProductName of scanner to test\n;   arg:2 - global to set on fail\n;\n; Globals\n;   (none)\n;\n; Locals\n;   twidentity.productname - product name of scanner to test\n;   certifyresult - global to set on fail\n;\n; Returns\n;   (none)\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize stuff, load tables if not already done for us...\n;\necho.titlesuite 'Vendor Custom Capability Tests v1.0 23-Feb-2020'\nsetlocal twidentity.productname '${arg:1}'\nsetlocal certifyresult '${arg:2}'\nif '${get:TW_ARRAY.ItemType}' != '' goto MAIN.LOADTABLES.SKIP\nrun '${folder:certification}/LoadTables'\n:MAIN.LOADTABLES.SKIP\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Run the tests...\n;\n\ncall CERTIFY '${folder:certification}/Opends'  '${get:twidentity.productname}' '${get:certifyresult}'\nif '${get:${get:certifyresult}}' == 'fail' goto MAIN.CLOSEDS\ncall CERTIFY 'DAT_CAPABILITY'                  '${get:twidentity.productname}' '${get:certifyresult}'\n:MAIN.CLOSEDS\ncall CERTIFY '${folder:certification}/Closeds' '${get:twidentity.productname}' '${get:certifyresult}'\nreturn\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Function: Certify\n; arg:1 - script to run\n; arg:2 - TW_IDENTITY.ProductName of scanner to test\n; arg:3 - global value to update on fail\n; returns: (none)\n;\n:CERTIFY\n;\nrun '${arg:1}' '${arg:2}'\nif '${ret:}' != 'pass' goto CERTIFY.FAIL\nreturn 'pass'\n;\n:CERTIFY.FAIL\nsetglobal '${arg:3}' 'fail'\nreturn 'fail'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/020 - Vendor Custom Capability Tests/DAT_CAPABILITY.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DAT_CAPABILITY\n;   Exercise DAT_CAPABILITY for the vendor custom capabilities\n;\n; Arguments\n;   arg:1 - TW_IDENTITY.ProductName of scanner to test\n;\n; Globals\n;   g_datcapabilityresult - pass/fail for the entire test\n;   g_querysupport - numeric value of query support for a capability\n;   g_pixeltype.value - for restoring pixel type\n;\n; Locals\n;   name - current test being done\n;   indent - padding for echo.passfail\n;\n;   pixeltype.itemlist - list of pixeltypes to check\n;   pixeltype.index - index of current pixeltype being checked\n;   pixeltype.value - current pixel type value for pixeltype.index\n;\n;   supportedcaps - data from MSG_GET for CAP_SUPPORTEDCAPS\n;   supportedcaps.index - index of capability from supportedcaps\n;   supportedcaps.value - current cap value for supportedcaps.index\n;\n; Returns\n;   pass or fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize...\n;\necho.titletest 'DAT_CAPABILITY'\nsetlocal indent ''\nsetlocal pixeltype.itemlist 'TWPT_BW,TWPT_GRAY,TWPT_RGB'\nsetlocal pixeltype.index '-1'\nsetglobal g_datcapabilityresult 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; MSG_RESETALL\n; If return code is not TWRC_SUCCESS, end with an error\n;\nsetlocal name 'MSG_RESETALL'\ndsmentry src ds dg_control dat_capability msg_resetall '0,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Repeat this section for each enumerated value found inside of ICAP_PIXELTYPE, \n; (testing is done for each value of ICAP_PIXELTYPE, to provide the best chance\n; of exercising every available capability).  Remember the pixeltype setting,\n; because we have to restore it as part of the MSG_RESET and MSG_SET tests.\n;\n:NEXTTWPT\nsetlocal indent '  '\nincrement pixeltype.index '${get:pixeltype.index}'\nsetglobal g_pixeltype.value '${getindex:pixeltype.itemlist:${get:pixeltype.index}}'\nif '${get:g_pixeltype.value}' != '' goto MAIN.TWPTSET\ngoto MAIN.PASS\n:MAIN.TWPTSET\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_PIXELTYPE,TWON_ONEVALUE,TWTY_UINT16,${get:g_pixeltype.value}'\nif '${sts:}' == 'SUCCESS' goto MAIN.TWPTCONTINUE\necho.passfail '${get:indent}${get:g_pixeltype.value}' 'skip'\ngoto NEXTTWPT\n:MAIN.TWPTCONTINUE\necho.passfail '${get:indent}${get:g_pixeltype.value}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Repeat this section for vendor custom array values found inside of\n; CAP_SUPPORTEDCAPS (each vendor custom capability ID is referred to as #CAP#\n; for the rest of this section)\n;\nsetlocal name 'CAP_SUPPORTEDCAPS MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'CAP_SUPPORTEDCAPS,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal supportedcaps '${ret:}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Turn on capabilities that enable the use of other capabilities\n; SPECNOTE: this isn't described in the tests, but it seems like a good idea\n;\ncall ENABLECAPABILITIES '${get:supportedcaps}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Grab a vendor custom capability from CAP_SUPPORTEDCAPS, we know it's\n; vendor custom if it's a number.\n;\nsetlocal supportedcaps.index '${get:TW_ARRAY.ItemList}'\nincrement supportedcaps.index '${get:supportedcaps.index}' -1\n:NEXTCAP\nincrement supportedcaps.index '${get:supportedcaps.index}' 1\nsetlocal supportedcaps.value '${getindex:supportedcaps:${get:supportedcaps.index}}'\nif '${get:supportedcaps.value}' == '' goto NEXTTWPT\nif '${get:supportedcaps.value}' !~contains '0x' goto NEXTCAP\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Perform these tests on each capability...\n; SPECNOTE: because we're referencing the querysupport value we don't have to accept\n; TWCC_CAPSEQERROR as a valid value, so it'll be an error just like everything else...\n;\ncall MSGQUERYSUPPORT '${get:supportedcaps.value}' g_querysupport          g_datcapabilityresult\ncall MSGGET          '${get:supportedcaps.value}' '${get:g_querysupport}' g_datcapabilityresult\ncall MSGGETCURRENT   '${get:supportedcaps.value}' '${get:g_querysupport}' g_datcapabilityresult\ncall MSGGETDEFAULT   '${get:supportedcaps.value}' '${get:g_querysupport}' g_datcapabilityresult\ncall MSGRESET        '${get:supportedcaps.value}' '${get:g_querysupport}' g_datcapabilityresult\ncall MSGSET          '${get:supportedcaps.value}' '${get:g_querysupport}' g_datcapabilityresult\ngoto NEXTCAP\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Summary and cleanup...\n;\n; Did we pass? (do an extra check)\n:MAIN.PASS\nif '${get:g_datcapabilityresult}' != 'pass' goto MAIN.ERROR\necho.passfail 'SUMMARY' 'pass'\nreturn 'pass'\n;\n; Ruh-roh...\n:MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'fail - ${sts:} ${ret:}'\n:MAIN.ERROR\necho.passfail 'SUMMARY' 'fail'\nreturn 'fail'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Function: MSGQUERYSUPPORT\n;\n; Arguments\n;   arg:1 - capability to check\n;   arg:2 - value returned\n;   arg:3 - only updated on fail\n;\n; Globals\n;   (none)\n;\n; Locals\n;   name - name of current test\n;   indent - amount to indent echo.passfail\n;   capability - MSG_QUERYSUPPORT on arg:1\n;\n; Returns\n;   (none)\n;\n:MSGQUERYSUPPORT\nsetlocal indent '    '\n;\n; Send the command...\necho ' '\necho '  ${arg:1}'\nsetlocal name 'Send MSG_QUERYSUPPORT'\ndsmentry src ds dg_control dat_capability msg_querysupport '${arg:1},0,0,0'\nif '${sts:}' != 'SUCCESS' goto MSGQUERYSUPPORT.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal capability '${ret:}'\n;\n; If TW_CAPABILITY.Cap is not #CAP#, then end with error\nsetlocal name 'Verify Cap'\nif '${getindex:capability:${get:TW_CAPABILITY.Cap}}' != '${arg:1}' goto MSGQUERYSUPPORT.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n; If TW_CAPABILITY.ConType is not TWON_ONEVALUE, then end with error.\nsetlocal name 'Verify ConType is TWON_ONEVALUE'\nif '${getindex:capability:${get:TW_CAPABILITY.ConType}}' != 'TWON_ONEVALUE' goto MSGQUERYSUPPORT.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n; If TW_ONEVALUE.ItemType is not TWTY_UINT32, then end with error\n; SPECNOTE: spec says TWTY_INT32, test says TWTY_UINT32...spec wins...\nsetlocal name 'Verify ItemType is TWTY_INT32'\nif '${getindex:capability:${get:TW_ONEVALUE.ItemType}}' != 'TWTY_INT32' goto MSGQUERYSUPPORT.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n; If TWQC_GET, TWQC_GETCURRENT or TWQC_GETDEFAULT is detected, then\n; all three must be present, if any are missing end with error\nsetlocal name 'Verify GET, GETCURRENT, GETDEFAULT'\nif '${getindex:capability:${get:TW_ONEVALUE.Item}}' & '0x000D' == '0' goto MSGQUERYSUPPORT.VERIFYSET\nif '${getindex:capability:${get:TW_ONEVALUE.Item}}' & '0x000D' != '0x000D' goto MSGQUERYSUPPORT.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n; If TWQC_RESET or TWQC_SET is detected, then both must be present,\n; plus TWQC_GET, TWQC_GETCURRENT and TWQC_GETDEFAULT, if not true\n; then end with error\n:MSGQUERYSUPPORT.VERIFYSET\nsetlocal name 'Verify SET, RESET with GETs'\nif '${getindex:capability:${get:TW_ONEVALUE.Item}}' & '0x0012' == '0' goto MSGQUERYSUPPORT.PASS\nif '${getindex:capability:${get:TW_ONEVALUE.Item}}' & '0x001F' != '0x001F' goto MSGQUERYSUPPORT.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n; All done...\ngoto MSGQUERYSUPPORT.PASS\n:MSGQUERYSUPPORT.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'fail'\nsetglobal '${arg:2}' '0'\nsetglobal '${arg:3}' 'fail'\nreturn\n:MSGQUERYSUPPORT.PASS\nsetglobal '${arg:2}' '${getindex:capability:${get:TW_ONEVALUE.Item}}'\nreturn\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Function: MSGGET\n;\n; Arguments\n;   arg:1 - capability to check\n;   arg:2 - value from MSG_QUERYSUPPORT\n;   arg:3 - only updated on fail\n;\n; Globals\n;   (none)\n;\n; Locals\n;   name - name of current test\n;   indent - amount to indent echo.passfail\n;   capability - MSG_QUERYSUPPORT on arg:1\n;\n; Returns\n;   (none)\n;\n:MSGGET\n;\n; Skip if not supported (TWQC_GET)...\nif '${arg:2}' & '0x0001' == '0' goto MSGGET.SKIP\nsetlocal indent '    '\n;\n; Send the command...\nsetlocal name 'Send MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get '${arg:1},0,0,0'\nif '${sts:}' != 'SUCCESS' goto MSGGET.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal capability '${ret:}'\n;\n; If TW_CAPABILITY.Cap is not #CAP#, then end with error\nsetlocal name 'Verify Cap'\nif '${getindex:capability:${get:TW_CAPABILITY.Cap}}' != '${arg:1}' goto MSGGET.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n; All done...\ngoto MSGGET.PASS\n:MSGGET.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'fail'\nsetglobal '${arg:3}' 'fail'\nreturn\n:MSGGET.SKIP\nreturn\n:MSGGET.PASS\nreturn\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Function: MSGGETCURRENT\n;\n; Arguments\n;   arg:1 - capability to check\n;   arg:2 - value from MSG_QUERYSUPPORT\n;   arg:3 - only updated on fail\n;\n; Globals\n;   (none)\n;\n; Locals\n;   name - name of current test\n;   indent - amount to indent echo.passfail\n;   capability - MSG_QUERYSUPPORT on arg:1\n;\n; Returns\n;   (none)\n;\n:MSGGETCURRENT\n;\n; Skip if not supported (TWQC_GETCURRENT)...\nif '${arg:2}' & '0x0008' == '0' goto MSGGETCURRENT.SKIP\nsetlocal indent '    '\n;\n; Send the command...\nsetlocal name 'Send MSG_GETCURRENT'\ndsmentry src ds dg_control dat_capability msg_getcurrent '${arg:1},0,0,0'\nif '${sts:}' != 'SUCCESS' goto MSGGETCURRENT.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal capability '${ret:}'\n;\n; If TW_CAPABILITY.Cap is not #CAP#, then end with error\nsetlocal name 'Verify Cap'\nif '${getindex:capability:${get:TW_CAPABILITY.Cap}}' != '${arg:1}' goto MSGGETCURRENT.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n; All done...\ngoto MSGGETCURRENT.PASS\n:MSGGETCURRENT.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'fail'\nsetglobal '${arg:3}' 'fail'\nreturn\n:MSGGETCURRENT.SKIP\nreturn\n:MSGGETCURRENT.PASS\nreturn\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Function: MSGGETDEFAULT\n;\n; Arguments\n;   arg:1 - capability to check\n;   arg:2 - value from MSG_QUERYSUPPORT\n;   arg:3 - only updated on fail\n;\n; Globals\n;   (none)\n;\n; Locals\n;   name - name of current test\n;   indent - amount to indent echo.passfail\n;   capability - MSG_QUERYSUPPORT on arg:1\n;\n; Returns\n;   (none)\n;\n:MSGGETDEFAULT\n;\n; Skip if not supported (TWQC_GETDEFAULT)...\nif '${arg:2}' & '0x0004' == '0' goto MSGGETDEFAULT.SKIP\nsetlocal indent '    '\n;\n; Send the command...\nsetlocal name 'Send MSG_GETDEFAULT'\ndsmentry src ds dg_control dat_capability msg_getdefault '${arg:1},0,0,0'\nif '${sts:}' != 'SUCCESS' goto MSGGETDEFAULT.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal capability '${ret:}'\n;\n; If TW_CAPABILITY.Cap is not #CAP#, then end with error\nsetlocal name 'Verify Cap'\nif '${getindex:capability:${get:TW_CAPABILITY.Cap}}' != '${arg:1}' goto MSGGETDEFAULT.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n; All done...\ngoto MSGGETDEFAULT.PASS\n:MSGGETDEFAULT.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'fail'\nsetglobal '${arg:3}' 'fail'\nreturn\n:MSGGETDEFAULT.SKIP\nreturn\n:MSGGETDEFAULT.PASS\nreturn\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Function: MSGRESET\n;\n; Arguments\n;   arg:1 - capability to check\n;   arg:2 - value from MSG_QUERYSUPPORT\n;   arg:3 - only updated on fail\n;\n; Globals\n;   (none)\n;\n; Locals\n;   name - name of current test\n;   indent - amount to indent echo.passfail\n;   capability - MSG_QUERYSUPPORT on arg:1\n;\n; Returns\n;   (none)\n;\n:MSGRESET\n;\n; Skip if not supported (TWQC_RESET)...\nif '${arg:2}' & '0x0010' == '0' goto MSGRESET.SKIP\nsetlocal indent '    '\n;\n; Send the command...\nsetlocal name 'Send MSG_RESET'\ndsmentry src ds dg_control dat_capability msg_reset '${arg:1},0,0,0'\nif '${sts:}' != 'SUCCESS' goto MSGRESET.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal capability '${ret:}'\n;\n; If TW_CAPABILITY.Cap is not #CAP#, then end with error\nsetlocal name 'Verify Cap'\nif '${getindex:capability:${get:TW_CAPABILITY.Cap}}' != '${arg:1}' goto MSGRESET.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n; All done...\ngoto MSGRESET.PASS\n:MSGRESET.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'fail'\nsetglobal '${arg:3}' 'fail'\nreturn\n:MSGRESET.SKIP\nreturn\n:MSGRESET.PASS\nreturn\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Function: MSGSET\n;\n; Arguments\n;   arg:1 - capability to check\n;   arg:2 - value from MSG_QUERYSUPPORT\n;   arg:3 - only updated on fail\n;\n; Globals\n;   (none)\n;\n; Locals\n;   name - name of current test\n;   indent - amount to indent echo.passfail\n;   capability - MSG_QUERYSUPPORT on arg:1\n;   capabilityrestore - value to restore when we're done\n;\n; Returns\n;   (none)\n;\n:MSGSET\n;\n; Skip if not supported (TWQC_SET)...\nif '${arg:2}' & '0x0002' == '0' goto MSGSET.SKIP\nsetlocal indent '    '\n;\n; Explain what's going on...\nsetlocal name 'Test MSG_SET'\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n; GET -> SET, and check they match with a final GET\n; We'll accept SUCCESS or CHECKSTATUS\nsetlocal name 'Send MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get '${arg:1},0,0,0'\nif '${sts:}' != 'SUCCESS' goto MSGSET.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal capability '${ret:}'\nsetlocal capabilityrestore '${ret:}'\nsetlocal name 'Send MSG_SET with that GET'\ndsmentry src ds dg_control dat_capability msg_set '${get:capability}'\nif '/CHECKSTATUS/SUCCESS/' !~contains '/${sts:}/' goto MSGSET.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal name 'Send MSG_GET to confirm MSG_SET'\ndsmentry src ds dg_control dat_capability msg_get '${arg:1},0,0,0'\nsetlocal value '${ret:}'\nif '${sts:}' != 'SUCCESS' goto MSGSET.ERROR.ECHOPASSFAIL\nif '${get:value}' != '${get:capability}' goto MSGSET.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n; GETGURRENT -> SET, and check they match with a final GETCURRENT\nsetlocal name 'Send MSG_GETCURRENT'\ndsmentry src ds dg_control dat_capability msg_getcurrent '${arg:1},0,0,0'\nif '${sts:}' != 'SUCCESS' goto MSGSET.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal capability '${ret:}'\nsetlocal name 'Send MSG_SET with that GETCURRENT'\ndsmentry src ds dg_control dat_capability msg_set '${get:capability}'\nif '${sts:}' != 'SUCCESS' goto MSGSET.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal name 'Send MSG_GETCURRENT to confirm MSG_SET'\ndsmentry src ds dg_control dat_capability msg_getcurrent '${arg:1},0,0,0'\nsetlocal value '${ret:}'\nif '${sts:}' != 'SUCCESS' goto MSGSET.ERROR.ECHOPASSFAIL\nif '${get:value}' != '${get:capability}' goto MSGSET.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n; GETDEFAULT -> SET, and check they match with a final GETCURRENT\nsetlocal name 'Send MSG_GETDEFAULT'\ndsmentry src ds dg_control dat_capability msg_getdefault '${arg:1},0,0,0'\nif '${sts:}' != 'SUCCESS' goto MSGSET.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal capability '${ret:}'\nsetlocal name 'Send MSG_SET with that GETDEFAULT'\ndsmentry src ds dg_control dat_capability msg_set '${get:capability}'\nif '${sts:}' != 'SUCCESS' goto MSGSET.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal name 'Send MSG_GETCURRENT to confirm MSG_SET'\ndsmentry src ds dg_control dat_capability msg_getcurrent '${arg:1},0,0,0'\nsetlocal value '${ret:}'\nif '${sts:}' != 'SUCCESS' goto MSGSET.ERROR.ECHOPASSFAIL\nif '${get:value}' != '${get:capability}' goto MSGSET.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n; RESET -> SET, and check they match with a final GETCURRENT\nsetlocal name 'Send MSG_RESET'\ndsmentry src ds dg_control dat_capability msg_reset '${arg:1},0,0,0'\nif '${sts:}' != 'SUCCESS' goto MSGSET.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal capability '${ret:}'\nsetlocal name 'Send MSG_SET with that RESET'\ndsmentry src ds dg_control dat_capability msg_set '${get:capability}'\nif '${sts:}' != 'SUCCESS' goto MSGSET.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal name 'Send MSG_GETCURRENT to confirm MSG_SET'\ndsmentry src ds dg_control dat_capability msg_getcurrent '${arg:1},0,0,0'\nsetlocal value '${ret:}'\nif '${sts:}' != 'SUCCESS' goto MSGSET.ERROR.ECHOPASSFAIL\nif '${get:value}' != '${get:capability}' goto MSGSET.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n; Restore the setting when we came into this function...\ndsmentry src ds dg_control dat_capability msg_set '${get:capabilityrestore}'\n;\n; All done...\ngoto MSGSET.PASS\n:MSGSET.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'fail ${sts:} <${get:capability}> <${get:value}>'\nsetglobal '${arg:3}' 'fail'\nreturn\n:MSGSET.SKIP\nreturn\n:MSGSET.PASS\nreturn\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Function: ENABLECAPABILITIES\n;   Turn on stuff that we find in the list, we don't care if it fails,\n;   we'll keep on going...\n;\n; Arguments\n;   arg:1 - supportedcaps\n;\n; Globals\n;   (none)\n;\n; Locals\n;   (none)\n;\n; Returns\n;   (none)\n;\n:ENABLECAPABILITIES\nsetlocal indent '    '\n;\n; CAP_PRINTERENABLED\n:ENABLECAPABILITIES.CAP_PRINTERENABLED\nif '${arg:1}' !~contains 'CAP_PRINTERENABLED' goto ENABLECAPABILITIES.ICAP_BARCODEDETECTIONENABLED\ndsmentry src ds dg_control dat_capability msg_set 'CAP_PRINTERENABLED,TWON_ONEVALUE,TWTY_BOOL,TRUE'\nif '${sts:}' != 'SUCCESS' goto ENABLECAPABILITIES.CAP_PRINTERENABLED.ECHOPASSFAIL\necho.passfail '${get:indent}Enable CAP_PRINTERENABLED' 'pass'\ngoto ENABLECAPABILITIES.ICAP_BARCODEDETECTIONENABLED\n:ENABLECAPABILITIES.CAP_PRINTERENABLED.ECHOPASSFAIL\necho.passfail '${get:indent}Enable CAP_PRINTERENABLED' 'fail (but we won't fail on it here)'\n;\n; ICAP_BARCODEDETECTIONENABLED\n:ENABLECAPABILITIES.ICAP_BARCODEDETECTIONENABLED\nif '${arg:1}' !~contains 'ICAP_BARCODEDETECTIONENABLED' goto ENABLECAPABILITIES.ICAP_PATCHCODEDETECTIONENABLED\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_BARCODEDETECTIONENABLED,TWON_ONEVALUE,TWTY_BOOL,TRUE'\nif '${sts:}' != 'SUCCESS' goto ENABLECAPABILITIES.ICAP_BARCODEDETECTIONENABLED.ECHOPASSFAIL\necho.passfail '${get:indent}Enable ICAP_BARCODEDETECTIONENABLED' 'pass'\ngoto ENABLECAPABILITIES.ICAP_PATCHCODEDETECTIONENABLED\n:ENABLECAPABILITIES.ICAP_BARCODEDETECTIONENABLED.ECHOPASSFAIL\necho.passfail '${get:indent}Enable ICAP_BARCODEDETECTIONENABLED' 'fail (but we won't fail on it here)'\n;\n; ICAP_PATCHCODEDETECTIONENABLED\n:ENABLECAPABILITIES.ICAP_PATCHCODEDETECTIONENABLED\nif '${arg:1}' !~contains 'CAP_PATCHCODEDETECTIONENABLED' goto ENABLECAPABILITIES.DONE\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_PATCHCODEDETECTIONENABLED,TWON_ONEVALUE,TWTY_BOOL,TRUE'\nif '${sts:}' != 'SUCCESS' goto ENABLECAPABILITIES.ICAP_PATCHCODEDETECTIONENABLED.ECHOPASSFAIL\necho.passfail '${get:indent}Enable CAP_PATCHCODEDETECTIONENABLED' 'pass'\ngoto ENABLECAPABILITIES.DONE\n:ENABLECAPABILITIES.ICAP_PATCHCODEDETECTIONENABLED.ECHOPASSFAIL\necho.passfail '${get:indent}Enable CAP_PATCHCODEDETECTIONENABLED' 'fail (but we won't fail on it here)'\n;\n; All done...\n:ENABLECAPABILITIES.DONE\nreturn\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/030 - Status Return Tests/Certification.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Status Return Tests\n;   Check the TWRC/TWCC values for some situations...\n;\n; Arguments\n;   arg:1 - TW_IDENTITY.ProductName of scanner to test\n;   arg:2 - global to set on fail\n;\n; Globals\n;   g_localcertifyresult - global to report to caller on fail\n;\n; Locals\n;   twidentity.productname - product name of scanner to test\n;\n; Returns\n;   (none)\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize stuff, load tables if not already done for us...\n;\necho.titlesuite 'Status Return Tests v1.0 23-Feb-2020'\nsetlocal twidentity.productname '${arg:1}'\nsetglobal g_localcertifyresult 'pass' ; assume success\nif '${get:TW_ARRAY.ItemType}' != '' goto MAIN.LOADTABLES.SKIP\nrun '${folder:certification}/LoadTables'\n:MAIN.LOADTABLES.SKIP\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Run the tests...\n;\ncall CERTIFY '${folder:certification}/Opends'  '${get:twidentity.productname}' g_localcertifyresult embedded\nif '${get:g_localcertifyresult}' == 'fail' goto MAIN.CLOSEDS\ncall CERTIFY 'Status Return Tests'             '${get:twidentity.productname}' g_localcertifyresult\n:MAIN.CLOSEDS\ncall CERTIFY '${folder:certification}/Closeds' '${get:twidentity.productname}' g_localcertifyresult embedded\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Summary and cleanup...\n;\n; Did we pass?\nif '${get:g_localcertifyresult}' != 'pass' goto MAIN.ERROR\necho.passfail 'SUMMARY' 'pass'\nreturn 'pass'\n;\n; Ruh-roh...\n:MAIN.ERROR\necho.passfail 'SUMMARY' 'fail'\nsetglobal '${arg:2}' 'fail'\nreturn 'fail'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Function: Certify\n; arg:1 - script to run\n; arg:2 - TW_IDENTITY.ProductName of scanner to test\n; arg:3 - global value to update on fail\n; arg:4 - embeded flag for open/close\n; returns: (none)\n;\n:CERTIFY\n;\nrun '${arg:1}' '${arg:2}' '${arg:4}'\nif '${ret:}' != 'pass' goto CERTIFY.FAIL\nreturn 'pass'\n;\n:CERTIFY.FAIL\nsetglobal '${arg:3}' 'fail'\nreturn 'fail'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/030 - Status Return Tests/Status Return Tests.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Status Return Tests\n;   Confirm that the expected status return is reported by certain operations.\n;\n; Arguments\n;   arg:1 - TW_IDENTITY.ProductName of scanner to test\n;   arg:2 - global to set on fail\n;\n; Globals\n;   g_value - data return from dsmentry call\n;\n; Locals\n;   certifyresult - global to report back on fail\n;\n; Returns\n;   pass or fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize...\n;\nsetlocal certifyresult '${arg:2}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Prompt the user...\n;\nif '${get:g_skipprompts}' != '' goto MAIN.SKIP.PROMPTS\necho.prompt\necho.prompt '*** DO NOT CLICK ON THE TWAIN USER INTERFACE WHEN IT COMES UP ***'\necho.prompt 'We are checking that the driver works correctly in state 5.'\necho.prompt 'When done the TWAIN user interface will exit on its own.'\necho.prompt\npause '(press the ENTER key when ready to continue)'\necho.prompt\n:MAIN.SKIP.PROMPTS\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DAT_IMAGELAYOUT\n; Confirm that DAT_IMAGELAYOUT returns the correct status\n; in various error conditions.  We're doing tests in state 5\n; so we need the driver's user interface...\n;\ncall SENDANDCHECK SUCCESS  '${get:certifyresult}' discard dg_control dat_userinterface msg_enabledsuionly  '1,0'\nsleep 5000 ; give the ui time to come up, we want to make sure we're really in state 5\ncall SENDANDCHECK SUCCESS  '${get:certifyresult}' g_value dg_image   dat_imagelayout   msg_get        '0,0,0,0,0,0,0'\ncall SENDANDCHECK SEQERROR '${get:certifyresult}' discard dg_image   dat_imagelayout   msg_set        '${get:g_value}'\ncall SENDANDCHECK SEQERROR '${get:certifyresult}' discard dg_image   dat_imagelayout   msg_reset      '0,0,0,0,0,0,0'\ncall SENDANDCHECK SUCCESS  '${get:certifyresult}' discard dg_control dat_userinterface msg_disableds  '0,0'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DAT_IMAGEMEMXFER\n; Confirm that DAT_IMAGEMEMXFER returns the correct status\n; in various error conditions.\n;\ncall SENDANDCHECK BADPROTOCOL '${get:certifyresult}' discard dg_image dat_imagememxfer msg_set '0,0,0,0,0,0,0,9,0,0'\ncall SENDANDCHECK SEQERROR    '${get:certifyresult}' discard dg_image dat_imagememxfer msg_get '0,0,0,0,0,0,0,9,0,0'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DAT_IMAGENATIVEXFER\n; Confirm that DAT_IMAGENATIVEXFER returns the correct status\n; in various error conditions.\n;\ncall SENDANDCHECK BADPROTOCOL '${get:certifyresult}' discard dg_image dat_imagenativexfer msg_set '0'\ncall SENDANDCHECK SEQERROR    '${get:certifyresult}' discard dg_image dat_imagenativexfer msg_get '0'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; All done...\n;\nreturn 'pass' ; caller figures out what really happened based on certifyresult...\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Function: SENDANDCHECK\n; arg:1 - expected status\n; arg:2 - status to return\n; arg:3 - data to return\n; arg:4 - DG to send\n; arg:5 - DAT to send \n; arg:6 - MSG to send \n; arg:7 - TW_MEMREF to send \n; returns: (none)\n;\n:SENDANDCHECK\ndsmentry src ds '${arg:4}' '${arg:5}' '${arg:6}' '${arg:7}'\nif '${sts:}' != '${arg:1}' goto SENDANDCHECK.ERROR.ECHOPASSFAIL\necho.passfail '${arg:5}/${arg:6} --> ${arg:1}' 'pass'\nsetglobal '${arg:3}' '${ret:}'\nreturn\n:SENDANDCHECK.ERROR.ECHOPASSFAIL\necho.passfail '${arg:5}/${arg:6} --> ${arg:1}' 'fail ${sts:} ${ret:}'\nsetglobal '${arg:2}' 'fail'\nreturn\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/040 - Stress Tests/Certification.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Stress Tests\n;   Perform repeated open/close commands\n;\n; Arguments\n;   arg:1 - TW_IDENTITY.ProductName of scanner to test\n;   arg:2 - global to set on fail\n;\n; Globals\n;   g_localcertifyresult - global to report to caller on fail\n;\n; Locals\n;   twidentity.productname - product name of scanner to test\n;\n; Returns\n;   (none)\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize stuff, load tables if not already done for us...\n;\necho.titlesuite 'Stress Tests v1.0 23-Feb-2020'\nsetlocal twidentity.productname '${arg:1}'\nsetglobal g_localcertifyresult 'pass'\nif '${get:TW_ARRAY.ItemType}' != '' goto MAIN.LOADTABLES.SKIP\nrun '${folder:certification}/LoadTables'\n:MAIN.LOADTABLES.SKIP\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Run the tests...\n;\ncall CERTIFY '${folder:certification}/Opends'  '${get:twidentity.productname}' g_localcertifyresult embedded\ncall CERTIFY '${folder:certification}/Closeds' '${get:twidentity.productname}' g_localcertifyresult embedded\nif '${get:g_localcertifyresult}' == 'fail' goto MAIN.ERROR\ncall CERTIFY '${folder:certification}/Opends'  '${get:twidentity.productname}' g_localcertifyresult embedded\ncall CERTIFY '${folder:certification}/Closeds' '${get:twidentity.productname}' g_localcertifyresult embedded\ncall CERTIFY '${folder:certification}/Opends'  '${get:twidentity.productname}' g_localcertifyresult embedded\ncall CERTIFY '${folder:certification}/Closeds' '${get:twidentity.productname}' g_localcertifyresult embedded\ncall CERTIFY '${folder:certification}/Opends'  '${get:twidentity.productname}' g_localcertifyresult embedded\ncall CERTIFY '${folder:certification}/Closeds' '${get:twidentity.productname}' g_localcertifyresult embedded\ncall CERTIFY '${folder:certification}/Opends'  '${get:twidentity.productname}' g_localcertifyresult embedded\ncall CERTIFY '${folder:certification}/Closeds' '${get:twidentity.productname}' g_localcertifyresult embedded\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Summary and cleanup...\n;\n; Did we pass?\nif '${get:g_localcertifyresult}' != 'pass' goto MAIN.ERROR\necho.passfail 'SUMMARY' 'pass'\nreturn 'pass'\n;\n; Ruh-roh...\n:MAIN.ERROR\necho.passfail 'SUMMARY' 'fail - ${sts:} ${ret:}'\nsetglobal '${arg:2}' 'fail'\nreturn 'fail'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Function: Certify\n; arg:1 - script to run\n; arg:2 - TW_IDENTITY.ProductName of scanner to test\n; arg:3 - global value to update on fail\n; arg:4 - embeded flag for open/close\n; returns: (none)\n;\n:CERTIFY\n;\nrun '${arg:1}' '${arg:2}' '${arg:4}'\nif '${ret:}' != 'pass' goto CERTIFY.FAIL\nreturn 'pass'\n;\n:CERTIFY.FAIL\nsetglobal '${arg:3}' 'fail'\nreturn 'fail'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/050 - Non-UI Image Transfer Tests/Certification.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Non-UI Image Transfer Tests\n;   Confirm that multiple MSG_ENABLEDS and MSG_DISABLEDS calls can be made in the context of\n;   one MSG_OPENDS / MSG_CLOSEDS. This test focuses on image capture with no UI, verifying\n;   that the Application does not have to close the driver after capturing images.\n;\n; Arguments\n;   arg:1 - TW_IDENTITY.ProductName of scanner to test\n;   arg:2 - global to set on fail\n;\n; Globals\n;   (none)\n;\n; Locals\n;   twidentity.productname - product name of scanner to test\n;   certifyresult - global to set on fail\n;   xfermech - result of getting ICAP_XFERMECH\n;   sheets - count of sheets the user needs\n;\n; Returns\n;   (none)\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize stuff, load tables if not already done for us...\n;\necho.titlesuite 'Non-UI Image Transfer Tests v1.0 01-Mar-2020'\nsetlocal twidentity.productname '${arg:1}'\nsetlocal certifyresult '${arg:2}'\nsetlocal sheets '0'\nif '${get:TW_ARRAY.ItemType}' != '' goto MAIN.LOADTABLES.SKIP\nrun '${folder:certification}/LoadTables'\n:MAIN.LOADTABLES.SKIP\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Open the scanner...\n;\ncall CERTIFY '${folder:certification}/Opends'  '${get:twidentity.productname}' '${get:certifyresult}'\nif '${get:${get:certifyresult}}' == 'fail' goto MAIN.CLOSEDS\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Prompt the user, if they have an ADF...\n;\n:MAIN.PROMPT\nif '${get:g_skipprompts}' != '' goto MAIN.SKIP.PROMPTS\ndsmentry src ds dg_control dat_capability msg_get 'CAP_FEEDERENABLED,0,0,0'\nif '${ret:}' !~contains 'TRUE' goto MAIN.SKIP.PROMPTS\ndsmentry src ds dg_control dat_capability msg_get 'ICAP_XFERMECH,0,0,0'\nsetlocal xfermech '${ret:}'\ndsmentry src ds dg_control dat_capability msg_get 'ICAP_PIXELTYPE,0,0,0'\nif '${ret:}' !~contains 'TWPT_BW' goto MAIN.PROMPTS.SKIP.BW\nincrement sheets '${get:sheets}' '${getindex:xfermech:${get:TW_ENUMERATION.NumItems}}'\n:MAIN.PROMPTS.SKIP.BW\nif '${ret:}' !~contains 'TWPT_GRAY' goto MAIN.PROMPTS.SKIP.GRAY\nincrement sheets '${get:sheets}' '${getindex:xfermech:${get:TW_ENUMERATION.NumItems}}'\n:MAIN.PROMPTS.SKIP.GRAY\nif '${ret:}' !~contains 'TWPT_RGB' goto MAIN.PROMPTS.SKIP.RGB\nincrement sheets '${get:sheets}' '${getindex:xfermech:${get:TW_ENUMERATION.NumItems}}'\n:MAIN.PROMPTS.SKIP.RGB\necho.prompt\necho.prompt \"Scanning will take place during this test.  There will be no\"\necho.prompt \"need to press any button on the TWAIN user interface to start\"\necho.prompt \"the scanner.  A progress indicator may appear during scanning.\"\necho.prompt\necho.prompt \"Place ${get:sheets} sheets of paper in the scanner's feeder.\"\npause '(press the ENTER key when ready to continue)'\necho.prompt\n:MAIN.SKIP.PROMPTS\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get ICAP_XFERMECH...\n;\nsetlocal name 'ICAP_XFERMECH MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'ICAP_XFERMECH,0,0,0'\nif '${sts:}' != 'SUCCESS' goto CERTIFY.FAIL\nsetlocal xfermech '${ret:}'\necho.passfail '${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Do the tests...\n;\ncall CERTIFY 'DAT_IMAGENATIVEXFER'             '${get:twidentity.productname}' '${get:certifyresult}' 'FALSE' '${folder:parent}'\ncall CERTIFY 'DAT_IMAGEMEMXFER'                '${get:twidentity.productname}' '${get:certifyresult}' 'FALSE' '${folder:parent}'\ncall CERTIFY 'DAT_IMAGEFILEXFER'               '${get:twidentity.productname}' '${get:certifyresult}' 'FALSE' '${folder:parent}' '${get:xfermech}'\ncall CERTIFY 'DAT_IMAGEMEMFILEXFER'            '${get:twidentity.productname}' '${get:certifyresult}' 'FALSE' '${folder:parent}' '${get:xfermech}'\n:MAIN.CLOSEDS\ncall CERTIFY '${folder:certification}/Closeds' '${get:twidentity.productname}' '${get:certifyresult}'\nreturn\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Function: Certify\n; arg:1 - script to run\n; arg:2 - TW_IDENTITY.ProductName of scanner to test\n; arg:3 - global value to update on fail\n; arg:4 - showui value\n; arg:5 - name of test\n; arg:6 - xfermech values\n; returns: (none)\n;\n:CERTIFY\n;\nrun '${arg:1}' '${arg:2}' '${arg:3}' '${arg:4}' '${arg:5}' '${arg:6}'\nif '${ret:}' != 'pass' goto CERTIFY.FAIL\nreturn 'pass'\n;\n:CERTIFY.FAIL\nsetglobal '${arg:3}' 'fail'\nreturn 'fail'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/050 - Non-UI Image Transfer Tests/DAT_IMAGEFILEXFER.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DAT_IMAGEFILEXFER\n;   This test issues multiple image transfer sessions using DAT_IMAGEFILEXFER. It is performed\n;   for all available image sources (unspecified, flatbed and/or ADF). Only one image is transferred\n;   per session.\n;\n;   We follow the capability ordering, so the loops take the form:\n;   set ICAP_XFERMECH TWSX_FILE\n;   foreach CAP_FEEDERENABLED\n;     foreach ICAP_PIXELTYPE\n;       scan\n;     end\n;   end\n;\n; Arguments\n;   arg:1 - TW_IDENTITY.ProductName of scanner to test\n;   arg:2 - global for us to update on failure\n;   arg:3 - value of ShowUI (TRUE or FALSE)\n;   arg:4 - test name for the image folder\n;   arg:5 - result of a MSG_GET on ICAP_XFERMECH\n;\n; Globals\n;   (none)\n;\n; Locals\n;   name - current test being done\n;   indent - indent the passfail text\n;   twimageinfo.compression - compression for current image\n;   showui - value of showui\n;\n;   image.count - count of images from 1\n;   image.folder - folder to put the images in\n;   image.prefix - adf or fb\n;\n;   feederenabled.list - scanner's feederenabled values\n;   feederenabled.index - index of feederenabled values\n;   feederenabled.value - current feederenabled value\n;\n;   pixeltype.list - scanner's pixeltype values for this feederenabled\n;   pixeltype.index - index of pixeltype values\n;   pixeltype.value - current pixeltype value\n;\n; Returns\n;   pass or fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; If not supported, quietly leave...\n;\nif '${arg:5}' ~contains 'TWSX_FILE' goto MAIN.CONTINUE\nreturn 'pass'\n:MAIN.CONTINUE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize...\n;\necho.titletest 'DAT_IMAGEFILEXFER'\nsetlocal indent ''\nsetlocal image.count '0'\nsetlocal image.folder '${folder:certimages}/${arg:4}/DAT_IMAGEFILEXFER'\nsetlocal image.prefix 'fb'\nsetlocal image.showname ''\nsetlocal showui '${arg:3}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Clean the image folder for this test...\n;\nimage cleanfolder '${get:image.folder}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; MSG_RESETALL\n; If return code is not TWRC_SUCCESS, end with an error\n;\nsetlocal name 'MSG_RESETALL'\ndsmentry src ds dg_control dat_capability msg_resetall '0,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get and set ICAP_XFERMECH...\n;\nsetlocal name 'ICAP_XFERMECH MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'ICAP_XFERMECH,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\nif '${ret:}' !~contains 'TWSX_FILE' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'ICAP_XFERMECH MSG_SET TWSX_FILE'\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_XFERMECH,TWON_ONEVALUE,TWTY_UINT16,TWSX_FILE'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get CAP_FEEDERENABLED, and loop so we test all values\n; for the current ICAP_XFERMECH setting.\n;\nsetlocal name 'CAP_FEEDERENABLED MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'CAP_FEEDERENABLED,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal feederenabled.list '${ret:}' ; what the scanner told us\nsetlocal feederenabled.index '${get:TW_ENUMERATION.ItemList}' ; point to itemlist\nincrement feederenabled.index '${get:feederenabled.index}' -1 ; less 1\n;\n:MAIN.FEEDERENABLED.NEXT\nsetlocal indent ''\nsetlocal image.count '0' ; reset count to 0\nincrement feederenabled.index '${get:feederenabled.index}' 1 ; next itemlist\nsetlocal feederenabled.value '${getindex:feederenabled.list:${get:feederenabled.index}}' ; get the value\nif '${get:feederenabled.value}' == '' goto MAIN.PASS ; we've passed all tests!!!\n;\nsetlocal name 'CAP_FEEDERENABLED MSG_SET ${get:feederenabled.value}'\ndsmentry src ds dg_control dat_capability msg_set 'CAP_FEEDERENABLED,TWON_ONEVALUE,TWTY_BOOL,${get:feederenabled.value}'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nif '${get:feederenabled.value}' ~~ 'FALSE' goto MAIN.FEEDERENABLED.SETFB\nsetlocal image.prefix 'adf'\ngoto MAIN.FEEDERENABLED.SETDONE\n:MAIN.FEEDERENABLED.SETFB\nsetlocal image.prefix 'fb'\n:MAIN.FEEDERENABLED.SETDONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get ICAP_PIXELTYPE, and loop so we test all values for\n; the current CAP_FEEDERENABLED setting.\n;\nsetlocal indent '  '\nsetlocal name 'ICAP_PIXELTYPE MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'ICAP_PIXELTYPE,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal pixeltype.list '${ret:}' ; what the scanner told us\nsetlocal pixeltype.index '${get:TW_ENUMERATION.ItemList}' ; point to itemlist\nincrement pixeltype.index '${get:pixeltype.index}' -1 ; less 1\n;\n:MAIN.PIXELTYPE.NEXT\nsetlocal indent '  '\nincrement pixeltype.index '${get:pixeltype.index}' 1 ; next itemlist\nsetlocal pixeltype.value '${getindex:pixeltype.list:${get:pixeltype.index}}' ; get the value\nif '${get:pixeltype.value}' == '' goto MAIN.FEEDERENABLED.NEXT ; pixeltypes done for this feederenabled\n;\nsetlocal name 'ICAP_PIXELTYPE MSG_SET ${get:pixeltype.value}'\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_PIXELTYPE,TWON_ONEVALUE,TWTY_UINT16,${get:pixeltype.value}'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; If we're a flatbed, we can start scanning...\n;\nsetlocal indent '    '\nif '${get:feederenabled.value}' ~~ 'FALSE' goto MAIN.USERINTERFACE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Check for paper in the feeder...\n;\ndsmentry src ds dg_control dat_capability msg_getcurrent 'CAP_FEEDERLOADED,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.FEEDERLOADED.DONE\nif '${ret:${get:TW_ONEVALUE.Item}}' ~~ 'TRUE' goto MAIN.FEEDERLOADED.DONE\necho.prompt\necho.prompt \"Place paper in the scanner's feeder.\"\npause '(press the ENTER key when ready to continue)'\n:MAIN.FEEDERLOADED.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Start scanning...\n;\n:MAIN.USERINTERFACE\nsetlocal name 'dg_control/dat_userinterface/msg_enableds'\nwait reset\ndsmentry src null dg_control dat_userinterface msg_enableds '${get:showui},0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Wait for MSG_XFERREADY, if we don't see it then scoot...\n;\nsetlocal name 'wait ${get:sys_waittimeout} seconds for MSG_XFERREADY'\nwait '${get:sys_waittimeout}000'\nif '${ret:}' !~contains 'msg_xferready' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get information about the image...\n;\n:MAIN.IMAGEINFO.NEXT\nsetlocal name 'dg_image/dat_imageinfo/msg_get'\ndsmentry src ds dg_image dat_imageinfo msg_get '0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\nsetlocal twimageinfo.compression '${ret:${get:index.twimageinfo.compression}}'\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set up the file transfer...\n;\nincrement image.count '${get:image.count}' 1\nif '${get:twimageinfo.compression}' == 'JPEG' goto MAIN.SETUPFILEXFER.JPEG\nsetlocal image.showname 'DAT_IMAGEFILEXFER/${get:image.prefix}${format:D6|${get:image.count}}.tif'\nsetlocal twsetupfilexfer.filename '${get:image.folder}/${get:image.prefix}${format:D6|${get:image.count}}.tif'\nsetlocal twsetupfilexfer.format 'TWFF_TIFF'\ngoto MAIN.SETUPFILEXFER\n:MAIN.SETUPFILEXFER.JPEG\nsetlocal image.showname 'DAT_IMAGEFILEXFER/${get:image.prefix}${format:D6|${get:image.count}}.jpg'\nsetlocal twsetupfilexfer.filename '${get:image.folder}/${get:image.prefix}${format:D6|${get:image.count}}.jpg'\nsetlocal twsetupfilexfer.format 'TWFF_JFIF'\n:MAIN.SETUPFILEXFER\nsetlocal name 'dg_control/dat_setupfilexfer/msg_set'\ndsmentry src ds dg_control dat_setupfilexfer msg_set '\"${get:twsetupfilexfer.filename}\",${get:twsetupfilexfer.format},0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Transfer the image...\n;\nsetlocal name 'dg_image/dat_imagefilexfer/msg_get'\ndsmentry src ds dg_image dat_imagefilexfer msg_get null\nif '${sts:}' != 'XFERDONE' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\necho.passfail '${get:indent}image <${get:image.showname}>' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; End the transfer, see if we're done...\n;\nsetlocal name 'dg_control/dat_pendingxfers/msg_endxfer'\ndsmentry src ds dg_control dat_pendingxfers msg_endxfer '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nif '${ret:${get:TW_PENDINGXFERS.Count}}' != '0' goto MAIN.IMAGEINFO.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We're out of images, so disable and go back up to\n; do the next ICAP_PIXELTYPE...\n;\nsetlocal name 'dg_control/dat_userinterface/msg_disableds'\ndsmentry src ds dg_control dat_userinterface msg_disableds '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\ngoto MAIN.PIXELTYPE.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Summary and cleanup...\n;\n; We passed...\n:MAIN.PASS\necho.passfail 'SUMMARY' 'pass'\nreturn 'pass'\n;\n; Ruh-roh...\n:MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'fail - ${sts:} ${ret:}'\necho.passfail 'SUMMARY' 'fail'\nsetglobal '${arg:2}' 'fail'\nreturn 'fail'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/050 - Non-UI Image Transfer Tests/DAT_IMAGEMEMFILEXFER.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DAT_IMAGEMEMFILEXFER\n;   This test issues multiple image transfer sessions using DAT_IMAGEMEMFILEXFER. It is performed\n;   for all available image sources (unspecified, flatbed and/or ADF). Only one image is transferred\n;   per session.\n;\n;   We follow the capability ordering, so the loops take the form:\n;   set ICAP_XFERMECH TWSX_MEMFILE\n;   foreach CAP_FEEDERENABLED\n;     foreach ICAP_PIXELTYPE\n;       scan\n;     end\n;   end\n;\n; Arguments\n;   arg:1 - TW_IDENTITY.ProductName of scanner to test\n;   arg:2 - global for us to update on failure\n;   arg:3 - value of ShowUI (TRUE or FALSE)\n;   arg:4 - test name for the image folder\n;   arg:5 - result of a MSG_GET on ICAP_XFERMECH\n;\n; Globals\n;   (none)\n;\n; Locals\n;   name - current test being done\n;   indent - indent the passfail text\n;   imagememxfer - result of DAT_IMAGEMEMXFER call\n;   setupmemxfer.preferred - preferred field from DAT_SETUPMEMXFER call\n;\n;   image.count - count of images from 1\n;   image.folder - folder to put the images in\n;   image.prefix - adf or fb\n;\n;   feederenabled.list - scanner's feederenabled values\n;   feederenabled.index - index of feederenabled values\n;   feederenabled.value - current feederenabled value\n;\n;   pixeltype.list - scanner's pixeltype values for this feederenabled\n;   pixeltype.index - index of pixeltype values\n;   pixeltype.value - current pixeltype value\n;\n; Returns\n;   pass or fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; If not supported, quietly leave...\n;\nif '${arg:5}' ~contains 'TWSX_MEMFILE' goto MAIN.CONTINUE\nreturn 'pass'\n:MAIN.CONTINUE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize...\n;\necho.titletest 'DAT_IMAGEMEMFILEXFER'\nsetlocal indent ''\nsetlocal image.pointer '0'\nsetlocal image.count '0'\nsetlocal image.folder '${folder:certimages}/${arg:4}/DAT_IMAGEMEMFILEXFER'\nsetlocal image.prefix 'fb'\nsetlocal showui '${arg:3}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Clean the image folder for this test...\n;\nimage cleanfolder '${get:image.folder}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; MSG_RESETALL\n; If return code is not TWRC_SUCCESS, end with an error\n;\nsetlocal name 'MSG_RESETALL'\ndsmentry src ds dg_control dat_capability msg_resetall '0,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get and set ICAP_XFERMECH...\n;\nsetlocal name 'ICAP_XFERMECH MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'ICAP_XFERMECH,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\nif '${ret:}' !~contains 'TWSX_MEMFILE' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'ICAP_XFERMECH MSG_SET TWSX_MEMFILE'\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_XFERMECH,TWON_ONEVALUE,TWTY_UINT16,TWSX_MEMFILE'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get CAP_FEEDERENABLED, and loop so we test all values\n; for the current ICAP_XFERMECH setting.\n;\nsetlocal name 'CAP_FEEDERENABLED MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'CAP_FEEDERENABLED,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal feederenabled.list '${ret:}' ; what the scanner told us\nsetlocal feederenabled.index '${get:TW_ENUMERATION.ItemList}' ; point to itemlist\nincrement feederenabled.index '${get:feederenabled.index}' -1 ; less 1\n;\n:MAIN.FEEDERENABLED.NEXT\nsetlocal indent ''\nsetlocal image.count '0' ; reset count to 0\nincrement feederenabled.index '${get:feederenabled.index}' 1 ; next itemlist\nsetlocal feederenabled.value '${getindex:feederenabled.list:${get:feederenabled.index}}' ; get the value\nif '${get:feederenabled.value}' == '' goto MAIN.PASS ; we've passed all tests!!!\n;\nsetlocal name 'CAP_FEEDERENABLED MSG_SET ${get:feederenabled.value}'\ndsmentry src ds dg_control dat_capability msg_set 'CAP_FEEDERENABLED,TWON_ONEVALUE,TWTY_BOOL,${get:feederenabled.value}'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nif '${get:feederenabled.value}' ~~ 'FALSE' goto MAIN.FEEDERENABLED.SETFB\nsetlocal image.prefix 'adf'\ngoto MAIN.FEEDERENABLED.SETDONE\n:MAIN.FEEDERENABLED.SETFB\nsetlocal image.prefix 'fb'\n:MAIN.FEEDERENABLED.SETDONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get ICAP_PIXELTYPE, and loop so we test all values for\n; the current CAP_FEEDERENABLED setting.\n;\nsetlocal indent '  '\nsetlocal name 'ICAP_PIXELTYPE MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'ICAP_PIXELTYPE,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal pixeltype.list '${ret:}' ; what the scanner told us\nsetlocal pixeltype.index '${get:TW_ENUMERATION.ItemList}' ; point to itemlist\nincrement pixeltype.index '${get:pixeltype.index}' -1 ; less 1\n;\n:MAIN.PIXELTYPE.NEXT\nsetlocal indent '  '\nincrement pixeltype.index '${get:pixeltype.index}' 1 ; next itemlist\nsetlocal pixeltype.value '${getindex:pixeltype.list:${get:pixeltype.index}}' ; get the value\nif '${get:pixeltype.value}' == '' goto MAIN.FEEDERENABLED.NEXT ; pixeltypes done for this feederenabled\n;\nsetlocal name 'ICAP_PIXELTYPE MSG_SET ${get:pixeltype.value}'\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_PIXELTYPE,TWON_ONEVALUE,TWTY_UINT16,${get:pixeltype.value}'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get the preferred size for memory transfers, and allocate\n; a pointer for the memory transfers...\n;\nsetlocal indent '    '\nsetlocal name 'dg_control/dat_setupmemxfer/msg_get'\ndsmentry src ds dg_control dat_setupmemxfer msg_get '0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'TW_SETUPMEMXFER.Preferred > 0'\nsetlocal setupmemxfer.preferred '${ret:${get:TW_SETUPMEMXFER.Preferred}}'\nif '${get:setupmemxfer.preferred}' <= '0' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'allocate pointer for ${get:setupmemxfer.preferred} bytes'\nfree pointer image.pointer ; for the last loop\nallocate pointer image.pointer '${get:setupmemxfer.preferred}'\nif '${get:image.pointer}' == '0' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set DAT_SETUPFILEXFER to TWFF_TIFF\n;\nsetlocal name 'dg_control/dat_setupfilexfer/msg_set TWFF_TIFF'\ndsmentry src null dg_control dat_setupfilexfer msg_set 'file,TWFF_TIFF,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; If we're a flatbed, we can start scanning...\n;\nif '${get:feederenabled.value}' ~~ 'FALSE' goto MAIN.USERINTERFACE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Check for paper in the feeder...\n;\ndsmentry src ds dg_control dat_capability msg_getcurrent 'CAP_FEEDERLOADED,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.FEEDERLOADED.DONE\nif '${ret:${get:TW_ONEVALUE.Item}}' ~~ 'TRUE' goto MAIN.FEEDERLOADED.DONE\necho.prompt\necho.prompt \"Place paper in the scanner's feeder.\"\npause '(press the ENTER key when ready to continue)'\n:MAIN.FEEDERLOADED.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We only need one sheet of paper...\n;\nsetlocal name 'CAP_XFERCOUNT MSG_SET 1'\ndsmentry src ds dg_control dat_capability msg_set 'CAP_XFERCOUNT,TWON_ONEVALUE,TWTY_INT16,1'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Start scanning...\n;\n:MAIN.USERINTERFACE\nsetlocal name 'dg_control/dat_userinterface/msg_enableds'\nwait reset\ndsmentry src null dg_control dat_userinterface msg_enableds '${get:showui},0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Wait for MSG_XFERREADY, if we don't see it then scoot...\n;\nsetlocal name 'wait ${get:sys_waittimeout} seconds for MSG_XFERREADY'\nwait '${get:sys_waittimeout}000'\nif '${ret:}' !~contains 'msg_xferready' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Do a memory file transfer...\n; This little song and dance with the states is so that we can\n; start the transfer in state 6 with each new image, but switch\n; to state 7 if we need multiple calls to capture the current\n; image...\n;\n; The saved images will be in TIFF format, which includes TIFF\n; JPEG (the better form, where a simple TIFF header is added).\n;\nincrement image.count '${get:image.count}' 1\nimage free memfileimage\n;\n:MAIN.IMAGEMEMFILEXFER.NEXT\nsetlocal name 'dg_image/dat_imagememxfer/msg_get'\ndsmentry src ds dg_image dat_imagememfilexfer msg_get '0,0,0,0,0,0,0,9,${get:setupmemxfer.preferred},${get:image.pointer}'\nsetlocal imagememxfer '${ret:}'\nif '${sts:}' == 'XFERDONE' goto MAIN.IMAGEMEMFILEXFER.XFERDONE\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\n;\necho.passfail '${get:indent}${get:name} SUCCESS' 'pass'\nimage append memfileimage '${get:imagememxfer}'\ngoto MAIN.IMAGEMEMFILEXFER.NEXT\n;\n:MAIN.IMAGEMEMFILEXFER.XFERDONE\necho.passfail '${get:indent}${get:name} XFERDONE' 'pass'\nimage append memfileimage '${get:imagememxfer}'\nimage save memfileimage memfile '${get:image.folder}/${get:image.prefix}${format:D6|${get:image.count}}'\necho.passfail '${get:indent}image <${ret:}>' 'pass'\nimage free memfileimage\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; End the transfer, see if we're done...\n;\nsetlocal name 'dg_control/dat_pendingxfers/msg_endxfer'\ndsmentry src ds dg_control dat_pendingxfers msg_endxfer '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nif '${ret:${get:TW_PENDINGXFERS.Count}}' != '0' goto MAIN.IMAGEMEMFILEXFER.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We're out of images, so disable and go back up to\n; do the next ICAP_PIXELTYPE...\n;\nsetlocal name 'dg_control/dat_userinterface/msg_disableds'\ndsmentry src ds dg_control dat_userinterface msg_disableds '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\ngoto MAIN.PIXELTYPE.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Summary and cleanup...\n;\n; We passed...\n:MAIN.PASS\nimage free memfileimage\nfree pointer image.pointer\necho.passfail 'SUMMARY' 'pass'\nreturn 'pass'\n;\n; Ruh-roh...\n:MAIN.ERROR.ECHOPASSFAIL\nimage free memfileimage\nfree pointer image.pointer\necho.passfail '${get:indent}${get:name}' 'fail - ${sts:} ${ret:}'\necho.passfail 'SUMMARY' 'fail'\nsetglobal '${arg:2}' 'fail'\nreturn 'fail'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/050 - Non-UI Image Transfer Tests/DAT_IMAGEMEMXFER.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DAT_IMAGEMEMXFER\n;   This test issues multiple image transfer sessions using DAT_IMAGEMEMXFER. It is performed\n;   for all available image sources (unspecified, flatbed and/or ADF). Only one image is transferred\n;   per session.\n;\n;   We follow the capability ordering, so the loops take the form:\n;   set ICAP_XFERMECH TWSX_MEMORY\n;   foreach CAP_FEEDERENABLED\n;     foreach ICAP_PIXELTYPE\n;       scan\n;     end\n;   end\n;\n; Arguments\n;   arg:1 - TW_IDENTITY.ProductName of scanner to test\n;   arg:2 - global for us to update on failure\n;   arg:3 - value of ShowUI (TRUE or FALSE)\n;   arg:4 - test name for the image folder\n;\n; Globals\n;   (none)\n;\n; Locals\n;   name - current test being done\n;   indent - indent the passfail text\n;   imageinfo - metadata for the current image\n;   imagememxfer - result of DAT_IMAGEMEMXFER call\n;   setupmemxfer.preferred - preferred field from DAT_SETUPMEMXFER call\n;\n;   image.count - count of images from 1\n;   image.folder - folder to put the images in\n;   image.prefix - adf or fb\n;\n;   feederenabled.list - scanner's feederenabled values\n;   feederenabled.index - index of feederenabled values\n;   feederenabled.value - current feederenabled value\n;\n;   pixeltype.list - scanner's pixeltype values for this feederenabled\n;   pixeltype.index - index of pixeltype values\n;   pixeltype.value - current pixeltype value\n;\n; Returns\n;   pass or fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize...\n;\necho.titletest 'DAT_IMAGEMEMXFER'\nsetlocal indent ''\nsetlocal image.pointer '0'\nsetlocal image.count '0'\nsetlocal image.folder '${folder:certimages}/${arg:4}/DAT_IMAGEMEMXFER'\nsetlocal image.prefix 'fb'\nsetlocal showui '${arg:3}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Clean the image folder for this test...\n;\nimage cleanfolder '${get:image.folder}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; MSG_RESETALL\n; If return code is not TWRC_SUCCESS, end with an error\n;\nsetlocal name 'MSG_RESETALL'\ndsmentry src ds dg_control dat_capability msg_resetall '0,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get and set ICAP_XFERMECH...\n;\nsetlocal name 'ICAP_XFERMECH MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'ICAP_XFERMECH,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\nif '${ret:}' !~contains 'TWSX_MEMORY' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'ICAP_XFERMECH MSG_SET TWSX_MEMORY'\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_XFERMECH,TWON_ONEVALUE,TWTY_UINT16,TWSX_MEMORY'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get CAP_FEEDERENABLED, and loop so we test all values\n; for the current ICAP_XFERMECH setting.\n;\nsetlocal name 'CAP_FEEDERENABLED MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'CAP_FEEDERENABLED,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal feederenabled.list '${ret:}' ; what the scanner told us\nsetlocal feederenabled.index '${get:TW_ENUMERATION.ItemList}' ; point to itemlist\nincrement feederenabled.index '${get:feederenabled.index}' -1 ; less 1\n;\n:MAIN.FEEDERENABLED.NEXT\nsetlocal indent ''\nsetlocal image.count '0' ; reset count to 0\nincrement feederenabled.index '${get:feederenabled.index}' 1 ; next itemlist\nsetlocal feederenabled.value '${getindex:feederenabled.list:${get:feederenabled.index}}' ; get the value\nif '${get:feederenabled.value}' == '' goto MAIN.PASS ; we've passed all tests!!!\n;\nsetlocal name 'CAP_FEEDERENABLED MSG_SET ${get:feederenabled.value}'\ndsmentry src ds dg_control dat_capability msg_set 'CAP_FEEDERENABLED,TWON_ONEVALUE,TWTY_BOOL,${get:feederenabled.value}'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nif '${get:feederenabled.value}' ~~ 'FALSE' goto MAIN.FEEDERENABLED.SETFB\nsetlocal image.prefix 'adf'\ngoto MAIN.FEEDERENABLED.SETDONE\n:MAIN.FEEDERENABLED.SETFB\nsetlocal image.prefix 'fb'\n:MAIN.FEEDERENABLED.SETDONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get ICAP_PIXELTYPE, and loop so we test all values for\n; the current CAP_FEEDERENABLED setting.\n;\nsetlocal indent '  '\nsetlocal name 'ICAP_PIXELTYPE MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'ICAP_PIXELTYPE,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal pixeltype.list '${ret:}' ; what the scanner told us\nsetlocal pixeltype.index '${get:TW_ENUMERATION.ItemList}' ; point to itemlist\nincrement pixeltype.index '${get:pixeltype.index}' -1 ; less 1\n;\n:MAIN.PIXELTYPE.NEXT\nsetlocal indent '  '\nincrement pixeltype.index '${get:pixeltype.index}' 1 ; next itemlist\nsetlocal pixeltype.value '${getindex:pixeltype.list:${get:pixeltype.index}}' ; get the value\nif '${get:pixeltype.value}' == '' goto MAIN.FEEDERENABLED.NEXT ; pixeltypes done for this feederenabled\n;\nsetlocal name 'ICAP_PIXELTYPE MSG_SET ${get:pixeltype.value}'\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_PIXELTYPE,TWON_ONEVALUE,TWTY_UINT16,${get:pixeltype.value}'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get the preferred size for memory transfers, and allocate\n; a pointer for the memory transfers...\n;\nsetlocal indent '    '\nsetlocal name 'dg_control/dat_setupmemxfer/msg_get'\ndsmentry src ds dg_control dat_setupmemxfer msg_get '0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'TW_SETUPMEMXFER.Preferred > 0'\nsetlocal setupmemxfer.preferred '${ret:${get:TW_SETUPMEMXFER.Preferred}}'\nif '${get:setupmemxfer.preferred}' <= '0' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'allocate pointer for ${get:setupmemxfer.preferred} bytes'\nfree pointer image.pointer ; for the last loop\nallocate pointer image.pointer '${get:setupmemxfer.preferred}'\nif '${get:image.pointer}' == '0' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; If we're a flatbed, we can start scanning...\n;\nif '${get:feederenabled.value}' ~~ 'FALSE' goto MAIN.USERINTERFACE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Check for paper in the feeder...\n;\ndsmentry src ds dg_control dat_capability msg_getcurrent 'CAP_FEEDERLOADED,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.FEEDERLOADED.DONE\nif '${ret:${get:TW_ONEVALUE.Item}}' ~~ 'TRUE' goto MAIN.FEEDERLOADED.DONE\necho.prompt\necho.prompt \"Place paper in the scanner's feeder.\"\npause '(press the ENTER key when ready to continue)'\n:MAIN.FEEDERLOADED.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We only need one sheet of paper...\n;\nsetlocal name 'CAP_XFERCOUNT MSG_SET 1'\ndsmentry src ds dg_control dat_capability msg_set 'CAP_XFERCOUNT,TWON_ONEVALUE,TWTY_INT16,1'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Start scanning...\n;\n:MAIN.USERINTERFACE\nsetlocal name 'dg_control/dat_userinterface/msg_enableds'\nwait reset\ndsmentry src null dg_control dat_userinterface msg_enableds '${get:showui},0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Wait for MSG_XFERREADY, if we don't see it then scoot...\n;\nsetlocal name 'wait ${get:sys_waittimeout} seconds for MSG_XFERREADY'\nwait '${get:sys_waittimeout}000'\nif '${ret:}' !~contains 'msg_xferready' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Do a memory transfer...\n; This little song and dance with the states is so that we can\n; start the transfer in state 6 with each new image, but switch\n; to state 7 if we need multiple calls to capture the current\n; image...\n;\n; The saved images will be in TIFF format, which includes TIFF\n; JPEG (the better form, where a simple TIFF header is added).\n;\nincrement image.count '${get:image.count}' 1\nimage free memimage\n;\n:MAIN.IMAGEMEMXFER.NEXT\nsetlocal name 'dg_image/dat_imagememxfer/msg_get'\ndsmentry src ds dg_image dat_imagememxfer msg_get '0,0,0,0,0,0,0,9,${get:setupmemxfer.preferred},${get:image.pointer}'\nsetlocal imagememxfer '${ret:}'\nif '${sts:}' == 'XFERDONE' goto MAIN.IMAGEMEMXFER.XFERDONE\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\n;\necho.passfail '${get:indent}${get:name} SUCCESS' 'pass'\nimage append memimage '${get:imagememxfer}'\ngoto MAIN.IMAGEMEMXFER.NEXT\n;\n:MAIN.IMAGEMEMXFER.XFERDONE\necho.passfail '${get:indent}${get:name} XFERDONE' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We need image info to make sense of this data...\n;\nsetlocal name 'dg_image/dat_imageinfo/msg_get'\ndsmentry src ds dg_image dat_imageinfo msg_get '0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0'\nsetlocal imageinfo '${ret:}'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Save the image...\n;\nimage append memimage '${get:imagememxfer}'\nimage addheader memimage '${get:imageinfo}'\nimage save memimage memory '${get:image.folder}/${get:image.prefix}${format:D6|${get:image.count}}'\necho.passfail '${get:indent}image <${ret:}>' 'pass'\nimage free memimage\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; End the transfer, see if we're done...\n;\nsetlocal name 'dg_control/dat_pendingxfers/msg_endxfer'\ndsmentry src ds dg_control dat_pendingxfers msg_endxfer '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nif '${ret:${get:TW_PENDINGXFERS.Count}}' != '0' goto MAIN.IMAGEMEMXFER.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We're out of images, so disable and go back up to\n; do the next ICAP_PIXELTYPE...\n;\nsetlocal name 'dg_control/dat_userinterface/msg_disableds'\ndsmentry src ds dg_control dat_userinterface msg_disableds '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\ngoto MAIN.PIXELTYPE.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Summary and cleanup...\n;\n; We passed...\n:MAIN.PASS\nimage free memimage\nfree pointer image.pointer\necho.passfail 'SUMMARY' 'pass'\nreturn 'pass'\n;\n; Ruh-roh...\n:MAIN.ERROR.ECHOPASSFAIL\nimage free memimage\nfree pointer image.pointer\necho.passfail '${get:indent}${get:name}' 'fail - ${sts:} ${ret:}'\necho.passfail 'SUMMARY' 'fail'\nsetglobal '${arg:2}' 'fail'\nreturn 'fail'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/050 - Non-UI Image Transfer Tests/DAT_IMAGENATIVEXFER.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DAT_IMAGENATIVEXFER\n;   This test issues multiple image transfer sessions using DAT_IMAGENATIVEXFER. It is performed\n;   for all available image sources (unspecified, flatbed and/or ADF). Only one image is transferred\n;   per session.\n;\n;   We follow the capability ordering, so the loops take the form:\n;   set ICAP_XFERMECH TWSX_NATIVE\n;   foreach CAP_FEEDERENABLED\n;     foreach ICAP_PIXELTYPE\n;       scan\n;     end\n;   end\n;\n; Arguments\n;   arg:1 - TW_IDENTITY.ProductName of scanner to test\n;   arg:2 - global for us to update on failure\n;   arg:3 - value of ShowUI (TRUE or FALSE)\n;   arg:4 - test name for the image folder\n;\n; Globals\n;   (none)\n;\n; Locals\n;   name - current test being done\n;   indent - indent the passfail text\n;\n;   image.handle - native handle\n;   image.count - count of images from 1\n;   image.folder - folder to put the images in\n;   image.prefix - adf or fb\n;\n;   feederenabled.list - scanner's feederenabled values\n;   feederenabled.index - index of feederenabled values\n;   feederenabled.value - current feederenabled value\n;\n;   pixeltype.list - scanner's pixeltype values for this feederenabled\n;   pixeltype.index - index of pixeltype values\n;   pixeltype.value - current pixeltype value\n;\n; Returns\n;   pass or fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize...\n;\necho.titletest 'DAT_IMAGENATIVEXFER'\nsetlocal indent ''\nsetlocal image.handle '0'\nsetlocal image.count '0'\nsetlocal image.folder '${folder:certimages}/${arg:4}/DAT_IMAGENATIVEXFER'\nsetlocal image.prefix 'fb'\nsetlocal showui '${arg:3}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Clean the image folder for this test...\n;\nimage cleanfolder '${get:image.folder}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; MSG_RESETALL\n; If return code is not TWRC_SUCCESS, end with an error\n;\nsetlocal name 'MSG_RESETALL'\ndsmentry src ds dg_control dat_capability msg_resetall '0,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get and set ICAP_XFERMECH...\n;\nsetlocal name 'ICAP_XFERMECH MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'ICAP_XFERMECH,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\nif '${ret:}' !~contains 'TWSX_NATIVE' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'ICAP_XFERMECH MSG_SET TWSX_NATIVE'\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_XFERMECH,TWON_ONEVALUE,TWTY_UINT16,TWSX_NATIVE'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get CAP_FEEDERENABLED, and loop so we test all values\n; for the current ICAP_XFERMECH setting.\n;\nsetlocal name 'CAP_FEEDERENABLED MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'CAP_FEEDERENABLED,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal feederenabled.list '${ret:}' ; what the scanner told us\nsetlocal feederenabled.index '${get:TW_ENUMERATION.ItemList}' ; point to itemlist\nincrement feederenabled.index '${get:feederenabled.index}' -1 ; less 1\n;\n:MAIN.FEEDERENABLED.NEXT\nsetlocal indent ''\nsetlocal image.count '0' ; reset count to 0\nincrement feederenabled.index '${get:feederenabled.index}' 1 ; next itemlist\nsetlocal feederenabled.value '${getindex:feederenabled.list:${get:feederenabled.index}}' ; get the value\nif '${get:feederenabled.value}' == '' goto MAIN.PASS ; we've passed all tests!!!\n;\nsetlocal name 'CAP_FEEDERENABLED MSG_SET ${get:feederenabled.value}'\ndsmentry src ds dg_control dat_capability msg_set 'CAP_FEEDERENABLED,TWON_ONEVALUE,TWTY_BOOL,${get:feederenabled.value}'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nif '${get:feederenabled.value}' ~~ 'FALSE' goto MAIN.FEEDERENABLED.SETFB\nsetlocal image.prefix 'adf'\ngoto MAIN.FEEDERENABLED.SETDONE\n:MAIN.FEEDERENABLED.SETFB\nsetlocal image.prefix 'fb'\n:MAIN.FEEDERENABLED.SETDONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get ICAP_PIXELTYPE, and loop so we test all values for\n; the current CAP_FEEDERENABLED setting.\n;\nsetlocal indent '  '\nsetlocal name 'ICAP_PIXELTYPE MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'ICAP_PIXELTYPE,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal pixeltype.list '${ret:}' ; what the scanner told us\nsetlocal pixeltype.index '${get:TW_ENUMERATION.ItemList}' ; point to itemlist\nincrement pixeltype.index '${get:pixeltype.index}' -1 ; less 1\n;\n:MAIN.PIXELTYPE.NEXT\nsetlocal indent '  '\nincrement pixeltype.index '${get:pixeltype.index}' 1 ; next itemlist\nsetlocal pixeltype.value '${getindex:pixeltype.list:${get:pixeltype.index}}' ; get the value\nif '${get:pixeltype.value}' == '' goto MAIN.FEEDERENABLED.NEXT ; pixeltypes done for this feederenabled\n;\nsetlocal name 'ICAP_PIXELTYPE MSG_SET ${get:pixeltype.value}'\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_PIXELTYPE,TWON_ONEVALUE,TWTY_UINT16,${get:pixeltype.value}'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; If we're a flatbed, we can start scanning...\n;\nsetlocal indent '    '\nif '${get:feederenabled.value}' ~~ 'FALSE' goto MAIN.USERINTERFACE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Check for paper in the feeder...\n;\ndsmentry src ds dg_control dat_capability msg_getcurrent 'CAP_FEEDERLOADED,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.FEEDERLOADED.DONE\nif '${ret:${get:TW_ONEVALUE.Item}}' ~~ 'TRUE' goto MAIN.FEEDERLOADED.DONE\necho.prompt\necho.prompt \"Place paper in the scanner's feeder.\"\npause '(press the ENTER key when ready to continue)'\n:MAIN.FEEDERLOADED.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We only need one sheet of paper...\n;\nsetlocal name 'CAP_XFERCOUNT MSG_SET 1'\ndsmentry src ds dg_control dat_capability msg_set 'CAP_XFERCOUNT,TWON_ONEVALUE,TWTY_INT16,1'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Start scanning...\n;\n:MAIN.USERINTERFACE\nsetlocal name 'dg_control/dat_userinterface/msg_enableds'\nwait reset\ndsmentry src null dg_control dat_userinterface msg_enableds '${get:showui},0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Wait for MSG_XFERREADY, if we don't see it then scoot...\n;\nsetlocal name 'wait ${get:sys_waittimeout} seconds for MSG_XFERREADY'\nwait '${get:sys_waittimeout}000'\nif '${ret:}' !~contains 'msg_xferready' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Do a native transfer...\n;\n:MAIN.IMAGENATIVEXFER.NEXT\nsetlocal name 'dg_image/dat_imagenativexfer/msg_get'\nincrement image.count '${get:image.count}' 1\ndsmentry src ds dg_image dat_imagenativexfer msg_get '0'\nsetlocal image.handle '${ret:}'\nif '${sts:}' != 'XFERDONE' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nimage save image.handle native '${get:image.folder}/${get:image.prefix}${format:D6|${get:image.count}}'\necho.passfail '${get:indent}image <${ret:}>' 'pass'\nfree handle image.handle\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; End the transfer, see if we're done...\n;\nsetlocal name 'dg_control/dat_pendingxfers/msg_endxfer'\ndsmentry src ds dg_control dat_pendingxfers msg_endxfer '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nif '${ret:${get:TW_PENDINGXFERS.Count}}' != '0' goto MAIN.IMAGENATIVEXFER.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We're out of images, so disable and go back up to\n; do the next ICAP_PIXELTYPE...\n;\nsetlocal name 'dg_control/dat_userinterface/msg_disableds'\ndsmentry src ds dg_control dat_userinterface msg_disableds '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\ngoto MAIN.PIXELTYPE.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Summary and cleanup...\n;\n; We passed...\n:MAIN.PASS\nfree handle image.handle\necho.passfail 'SUMMARY' 'pass'\nreturn 'pass'\n;\n; Ruh-roh...\n:MAIN.ERROR.ECHOPASSFAIL\nfree handle image.handle\necho.passfail '${get:indent}${get:name}' 'fail - ${sts:} ${ret:}'\necho.passfail 'SUMMARY' 'fail'\nsetglobal '${arg:2}' 'fail'\nreturn 'fail'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/060 - UI Image Transfer Tests/Certification.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; UI Image Transfer Tests\n;   Confirm that multiple MSG_ENABLEDS and MSG_DISABLEDS calls can be made in the context of\n;   one MSG_OPENDS / MSG_CLOSEDS. This test focuses on image capture with no UI, verifying\n;   that the Application does not have to close the driver after capturing images.\n;\n; Arguments\n;   arg:1 - TW_IDENTITY.ProductName of scanner to test\n;   arg:2 - global to set on fail\n;\n; Globals\n;   (none)\n;\n; Locals\n;   twidentity.productname - product name of scanner to test\n;   certifyresult - global to set on fail\n;   xfermech - result of getting ICAP_XFERMECH\n;   sheets - count of sheets the user needs\n;\n; Returns\n;   (none)\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize stuff, load tables if not already done for us...\n;\necho.titlesuite 'UI Image Transfer Tests v1.0 03-Mar-2020'\nsetlocal twidentity.productname '${arg:1}'\nsetlocal certifyresult '${arg:2}'\nsetlocal sheets '0'\nif '${get:TW_ARRAY.ItemType}' != '' goto MAIN.LOADTABLES.SKIP\nrun '${folder:certification}/LoadTables'\n:MAIN.LOADTABLES.SKIP\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Open the scanner...\n;\ncall CERTIFY '${folder:certification}/Opends'  '${get:twidentity.productname}' '${get:certifyresult}'\nif '${get:${get:certifyresult}}' == 'fail' goto MAIN.CLOSEDS\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Prompt the user, if they have an ADF...\n;\n:MAIN.PROMPT\nif '${get:g_skipprompts}' != '' goto MAIN.SKIP.PROMPTS\ndsmentry src ds dg_control dat_capability msg_get 'CAP_FEEDERENABLED,0,0,0'\nif '${ret:}' !~contains 'TRUE' goto MAIN.SKIP.PROMPTS\ndsmentry src ds dg_control dat_capability msg_get 'ICAP_XFERMECH,0,0,0'\nsetlocal xfermech '${ret:}'\ndsmentry src ds dg_control dat_capability msg_get 'ICAP_PIXELTYPE,0,0,0'\nif '${ret:}' !~contains 'TWPT_BW' goto MAIN.PROMPTS.SKIP.BW\nincrement sheets '${get:sheets}' '${getindex:xfermech:${get:TW_ENUMERATION.NumItems}}'\n:MAIN.PROMPTS.SKIP.BW\nif '${ret:}' !~contains 'TWPT_GRAY' goto MAIN.PROMPTS.SKIP.GRAY\nincrement sheets '${get:sheets}' '${getindex:xfermech:${get:TW_ENUMERATION.NumItems}}'\n:MAIN.PROMPTS.SKIP.GRAY\nif '${ret:}' !~contains 'TWPT_RGB' goto MAIN.PROMPTS.SKIP.RGB\nincrement sheets '${get:sheets}' '${getindex:xfermech:${get:TW_ENUMERATION.NumItems}}'\n:MAIN.PROMPTS.SKIP.RGB\necho.prompt\necho.prompt \"Scanning will take place during this test.  The SCAN button\"\necho.prompt \"on the TWAIN user interface must be pressed.  This may also\"\necho.prompt \"have names like START or ACQUIRE.\"\necho.prompt\necho.prompt \"Place ${get:sheets} sheets of paper in the scanner's feeder.\"\npause '(press the ENTER key when ready to continue)'\necho.prompt\n:MAIN.SKIP.PROMPTS\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get ICAP_XFERMECH...\n;\nsetlocal name 'ICAP_XFERMECH MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'ICAP_XFERMECH,0,0,0'\nif '${sts:}' != 'SUCCESS' goto CERTIFY.FAIL\nsetlocal xfermech '${ret:}'\necho.passfail '${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Do the tests...\n;\ncall CERTIFY 'DAT_IMAGENATIVEXFER'             '${get:twidentity.productname}' '${get:certifyresult}' 'TRUE' '${folder:parent}'\ncall CERTIFY 'DAT_IMAGEMEMXFER'                '${get:twidentity.productname}' '${get:certifyresult}' 'TRUE' '${folder:parent}'\ncall CERTIFY 'DAT_IMAGEFILEXFER'               '${get:twidentity.productname}' '${get:certifyresult}' 'TRUE' '${folder:parent}' '${get:xfermech}'\ncall CERTIFY 'DAT_IMAGEMEMFILEXFER'            '${get:twidentity.productname}' '${get:certifyresult}' 'TRUE' '${folder:parent}' '${get:xfermech}'\n:MAIN.CLOSEDS\ncall CERTIFY '${folder:certification}/Closeds' '${get:twidentity.productname}' '${get:certifyresult}'\nreturn\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Function: Certify\n; arg:1 - script to run\n; arg:2 - TW_IDENTITY.ProductName of scanner to test\n; arg:3 - global value to update on fail\n; arg:4 - showui value\n; arg:5 - name of test\n; arg:6 - xfermech values\n; returns: (none)\n;\n:CERTIFY\n;\nrun '${arg:1}' '${arg:2}' '${arg:3}' '${arg:4}' '${arg:5}' '${arg:6}'\nif '${ret:}' != 'pass' goto CERTIFY.FAIL\nreturn 'pass'\n;\n:CERTIFY.FAIL\nsetglobal '${arg:3}' 'fail'\nreturn 'fail'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/060 - UI Image Transfer Tests/DAT_IMAGEFILEXFER.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DAT_IMAGEFILEXFER\n;   This test issues multiple image transfer sessions using DAT_IMAGEFILEXFER. It is performed\n;   for all available image sources (unspecified, flatbed and/or ADF). Only one image is transferred\n;   per session.\n;\n;   We follow the capability ordering, so the loops take the form:\n;   set ICAP_XFERMECH TWSX_FILE\n;   foreach CAP_FEEDERENABLED\n;     foreach ICAP_PIXELTYPE\n;       scan\n;     end\n;   end\n;\n; Arguments\n;   arg:1 - TW_IDENTITY.ProductName of scanner to test\n;   arg:2 - global for us to update on failure\n;   arg:3 - value of ShowUI (TRUE or FALSE)\n;   arg:4 - test name for the image folder\n;   arg:5 - result of a MSG_GET on ICAP_XFERMECH\n;\n; Globals\n;   (none)\n;\n; Locals\n;   name - current test being done\n;   indent - indent the passfail text\n;   twimageinfo.compression - compression for current image\n;   showui - value of showui\n;\n;   image.count - count of images from 1\n;   image.folder - folder to put the images in\n;   image.prefix - adf or fb\n;\n;   feederenabled.list - scanner's feederenabled values\n;   feederenabled.index - index of feederenabled values\n;   feederenabled.value - current feederenabled value\n;\n;   pixeltype.list - scanner's pixeltype values for this feederenabled\n;   pixeltype.index - index of pixeltype values\n;   pixeltype.value - current pixeltype value\n;\n; Returns\n;   pass or fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; If not supported, quietly leave...\n;\nif '${arg:5}' ~contains 'TWSX_FILE' goto MAIN.CONTINUE\nreturn 'pass'\n:MAIN.CONTINUE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize...\n;\necho.titletest 'DAT_IMAGEFILEXFER'\nsetlocal indent ''\nsetlocal image.count '0'\nsetlocal image.folder '${folder:certimages}/${arg:4}/DAT_IMAGEFILEXFER'\nsetlocal image.prefix 'fb'\nsetlocal image.showname ''\nsetlocal showui '${arg:3}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Clean the image folder for this test...\n;\nimage cleanfolder '${get:image.folder}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; MSG_RESETALL\n; If return code is not TWRC_SUCCESS, end with an error\n;\nsetlocal name 'MSG_RESETALL'\ndsmentry src ds dg_control dat_capability msg_resetall '0,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get and set ICAP_XFERMECH...\n;\nsetlocal name 'ICAP_XFERMECH MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'ICAP_XFERMECH,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\nif '${ret:}' !~contains 'TWSX_FILE' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'ICAP_XFERMECH MSG_SET TWSX_FILE'\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_XFERMECH,TWON_ONEVALUE,TWTY_UINT16,TWSX_FILE'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get CAP_FEEDERENABLED, and loop so we test all values\n; for the current ICAP_XFERMECH setting.\n;\nsetlocal name 'CAP_FEEDERENABLED MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'CAP_FEEDERENABLED,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal feederenabled.list '${ret:}' ; what the scanner told us\nsetlocal feederenabled.index '${get:TW_ENUMERATION.ItemList}' ; point to itemlist\nincrement feederenabled.index '${get:feederenabled.index}' -1 ; less 1\n;\n:MAIN.FEEDERENABLED.NEXT\nsetlocal indent ''\nsetlocal image.count '0' ; reset count to 0\nincrement feederenabled.index '${get:feederenabled.index}' 1 ; next itemlist\nsetlocal feederenabled.value '${getindex:feederenabled.list:${get:feederenabled.index}}' ; get the value\nif '${get:feederenabled.value}' == '' goto MAIN.PASS ; we've passed all tests!!!\n;\nsetlocal name 'CAP_FEEDERENABLED MSG_SET ${get:feederenabled.value}'\ndsmentry src ds dg_control dat_capability msg_set 'CAP_FEEDERENABLED,TWON_ONEVALUE,TWTY_BOOL,${get:feederenabled.value}'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nif '${get:feederenabled.value}' ~~ 'FALSE' goto MAIN.FEEDERENABLED.SETFB\nsetlocal image.prefix 'adf'\ngoto MAIN.FEEDERENABLED.SETDONE\n:MAIN.FEEDERENABLED.SETFB\nsetlocal image.prefix 'fb'\n:MAIN.FEEDERENABLED.SETDONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get ICAP_PIXELTYPE, and loop so we test all values for\n; the current CAP_FEEDERENABLED setting.\n;\nsetlocal indent '  '\nsetlocal name 'ICAP_PIXELTYPE MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'ICAP_PIXELTYPE,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal pixeltype.list '${ret:}' ; what the scanner told us\nsetlocal pixeltype.index '${get:TW_ENUMERATION.ItemList}' ; point to itemlist\nincrement pixeltype.index '${get:pixeltype.index}' -1 ; less 1\n;\n:MAIN.PIXELTYPE.NEXT\nsetlocal indent '  '\nincrement pixeltype.index '${get:pixeltype.index}' 1 ; next itemlist\nsetlocal pixeltype.value '${getindex:pixeltype.list:${get:pixeltype.index}}' ; get the value\nif '${get:pixeltype.value}' == '' goto MAIN.FEEDERENABLED.NEXT ; pixeltypes done for this feederenabled\n;\nsetlocal name 'ICAP_PIXELTYPE MSG_SET ${get:pixeltype.value}'\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_PIXELTYPE,TWON_ONEVALUE,TWTY_UINT16,${get:pixeltype.value}'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; If we're a flatbed, we can start scanning...\n;\nsetlocal indent '    '\nif '${get:feederenabled.value}' ~~ 'FALSE' goto MAIN.USERINTERFACE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Check for paper in the feeder...\n;\ndsmentry src ds dg_control dat_capability msg_getcurrent 'CAP_FEEDERLOADED,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.FEEDERLOADED.DONE\nif '${ret:${get:TW_ONEVALUE.Item}}' ~~ 'TRUE' goto MAIN.FEEDERLOADED.DONE\necho.prompt\necho.prompt \"Place paper in the scanner's feeder.\"\npause '(press the ENTER key when ready to continue)'\n:MAIN.FEEDERLOADED.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We only need one sheet of paper...\n;\nsetlocal name 'CAP_XFERCOUNT MSG_SET 1'\ndsmentry src ds dg_control dat_capability msg_set 'CAP_XFERCOUNT,TWON_ONEVALUE,TWTY_INT16,1'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Start scanning...\n;\n:MAIN.USERINTERFACE\nsetlocal name 'dg_control/dat_userinterface/msg_enableds'\nwait reset\ndsmentry src null dg_control dat_userinterface msg_enableds '${get:showui},0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Wait for MSG_XFERREADY, if we don't see it then scoot...\n;\nsetlocal name 'wait ${get:sys_waittimeout} seconds for MSG_XFERREADY'\nwait '${get:sys_waittimeout}000'\nif '${ret:}' !~contains 'msg_xferready' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get information about the image...\n;\n:MAIN.IMAGEINFO.NEXT\nsetlocal name 'dg_image/dat_imageinfo/msg_get'\ndsmentry src ds dg_image dat_imageinfo msg_get '0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\nsetlocal twimageinfo.compression '${ret:${get:index.twimageinfo.compression}}'\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set up the file transfer...\n;\nincrement image.count '${get:image.count}' 1\nif '${get:twimageinfo.compression}' == 'JPEG' goto MAIN.SETUPFILEXFER.JPEG\nsetlocal image.showname 'DAT_IMAGEFILEXFER/${get:image.prefix}${format:D6|${get:image.count}}.tif'\nsetlocal twsetupfilexfer.filename '${get:image.folder}/${get:image.prefix}${format:D6|${get:image.count}}.tif'\nsetlocal twsetupfilexfer.format 'TWFF_TIFF'\ngoto MAIN.SETUPFILEXFER\n:MAIN.SETUPFILEXFER.JPEG\nsetlocal image.showname 'DAT_IMAGEFILEXFER/${get:image.prefix}${format:D6|${get:image.count}}.jpg'\nsetlocal twsetupfilexfer.filename '${get:image.folder}/${get:image.prefix}${format:D6|${get:image.count}}.jpg'\nsetlocal twsetupfilexfer.format 'TWFF_JFIF'\n:MAIN.SETUPFILEXFER\nsetlocal name 'dg_control/dat_setupfilexfer/msg_set'\ndsmentry src ds dg_control dat_setupfilexfer msg_set '\"${get:twsetupfilexfer.filename}\",${get:twsetupfilexfer.format},0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Transfer the image...\n;\nsetlocal name 'dg_image/dat_imagefilexfer/msg_get'\ndsmentry src ds dg_image dat_imagefilexfer msg_get null\nif '${sts:}' != 'XFERDONE' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\necho.passfail '${get:indent}image <${get:image.showname}>' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; End the transfer, see if we're done...\n;\nsetlocal name 'dg_control/dat_pendingxfers/msg_endxfer'\ndsmentry src ds dg_control dat_pendingxfers msg_endxfer '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nif '${ret:${get:TW_PENDINGXFERS.Count}}' != '0' goto MAIN.IMAGEINFO.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We're out of images, so disable and go back up to\n; do the next ICAP_PIXELTYPE...\n;\nsetlocal name 'dg_control/dat_userinterface/msg_disableds'\ndsmentry src ds dg_control dat_userinterface msg_disableds '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\ngoto MAIN.PIXELTYPE.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Summary and cleanup...\n;\n; We passed...\n:MAIN.PASS\necho.passfail 'SUMMARY' 'pass'\nreturn 'pass'\n;\n; Ruh-roh...\n:MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'fail - ${sts:} ${ret:}'\necho.passfail 'SUMMARY' 'fail'\nsetglobal '${arg:2}' 'fail'\nreturn 'fail'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/060 - UI Image Transfer Tests/DAT_IMAGEMEMFILEXFER.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DAT_IMAGEMEMFILEXFER\n;   This test issues multiple image transfer sessions using DAT_IMAGEMEMFILEXFER. It is performed\n;   for all available image sources (unspecified, flatbed and/or ADF). Only one image is transferred\n;   per session.\n;\n;   We follow the capability ordering, so the loops take the form:\n;   set ICAP_XFERMECH TWSX_MEMFILE\n;   foreach CAP_FEEDERENABLED\n;     foreach ICAP_PIXELTYPE\n;       scan\n;     end\n;   end\n;\n; Arguments\n;   arg:1 - TW_IDENTITY.ProductName of scanner to test\n;   arg:2 - global for us to update on failure\n;   arg:3 - value of ShowUI (TRUE or FALSE)\n;   arg:4 - test name for the image folder\n;   arg:5 - result of a MSG_GET on ICAP_XFERMECH\n;\n; Globals\n;   (none)\n;\n; Locals\n;   name - current test being done\n;   indent - indent the passfail text\n;   imagememxfer - result of DAT_IMAGEMEMXFER call\n;   setupmemxfer.preferred - preferred field from DAT_SETUPMEMXFER call\n;\n;   image.count - count of images from 1\n;   image.folder - folder to put the images in\n;   image.prefix - adf or fb\n;\n;   feederenabled.list - scanner's feederenabled values\n;   feederenabled.index - index of feederenabled values\n;   feederenabled.value - current feederenabled value\n;\n;   pixeltype.list - scanner's pixeltype values for this feederenabled\n;   pixeltype.index - index of pixeltype values\n;   pixeltype.value - current pixeltype value\n;\n; Returns\n;   pass or fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; If not supported, quietly leave...\n;\nif '${arg:5}' ~contains 'TWSX_MEMFILE' goto MAIN.CONTINUE\nreturn 'pass'\n:MAIN.CONTINUE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize...\n;\necho.titletest 'DAT_IMAGEMEMFILEXFER'\nsetlocal indent ''\nsetlocal image.pointer '0'\nsetlocal image.count '0'\nsetlocal image.folder '${folder:certimages}/${arg:4}/DAT_IMAGEMEMFILEXFER'\nsetlocal image.prefix 'fb'\nsetlocal showui '${arg:3}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Clean the image folder for this test...\n;\nimage cleanfolder '${get:image.folder}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; MSG_RESETALL\n; If return code is not TWRC_SUCCESS, end with an error\n;\nsetlocal name 'MSG_RESETALL'\ndsmentry src ds dg_control dat_capability msg_resetall '0,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get and set ICAP_XFERMECH...\n;\nsetlocal name 'ICAP_XFERMECH MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'ICAP_XFERMECH,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\nif '${ret:}' !~contains 'TWSX_MEMFILE' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'ICAP_XFERMECH MSG_SET TWSX_MEMFILE'\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_XFERMECH,TWON_ONEVALUE,TWTY_UINT16,TWSX_MEMFILE'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get CAP_FEEDERENABLED, and loop so we test all values\n; for the current ICAP_XFERMECH setting.\n;\nsetlocal name 'CAP_FEEDERENABLED MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'CAP_FEEDERENABLED,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal feederenabled.list '${ret:}' ; what the scanner told us\nsetlocal feederenabled.index '${get:TW_ENUMERATION.ItemList}' ; point to itemlist\nincrement feederenabled.index '${get:feederenabled.index}' -1 ; less 1\n;\n:MAIN.FEEDERENABLED.NEXT\nsetlocal indent ''\nsetlocal image.count '0' ; reset count to 0\nincrement feederenabled.index '${get:feederenabled.index}' 1 ; next itemlist\nsetlocal feederenabled.value '${getindex:feederenabled.list:${get:feederenabled.index}}' ; get the value\nif '${get:feederenabled.value}' == '' goto MAIN.PASS ; we've passed all tests!!!\n;\nsetlocal name 'CAP_FEEDERENABLED MSG_SET ${get:feederenabled.value}'\ndsmentry src ds dg_control dat_capability msg_set 'CAP_FEEDERENABLED,TWON_ONEVALUE,TWTY_BOOL,${get:feederenabled.value}'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nif '${get:feederenabled.value}' ~~ 'FALSE' goto MAIN.FEEDERENABLED.SETFB\nsetlocal image.prefix 'adf'\ngoto MAIN.FEEDERENABLED.SETDONE\n:MAIN.FEEDERENABLED.SETFB\nsetlocal image.prefix 'fb'\n:MAIN.FEEDERENABLED.SETDONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get ICAP_PIXELTYPE, and loop so we test all values for\n; the current CAP_FEEDERENABLED setting.\n;\nsetlocal indent '  '\nsetlocal name 'ICAP_PIXELTYPE MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'ICAP_PIXELTYPE,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal pixeltype.list '${ret:}' ; what the scanner told us\nsetlocal pixeltype.index '${get:TW_ENUMERATION.ItemList}' ; point to itemlist\nincrement pixeltype.index '${get:pixeltype.index}' -1 ; less 1\n;\n:MAIN.PIXELTYPE.NEXT\nsetlocal indent '  '\nincrement pixeltype.index '${get:pixeltype.index}' 1 ; next itemlist\nsetlocal pixeltype.value '${getindex:pixeltype.list:${get:pixeltype.index}}' ; get the value\nif '${get:pixeltype.value}' == '' goto MAIN.FEEDERENABLED.NEXT ; pixeltypes done for this feederenabled\n;\nsetlocal name 'ICAP_PIXELTYPE MSG_SET ${get:pixeltype.value}'\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_PIXELTYPE,TWON_ONEVALUE,TWTY_UINT16,${get:pixeltype.value}'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get the preferred size for memory transfers, and allocate\n; a pointer for the memory transfers...\n;\nsetlocal indent '    '\nsetlocal name 'dg_control/dat_setupmemxfer/msg_get'\ndsmentry src ds dg_control dat_setupmemxfer msg_get '0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'TW_SETUPMEMXFER.Preferred > 0'\nsetlocal setupmemxfer.preferred '${ret:${get:TW_SETUPMEMXFER.Preferred}}'\nif '${get:setupmemxfer.preferred}' <= '0' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'allocate pointer for ${get:setupmemxfer.preferred} bytes'\nfree pointer image.pointer ; for the last loop\nallocate pointer image.pointer '${get:setupmemxfer.preferred}'\nif '${get:image.pointer}' == '0' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set DAT_SETUPFILEXFER to TWFF_TIFF\n;\nsetlocal name 'dg_control/dat_setupfilexfer/msg_set TWFF_TIFF'\ndsmentry src null dg_control dat_setupfilexfer msg_set 'file,TWFF_TIFF,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; If we're a flatbed, we can start scanning...\n;\nif '${get:feederenabled.value}' ~~ 'FALSE' goto MAIN.USERINTERFACE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Check for paper in the feeder...\n;\ndsmentry src ds dg_control dat_capability msg_getcurrent 'CAP_FEEDERLOADED,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.FEEDERLOADED.DONE\nif '${ret:${get:TW_ONEVALUE.Item}}' ~~ 'TRUE' goto MAIN.FEEDERLOADED.DONE\necho.prompt\necho.prompt \"Place paper in the scanner's feeder.\"\npause '(press the ENTER key when ready to continue)'\n:MAIN.FEEDERLOADED.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We only need one sheet of paper...\n;\nsetlocal name 'CAP_XFERCOUNT MSG_SET 1'\ndsmentry src ds dg_control dat_capability msg_set 'CAP_XFERCOUNT,TWON_ONEVALUE,TWTY_INT16,1'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Start scanning...\n;\n:MAIN.USERINTERFACE\nsetlocal name 'dg_control/dat_userinterface/msg_enableds'\nwait reset\ndsmentry src null dg_control dat_userinterface msg_enableds '${get:showui},0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Wait for MSG_XFERREADY, if we don't see it then scoot...\n;\nsetlocal name 'wait ${get:sys_waittimeout} seconds for MSG_XFERREADY'\nwait '${get:sys_waittimeout}000'\nif '${ret:}' !~contains 'msg_xferready' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Do a memory file transfer...\n; This little song and dance with the states is so that we can\n; start the transfer in state 6 with each new image, but switch\n; to state 7 if we need multiple calls to capture the current\n; image...\n;\n; The saved images will be in TIFF format, which includes TIFF\n; JPEG (the better form, where a simple TIFF header is added).\n;\nincrement image.count '${get:image.count}' 1\nimage free memfileimage\n;\n:MAIN.IMAGEMEMFILEXFER.NEXT\nsetlocal name 'dg_image/dat_imagememxfer/msg_get'\ndsmentry src ds dg_image dat_imagememfilexfer msg_get '0,0,0,0,0,0,0,9,${get:setupmemxfer.preferred},${get:image.pointer}'\nsetlocal imagememxfer '${ret:}'\nif '${sts:}' == 'XFERDONE' goto MAIN.IMAGEMEMFILEXFER.XFERDONE\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\n;\necho.passfail '${get:indent}${get:name} SUCCESS' 'pass'\nimage append memfileimage '${get:imagememxfer}'\ngoto MAIN.IMAGEMEMFILEXFER.NEXT\n;\n:MAIN.IMAGEMEMFILEXFER.XFERDONE\necho.passfail '${get:indent}${get:name} XFERDONE' 'pass'\nimage append memfileimage '${get:imagememxfer}'\nimage save memfileimage memfile '${get:image.folder}/${get:image.prefix}${format:D6|${get:image.count}}'\necho.passfail '${get:indent}image <${ret:}>' 'pass'\nimage free memfileimage\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; End the transfer, see if we're done...\n;\nsetlocal name 'dg_control/dat_pendingxfers/msg_endxfer'\ndsmentry src ds dg_control dat_pendingxfers msg_endxfer '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nif '${ret:${get:TW_PENDINGXFERS.Count}}' != '0' goto MAIN.IMAGEMEMFILEXFER.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We're out of images, so disable and go back up to\n; do the next ICAP_PIXELTYPE...\n;\nsetlocal name 'dg_control/dat_userinterface/msg_disableds'\ndsmentry src ds dg_control dat_userinterface msg_disableds '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\ngoto MAIN.PIXELTYPE.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Summary and cleanup...\n;\n; We passed...\n:MAIN.PASS\nimage free memfileimage\nfree pointer image.pointer\necho.passfail 'SUMMARY' 'pass'\nreturn 'pass'\n;\n; Ruh-roh...\n:MAIN.ERROR.ECHOPASSFAIL\nimage free memfileimage\nfree pointer image.pointer\necho.passfail '${get:indent}${get:name}' 'fail - ${sts:} ${ret:}'\necho.passfail 'SUMMARY' 'fail'\nsetglobal '${arg:2}' 'fail'\nreturn 'fail'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/060 - UI Image Transfer Tests/DAT_IMAGEMEMXFER.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DAT_IMAGEMEMXFER\n;   This test issues multiple image transfer sessions using DAT_IMAGEMEMXFER. It is performed\n;   for all available image sources (unspecified, flatbed and/or ADF). Only one image is transferred\n;   per session.\n;\n;   We follow the capability ordering, so the loops take the form:\n;   set ICAP_XFERMECH TWSX_MEMORY\n;   foreach CAP_FEEDERENABLED\n;     foreach ICAP_PIXELTYPE\n;       scan\n;     end\n;   end\n;\n; Arguments\n;   arg:1 - TW_IDENTITY.ProductName of scanner to test\n;   arg:2 - global for us to update on failure\n;   arg:3 - value of ShowUI (TRUE or FALSE)\n;   arg:4 - test name for the image folder\n;\n; Globals\n;   (none)\n;\n; Locals\n;   name - current test being done\n;   indent - indent the passfail text\n;   imageinfo - metadata for the current image\n;   imagememxfer - result of DAT_IMAGEMEMXFER call\n;   setupmemxfer.preferred - preferred field from DAT_SETUPMEMXFER call\n;\n;   image.count - count of images from 1\n;   image.folder - folder to put the images in\n;   image.prefix - adf or fb\n;\n;   feederenabled.list - scanner's feederenabled values\n;   feederenabled.index - index of feederenabled values\n;   feederenabled.value - current feederenabled value\n;\n;   pixeltype.list - scanner's pixeltype values for this feederenabled\n;   pixeltype.index - index of pixeltype values\n;   pixeltype.value - current pixeltype value\n;\n; Returns\n;   pass or fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize...\n;\necho.titletest 'DAT_IMAGEMEMXFER'\nsetlocal indent ''\nsetlocal image.pointer '0'\nsetlocal image.count '0'\nsetlocal image.folder '${folder:certimages}/${arg:4}/DAT_IMAGEMEMXFER'\nsetlocal image.prefix 'fb'\nsetlocal showui '${arg:3}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Clean the image folder for this test...\n;\nimage cleanfolder '${get:image.folder}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; MSG_RESETALL\n; If return code is not TWRC_SUCCESS, end with an error\n;\nsetlocal name 'MSG_RESETALL'\ndsmentry src ds dg_control dat_capability msg_resetall '0,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get and set ICAP_XFERMECH...\n;\nsetlocal name 'ICAP_XFERMECH MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'ICAP_XFERMECH,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\nif '${ret:}' !~contains 'TWSX_MEMORY' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'ICAP_XFERMECH MSG_SET TWSX_MEMORY'\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_XFERMECH,TWON_ONEVALUE,TWTY_UINT16,TWSX_MEMORY'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get CAP_FEEDERENABLED, and loop so we test all values\n; for the current ICAP_XFERMECH setting.\n;\nsetlocal name 'CAP_FEEDERENABLED MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'CAP_FEEDERENABLED,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal feederenabled.list '${ret:}' ; what the scanner told us\nsetlocal feederenabled.index '${get:TW_ENUMERATION.ItemList}' ; point to itemlist\nincrement feederenabled.index '${get:feederenabled.index}' -1 ; less 1\n;\n:MAIN.FEEDERENABLED.NEXT\nsetlocal indent ''\nsetlocal image.count '0' ; reset count to 0\nincrement feederenabled.index '${get:feederenabled.index}' 1 ; next itemlist\nsetlocal feederenabled.value '${getindex:feederenabled.list:${get:feederenabled.index}}' ; get the value\nif '${get:feederenabled.value}' == '' goto MAIN.PASS ; we've passed all tests!!!\n;\nsetlocal name 'CAP_FEEDERENABLED MSG_SET ${get:feederenabled.value}'\ndsmentry src ds dg_control dat_capability msg_set 'CAP_FEEDERENABLED,TWON_ONEVALUE,TWTY_BOOL,${get:feederenabled.value}'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nif '${get:feederenabled.value}' ~~ 'FALSE' goto MAIN.FEEDERENABLED.SETFB\nsetlocal image.prefix 'adf'\ngoto MAIN.FEEDERENABLED.SETDONE\n:MAIN.FEEDERENABLED.SETFB\nsetlocal image.prefix 'fb'\n:MAIN.FEEDERENABLED.SETDONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get ICAP_PIXELTYPE, and loop so we test all values for\n; the current CAP_FEEDERENABLED setting.\n;\nsetlocal indent '  '\nsetlocal name 'ICAP_PIXELTYPE MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'ICAP_PIXELTYPE,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal pixeltype.list '${ret:}' ; what the scanner told us\nsetlocal pixeltype.index '${get:TW_ENUMERATION.ItemList}' ; point to itemlist\nincrement pixeltype.index '${get:pixeltype.index}' -1 ; less 1\n;\n:MAIN.PIXELTYPE.NEXT\nsetlocal indent '  '\nincrement pixeltype.index '${get:pixeltype.index}' 1 ; next itemlist\nsetlocal pixeltype.value '${getindex:pixeltype.list:${get:pixeltype.index}}' ; get the value\nif '${get:pixeltype.value}' == '' goto MAIN.FEEDERENABLED.NEXT ; pixeltypes done for this feederenabled\n;\nsetlocal name 'ICAP_PIXELTYPE MSG_SET ${get:pixeltype.value}'\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_PIXELTYPE,TWON_ONEVALUE,TWTY_UINT16,${get:pixeltype.value}'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get the preferred size for memory transfers, and allocate\n; a pointer for the memory transfers...\n;\nsetlocal indent '    '\nsetlocal name 'dg_control/dat_setupmemxfer/msg_get'\ndsmentry src ds dg_control dat_setupmemxfer msg_get '0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'TW_SETUPMEMXFER.Preferred > 0'\nsetlocal setupmemxfer.preferred '${ret:${get:TW_SETUPMEMXFER.Preferred}}'\nif '${get:setupmemxfer.preferred}' <= '0' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'allocate pointer for ${get:setupmemxfer.preferred} bytes'\nfree pointer image.pointer ; for the last loop\nallocate pointer image.pointer '${get:setupmemxfer.preferred}'\nif '${get:image.pointer}' == '0' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; If we're a flatbed, we can start scanning...\n;\nif '${get:feederenabled.value}' ~~ 'FALSE' goto MAIN.USERINTERFACE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Check for paper in the feeder...\n;\ndsmentry src ds dg_control dat_capability msg_getcurrent 'CAP_FEEDERLOADED,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.FEEDERLOADED.DONE\nif '${ret:${get:TW_ONEVALUE.Item}}' ~~ 'TRUE' goto MAIN.FEEDERLOADED.DONE\necho.prompt\necho.prompt \"Place paper in the scanner's feeder.\"\npause '(press the ENTER key when ready to continue)'\n:MAIN.FEEDERLOADED.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We only need one sheet of paper...\n;\nsetlocal name 'CAP_XFERCOUNT MSG_SET 1'\ndsmentry src ds dg_control dat_capability msg_set 'CAP_XFERCOUNT,TWON_ONEVALUE,TWTY_INT16,1'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Start scanning...\n;\n:MAIN.USERINTERFACE\nsetlocal name 'dg_control/dat_userinterface/msg_enableds'\nwait reset\ndsmentry src null dg_control dat_userinterface msg_enableds '${get:showui},0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Wait for MSG_XFERREADY, if we don't see it then scoot...\n;\nsetlocal name 'wait ${get:sys_waittimeout} seconds for MSG_XFERREADY'\nwait '${get:sys_waittimeout}000'\nif '${ret:}' !~contains 'msg_xferready' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Do a memory transfer...\n; This little song and dance with the states is so that we can\n; start the transfer in state 6 with each new image, but switch\n; to state 7 if we need multiple calls to capture the current\n; image...\n;\n; The saved images will be in TIFF format, which includes TIFF\n; JPEG (the better form, where a simple TIFF header is added).\n;\nincrement image.count '${get:image.count}' 1\nimage free memimage\n;\n:MAIN.IMAGEMEMXFER.NEXT\nsetlocal name 'dg_image/dat_imagememxfer/msg_get'\ndsmentry src ds dg_image dat_imagememxfer msg_get '0,0,0,0,0,0,0,9,${get:setupmemxfer.preferred},${get:image.pointer}'\nsetlocal imagememxfer '${ret:}'\nif '${sts:}' == 'XFERDONE' goto MAIN.IMAGEMEMXFER.XFERDONE\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\n;\necho.passfail '${get:indent}${get:name} SUCCESS' 'pass'\nimage append memimage '${get:imagememxfer}'\ngoto MAIN.IMAGEMEMXFER.NEXT\n;\n:MAIN.IMAGEMEMXFER.XFERDONE\necho.passfail '${get:indent}${get:name} XFERDONE' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We need image info to make sense of this data...\n;\nsetlocal name 'dg_image/dat_imageinfo/msg_get'\ndsmentry src ds dg_image dat_imageinfo msg_get '0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0'\nsetlocal imageinfo '${ret:}'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Save the image...\n;\nimage append memimage '${get:imagememxfer}'\nimage addheader memimage '${get:imageinfo}'\nimage save memimage memory '${get:image.folder}/${get:image.prefix}${format:D6|${get:image.count}}'\necho.passfail '${get:indent}image <${ret:}>' 'pass'\nimage free memimage\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; End the transfer, see if we're done...\n;\nsetlocal name 'dg_control/dat_pendingxfers/msg_endxfer'\ndsmentry src ds dg_control dat_pendingxfers msg_endxfer '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nif '${ret:${get:TW_PENDINGXFERS.Count}}' != '0' goto MAIN.IMAGEMEMXFER.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We're out of images, so disable and go back up to\n; do the next ICAP_PIXELTYPE...\n;\nsetlocal name 'dg_control/dat_userinterface/msg_disableds'\ndsmentry src ds dg_control dat_userinterface msg_disableds '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\ngoto MAIN.PIXELTYPE.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Summary and cleanup...\n;\n; We passed...\n:MAIN.PASS\nimage free memfileimage\nfree pointer image.pointer\necho.passfail 'SUMMARY' 'pass'\nreturn 'pass'\n;\n; Ruh-roh...\n:MAIN.ERROR.ECHOPASSFAIL\nimage free memimage\nfree pointer image.pointer\necho.passfail '${get:indent}${get:name}' 'fail - ${sts:} ${ret:}'\necho.passfail 'SUMMARY' 'fail'\nsetglobal '${arg:2}' 'fail'\nreturn 'fail'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/060 - UI Image Transfer Tests/DAT_IMAGENATIVEXFER.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DAT_IMAGENATIVEXFER\n;   This test issues multiple image transfer sessions using DAT_IMAGENATIVEXFER. It is performed\n;   for all available image sources (unspecified, flatbed and/or ADF). Only one image is transferred\n;   per session.\n;\n;   We follow the capability ordering, so the loops take the form:\n;   set ICAP_XFERMECH TWSX_NATIVE\n;   foreach CAP_FEEDERENABLED\n;     foreach ICAP_PIXELTYPE\n;       scan\n;     end\n;   end\n;\n; Arguments\n;   arg:1 - TW_IDENTITY.ProductName of scanner to test\n;   arg:2 - global for us to update on failure\n;   arg:3 - value of ShowUI (TRUE or FALSE)\n;   arg:4 - test name for the image folder\n;\n; Globals\n;   (none)\n;\n; Locals\n;   name - current test being done\n;   indent - indent the passfail text\n;\n;   image.handle - native handle\n;   image.count - count of images from 1\n;   image.folder - folder to put the images in\n;   image.prefix - adf or fb\n;\n;   feederenabled.list - scanner's feederenabled values\n;   feederenabled.index - index of feederenabled values\n;   feederenabled.value - current feederenabled value\n;\n;   pixeltype.list - scanner's pixeltype values for this feederenabled\n;   pixeltype.index - index of pixeltype values\n;   pixeltype.value - current pixeltype value\n;\n; Returns\n;   pass or fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize...\n;\necho.titletest 'DAT_IMAGENATIVEXFER'\nsetlocal indent ''\nsetlocal image.handle '0'\nsetlocal image.count '0'\nsetlocal image.folder '${folder:certimages}/${arg:4}/DAT_IMAGENATIVEXFER'\nsetlocal image.prefix 'fb'\nsetlocal showui '${arg:3}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Clean the image folder for this test...\n;\nimage cleanfolder '${get:image.folder}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; MSG_RESETALL\n; If return code is not TWRC_SUCCESS, end with an error\n;\nsetlocal name 'MSG_RESETALL'\ndsmentry src ds dg_control dat_capability msg_resetall '0,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get and set ICAP_XFERMECH...\n;\nsetlocal name 'ICAP_XFERMECH MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'ICAP_XFERMECH,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\nif '${ret:}' !~contains 'TWSX_NATIVE' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'ICAP_XFERMECH MSG_SET TWSX_NATIVE'\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_XFERMECH,TWON_ONEVALUE,TWTY_UINT16,TWSX_NATIVE'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get CAP_FEEDERENABLED, and loop so we test all values\n; for the current ICAP_XFERMECH setting.\n;\nsetlocal name 'CAP_FEEDERENABLED MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'CAP_FEEDERENABLED,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal feederenabled.list '${ret:}' ; what the scanner told us\nsetlocal feederenabled.index '${get:TW_ENUMERATION.ItemList}' ; point to itemlist\nincrement feederenabled.index '${get:feederenabled.index}' -1 ; less 1\n;\n:MAIN.FEEDERENABLED.NEXT\nsetlocal indent ''\nsetlocal image.count '0' ; reset count to 0\nincrement feederenabled.index '${get:feederenabled.index}' 1 ; next itemlist\nsetlocal feederenabled.value '${getindex:feederenabled.list:${get:feederenabled.index}}' ; get the value\nif '${get:feederenabled.value}' == '' goto MAIN.PASS ; we've passed all tests!!!\n;\nsetlocal name 'CAP_FEEDERENABLED MSG_SET ${get:feederenabled.value}'\ndsmentry src ds dg_control dat_capability msg_set 'CAP_FEEDERENABLED,TWON_ONEVALUE,TWTY_BOOL,${get:feederenabled.value}'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nif '${get:feederenabled.value}' ~~ 'FALSE' goto MAIN.FEEDERENABLED.SETFB\nsetlocal image.prefix 'adf'\ngoto MAIN.FEEDERENABLED.SETDONE\n:MAIN.FEEDERENABLED.SETFB\nsetlocal image.prefix 'fb'\n:MAIN.FEEDERENABLED.SETDONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get ICAP_PIXELTYPE, and loop so we test all values for\n; the current CAP_FEEDERENABLED setting.\n;\nsetlocal indent '  '\nsetlocal name 'ICAP_PIXELTYPE MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'ICAP_PIXELTYPE,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal pixeltype.list '${ret:}' ; what the scanner told us\nsetlocal pixeltype.index '${get:TW_ENUMERATION.ItemList}' ; point to itemlist\nincrement pixeltype.index '${get:pixeltype.index}' -1 ; less 1\n;\n:MAIN.PIXELTYPE.NEXT\nsetlocal indent '  '\nincrement pixeltype.index '${get:pixeltype.index}' 1 ; next itemlist\nsetlocal pixeltype.value '${getindex:pixeltype.list:${get:pixeltype.index}}' ; get the value\nif '${get:pixeltype.value}' == '' goto MAIN.FEEDERENABLED.NEXT ; pixeltypes done for this feederenabled\n;\nsetlocal name 'ICAP_PIXELTYPE MSG_SET ${get:pixeltype.value}'\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_PIXELTYPE,TWON_ONEVALUE,TWTY_UINT16,${get:pixeltype.value}'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; If we're a flatbed, we can start scanning...\n;\nsetlocal indent '    '\nif '${get:feederenabled.value}' ~~ 'FALSE' goto MAIN.USERINTERFACE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Check for paper in the feeder...\n;\ndsmentry src ds dg_control dat_capability msg_getcurrent 'CAP_FEEDERLOADED,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.FEEDERLOADED.DONE\nif '${ret:${get:TW_ONEVALUE.Item}}' ~~ 'TRUE' goto MAIN.FEEDERLOADED.DONE\necho.prompt\necho.prompt \"Place paper in the scanner's feeder.\"\npause '(press the ENTER key when ready to continue)'\n:MAIN.FEEDERLOADED.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We only need one sheet of paper...\n;\nsetlocal name 'CAP_XFERCOUNT MSG_SET 1'\ndsmentry src ds dg_control dat_capability msg_set 'CAP_XFERCOUNT,TWON_ONEVALUE,TWTY_INT16,1'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Start scanning...\n;\n:MAIN.USERINTERFACE\nsetlocal name 'dg_control/dat_userinterface/msg_enableds'\nwait reset\ndsmentry src null dg_control dat_userinterface msg_enableds '${get:showui},0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Wait for MSG_XFERREADY, if we don't see it then scoot...\n;\nsetlocal name 'wait ${get:sys_waittimeout} seconds for MSG_XFERREADY'\nwait '${get:sys_waittimeout}000'\nif '${ret:}' !~contains 'msg_xferready' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Do a native transfer...\n;\n:MAIN.IMAGENATIVEXFER.NEXT\nsetlocal name 'dg_image/dat_imagenativexfer/msg_get'\nincrement image.count '${get:image.count}' 1\ndsmentry src ds dg_image dat_imagenativexfer msg_get '0'\nsetlocal image.handle '${ret:}'\nif '${sts:}' != 'XFERDONE' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nimage save image.handle native '${get:image.folder}/${get:image.prefix}${format:D6|${get:image.count}}'\necho.passfail '${get:indent}image <${ret:}>' 'pass'\nfree handle image.handle\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; End the transfer, see if we're done...\n;\nsetlocal name 'dg_control/dat_pendingxfers/msg_endxfer'\ndsmentry src ds dg_control dat_pendingxfers msg_endxfer '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nif '${ret:${get:TW_PENDINGXFERS.Count}}' != '0' goto MAIN.IMAGENATIVEXFER.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We're out of images, so disable and go back up to\n; do the next ICAP_PIXELTYPE...\n;\nsetlocal name 'dg_control/dat_userinterface/msg_disableds'\ndsmentry src ds dg_control dat_userinterface msg_disableds '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\ngoto MAIN.PIXELTYPE.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Summary and cleanup...\n;\n; We passed...\n:MAIN.PASS\nfree handle image.handle\necho.passfail 'SUMMARY' 'pass'\nreturn 'pass'\n;\n; Ruh-roh...\n:MAIN.ERROR.ECHOPASSFAIL\nfree handle image.handle\necho.passfail '${get:indent}${get:name}' 'fail - ${sts:} ${ret:}'\necho.passfail 'SUMMARY' 'fail'\nsetglobal '${arg:2}' 'fail'\nreturn 'fail'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/070 - CAP_XFERCOUNT Tests/Certification.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; CAP_XFERCOUNT Tests\n;   Confirm that when the data source accepts various values for CAP_XFERCOUNT, that it\n;   returns the specified number of images. Test both flatbed and document feeders.\n;\n; Arguments\n;   arg:1 - TW_IDENTITY.ProductName of scanner to test\n;   arg:2 - global to set on fail\n;\n; Globals\n;   (none)\n;\n; Locals\n;   twidentity.productname - product name of scanner to test\n;   certifyresult - global to set on fail\n;   xfermech - result of getting ICAP_XFERMECH\n;\n; Returns\n;   (none)\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize stuff, load tables if not already done for us...\n;\necho.titlesuite 'CAP_XFERCOUNT Tests v1.0 04-Mar-2020'\nsetlocal twidentity.productname '${arg:1}'\nsetlocal certifyresult '${arg:2}'\nif '${get:TW_ARRAY.ItemType}' != '' goto MAIN.LOADTABLES.SKIP\nrun '${folder:certification}/LoadTables'\n:MAIN.LOADTABLES.SKIP\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Run the tests...\n;\ncall CERTIFY '${folder:certification}/Opends'  '${get:twidentity.productname}' '${get:certifyresult}'\nif '${get:${get:certifyresult}}' == 'fail' goto MAIN.CLOSEDS\n\n; Get ICAP_XFERMECH...\nsetlocal name 'ICAP_XFERMECH MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'ICAP_XFERMECH,0,0,0'\nif '${sts:}' != 'SUCCESS' goto CERTIFY.FAIL\nsetlocal xfermech '${ret:}'\necho.passfail '${get:name}' 'pass'\n\n; Do the tests...\ncall CERTIFY 'DAT_IMAGENATIVEXFER'             '${get:twidentity.productname}' '${get:certifyresult}' 'FALSE' '${folder:parent}'\ncall CERTIFY 'DAT_IMAGEMEMXFER'                '${get:twidentity.productname}' '${get:certifyresult}' 'FALSE' '${folder:parent}'\ncall CERTIFY 'DAT_IMAGEFILEXFER'               '${get:twidentity.productname}' '${get:certifyresult}' 'FALSE' '${folder:parent}' '${get:xfermech}'\ncall CERTIFY 'DAT_IMAGEMEMFILEXFER'            '${get:twidentity.productname}' '${get:certifyresult}' 'FALSE' '${folder:parent}' '${get:xfermech}'\n:MAIN.CLOSEDS\ncall CERTIFY '${folder:certification}/Closeds' '${get:twidentity.productname}' '${get:certifyresult}'\nreturn\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Function: Certify\n; arg:1 - script to run\n; arg:2 - TW_IDENTITY.ProductName of scanner to test\n; arg:3 - global value to update on fail\n; arg:4 - showui value\n; arg:5 - name of test\n; arg:6 - xfermech values\n; returns: (none)\n;\n:CERTIFY\n;\nrun '${arg:1}' '${arg:2}' '${arg:3}' '${arg:4}' '${arg:5}' '${arg:6}'\nif '${ret:}' != 'pass' goto CERTIFY.FAIL\nreturn 'pass'\n;\n:CERTIFY.FAIL\nsetglobal '${arg:3}' 'fail'\nreturn 'fail'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/070 - CAP_XFERCOUNT Tests/DAT_IMAGEFILEXFER.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DAT_IMAGEFILEXFER\n;   This test sets CAP_XFERCOUNT to 0, 1 and -1 for a flatbed scanner. It expects an error for the\n;   value 0, and only one image to be transferred per scanning session for the values 1 and -1.\n;\n;   We follow the capability ordering, so the loops take the form:\n;   set ICAP_XFERMECH TWSX_FILE\n;   foreach CAP_FEEDERENABLED\n;     foreach ICAP_PIXELTYPE\n;       scan\n;     end\n;   end\n;\n; Arguments\n;   arg:1 - TW_IDENTITY.ProductName of scanner to test\n;   arg:2 - global for us to update on failure\n;   arg:3 - value of ShowUI (TRUE or FALSE)\n;   arg:4 - test name for the image folder\n;   arg:5 - result of a MSG_GET on ICAP_XFERMECH\n;\n; Globals\n;   (none)\n;\n; Locals\n;   name - current test being done\n;   indent - indent the passfail text\n;   twimageinfo.compression - compression for current image\n;   showui - value of showui\n;\n;   image.count - count of images from 1\n;   image.folder - folder to put the images in\n;   image.folderone - path for CAP_XFERCOUNT=1 test\n;   image.folderall - path for CAP_XFERCOUNT=-1 test\n;   image.prefix - adf or fb\n;   image.testcount - count of images from 0 for a specific test\n;\n;   feederenabled.list - scanner's feederenabled values\n;   feederenabled.index - index of feederenabled values\n;   feederenabled.value - current feederenabled value\n;\n;   xfercount.test - number of test we're running\n;\n; Returns\n;   pass or fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; If not supported, quietly leave...\n;\nif '${arg:5}' ~contains 'TWSX_FILE' goto MAIN.CONTINUE\nreturn 'pass'\n:MAIN.CONTINUE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize...\n;\necho.titletest 'DAT_IMAGEFILEXFER'\nsetlocal indent ''\nsetlocal image.count '0'\nsetlocal image.folder ''\nsetlocal image.folderone '${folder:certimages}/${arg:4}/DAT_IMAGEFILEXFER/one'\nsetlocal image.folderall '${folder:certimages}/${arg:4}/DAT_IMAGEFILEXFER/all'\nsetlocal image.prefix 'fb'\nsetlocal image.testcount '1'\nsetlocal showui '${arg:3}'\nsetlocal xfercount.test '0'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Prompt the user, if they have an ADF...\n;\nif '${get:g_skipprompts}' != '' goto MAIN.SKIP.PROMPTS\ndsmentry src ds dg_control dat_capability msg_get 'CAP_FEEDERENABLED,0,0,0'\nif '${ret:}' !~contains 'TRUE' goto MAIN.SKIP.PROMPTS\necho.prompt\necho.prompt \"Scanning will take place during this test.  There will be no\"\necho.prompt \"need to press any button on the TWAIN user interface to start\"\necho.prompt \"the scanner.  A progress indicator may appear during scanning.\"\necho.prompt\necho.prompt \"Place at least 3 sheets of paper in the scanner's feeder.\"\npause '(press the ENTER key when ready to continue)'\necho.prompt\n:MAIN.SKIP.PROMPTS\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Clean the image folder for this test...\n;\nimage cleanfolder '${get:image.folderone}'\nimage cleanfolder '${get:image.folderall}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; MSG_RESETALL\n; If return code is not TWRC_SUCCESS, end with an error\n;\nsetlocal name 'MSG_RESETALL'\ndsmentry src ds dg_control dat_capability msg_resetall '0,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get and set ICAP_XFERMECH...\n;\nsetlocal name 'ICAP_XFERMECH MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'ICAP_XFERMECH,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\nif '${ret:}' !~contains 'TWSX_FILE' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'ICAP_XFERMECH MSG_SET TWSX_FILE'\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_XFERMECH,TWON_ONEVALUE,TWTY_UINT16,TWSX_FILE'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get CAP_FEEDERENABLED, and loop so we test all values\n; for the current ICAP_XFERMECH setting.\n;\nsetlocal name 'CAP_FEEDERENABLED MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'CAP_FEEDERENABLED,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal feederenabled.list '${ret:}' ; what the scanner told us\nsetlocal feederenabled.index '${get:TW_ENUMERATION.ItemList}' ; point to itemlist\nincrement feederenabled.index '${get:feederenabled.index}' -1 ; less 1\n;\n:MAIN.FEEDERENABLED.NEXT\nsetlocal indent ''\nsetlocal xfercount.test '0' ; reset the tests\nincrement feederenabled.index '${get:feederenabled.index}' 1 ; next itemlist\nsetlocal feederenabled.value '${getindex:feederenabled.list:${get:feederenabled.index}}' ; get the value\nif '${get:feederenabled.value}' == '' goto MAIN.PASS ; we've passed all tests!!!\n;\nsetlocal name 'CAP_FEEDERENABLED MSG_SET ${get:feederenabled.value}'\ndsmentry src ds dg_control dat_capability msg_set 'CAP_FEEDERENABLED,TWON_ONEVALUE,TWTY_BOOL,${get:feederenabled.value}'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nif '${get:feederenabled.value}' ~~ 'FALSE' goto MAIN.FEEDERENABLED.SETFB\nsetlocal image.prefix 'adf'\ngoto MAIN.FEEDERENABLED.SETDONE\n:MAIN.FEEDERENABLED.SETFB\nsetlocal image.prefix 'fb'\n:MAIN.FEEDERENABLED.SETDONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Dispatch to the CAP_XFERCOUNT test we want to run...\n;\n:MAIN.XFERCOUNT.NEXT\nsetlocal indent '  '\nincrement xfercount.test '${get:xfercount.test}' 1\nif '${get:xfercount.test}' == '1' goto MAIN.XFERCOUNT.TEST1\nif '${get:xfercount.test}' == '2' goto MAIN.XFERCOUNT.TEST2\nif '${get:xfercount.test}' == '3' goto MAIN.XFERCOUNT.TEST3\ngoto MAIN.FEEDERENABLED.NEXT ; we're done test with this paper source, go to the next one\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set CAP_XFERCOUNT to 0...\n;\n:MAIN.XFERCOUNT.TEST1\nsetlocal name 'CAP_XFERCOUNT == 0'\ndsmentry src ds dg_control dat_capability msg_set 'CAP_XFERCOUNT,TWON_ONEVALUE,TWTY_INT16,0'\nif '${sts:}' == 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\ngoto MAIN.XFERCOUNT.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set CAP_XFERCOUNT to 1...\n;\n:MAIN.XFERCOUNT.TEST2\nsetlocal name 'CAP_XFERCOUNT == 1'\ndsmentry src ds dg_control dat_capability msg_set 'CAP_XFERCOUNT,TWON_ONEVALUE,TWTY_INT16,1'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal image.folder '${get:image.folderone}'\ngoto MAIN.FEEDERLOADED\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set CAP_XFERCOUNT to -1...\n;\n:MAIN.XFERCOUNT.TEST3\nsetlocal name 'CAP_XFERCOUNT == -1'\ndsmentry src ds dg_control dat_capability msg_set 'CAP_XFERCOUNT,TWON_ONEVALUE,TWTY_INT16,-1'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal image.folder '${get:image.folderall}'\ngoto MAIN.FEEDERLOADED\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Check for paper in the feeder, skip for a flatbed...\n;\n:MAIN.FEEDERLOADED\nif '${get:feederenabled.value}' ~~ 'FALSE' goto MAIN.FEEDERLOADED.DONE\ndsmentry src ds dg_control dat_capability msg_getcurrent 'CAP_FEEDERLOADED,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.FEEDERLOADED.DONE\nif '${ret:${get:TW_ONEVALUE.Item}}' ~~ 'TRUE' goto MAIN.FEEDERLOADED.DONE\necho.prompt\necho.prompt \"Place paper in the scanner's feeder.\"\npause '(press the ENTER key when ready to continue)'\n:MAIN.FEEDERLOADED.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Start scanning...\n;\nsetlocal indent '    '\nsetlocal name 'dg_control/dat_userinterface/msg_enableds'\nsetlocal image.testcount '1' ; reset to 1\nwait reset\ndsmentry src null dg_control dat_userinterface msg_enableds '${get:showui},0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Wait for MSG_XFERREADY, if we don't see it then scoot...\n;\nsetlocal name 'wait ${get:sys_waittimeout} seconds for MSG_XFERREADY'\nwait '${get:sys_waittimeout}000'\nif '${ret:}' !~contains 'msg_xferready' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get information about the image...\n;\n:MAIN.IMAGEINFO.NEXT\nsetlocal name 'dg_image/dat_imageinfo/msg_get'\ndsmentry src ds dg_image dat_imageinfo msg_get '0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\nsetlocal twimageinfo.compression '${ret:${get:index.twimageinfo.compression}}'\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set up the file transfer...\n;\nincrement image.count '${get:image.count}' 1\nif '${get:twimageinfo.compression}' == 'JPEG' goto MAIN.SETUPFILEXFER.JPEG\nsetlocal image.showname 'DAT_IMAGEFILEXFER/${get:image.prefix}${format:D6|${get:image.count}}.tif'\nsetlocal twsetupfilexfer.filename '${get:image.folder}/${get:image.prefix}${format:D6|${get:image.testcount}}.tif'\nsetlocal twsetupfilexfer.format 'TWFF_TIFF'\ngoto MAIN.SETUPFILEXFER\n:MAIN.SETUPFILEXFER.JPEG\nsetlocal image.showname 'DAT_IMAGEFILEXFER/${get:image.prefix}${format:D6|${get:image.count}}.jpg'\nsetlocal twsetupfilexfer.filename '${get:image.folder}/${get:image.prefix}${format:D6|${get:image.testcount}}.jpg'\nsetlocal twsetupfilexfer.format 'TWFF_JFIF'\n:MAIN.SETUPFILEXFER\nsetlocal name 'dg_control/dat_setupfilexfer/msg_set'\ndsmentry src ds dg_control dat_setupfilexfer msg_set '\"${get:twsetupfilexfer.filename}\",${get:twsetupfilexfer.format},0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Transfer the image...\n;\nsetlocal name 'dg_image/dat_imagefilexfer/msg_get'\ndsmentry src ds dg_image dat_imagefilexfer msg_get null\nif '${sts:}' != 'XFERDONE' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\necho.passfail '${get:indent}image <${get:image.showname}>' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; End the transfer, see if we're done...\n;\nsetlocal name 'dg_control/dat_pendingxfers/msg_endxfer'\ndsmentry src ds dg_control dat_pendingxfers msg_endxfer '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nincrement image.testcount '${get:image.testcount}' 1 ; count the image\nif '${ret:${get:TW_PENDINGXFERS.Count}}' != '0' goto MAIN.IMAGEINFO.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We're out of images, so disable...\n;\nsetlocal name 'dg_control/dat_userinterface/msg_disableds'\ndsmentry src ds dg_control dat_userinterface msg_disableds '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Check the results before going up to the next CAP_XFERCOUNT test.\n; Note that flatbeds should always return one image.\n;\nif '${get:feederenabled.value}' ~~ 'FALSE' goto MAIN.XFERCOUNT.CHECKTEST2\nif '${get:xfercount.test}' == '2' goto MAIN.XFERCOUNT.CHECKTEST2\nif '${get:xfercount.test}' == '3' goto MAIN.XFERCOUNT.CHECKTEST3\necho.passfail '${get:indent}WE SHOULD NOT BE HERE' 'fail - test=${get:xfercount.test}'\ngoto MAIN.ERROR.ECHOPASSFAIL\n;\n:MAIN.XFERCOUNT.CHECKTEST2\nsetlocal name 'one image transferred'\nif '${get:image.testcount}' != '2' goto MAIN.ERROR.ECHOPASSFAIL ; image.testcountstarted at 1\necho.passfail '${get:indent}${get:name}' 'pass'\ngoto MAIN.XFERCOUNT.NEXT\n;\n:MAIN.XFERCOUNT.CHECKTEST3\nsetlocal name 'multiple images transferred (${get:image.testcount})'\nif '${get:image.testcount}' < '3' goto MAIN.ERROR.ECHOPASSFAIL ; image.testcountstarted at 1\necho.passfail '${get:indent}${get:name}' 'pass'\ngoto MAIN.XFERCOUNT.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Summary and cleanup...\n;\n; We passed...\n:MAIN.PASS\necho.passfail 'SUMMARY' 'pass'\nreturn 'pass'\n;\n; Ruh-roh...\n:MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'fail - ${sts:} ${ret:}'\necho.passfail 'SUMMARY' 'fail'\nsetglobal '${arg:2}' 'fail'\nreturn 'fail'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/070 - CAP_XFERCOUNT Tests/DAT_IMAGEMEMFILEXFER.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DAT_IMAGEMEMFILEXFER\n;   This test sets CAP_XFERCOUNT to 0, 1 and -1 for a flatbed scanner. It expects an error for the\n;   value 0, and only one image to be transferred per scanning session for the values 1 and -1.\n;\n;   We follow the capability ordering, so the loops take the form:\n;   set ICAP_XFERMECH TWSX_MEMFILE\n;   foreach CAP_FEEDERENABLED\n;     foreach ICAP_PIXELTYPE\n;       scan\n;     end\n;   end\n;\n; Arguments\n;   arg:1 - TW_IDENTITY.ProductName of scanner to test\n;   arg:2 - global for us to update on failure\n;   arg:3 - value of ShowUI (TRUE or FALSE)\n;   arg:4 - test name for the image folder\n;   arg:5 - result of a MSG_GET on ICAP_XFERMECH\n;\n; Globals\n;   (none)\n;\n; Locals\n;   name - current test being done\n;   indent - indent the passfail text\n;   imagememxfer - result of DAT_IMAGEMEMXFER call\n;   setupmemxfer.preferred - preferred field from DAT_SETUPMEMXFER call\n;\n;   image.count - count of images from 1\n;   image.folder - folder to put the images in\n;   image.folderone - path for CAP_XFERCOUNT=1 test\n;   image.folderall - path for CAP_XFERCOUNT=-1 test\n;   image.prefix - adf or fb\n;   image.testcount - count of images from 0 for a specific test\n;\n;   feederenabled.list - scanner's feederenabled values\n;   feederenabled.index - index of feederenabled values\n;   feederenabled.value - current feederenabled value\n;\n; Returns\n;   pass or fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; If not supported, quietly leave...\n;\nif '${arg:5}' ~contains 'TWSX_MEMFILE' goto MAIN.CONTINUE\nreturn 'pass'\n:MAIN.CONTINUE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize...\n;\necho.titletest 'DAT_IMAGEMEMFILEXFER'\nsetlocal indent ''\nsetlocal image.pointer '0'\nsetlocal image.count '0'\nsetlocal image.folder ''\nsetlocal image.folderone '${folder:certimages}/${arg:4}/DAT_IMAGEMEMFILEXFER/one'\nsetlocal image.folderall '${folder:certimages}/${arg:4}/DAT_IMAGEMEMFILEXFER/all'\nsetlocal image.prefix 'fb'\nsetlocal image.testcount '1'\nsetlocal showui '${arg:3}'\nsetlocal xfercount.test '0'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Prompt the user, if they have an ADF...\n;\nif '${get:g_skipprompts}' != '' goto MAIN.SKIP.PROMPTS\ndsmentry src ds dg_control dat_capability msg_get 'CAP_FEEDERENABLED,0,0,0'\nif '${ret:}' !~contains 'TRUE' goto MAIN.SKIP.PROMPTS\necho.prompt\necho.prompt \"Scanning will take place during this test.  There will be no\"\necho.prompt \"need to press any button on the TWAIN user interface to start\"\necho.prompt \"the scanner.  A progress indicator may appear during scanning.\"\necho.prompt\necho.prompt \"Place at least 3 sheets of paper in the scanner's feeder.\"\npause '(press the ENTER key when ready to continue)'\necho.prompt\n:MAIN.SKIP.PROMPTS\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Clean the image folder for this test...\n;\nimage cleanfolder '${get:image.folderone}'\nimage cleanfolder '${get:image.folderall}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; MSG_RESETALL\n; If return code is not TWRC_SUCCESS, end with an error\n;\nsetlocal name 'MSG_RESETALL'\ndsmentry src ds dg_control dat_capability msg_resetall '0,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get and set ICAP_XFERMECH...\n;\nsetlocal name 'ICAP_XFERMECH MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'ICAP_XFERMECH,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\nif '${ret:}' !~contains 'TWSX_MEMFILE' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'ICAP_XFERMECH MSG_SET TWSX_MEMFILE'\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_XFERMECH,TWON_ONEVALUE,TWTY_UINT16,TWSX_MEMFILE'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get CAP_FEEDERENABLED, and loop so we test all values\n; for the current ICAP_XFERMECH setting.\n;\nsetlocal name 'CAP_FEEDERENABLED MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'CAP_FEEDERENABLED,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal feederenabled.list '${ret:}' ; what the scanner told us\nsetlocal feederenabled.index '${get:TW_ENUMERATION.ItemList}' ; point to itemlist\nincrement feederenabled.index '${get:feederenabled.index}' -1 ; less 1\n;\n:MAIN.FEEDERENABLED.NEXT\nsetlocal indent ''\nsetlocal xfercount.test '0' ; reset the tests\nincrement feederenabled.index '${get:feederenabled.index}' 1 ; next itemlist\nsetlocal feederenabled.value '${getindex:feederenabled.list:${get:feederenabled.index}}' ; get the value\nif '${get:feederenabled.value}' == '' goto MAIN.PASS ; we've passed all tests!!!\n;\nsetlocal name 'CAP_FEEDERENABLED MSG_SET ${get:feederenabled.value}'\ndsmentry src ds dg_control dat_capability msg_set 'CAP_FEEDERENABLED,TWON_ONEVALUE,TWTY_BOOL,${get:feederenabled.value}'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nif '${get:feederenabled.value}' ~~ 'FALSE' goto MAIN.FEEDERENABLED.SETFB\nsetlocal image.prefix 'adf'\ngoto MAIN.FEEDERENABLED.SETDONE\n:MAIN.FEEDERENABLED.SETFB\nsetlocal image.prefix 'fb'\n:MAIN.FEEDERENABLED.SETDONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Dispatch to the CAP_XFERCOUNT test we want to run...\n;\n:MAIN.XFERCOUNT.NEXT\nsetlocal indent '  '\nincrement xfercount.test '${get:xfercount.test}' 1\nif '${get:xfercount.test}' == '1' goto MAIN.XFERCOUNT.TEST1\nif '${get:xfercount.test}' == '2' goto MAIN.XFERCOUNT.TEST2\nif '${get:xfercount.test}' == '3' goto MAIN.XFERCOUNT.TEST3\ngoto MAIN.FEEDERENABLED.NEXT ; we're done test with this paper source, go to the next one\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set CAP_XFERCOUNT to 0...\n;\n:MAIN.XFERCOUNT.TEST1\nsetlocal name 'CAP_XFERCOUNT == 0'\ndsmentry src ds dg_control dat_capability msg_set 'CAP_XFERCOUNT,TWON_ONEVALUE,TWTY_INT16,0'\nif '${sts:}' == 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\ngoto MAIN.XFERCOUNT.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set CAP_XFERCOUNT to 1...\n;\n:MAIN.XFERCOUNT.TEST2\nsetlocal name 'CAP_XFERCOUNT == 1'\ndsmentry src ds dg_control dat_capability msg_set 'CAP_XFERCOUNT,TWON_ONEVALUE,TWTY_INT16,1'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal image.folder '${get:image.folderone}'\ngoto MAIN.FEEDERLOADED\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set CAP_XFERCOUNT to -1...\n;\n:MAIN.XFERCOUNT.TEST3\nsetlocal name 'CAP_XFERCOUNT == -1'\ndsmentry src ds dg_control dat_capability msg_set 'CAP_XFERCOUNT,TWON_ONEVALUE,TWTY_INT16,-1'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal image.folder '${get:image.folderall}'\ngoto MAIN.FEEDERLOADED\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Check for paper in the feeder, skip for a flatbed...\n;\n:MAIN.FEEDERLOADED\nif '${get:feederenabled.value}' ~~ 'FALSE' goto MAIN.FEEDERLOADED.DONE\ndsmentry src ds dg_control dat_capability msg_getcurrent 'CAP_FEEDERLOADED,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.FEEDERLOADED.DONE\nif '${ret:${get:TW_ONEVALUE.Item}}' ~~ 'TRUE' goto MAIN.FEEDERLOADED.DONE\necho.prompt\necho.prompt \"Place paper in the scanner's feeder.\"\npause '(press the ENTER key when ready to continue)'\n:MAIN.FEEDERLOADED.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get the preferred size for memory transfers, and allocate\n; a pointer for the memory transfers...\n;\nsetlocal indent '    '\nsetlocal name 'dg_control/dat_setupmemxfer/msg_get'\ndsmentry src ds dg_control dat_setupmemxfer msg_get '0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'TW_SETUPMEMXFER.Preferred > 0'\nsetlocal setupmemxfer.preferred '${ret:${get:TW_SETUPMEMXFER.Preferred}}'\nif '${get:setupmemxfer.preferred}' <= '0' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'allocate pointer for ${get:setupmemxfer.preferred} bytes'\nfree pointer image.pointer ; for the last loop\nallocate pointer image.pointer '${get:setupmemxfer.preferred}'\nif '${get:image.pointer}' == '0' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set DAT_SETUPFILEXFER to TWFF_TIFF\n;\nsetlocal name 'dg_control/dat_setupfilexfer/msg_set TWFF_TIFF'\ndsmentry src null dg_control dat_setupfilexfer msg_set 'file,TWFF_TIFF,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Start scanning...\n;\n:MAIN.USERINTERFACE\nsetlocal indent '    '\nsetlocal name 'dg_control/dat_userinterface/msg_enableds'\nsetlocal image.testcount '1' ; reset to 1\nsetlocal name 'dg_control/dat_userinterface/msg_enableds'\nwait reset\ndsmentry src null dg_control dat_userinterface msg_enableds '${get:showui},0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Wait for MSG_XFERREADY, if we don't see it then scoot...\n;\nsetlocal name 'wait ${get:sys_waittimeout} seconds for MSG_XFERREADY'\nwait '${get:sys_waittimeout}000'\nif '${ret:}' !~contains 'msg_xferready' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Do a memory file transfer...\n; This little song and dance with the states is so that we can\n; start the transfer in state 6 with each new image, but switch\n; to state 7 if we need multiple calls to capture the current\n; image...\n;\n; The saved images will be in TIFF format, which includes TIFF\n; JPEG (the better form, where a simple TIFF header is added).\n;\nincrement image.count '${get:image.count}' 1\nimage free memfileimage\n;\n:MAIN.IMAGEMEMFILEXFER.NEXT\nsetlocal name 'dg_image/dat_imagememxfer/msg_get'\ndsmentry src ds dg_image dat_imagememfilexfer msg_get '0,0,0,0,0,0,0,9,${get:setupmemxfer.preferred},${get:image.pointer}'\nsetlocal imagememxfer '${ret:}'\nif '${sts:}' == 'XFERDONE' goto MAIN.IMAGEMEMFILEXFER.XFERDONE\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\n;\necho.passfail '${get:indent}${get:name} SUCCESS' 'pass'\nimage append memfileimage '${get:imagememxfer}'\ngoto MAIN.IMAGEMEMFILEXFER.NEXT\n;\n:MAIN.IMAGEMEMFILEXFER.XFERDONE\necho.passfail '${get:indent}${get:name} XFERDONE' 'pass'\nimage append memfileimage '${get:imagememxfer}'\nimage save memfileimage memfile '${get:image.folder}/${get:image.prefix}${format:D6|${get:image.testcount}}'\necho.passfail '${get:indent}image <${ret:}>' 'pass'\nimage free memfileimage\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; End the transfer, see if we're done...\n;\nsetlocal name 'dg_control/dat_pendingxfers/msg_endxfer'\ndsmentry src ds dg_control dat_pendingxfers msg_endxfer '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nincrement image.testcount '${get:image.testcount}' 1 ; count the image\nif '${ret:${get:TW_PENDINGXFERS.Count}}' != '0' goto MAIN.IMAGEMEMFILEXFER.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We're out of images, so disable...\n;\nsetlocal name 'dg_control/dat_userinterface/msg_disableds'\ndsmentry src ds dg_control dat_userinterface msg_disableds '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Check the results before going up to the next CAP_XFERCOUNT test.\n; Note that flatbeds should always return one image.\n;\nif '${get:feederenabled.value}' ~~ 'FALSE' goto MAIN.XFERCOUNT.CHECKTEST2\nif '${get:xfercount.test}' == '2' goto MAIN.XFERCOUNT.CHECKTEST2\nif '${get:xfercount.test}' == '3' goto MAIN.XFERCOUNT.CHECKTEST3\necho.passfail '${get:indent}WE SHOULD NOT BE HERE' 'fail - test=${get:xfercount.test}'\ngoto MAIN.ERROR.ECHOPASSFAIL\n;\n:MAIN.XFERCOUNT.CHECKTEST2\nsetlocal name 'one image transferred'\nif '${get:image.testcount}' != '2' goto MAIN.ERROR.ECHOPASSFAIL ; image.testcount started at 1\necho.passfail '${get:indent}${get:name}' 'pass'\ngoto MAIN.XFERCOUNT.NEXT\n;\n:MAIN.XFERCOUNT.CHECKTEST3\nsetlocal name 'multiple images transferred (${get:image.testcount})'\nif '${get:image.testcount}' < '3' goto MAIN.ERROR.ECHOPASSFAIL ; image.testcount started at 1\necho.passfail '${get:indent}${get:name}' 'pass'\ngoto MAIN.XFERCOUNT.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Summary and cleanup...\n;\n; We passed...\n:MAIN.PASS\nimage free memfileimage\nfree pointer image.pointer\necho.passfail 'SUMMARY' 'pass'\nreturn 'pass'\n;\n; Ruh-roh...\n:MAIN.ERROR.ECHOPASSFAIL\nimage free memfileimage\nfree pointer image.pointer\necho.passfail '${get:indent}${get:name}' 'fail - ${sts:} ${ret:}'\necho.passfail 'SUMMARY' 'fail'\nsetglobal '${arg:2}' 'fail'\nreturn 'fail'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/070 - CAP_XFERCOUNT Tests/DAT_IMAGEMEMXFER.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DAT_IMAGEMEMXFER\n;   This test sets CAP_XFERCOUNT to 0, 1 and -1 for a flatbed scanner. It expects an error for the\n;   value 0, and only one image to be transferred per scanning session for the values 1 and -1.\n;\n;   We follow the capability ordering, so the loops take the form:\n;   set ICAP_XFERMECH TWSX_MEMORY\n;   foreach CAP_FEEDERENABLED\n;     foreach ICAP_PIXELTYPE\n;       scan\n;     end\n;   end\n;\n; Arguments\n;   arg:1 - TW_IDENTITY.ProductName of scanner to test\n;   arg:2 - global for us to update on failure\n;   arg:3 - value of ShowUI (TRUE or FALSE)\n;   arg:4 - test name for the image folder\n;\n; Globals\n;   (none)\n;\n; Locals\n;   name - current test being done\n;   indent - indent the passfail text\n;   imageinfo - metadata for the current image\n;   imagememxfer - result of DAT_IMAGEMEMXFER call\n;   setupmemxfer.preferred - preferred field from DAT_SETUPMEMXFER call\n;\n;   image.count - count of images from 1\n;   image.folder - folder to put the images in\n;   image.folderone - path for CAP_XFERCOUNT=1 test\n;   image.folderall - path for CAP_XFERCOUNT=-1 test\n;   image.prefix - adf or fb\n;   image.testcount - count of images from 0 for a specific test\n;\n;   feederenabled.list - scanner's feederenabled values\n;   feederenabled.index - index of feederenabled values\n;   feederenabled.value - current feederenabled value\n;\n;   pixeltype.list - scanner's pixeltype values for this feederenabled\n;   pixeltype.index - index of pixeltype values\n;   pixeltype.value - current pixeltype value\n;\n; Returns\n;   pass or fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize...\n;\necho.titletest 'DAT_IMAGEMEMXFER'\nsetlocal indent ''\nsetlocal image.pointer '0'\nsetlocal image.count '0'\nsetlocal image.folder ''\nsetlocal image.folderone '${folder:certimages}/${arg:4}/DAT_IMAGEMEMXFER/one'\nsetlocal image.folderall '${folder:certimages}/${arg:4}/DAT_IMAGEMEMXFER/all'\nsetlocal image.prefix 'fb'\nsetlocal image.testcount '1'\nsetlocal showui '${arg:3}'\nsetlocal xfercount.test '0'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Prompt the user, if they have an ADF...\n;\nif '${get:g_skipprompts}' != '' goto MAIN.SKIP.PROMPTS\ndsmentry src ds dg_control dat_capability msg_get 'CAP_FEEDERENABLED,0,0,0'\nif '${ret:}' !~contains 'TRUE' goto MAIN.SKIP.PROMPTS\necho.prompt\necho.prompt \"Scanning will take place during this test.  There will be no\"\necho.prompt \"need to press any button on the TWAIN user interface to start\"\necho.prompt \"the scanner.  A progress indicator may appear during scanning.\"\necho.prompt\necho.prompt \"Place at least 3 sheets of paper in the scanner's feeder.\"\npause '(press the ENTER key when ready to continue)'\necho.prompt\n:MAIN.SKIP.PROMPTS\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Clean the image folder for this test...\n;\nimage cleanfolder '${get:image.folderone}'\nimage cleanfolder '${get:image.folderall}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; MSG_RESETALL\n; If return code is not TWRC_SUCCESS, end with an error\n;\nsetlocal name 'MSG_RESETALL'\ndsmentry src ds dg_control dat_capability msg_resetall '0,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get and set ICAP_XFERMECH...\n;\nsetlocal name 'ICAP_XFERMECH MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'ICAP_XFERMECH,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\nif '${ret:}' !~contains 'TWSX_MEMORY' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'ICAP_XFERMECH MSG_SET TWSX_MEMORY'\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_XFERMECH,TWON_ONEVALUE,TWTY_UINT16,TWSX_MEMORY'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get CAP_FEEDERENABLED, and loop so we test all values\n; for the current ICAP_XFERMECH setting.\n;\nsetlocal name 'CAP_FEEDERENABLED MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'CAP_FEEDERENABLED,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal feederenabled.list '${ret:}' ; what the scanner told us\nsetlocal feederenabled.index '${get:TW_ENUMERATION.ItemList}' ; point to itemlist\nincrement feederenabled.index '${get:feederenabled.index}' -1 ; less 1\n;\n:MAIN.FEEDERENABLED.NEXT\nsetlocal indent ''\nsetlocal xfercount.test '0' ; reset the tests\nincrement feederenabled.index '${get:feederenabled.index}' 1 ; next itemlist\nsetlocal feederenabled.value '${getindex:feederenabled.list:${get:feederenabled.index}}' ; get the value\nif '${get:feederenabled.value}' == '' goto MAIN.PASS ; we've passed all tests!!!\n;\nsetlocal name 'CAP_FEEDERENABLED MSG_SET ${get:feederenabled.value}'\ndsmentry src ds dg_control dat_capability msg_set 'CAP_FEEDERENABLED,TWON_ONEVALUE,TWTY_BOOL,${get:feederenabled.value}'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nif '${get:feederenabled.value}' ~~ 'FALSE' goto MAIN.FEEDERENABLED.SETFB\nsetlocal image.prefix 'adf'\ngoto MAIN.FEEDERENABLED.SETDONE\n:MAIN.FEEDERENABLED.SETFB\nsetlocal image.prefix 'fb'\n:MAIN.FEEDERENABLED.SETDONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Dispatch to the CAP_XFERCOUNT test we want to run...\n;\n:MAIN.XFERCOUNT.NEXT\nsetlocal indent '  '\nincrement xfercount.test '${get:xfercount.test}' 1\nif '${get:xfercount.test}' == '1' goto MAIN.XFERCOUNT.TEST1\nif '${get:xfercount.test}' == '2' goto MAIN.XFERCOUNT.TEST2\nif '${get:xfercount.test}' == '3' goto MAIN.XFERCOUNT.TEST3\ngoto MAIN.FEEDERENABLED.NEXT ; we're done test with this paper source, go to the next one\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set CAP_XFERCOUNT to 0...\n;\n:MAIN.XFERCOUNT.TEST1\nsetlocal name 'CAP_XFERCOUNT == 0'\ndsmentry src ds dg_control dat_capability msg_set 'CAP_XFERCOUNT,TWON_ONEVALUE,TWTY_INT16,0'\nif '${sts:}' == 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\ngoto MAIN.XFERCOUNT.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set CAP_XFERCOUNT to 1...\n;\n:MAIN.XFERCOUNT.TEST2\nsetlocal name 'CAP_XFERCOUNT == 1'\ndsmentry src ds dg_control dat_capability msg_set 'CAP_XFERCOUNT,TWON_ONEVALUE,TWTY_INT16,1'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal image.folder '${get:image.folderone}'\ngoto MAIN.FEEDERLOADED\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set CAP_XFERCOUNT to -1...\n;\n:MAIN.XFERCOUNT.TEST3\nsetlocal name 'CAP_XFERCOUNT == -1'\ndsmentry src ds dg_control dat_capability msg_set 'CAP_XFERCOUNT,TWON_ONEVALUE,TWTY_INT16,-1'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal image.folder '${get:image.folderall}'\ngoto MAIN.FEEDERLOADED\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Check for paper in the feeder, skip for a flatbed...\n;\n:MAIN.FEEDERLOADED\nif '${get:feederenabled.value}' ~~ 'FALSE' goto MAIN.FEEDERLOADED.DONE\ndsmentry src ds dg_control dat_capability msg_getcurrent 'CAP_FEEDERLOADED,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.FEEDERLOADED.DONE\nif '${ret:${get:TW_ONEVALUE.Item}}' ~~ 'TRUE' goto MAIN.FEEDERLOADED.DONE\necho.prompt\necho.prompt \"Place paper in the scanner's feeder.\"\npause '(press the ENTER key when ready to continue)'\n:MAIN.FEEDERLOADED.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get the preferred size for memory transfers, and allocate\n; a pointer for the memory transfers...\n;\nsetlocal indent '    '\nsetlocal name 'dg_control/dat_setupmemxfer/msg_get'\ndsmentry src ds dg_control dat_setupmemxfer msg_get '0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'TW_SETUPMEMXFER.Preferred > 0'\nsetlocal setupmemxfer.preferred '${ret:${get:TW_SETUPMEMXFER.Preferred}}'\nif '${get:setupmemxfer.preferred}' <= '0' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'allocate pointer for ${get:setupmemxfer.preferred} bytes'\nfree pointer image.pointer ; for the last loop\nallocate pointer image.pointer '${get:setupmemxfer.preferred}'\nif '${get:image.pointer}' == '0' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Start scanning...\n;\n:MAIN.USERINTERFACE\nsetlocal indent '    '\nsetlocal name 'dg_control/dat_userinterface/msg_enableds'\nsetlocal image.testcount '1' ; reset to 1\nwait reset\ndsmentry src null dg_control dat_userinterface msg_enableds '${get:showui},0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Wait for MSG_XFERREADY, if we don't see it then scoot...\n;\nsetlocal name 'wait ${get:sys_waittimeout} seconds for MSG_XFERREADY'\nwait '${get:sys_waittimeout}000'\nif '${ret:}' !~contains 'msg_xferready' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Do a memory transfer...\n; This little song and dance with the states is so that we can\n; start the transfer in state 6 with each new image, but switch\n; to state 7 if we need multiple calls to capture the current\n; image...\n;\n; The saved images will be in TIFF format, which includes TIFF\n; JPEG (the better form, where a simple TIFF header is added).\n;\nincrement image.count '${get:image.count}' 1\nimage free memimage\n;\n:MAIN.IMAGEMEMXFER.NEXT\nsetlocal name 'dg_image/dat_imagememxfer/msg_get'\ndsmentry src ds dg_image dat_imagememxfer msg_get '0,0,0,0,0,0,0,9,${get:setupmemxfer.preferred},${get:image.pointer}'\nsetlocal imagememxfer '${ret:}'\nif '${sts:}' == 'XFERDONE' goto MAIN.IMAGEMEMXFER.XFERDONE\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\n;\necho.passfail '${get:indent}${get:name} SUCCESS' 'pass'\nimage append memimage '${get:imagememxfer}'\ngoto MAIN.IMAGEMEMXFER.NEXT\n;\n:MAIN.IMAGEMEMXFER.XFERDONE\necho.passfail '${get:indent}${get:name} XFERDONE' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We need image info to make sense of this data...\n;\nsetlocal name 'dg_image/dat_imageinfo/msg_get'\ndsmentry src ds dg_image dat_imageinfo msg_get '0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0'\nsetlocal imageinfo '${ret:}'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Save the image...\n;\nimage append memimage '${get:imagememxfer}'\nimage addheader memimage '${get:imageinfo}'\nimage save memimage memory '${get:image.folder}/${get:image.prefix}${format:D6|${get:image.testcount}}'\necho.passfail '${get:indent}image <${ret:}>' 'pass'\nimage free memimage\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; End the transfer, see if we're done...\n;\nsetlocal name 'dg_control/dat_pendingxfers/msg_endxfer'\ndsmentry src ds dg_control dat_pendingxfers msg_endxfer '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nincrement image.testcount '${get:image.testcount}' 1 ; count the image\nif '${ret:${get:TW_PENDINGXFERS.Count}}' != '0' goto MAIN.IMAGEMEMXFER.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We're out of images, so disable...\n;\nsetlocal name 'dg_control/dat_userinterface/msg_disableds'\ndsmentry src ds dg_control dat_userinterface msg_disableds '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Check the results before going up to the next CAP_XFERCOUNT test.\n; Note that flatbeds should always return one image.\n;\nif '${get:feederenabled.value}' ~~ 'FALSE' goto MAIN.XFERCOUNT.CHECKTEST2\nif '${get:xfercount.test}' == '2' goto MAIN.XFERCOUNT.CHECKTEST2\nif '${get:xfercount.test}' == '3' goto MAIN.XFERCOUNT.CHECKTEST3\necho.passfail '${get:indent}WE SHOULD NOT BE HERE' 'fail - test=${get:xfercount.test}'\ngoto MAIN.ERROR.ECHOPASSFAIL\n;\n:MAIN.XFERCOUNT.CHECKTEST2\nsetlocal name 'one image transferred'\nif '${get:image.testcount}' != '2' goto MAIN.ERROR.ECHOPASSFAIL ; image.testcount started at 1\necho.passfail '${get:indent}${get:name}' 'pass'\ngoto MAIN.XFERCOUNT.NEXT\n;\n:MAIN.XFERCOUNT.CHECKTEST3\nsetlocal name 'multiple images transferred (${get:image.testcount})' ; image.testcount started at 1\nif '${get:image.testcount}' < '3' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\ngoto MAIN.XFERCOUNT.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Summary and cleanup...\n;\n; We passed...\n:MAIN.PASS\nimage free memimage\nfree pointer image.pointer\necho.passfail 'SUMMARY' 'pass'\nreturn 'pass'\n;\n; Ruh-roh...\n:MAIN.ERROR.ECHOPASSFAIL\nimage free memimage\nfree pointer image.pointer\necho.passfail '${get:indent}${get:name}' 'fail - ${sts:} ${ret:}'\necho.passfail 'SUMMARY' 'fail'\nsetglobal '${arg:2}' 'fail'\nreturn 'fail'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/070 - CAP_XFERCOUNT Tests/DAT_IMAGENATIVEXFER.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DAT_IMAGENATIVEXFER\n;   This test sets CAP_XFERCOUNT to 0, 1 and -1 for a flatbed scanner. It expects an error for the\n;   value 0, and only one image to be transferred per scanning session for the values 1 and -1.\n;\n;   We follow the capability ordering, so the loops take the form:\n;   set ICAP_XFERMECH TWSX_NATIVE\n;   foreach CAP_FEEDERENABLED\n;     foreach ICAP_PIXELTYPE\n;       scan\n;     end\n;   end\n;\n; Arguments\n;   arg:1 - TW_IDENTITY.ProductName of scanner to test\n;   arg:2 - global for us to update on failure\n;   arg:3 - value of ShowUI (TRUE or FALSE)\n;   arg:4 - test name for the image folder\n;\n; Globals\n;   (none)\n;\n; Locals\n;   name - current test being done\n;   indent - indent the passfail text\n;\n;   image.handle - native handle\n;   image.count - count of images from 1\n;   image.folder - folder to put the images in\n;   image.folderone - path for CAP_XFERCOUNT=1 test\n;   image.folderall - path for CAP_XFERCOUNT=-1 test\n;   image.prefix - adf or fb\n;   image.testcount - count of images from 0 for a specific test\n;\n;   feederenabled.list - scanner's feederenabled values\n;   feederenabled.index - index of feederenabled values\n;   feederenabled.value - current feederenabled value\n;\n; Returns\n;   pass or fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize...\n;\necho.titletest 'DAT_IMAGENATIVEXFER'\nsetlocal indent ''\nsetlocal image.handle '0'\nsetlocal image.count '0'\nsetlocal image.folder ''\nsetlocal image.folderone '${folder:certimages}/${arg:4}/DAT_IMAGENATIVEXFER/one'\nsetlocal image.folderall '${folder:certimages}/${arg:4}/DAT_IMAGENATIVEXFER/all'\nsetlocal image.prefix 'fb'\nsetlocal image.testcount '1'\nsetlocal showui '${arg:3}'\nsetlocal xfercount.test '0'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Prompt the user, if they have an ADF...\n;\nif '${get:g_skipprompts}' != '' goto MAIN.SKIP.PROMPTS\ndsmentry src ds dg_control dat_capability msg_get 'CAP_FEEDERENABLED,0,0,0'\nif '${ret:}' !~contains 'TRUE' goto MAIN.SKIP.PROMPTS\necho.prompt\necho.prompt \"Scanning will take place during this test.  There will be no\"\necho.prompt \"need to press any button on the TWAIN user interface to start\"\necho.prompt \"the scanner.  A progress indicator may appear during scanning.\"\necho.prompt\necho.prompt \"Place at least 3 sheets of paper in the scanner's feeder.\"\npause '(press the ENTER key when ready to continue)'\necho.prompt\n:MAIN.SKIP.PROMPTS\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Clean the image folder for this test...\n;\nimage cleanfolder '${get:image.folderone}'\nimage cleanfolder '${get:image.folderall}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; MSG_RESETALL\n; If return code is not TWRC_SUCCESS, end with an error\n;\nsetlocal name 'MSG_RESETALL'\ndsmentry src ds dg_control dat_capability msg_resetall '0,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get and set ICAP_XFERMECH...\n;\nsetlocal name 'ICAP_XFERMECH MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'ICAP_XFERMECH,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\nif '${ret:}' !~contains 'TWSX_NATIVE' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'ICAP_XFERMECH MSG_SET TWSX_NATIVE'\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_XFERMECH,TWON_ONEVALUE,TWTY_UINT16,TWSX_NATIVE'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get CAP_FEEDERENABLED, and loop so we test all values\n; for the current ICAP_XFERMECH setting.\n;\nsetlocal name 'CAP_FEEDERENABLED MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'CAP_FEEDERENABLED,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal feederenabled.list '${ret:}' ; what the scanner told us\nsetlocal feederenabled.index '${get:TW_ENUMERATION.ItemList}' ; point to itemlist\nincrement feederenabled.index '${get:feederenabled.index}' -1 ; less 1\n;\n:MAIN.FEEDERENABLED.NEXT\nsetlocal indent ''\nsetlocal xfercount.test '0' ; reset the tests\nincrement feederenabled.index '${get:feederenabled.index}' 1 ; next itemlist\nsetlocal feederenabled.value '${getindex:feederenabled.list:${get:feederenabled.index}}' ; get the value\nif '${get:feederenabled.value}' == '' goto MAIN.PASS ; we've passed all tests!!!\n;\nsetlocal name 'CAP_FEEDERENABLED MSG_SET ${get:feederenabled.value}'\ndsmentry src ds dg_control dat_capability msg_set 'CAP_FEEDERENABLED,TWON_ONEVALUE,TWTY_BOOL,${get:feederenabled.value}'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nif '${get:feederenabled.value}' ~~ 'FALSE' goto MAIN.FEEDERENABLED.SETFB\nsetlocal image.prefix 'adf'\ngoto MAIN.FEEDERENABLED.SETDONE\n:MAIN.FEEDERENABLED.SETFB\nsetlocal image.prefix 'fb'\n:MAIN.FEEDERENABLED.SETDONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Dispatch to the CAP_XFERCOUNT test we want to run...\n;\n:MAIN.XFERCOUNT.NEXT\nsetlocal indent '  '\nincrement xfercount.test '${get:xfercount.test}' 1\nif '${get:xfercount.test}' == '1' goto MAIN.XFERCOUNT.TEST1\nif '${get:xfercount.test}' == '2' goto MAIN.XFERCOUNT.TEST2\nif '${get:xfercount.test}' == '3' goto MAIN.XFERCOUNT.TEST3\ngoto MAIN.FEEDERENABLED.NEXT ; we're done test with this paper source, go to the next one\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set CAP_XFERCOUNT to 0...\n;\n:MAIN.XFERCOUNT.TEST1\nsetlocal name 'CAP_XFERCOUNT == 0'\ndsmentry src ds dg_control dat_capability msg_set 'CAP_XFERCOUNT,TWON_ONEVALUE,TWTY_INT16,0'\nif '${sts:}' == 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\ngoto MAIN.XFERCOUNT.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set CAP_XFERCOUNT to 1...\n;\n:MAIN.XFERCOUNT.TEST2\nsetlocal name 'CAP_XFERCOUNT == 1'\ndsmentry src ds dg_control dat_capability msg_set 'CAP_XFERCOUNT,TWON_ONEVALUE,TWTY_INT16,1'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal image.folder '${get:image.folderone}'\ngoto MAIN.FEEDERLOADED\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set CAP_XFERCOUNT to -1...\n;\n:MAIN.XFERCOUNT.TEST3\nsetlocal name 'CAP_XFERCOUNT == -1'\ndsmentry src ds dg_control dat_capability msg_set 'CAP_XFERCOUNT,TWON_ONEVALUE,TWTY_INT16,-1'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal image.folder '${get:image.folderall}'\ngoto MAIN.FEEDERLOADED\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Check for paper in the feeder, skip for a flatbed...\n;\n:MAIN.FEEDERLOADED\nif '${get:feederenabled.value}' ~~ 'FALSE' goto MAIN.FEEDERLOADED.DONE\ndsmentry src ds dg_control dat_capability msg_getcurrent 'CAP_FEEDERLOADED,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.FEEDERLOADED.DONE\nif '${ret:${get:TW_ONEVALUE.Item}}' ~~ 'TRUE' goto MAIN.FEEDERLOADED.DONE\necho.prompt\necho.prompt \"Place paper in the scanner's feeder.\"\npause '(press the ENTER key when ready to continue)'\n:MAIN.FEEDERLOADED.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Start scanning...\n;\nsetlocal indent '    '\nsetlocal name 'dg_control/dat_userinterface/msg_enableds'\nsetlocal image.testcount '1' ; reset to 1\nwait reset\ndsmentry src null dg_control dat_userinterface msg_enableds '${get:showui},0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Wait for MSG_XFERREADY, if we don't see it then scoot...\n;\nsetlocal name 'wait ${get:sys_waittimeout} seconds for MSG_XFERREADY'\nwait '${get:sys_waittimeout}000'\nif '${ret:}' !~contains 'msg_xferready' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Do a native transfer...\n;\n:MAIN.IMAGENATIVEXFER.NEXT\nsetlocal name 'dg_control/dat_imagenativexfer/msg_get'\nincrement image.count '${get:image.count}' 1\ndsmentry src ds dg_image dat_imagenativexfer msg_get '0'\nsetlocal image.handle '${ret:}'\nif '${sts:}' != 'XFERDONE' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nimage save image.handle native '${get:image.folder}/${get:image.prefix}${format:D6|${get:image.testcount}}'\necho.passfail '${get:indent}image <${ret:}>' 'pass'\nfree handle image.handle\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; End the transfer, see if we're done...\n;\nsetlocal name 'dg_control/dat_pendingxfers/msg_endxfer'\ndsmentry src ds dg_control dat_pendingxfers msg_endxfer '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nincrement image.testcount '${get:image.testcount}' 1 ; count the image\nif '${ret:${get:TW_PENDINGXFERS.Count}}' != '0' goto MAIN.IMAGENATIVEXFER.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We're out of images, so disable...\n;\nsetlocal name 'dg_control/dat_userinterface/msg_disableds'\ndsmentry src ds dg_control dat_userinterface msg_disableds '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Check the results before going up to the next CAP_XFERCOUNT test.\n; Note that flatbeds should always return one image.\n;\nif '${get:feederenabled.value}' ~~ 'FALSE' goto MAIN.XFERCOUNT.CHECKTEST2\nif '${get:xfercount.test}' == '2' goto MAIN.XFERCOUNT.CHECKTEST2\nif '${get:xfercount.test}' == '3' goto MAIN.XFERCOUNT.CHECKTEST3\necho.passfail '${get:indent}WE SHOULD NOT BE HERE' 'fail - test=${get:xfercount.test}'\ngoto MAIN.ERROR.ECHOPASSFAIL\n;\n:MAIN.XFERCOUNT.CHECKTEST2\nsetlocal name 'one image transferred'\nif '${get:image.testcount}' != '2' goto MAIN.ERROR.ECHOPASSFAIL ; image.testcount started at 1\necho.passfail '${get:indent}${get:name}' 'pass'\ngoto MAIN.XFERCOUNT.NEXT\n;\n:MAIN.XFERCOUNT.CHECKTEST3\nsetlocal name 'multiple images transferred (${get:image.testcount})'\nif '${get:image.testcount}' < '3' goto MAIN.ERROR.ECHOPASSFAIL ; image.testcount started at 1\necho.passfail '${get:indent}${get:name}' 'pass'\ngoto MAIN.XFERCOUNT.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Summary and cleanup...\n;\n; We passed...\n:MAIN.PASS\nfree handle image.handle\necho.passfail 'SUMMARY' 'pass'\nreturn 'pass'\n;\n; Ruh-roh...\n:MAIN.ERROR.ECHOPASSFAIL\nfree handle image.handle\necho.passfail '${get:indent}${get:name}' 'fail - ${sts:} ${ret:}'\necho.passfail 'SUMMARY' 'fail'\nsetglobal '${arg:2}' 'fail'\nreturn 'fail'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/080 - Version Tests/Certification.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Version Tests\n;   Confirm that the data sources responds correctly to different TWAIN versions of\n;   data source manager and application.\n;\n; Arguments\n;   arg:1 - TW_IDENTITY.ProductName of scanner to test\n;   arg:2 - global to set on fail\n;\n; Globals\n;   g_localcertifyresult - used locally to report to caller on fail\n;\n; Locals\n;   identity.productname - product name of scanner to test\n;   feederenabled - MSG_GET of CAP_FEEDERENABLED\n;   xfermech - MSG_GET of ICAP_XFERMECH\n;\n; Returns\n;   (none)\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize stuff, load tables if not already done for us...\n;\necho.titlesuite 'Version Tests v1.0 09-Mar-2020'\nsetlocal identity.productname '${arg:1}'\nsetglobal g_localcertifyresult 'pass' ; assume the best\nif '${get:TW_ARRAY.ItemType}' != '' goto MAIN.LOADTABLES.SKIP\nrun '${folder:certification}/LoadTables'\n:MAIN.LOADTABLES.SKIP\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Only do this on 32-bit Windows...\n;\nif '${platform:}' !~ 'WINDOWS' goto MAIN.PASS ; if not windows, we're done\nif '${bits:}' !~ '32' goto MAIN.PASS ; if not 32-bit, we're done\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Prompt the user, if they have an ADF...\n; (if more tests are added, be sure to bump up the number of sheets needed)\n;\nif '${get:g_skipprompts}' != '' goto MAIN.SKIP.PROMPTS\ncall CERTIFY '${folder:certification}/Opends'  '${get:identity.productname}' embedded\nif '${ret:}' != 'fail' goto MAIN.FEEDERENABLED\ncall CERTIFY '${folder:certification}/Closeds' '${get:identity.productname}' embedded\nreturn\n;\n:MAIN.FEEDERENABLED\ndsmentry src ds dg_control dat_capability msg_get 'CAP_FEEDERENABLED,0,0,0'\nsetlocal feederenabled '${ret:}'\ncall CERTIFY '${folder:certification}/Closeds' '${get:identity.productname}' embedded\nif '${get:feederenabled}' !~contains 'TRUE' goto MAIN.SKIP.PROMPTS\necho.prompt\necho.prompt \"Scanning will take place during this test.  There will be no\"\necho.prompt \"need to press any button on the TWAIN user interface to start\"\necho.prompt \"the scanner.  A progress indicator may appear during scanning.\"\necho.prompt\necho.prompt \"Place 6 sheets of paper in the scanner's feeder.\"\npause '(press the ENTER key when ready to continue)'\necho.prompt\n:MAIN.SKIP.PROMPTS\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Run the tests...\n;\n\n; MSG_OPENDSM using old DSM as TWAIN version 1.9 application, with DF_APP2 set\necho.titletest 'MSG_OPENDSM using old DSM as TWAIN version 1.9 application, with DF_APP2 set'\ncall CERTIFY '${folder:certification}/Opends'  '${get:identity.productname}' embedded '' 'protocolmajor=1' 'protocolminor=9' 'uselegacydsm=true'\ncall CERTIFY 'DAT_IMAGEMEMXFER'                '${get:identity.productname}' g_localcertifyresult 'FALSE' '${folder:parent}/DAT_IMAGEMEMXFER/1'\ncall CERTIFY '${folder:certification}/Closeds' '${get:identity.productname}' embedded\necho.passfail 'SUMMARY' '${get:g_localcertifyresult}'\n\n; MSG_OPENDSM using old DSM as TWAIN version 2.x application, with DF_APP2 not set\necho.titletest 'MSG_OPENDSM using old DSM as TWAIN version 2.x application, with DF_APP2 not set'\ncall CERTIFY '${folder:certification}/Opends'  '${get:identity.productname}' embedded '' 'protocolmajor=2' 'protocolminor=4' 'uselegacydsm=true' 'supportedgroups=0x00000003'\ncall CERTIFY 'DAT_IMAGEMEMXFER'                '${get:identity.productname}' g_localcertifyresult 'FALSE' '${folder:parent}/DAT_IMAGEMEMXFER/2'\ncall CERTIFY '${folder:certification}/Closeds' '${get:identity.productname}' embedded\necho.passfail 'SUMMARY' '${get:g_localcertifyresult}'\n\n; MSG_OPENDSM using old DSM as TWAIN version 2.x application, with DF_APP2 set\necho.titletest 'MSG_OPENDSM using old DSM as TWAIN version 2.x application, with DF_APP2 set'\ncall CERTIFY '${folder:certification}/Opends'  '${get:identity.productname}' embedded '' 'protocolmajor=2' 'protocolminor=4' 'uselegacydsm=true' 'supportedgroups=0x20000003'\ncall CERTIFY 'DAT_IMAGEMEMXFER'                '${get:identity.productname}' g_localcertifyresult 'FALSE' '${folder:parent}/DAT_IMAGEMEMXFER/3'\ncall CERTIFY '${folder:certification}/Closeds' '${get:identity.productname}' embedded\necho.passfail 'SUMMARY' '${get:g_localcertifyresult}'\n\n; MSG_OPENDSM using TWAIN 2 DSM as TWAIN version 1.9 application, with DF_APP2 set\necho.titletest 'MSG_OPENDSM using TWAIN 2 DSM as TWAIN version 1.9 application, with DF_APP2 set'\ncall CERTIFY '${folder:certification}/Opends'  '${get:identity.productname}' embedded '' 'protocolmajor=1' 'protocolminor=9' 'uselegacydsm=false' 'supportedgroups=0x20000003'\ncall CERTIFY 'DAT_IMAGEMEMXFER'                '${get:identity.productname}' g_localcertifyresult 'FALSE' '${folder:parent}/DAT_IMAGEMEMXFER/4'\ncall CERTIFY '${folder:certification}/Closeds' '${get:identity.productname}' embedded\necho.passfail 'SUMMARY' '${get:g_localcertifyresult}'\n\n; MSG_OPENDSM using TWAIN 2 DSM as TWAIN version 2.x application, with DF_APP2 not set\necho.titletest 'MSG_OPENDSM using TWAIN 2 DSM as TWAIN version 2.x application, with DF_APP2 not set'\ncall CERTIFY '${folder:certification}/Opends'  '${get:identity.productname}' embedded '' 'protocolmajor=2' 'protocolminor=4' 'uselegacydsm=false' 'supportedgroups=0x00000003'\ncall CERTIFY 'DAT_IMAGEMEMXFER'                '${get:identity.productname}' g_localcertifyresult 'FALSE' '${folder:parent}/DAT_IMAGEMEMXFER/5'\ncall CERTIFY '${folder:certification}/Closeds' '${get:identity.productname}' embedded\necho.passfail 'SUMMARY' '${get:g_localcertifyresult}'\n\n; MSG_OPENDSM using TWAIN 2 DSM as TWAIN version 1.9 application, with DF_APP2 not set\necho.titletest 'MSG_OPENDSM using TWAIN 2 DSM as TWAIN version 1.9 application, with DF_APP2 not set'\ncall CERTIFY '${folder:certification}/Opends'  '${get:identity.productname}' embedded '' 'protocolmajor=1' 'protocolminor=9' 'uselegacydsm=false' 'supportedgroups=0x00000003'\ncall CERTIFY 'DAT_IMAGEMEMXFER'                '${get:identity.productname}' g_localcertifyresult 'FALSE' '${folder:parent}/DAT_IMAGEMEMXFER/6'\ncall CERTIFY '${folder:certification}/Closeds' '${get:identity.productname}' embedded\necho.passfail 'SUMMARY' '${get:g_localcertifyresult}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Summary and cleanup...\n;\n; Did we pass? (do an extra check)\n:MAIN.PASS\nif '${get:g_localcertifyresult}' != 'pass' goto MAIN.ERROR\necho.passfail 'SUMMARY' 'pass'\nreturn 'pass'\n;\n; Ruh-roh...\n:MAIN.ERROR\necho.passfail 'SUMMARY' 'fail'\nsetglobal '${arg:2}' 'fail'\nreturn 'fail'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Function: Certify\n; arg:1 - script to run\n; arg:2 - TW_IDENTITY.ProductName of scanner to test\n; arg:3 - embeded flag for open/close -or- global to set on fail\n; arg:4 - dsmload arg -or- showui\n; arg:5 - dsmload arg -or- image folder\n; arg:6 - dsmload arg\n; arg:7 - dsmload arg\n; arg:8 - dsmload arg\n; returns: (none)\n;\n:CERTIFY\n;\nrun '${arg:1}' '${arg:2}' '${arg:3}' '${arg:4}' '${arg:5}' '${arg:6}' '${arg:7}' '${arg:8}'\nif '${ret:}' != 'pass' goto CERTIFY.FAIL\nreturn 'pass'\n;\n:CERTIFY.FAIL\nsetglobal g_localcertifyresult 'fail'\nreturn 'fail'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/080 - Version Tests/DAT_IMAGEMEMXFER.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DAT_IMAGEMEMXFER\n;   Confirm that the data source can respond correctly to different TWAIN version of application\n;   and data source manager by attempting to scan using different setups. This tests for hangs and\n;   crashes. Use Memory transfer if available. Scan one image without UI. Testing with old DSM is\n;   only for 32-bit data sources only.\n;\n; Arguments\n;   arg:1 - TW_IDENTITY.ProductName of scanner to test\n;   arg:2 - global for us to update on failure\n;   arg:3 - value of ShowUI (TRUE or FALSE)\n;   arg:4 - test name for the image folder\n;\n; Globals\n;   (none)\n;\n; Locals\n;   name - current test being done\n;   indent - indent the passfail text\n;   imageinfo - metadata for the current image\n;   imagememxfer - result of DAT_IMAGEMEMXFER call\n;   setupmemxfer.preferred - preferred field from DAT_SETUPMEMXFER call\n;\n;   image.count - count of images from 1\n;   image.folder - folder to put the images in\n;\n;   feederenabled.list - scanner's feederenabled values\n;   feederenabled.index - index of feederenabled values\n;   feederenabled.value - current feederenabled value\n;\n;   pixeltype.list - scanner's pixeltype values for this feederenabled\n;   pixeltype.index - index of pixeltype values\n;   pixeltype.value - current pixeltype value\n;\n; Returns\n;   pass or fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize...\n;\nsetlocal indent ''\nsetlocal image.pointer '0'\nsetlocal image.count '0'\nsetlocal image.folder '${folder:certimages}/${arg:4}'\nsetlocal showui '${arg:3}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Clean the image folder for this test...\n;\nimage cleanfolder '${get:image.folder}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; MSG_RESETALL\n; If return code is not TWRC_SUCCESS, end with an error\n;\nsetlocal name 'MSG_RESETALL'\ndsmentry src ds dg_control dat_capability msg_resetall '0,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get and set ICAP_XFERMECH...\n;\nsetlocal name 'ICAP_XFERMECH MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'ICAP_XFERMECH,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\nif '${ret:}' !~contains 'TWSX_MEMORY' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'ICAP_XFERMECH MSG_SET TWSX_MEMORY'\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_XFERMECH,TWON_ONEVALUE,TWTY_UINT16,TWSX_MEMORY'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get the preferred size for memory transfers, and allocate\n; a pointer for the memory transfers...\n;\nsetlocal name 'dg_control/dat_setupmemxfer/msg_get'\ndsmentry src ds dg_control dat_setupmemxfer msg_get '0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'TW_SETUPMEMXFER.Preferred > 0'\nsetlocal setupmemxfer.preferred '${ret:${get:TW_SETUPMEMXFER.Preferred}}'\nif '${get:setupmemxfer.preferred}' <= '0' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'allocate pointer for ${get:setupmemxfer.preferred} bytes'\nallocate pointer image.pointer '${get:setupmemxfer.preferred}'\nif '${get:image.pointer}' == '0' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Check for paper in the feeder, skip for a flatbed...\n;\n:MAIN.FEEDERLOADED\ndsmentry src ds dg_control dat_capability msg_getcurrent 'CAP_FEEDERENABLED,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.FEEDERLOADED.DONE\nif '${ret:${get:TW_ONEVALUE.Item}}' ~~ 'FALSE' goto MAIN.FEEDERLOADED.DONE\ndsmentry src ds dg_control dat_capability msg_getcurrent 'CAP_FEEDERLOADED,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.FEEDERLOADED.DONE\nif '${ret:${get:TW_ONEVALUE.Item}}' ~~ 'TRUE' goto MAIN.FEEDERLOADED.DONE\necho.prompt\necho.prompt \"Place paper in the scanner's feeder.\"\npause '(press the ENTER key when ready to continue)'\n:MAIN.FEEDERLOADED.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We only need one sheet of paper...\n;\nsetlocal name 'CAP_XFERCOUNT MSG_SET 1'\ndsmentry src ds dg_control dat_capability msg_set 'CAP_XFERCOUNT,TWON_ONEVALUE,TWTY_INT16,1'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Start scanning...\n;\n:MAIN.USERINTERFACE\nsetlocal name 'dg_control/dat_userinterface/msg_enableds'\nwait reset\ndsmentry src null dg_control dat_userinterface msg_enableds '${get:showui},0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Wait for MSG_XFERREADY, if we don't see it then scoot...\n;\nsetlocal name 'wait ${get:sys_waittimeout} seconds for MSG_XFERREADY'\nwait '${get:sys_waittimeout}000'\nif '${ret:}' !~contains 'msg_xferready' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Do a memory transfer...\n; This little song and dance with the states is so that we can\n; start the transfer in state 6 with each new image, but switch\n; to state 7 if we need multiple calls to capture the current\n; image...\n;\n; The saved images will be in TIFF format, which includes TIFF\n; JPEG (the better form, where a simple TIFF header is added).\n;\nincrement image.count '${get:image.count}' 1\nimage free memimage\n;\n:MAIN.IMAGEMEMXFER.NEXT\nsetlocal name 'dg_image/dat_imagememxfer/msg_get'\ndsmentry src ds dg_image dat_imagememxfer msg_get '0,0,0,0,0,0,0,9,${get:setupmemxfer.preferred},${get:image.pointer}'\nsetlocal imagememxfer '${ret:}'\nif '${sts:}' == 'XFERDONE' goto MAIN.IMAGEMEMXFER.XFERDONE\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\n;\necho.passfail '${get:indent}${get:name} SUCCESS' 'pass'\nimage append memimage '${get:imagememxfer}'\ngoto MAIN.IMAGEMEMXFER.NEXT\n;\n:MAIN.IMAGEMEMXFER.XFERDONE\necho.passfail '${get:indent}${get:name} XFERDONE' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We need image info to make sense of this data...\n;\nsetlocal name 'dg_image/dat_imageinfo/msg_get'\ndsmentry src ds dg_image dat_imageinfo msg_get '0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0'\nsetlocal imageinfo '${ret:}'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Save the image...\n;\nimage append memimage '${get:imagememxfer}'\nimage addheader memimage '${get:imageinfo}'\nimage save memimage memory '${get:image.folder}/img${format:D6|${get:image.count}}'\necho.passfail '${get:indent}image <${ret:}>' 'pass'\nimage free memimage\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; End the transfer, see if we're done...\n;\nsetlocal name 'dg_control/dat_pendingxfers/msg_endxfer'\ndsmentry src ds dg_control dat_pendingxfers msg_endxfer '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nif '${ret:${get:TW_PENDINGXFERS.Count}}' != '0' goto MAIN.IMAGEMEMXFER.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We're out of images, so disable; we'll drop down to MAIN.PASS...\n;\nsetlocal name 'dg_control/dat_userinterface/msg_disableds'\ndsmentry src ds dg_control dat_userinterface msg_disableds '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Summary and cleanup...\n;\n; We passed...\n:MAIN.PASS\nimage free memimage\nfree pointer image.pointer\nreturn 'pass'\n;\n; Ruh-roh...\n:MAIN.ERROR.ECHOPASSFAIL\nimage free memimage\nfree pointer image.pointer\necho.passfail '${get:indent}${get:name}' 'fail - ${sts:} ${ret:}'\nsetglobal '${arg:2}' 'fail'\nreturn 'fail'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/090 - Verify Values for MSG_OPENDS, MSG_RESET, and MSG_RESETALL/Certification.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Verify Values for MSG_OPENDS, MSG_RESET, and MSG_RESETALL\n;   Confirm that the indicated capabilities have the values required by the Specification\n;   after aDG_CONTROL / DAT_CAPABILITY / MSG_RESETALL is applied to the entire driver, or\n;   a DG_CONTROL / DAT_CAPABILITY / MSG_RESET is applied to a single capability.  Also,\n;   confirm those capabilities that have mandatory values after MSG_OPENDS.\n;\n; Arguments\n;   arg:1 - TW_IDENTITY.ProductName of scanner to test\n;   arg:2 - global to set on fail\n;\n; Globals\n;   (none)\n;\n; Locals\n;   twidentity.productname - product name of scanner to test\n;   certifyresult - global to set on fail\n;   xfermech - result of getting ICAP_XFERMECH\n;\n; Returns\n;   (none)\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize stuff, load tables if not already done for us...\n;\necho.titlesuite 'Verify Values for MSG_OPENDS, MSG_RESET, and MSG_RESETALL v1.0 02-Mar-2020'\nsetlocal twidentity.productname '${arg:1}'\nsetlocal certifyresult '${arg:2}'\nif '${get:TW_ARRAY.ItemType}' != '' goto MAIN.LOADTABLES.SKIP\nrun '${folder:certification}/LoadTables'\n:MAIN.LOADTABLES.SKIP\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Run the tests...\n;\ncall CERTIFY 'MSG_OPENDS'   '${get:twidentity.productname}' '${get:certifyresult}'\nif '${get:${get:certifyresult}}' == 'fail' goto MAIN.RETURN\ncall CERTIFY 'MSG_RESET'    '${get:twidentity.productname}' '${get:certifyresult}'\ncall CERTIFY 'MSG_RESETALL' '${get:twidentity.productname}' '${get:certifyresult}'\n:MAIN.RETURN\nreturn\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Function: Certify\n; arg:1 - script to run\n; arg:2 - TW_IDENTITY.ProductName of scanner to test\n; arg:3 - global value to update on fail\n; arg:4 - xfermech values\n; returns: (none)\n;\n:CERTIFY\n;\nrun '${arg:1}' '${arg:2}' '${arg:3}' '${arg:4}'\nif '${ret:}' != 'pass' goto CERTIFY.FAIL\nreturn 'pass'\n;\n:CERTIFY.FAIL\nsetglobal '${arg:3}' 'fail'\nreturn 'fail'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/090 - Verify Values for MSG_OPENDS, MSG_RESET, and MSG_RESETALL/MSG_OPENDS.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; MSG_OPENDS\n;   Compare the CAP.ValueAfterOpen values of all TWAIN standard capabilities\n;   for the values of CAP_FEEDERENABLES and ICAP_PIXELTYPE to make sure they\n;   have their mandatory settting after MSG_OPENDS.\n;\n;   Our loop takes the form:\n;   foreach CAP_FEEDERENABLED\n;     foreach ICAP_PIXELTYPE\n;       foreach CAP_SUPPORTEDCAPS\n;         check values\n;       end\n;     end\n;   end\n;\n; Arguments\n;   arg:1 - TW_IDENTITY.ProductName of scanner to test\n;   arg:2 - global for us to update on failure\n;\n; Globals\n;   (none)\n;\n; Locals\n;   name - current test being done\n;   indent - indent the passfail text\n;   capability - getcurrent result for capability\n;\n;   feederenabled.list - scanner's feederenabled values\n;   feederenabled.index - index of feederenabled values\n;   feederenabled.value - current feederenabled value\n;\n;   pixeltype.list - scanner's pixeltype values for this feederenabled\n;   pixeltype.index - index of pixeltype values\n;   pixeltype.value - current pixeltype value\n;\n;   supportedcaps.list - scanner's capabilities\n;   supportedcaps.index - index of supportedcaps values\n;   supportedcaps.value - current supportedcap value\n;\n; Returns\n;   pass or fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize...\n;\necho.titletest 'MSG_OPENDS'\nsetlocal indent ''\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Open the source...\n;\nrun '${folder:certification}/Opends' '${arg:1}' embedded\nif '${ret:}' != 'pass' goto MAIN.ERROR.ECHOPASSFAIL\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get CAP_FEEDERENABLED, and loop so we test all values\n; for the current ICAP_XFERMECH setting.\n;\nsetlocal name 'CAP_FEEDERENABLED MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'CAP_FEEDERENABLED,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal feederenabled.list '${ret:}' ; what the scanner told us\nsetlocal feederenabled.index '${get:TW_ENUMERATION.ItemList}' ; point to itemlist\nincrement feederenabled.index '${get:feederenabled.index}' -1 ; less 1\n;\n:MAIN.FEEDERENABLED.NEXT\nsetlocal indent ''\nincrement feederenabled.index '${get:feederenabled.index}' 1 ; next itemlist\nsetlocal feederenabled.value '${getindex:feederenabled.list:${get:feederenabled.index}}' ; get the value\nif '${get:feederenabled.value}' == '' goto MAIN.PASS ; we've passed all tests!!!\n;\nsetlocal name 'CAP_FEEDERENABLED MSG_SET ${get:feederenabled.value}'\ndsmentry src ds dg_control dat_capability msg_set 'CAP_FEEDERENABLED,TWON_ONEVALUE,TWTY_BOOL,${get:feederenabled.value}'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get ICAP_PIXELTYPE, and loop so we test all values for\n; the current CAP_FEEDERENABLED setting.\n;\nsetlocal indent '  '\nsetlocal name 'ICAP_PIXELTYPE MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'ICAP_PIXELTYPE,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal pixeltype.list '${ret:}' ; what the scanner told us\nsetlocal pixeltype.index '${get:TW_ENUMERATION.ItemList}' ; point to itemlist\nincrement pixeltype.index '${get:pixeltype.index}' -1 ; less 1\n;\n:MAIN.PIXELTYPE.NEXT\nsetlocal indent '  '\nincrement pixeltype.index '${get:pixeltype.index}' 1 ; next itemlist\nsetlocal pixeltype.value '${getindex:pixeltype.list:${get:pixeltype.index}}' ; get the value\nif '${get:pixeltype.value}' == '' goto MAIN.FEEDERENABLED.NEXT ; pixeltypes done for this feederenabled\n;\nsetlocal name 'ICAP_PIXELTYPE MSG_SET ${get:pixeltype.value}'\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_PIXELTYPE,TWON_ONEVALUE,TWTY_UINT16,${get:pixeltype.value}'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get CAP_SUPPORTEDCAPS, and loop so we test all values for\n; the current ICAP_PIXELTYPE setting.\n;\nsetlocal indent '    '\nsetlocal name 'CAP_SUPPORTEDCAPS MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'CAP_SUPPORTEDCAPS,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal supportedcaps.list '${ret:}' ; what the scanner told us\nsetlocal supportedcaps.index '${get:TW_ENUMERATION.ItemList}' ; point to itemlist\nincrement supportedcaps.index '${get:supportedcaps.index}' -1 ; less 1\n;\n:MAIN.SUPPORTEDCAPS.NEXT\nsetlocal indent '    '\nincrement supportedcaps.index '${get:supportedcaps.index}' 1 ; next itemlist\nsetlocal supportedcaps.value '${getindex:supportedcaps.list:${get:supportedcaps.index}}' ; get the value\nif '${get:supportedcaps.value}' ~contains '0x' goto MAIN.SUPPORTEDCAPS.NEXT ; nonstandard TWAIN, skip it\nif '${get:supportedcaps.value}' == '' goto MAIN.PIXELTYPE.NEXT ; supportedcaps done for this pixeltype\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get the CAP.ValueAfterOpen, and skip if it's UNDEFINED\n;\nsetlocal valueafteropen '${get:${get:supportedcaps.value}.ValueAfterOpen}'\nif '${get:valueafteropen}' == 'UNDEFINED' goto MAIN.SUPPORTEDCAPS.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get the current value...\n;\nsetlocal name '${get:supportedcaps.value} MSG_GETCURRENT'\ndsmentry src ds dg_control dat_capability msg_getcurrent '${get:supportedcaps.value},0,0,0'\nsetlocal capability '${ret:}'\nif '${sts:}' == 'CAPSEQERROR' goto MAIN.SUPPORTEDCAPS.NEXT ; skip items that we can't access right now\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Compare the values for a TW_ONEVALUE...\n;\nsetlocal name '${get:supportedcaps.value} ${getindex:capability:${get:TW_ONEVALUE.Item}} == ${get:valueafteropen}'\nif '${getindex:capability:${get:TW_CAPABILITY.ConType}}' == 'TWON_ARRAY' goto MAIN.COMPARE.ARRAY.EMPTY\nif '${getindex:capability:${get:TW_CAPABILITY.ConType}}' != 'TWON_ONEVALUE' goto MAIN.ERROR.ECHOPASSFAIL\nif '${getindex:capability:${get:TW_ONEVALUE.Item}}' != '${get:valueafteropen}' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:index}${get:name}' 'pass'\ngoto MAIN.SUPPORTEDCAPS.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Compare the values for a TW_ARRAY that should be empty...\n;\n:MAIN.COMPARE.ARRAY.EMPTY\nsetlocal name '${get:supportedcaps.value} array is empty'\nif '${get:valueafteropen}' != '' goto MAIN.COMPARE.ARRAY.NOTEMPTY\nif '${getindex:capability:${get:TW_ARRAY.ItemList}' != '' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:index}${get:name}' 'pass'\ngoto MAIN.SUPPORTEDCAPS.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Compare the values for a TW_ARRAY that has mandatory values...\n;\n:MAIN.COMPARE.ARRAY.NOTEMPTY\nsetlocal name '${get:supportedcaps.value} array with values'\nif '${getindex:capability:${get:TW_ARRAY.ItemList}' == '' goto MAIN.ERROR.ECHOPASSFAIL\n;\nsetlocal valueafteropen.index '0'\n:MAIN.VALUE.NEXT\nsetlocal value '${getindex:valueafteropen:${get:valueafteropen.index}}'\nif '${get:value}' == '' goto MAIN.SUPPORTEDCAPS.NEXT ; we did okay, go to the next capability\nsetlocal name '${get:supportedcaps.value} contains '${get:value}'\nif '${get:capability}' !~contains '${get:value}' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:index}${get:name}' 'pass'\ngoto MAIN.VALUE.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Summary and cleanup...\n;\n; We passed...\n:MAIN.PASS\nrun '${folder:certification}/Closeds' '${arg:1}' embedded\necho.passfail 'SUMMARY' 'pass'\nreturn 'pass'\n;\n; Ruh-roh...\n:MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'fail - ${sts:} ${ret:}'\nrun '${folder:certification}/Closeds' '${arg:1}' embedded\necho.passfail 'SUMMARY' 'fail'\nsetglobal '${arg:2}' 'fail'\nreturn 'fail'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/090 - Verify Values for MSG_OPENDS, MSG_RESET, and MSG_RESETALL/MSG_RESET.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; MSG_RESET\n;   Compare the CAP.ValueAfterReset values of all TWAIN standard capabilities\n;   for the values of CAP_FEEDERENABLED and ICAP_PIXELTYPE to make sure they\n;   have their mandatory settting after running MSG_RESET on them.\n;\n;   Our loop takes the form:\n;   foreach CAP_FEEDERENABLED\n;     foreach ICAP_PIXELTYPE\n;       foreach CAP_SUPPORTEDCAPS\n;         reset capability\n;         check values\n;       end\n;     end\n;   end\n;\n; Arguments\n;   arg:1 - TW_IDENTITY.ProductName of scanner to test\n;   arg:2 - global for us to update on failure\n;\n; Globals\n;   (none)\n;\n; Locals\n;   name - current test being done\n;   indent - indent the passfail text\n;   capability - getcurrent result for capability\n;\n;   feederenabled.list - scanner's feederenabled values\n;   feederenabled.index - index of feederenabled values\n;   feederenabled.value - current feederenabled value\n;\n;   pixeltype.list - scanner's pixeltype values for this feederenabled\n;   pixeltype.index - index of pixeltype values\n;   pixeltype.value - current pixeltype value\n;\n;   supportedcaps.list - scanner's capabilities\n;   supportedcaps.index - index of supportedcaps values\n;   supportedcaps.value - current supportedcap value\n;\n; Returns\n;   pass or fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize...\n;\necho.titletest 'MSG_RESET'\nsetlocal indent ''\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Open the source...\n;\nrun '${folder:certification}/Opends' '${arg:1}' embedded\nif '${ret:}' != 'pass' goto MAIN.ERROR.ECHOPASSFAIL\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get CAP_FEEDERENABLED, and loop so we test all values\n; for the current ICAP_XFERMECH setting.\n;\nsetlocal name 'CAP_FEEDERENABLED MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'CAP_FEEDERENABLED,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal feederenabled.list '${ret:}' ; what the scanner told us\nsetlocal feederenabled.index '${get:TW_ENUMERATION.ItemList}' ; point to itemlist\nincrement feederenabled.index '${get:feederenabled.index}' -1 ; less 1\n;\n:MAIN.FEEDERENABLED.NEXT\nsetlocal indent ''\nincrement feederenabled.index '${get:feederenabled.index}' 1 ; next itemlist\nsetlocal feederenabled.value '${getindex:feederenabled.list:${get:feederenabled.index}}' ; get the value\nif '${get:feederenabled.value}' == '' goto MAIN.PASS ; we've passed all tests!!!\n;\nsetlocal name 'CAP_FEEDERENABLED MSG_SET ${get:feederenabled.value}'\ndsmentry src ds dg_control dat_capability msg_set 'CAP_FEEDERENABLED,TWON_ONEVALUE,TWTY_BOOL,${get:feederenabled.value}'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get ICAP_PIXELTYPE, and loop so we test all values for\n; the current CAP_FEEDERENABLED setting.\n;\nsetlocal indent '  '\nsetlocal name 'ICAP_PIXELTYPE MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'ICAP_PIXELTYPE,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal pixeltype.list '${ret:}' ; what the scanner told us\nsetlocal pixeltype.index '${get:TW_ENUMERATION.ItemList}' ; point to itemlist\nincrement pixeltype.index '${get:pixeltype.index}' -1 ; less 1\n;\n:MAIN.PIXELTYPE.NEXT\nsetlocal indent '  '\nincrement pixeltype.index '${get:pixeltype.index}' 1 ; next itemlist\nsetlocal pixeltype.value '${getindex:pixeltype.list:${get:pixeltype.index}}' ; get the value\nif '${get:pixeltype.value}' == '' goto MAIN.FEEDERENABLED.NEXT ; pixeltypes done for this feederenabled\n;\nsetlocal name 'ICAP_PIXELTYPE MSG_SET ${get:pixeltype.value}'\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_PIXELTYPE,TWON_ONEVALUE,TWTY_UINT16,${get:pixeltype.value}'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get CAP_SUPPORTEDCAPS, and loop so we test all values for\n; the current ICAP_PIXELTYPE setting.\n;\nsetlocal indent '    '\nsetlocal name 'CAP_SUPPORTEDCAPS MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'CAP_SUPPORTEDCAPS,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal supportedcaps.list '${ret:}' ; what the scanner told us\nsetlocal supportedcaps.index '${get:TW_ENUMERATION.ItemList}' ; point to itemlist\nincrement supportedcaps.index '${get:supportedcaps.index}' -1 ; less 1\n;\n:MAIN.SUPPORTEDCAPS.NEXT\nsetlocal indent '    '\nincrement supportedcaps.index '${get:supportedcaps.index}' 1 ; next itemlist\nsetlocal supportedcaps.value '${getindex:supportedcaps.list:${get:supportedcaps.index}}' ; get the value\nif '${get:supportedcaps.value}' ~contains '0x' goto MAIN.SUPPORTEDCAPS.NEXT ; nonstandard TWAIN, skip it\nif '${get:supportedcaps.value}' == '' goto MAIN.PIXELTYPE.NEXT ; supportedcaps done for this pixeltype\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get the CAP.ValueAfterReset, and skip if it's UNDEFINED\n;\nsetlocal valueafterreset '${get:${get:supportedcaps.value}.ValueAfterReset}'\nif '${get:valueafterreset}' == 'UNDEFINED' goto MAIN.SUPPORTEDCAPS.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Reset the current value...\n;\nsetlocal name '${get:supportedcaps.value} MSG_RESET'\ndsmentry src ds dg_control dat_capability msg_reset '${get:supportedcaps.value},0,0,0'\nsetlocal capability '${ret:}'\nif '${sts:}' == 'CAPSEQERROR' goto MAIN.SUPPORTEDCAPS.NEXT ; skip items that we can't access right now\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Compare the values for a TW_ONEVALUE...\n;\nsetlocal name '${get:supportedcaps.value} ${getindex:capability:${get:TW_ONEVALUE.Item}} == ${get:valueafterreset}'\nif '${getindex:capability:${get:TW_CAPABILITY.ConType}}' == 'TWON_ARRAY' goto MAIN.COMPARE.ARRAY.EMPTY\nif '${getindex:capability:${get:TW_CAPABILITY.ConType}}' != 'TWON_ONEVALUE' goto MAIN.ERROR.ECHOPASSFAIL\nif '${get:valueafterreset}' contains '|' goto MAIN.MULTIPLE.VALUES\nif '${getindex:capability:${get:TW_ONEVALUE.Item}}' != '${get:valueafterreset}' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\ngoto MAIN.SUPPORTEDCAPS.NEXT\n;\n:MAIN.MULTIPLE.VALUES\nif '|${get:valueafterreset}|' !~contains '|${getindex:capability:${get:TW_ONEVALUE.Item}}|' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\ngoto MAIN.SUPPORTEDCAPS.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Compare the values for a TW_ARRAY that should be empty...\n;\n:MAIN.COMPARE.ARRAY.EMPTY\nsetlocal name '${get:supportedcaps.value} array is empty'\nif '${get:valueafterreset}' != '' goto MAIN.COMPARE.ARRAY.NOTEMPTY\nif '${getindex:capability:${get:TW_ARRAY.ItemList}}' != '' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\ngoto MAIN.SUPPORTEDCAPS.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Compare the values for a TW_ARRAY that has mandatory values...\n;\n:MAIN.COMPARE.ARRAY.NOTEMPTY\nsetlocal name '${get:supportedcaps.value} array with values'\nif '${getindex:capability:${get:TW_ARRAY.ItemList}}' == '' goto MAIN.ERROR.ECHOPASSFAIL\n;\nsetlocal valueafterreset.index '-1'\n:MAIN.VALUE.NEXT\nincrement valueafterreset.index '${get:valueafterreset.index}' 1\nsetlocal value '${getindex:valueafterreset:${get:valueafterreset.index}}'\nif '${get:value}' == '' goto MAIN.SUPPORTEDCAPS.NEXT ; we did okay, go to the next capability\nsetlocal name '${get:supportedcaps.value} contains ${get:value}'\nif '${get:capability}' !~contains '${get:value}' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\ngoto MAIN.VALUE.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Summary and cleanup...\n;\n; We passed...\n:MAIN.PASS\nrun '${folder:certification}/Closeds' '${arg:1}' embedded\necho.passfail 'SUMMARY' 'pass'\nreturn 'pass'\n;\n; Ruh-roh...\n:MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'fail - ${sts:} ${ret:}'\nrun '${folder:certification}/Closeds' '${arg:1}' embedded\necho.passfail 'SUMMARY' 'fail'\nsetglobal '${arg:2}' 'fail'\nreturn 'fail'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/090 - Verify Values for MSG_OPENDS, MSG_RESET, and MSG_RESETALL/MSG_RESETALL.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; MSG_RESETALL\n;   Compare the CAP.ValueAfterReset values of all TWAIN standard capabilities\n;   for the values of CAP_FEEDERENABLED and ICAP_PIXELTYPE to make sure they\n;   have their mandatory settting after running MSG_RESETALL.\n;\n;   Our loop takes the form:\n;   resetall\n;   foreach CAP_FEEDERENABLED\n;     foreach ICAP_PIXELTYPE\n;       foreach CAP_SUPPORTEDCAPS\n;         check values\n;       end\n;     end\n;   end\n;\n; Arguments\n;   arg:1 - TW_IDENTITY.ProductName of scanner to test\n;   arg:2 - global for us to update on failure\n;\n; Globals\n;   (none)\n;\n; Locals\n;   name - current test being done\n;   indent - indent the passfail text\n;   capability - getcurrent result for capability\n;\n;   feederenabled.list - scanner's feederenabled values\n;   feederenabled.index - index of feederenabled values\n;   feederenabled.value - current feederenabled value\n;\n;   pixeltype.list - scanner's pixeltype values for this feederenabled\n;   pixeltype.index - index of pixeltype values\n;   pixeltype.value - current pixeltype value\n;\n;   supportedcaps.list - scanner's capabilities\n;   supportedcaps.index - index of supportedcaps values\n;   supportedcaps.value - current supportedcap value\n;\n; Returns\n;   pass or fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize...\n;\necho.titletest 'MSG_RESETALL'\nsetlocal indent ''\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Open the source...\n;\nrun '${folder:certification}/Opends' '${arg:1}' embedded\nif '${ret:}' != 'pass' goto MAIN.ERROR.ECHOPASSFAIL\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Reset all...\n;\nsetlocal name 'MSG_RESETALL'\ndsmentry src ds dg_control dat_capability msg_resetall '0,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get CAP_FEEDERENABLED, and loop so we test all values\n; for the current ICAP_XFERMECH setting.\n;\nsetlocal name 'CAP_FEEDERENABLED MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'CAP_FEEDERENABLED,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal feederenabled.list '${ret:}' ; what the scanner told us\nsetlocal feederenabled.index '${get:TW_ENUMERATION.ItemList}' ; point to itemlist\nincrement feederenabled.index '${get:feederenabled.index}' -1 ; less 1\n;\n:MAIN.FEEDERENABLED.NEXT\nsetlocal indent ''\nincrement feederenabled.index '${get:feederenabled.index}' 1 ; next itemlist\nsetlocal feederenabled.value '${getindex:feederenabled.list:${get:feederenabled.index}}' ; get the value\nif '${get:feederenabled.value}' == '' goto MAIN.PASS ; we've passed all tests!!!\n;\nsetlocal name 'CAP_FEEDERENABLED MSG_SET ${get:feederenabled.value}'\ndsmentry src ds dg_control dat_capability msg_set 'CAP_FEEDERENABLED,TWON_ONEVALUE,TWTY_BOOL,${get:feederenabled.value}'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get ICAP_PIXELTYPE, and loop so we test all values for\n; the current CAP_FEEDERENABLED setting.\n;\nsetlocal indent '  '\nsetlocal name 'ICAP_PIXELTYPE MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'ICAP_PIXELTYPE,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal pixeltype.list '${ret:}' ; what the scanner told us\nsetlocal pixeltype.index '${get:TW_ENUMERATION.ItemList}' ; point to itemlist\nincrement pixeltype.index '${get:pixeltype.index}' -1 ; less 1\n;\n:MAIN.PIXELTYPE.NEXT\nsetlocal indent '  '\nincrement pixeltype.index '${get:pixeltype.index}' 1 ; next itemlist\nsetlocal pixeltype.value '${getindex:pixeltype.list:${get:pixeltype.index}}' ; get the value\nif '${get:pixeltype.value}' == '' goto MAIN.FEEDERENABLED.NEXT ; pixeltypes done for this feederenabled\n;\nsetlocal name 'ICAP_PIXELTYPE MSG_SET ${get:pixeltype.value}'\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_PIXELTYPE,TWON_ONEVALUE,TWTY_UINT16,${get:pixeltype.value}'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get CAP_SUPPORTEDCAPS, and loop so we test all values for\n; the current ICAP_PIXELTYPE setting.\n;\nsetlocal indent '    '\nsetlocal name 'CAP_SUPPORTEDCAPS MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'CAP_SUPPORTEDCAPS,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal supportedcaps.list '${ret:}' ; what the scanner told us\nsetlocal supportedcaps.index '${get:TW_ENUMERATION.ItemList}' ; point to itemlist\nincrement supportedcaps.index '${get:supportedcaps.index}' -1 ; less 1\n;\n:MAIN.SUPPORTEDCAPS.NEXT\nsetlocal indent '    '\nincrement supportedcaps.index '${get:supportedcaps.index}' 1 ; next itemlist\nsetlocal supportedcaps.value '${getindex:supportedcaps.list:${get:supportedcaps.index}}' ; get the value\nif '${get:supportedcaps.value}' ~contains '0x' goto MAIN.SUPPORTEDCAPS.NEXT ; nonstandard TWAIN, skip it\nif '${get:supportedcaps.value}' == '' goto MAIN.PIXELTYPE.NEXT ; supportedcaps done for this pixeltype\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get the CAP.ValueAfterReset, and skip if it's UNDEFINED\n;\nsetlocal valueafterreset '${get:${get:supportedcaps.value}.ValueAfterReset}'\nif '${get:valueafterreset}' == 'UNDEFINED' goto MAIN.SUPPORTEDCAPS.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Reset the current value...\n;\nsetlocal name '${get:supportedcaps.value} MSG_GETCURRENT'\ndsmentry src ds dg_control dat_capability msg_getcurrent '${get:supportedcaps.value},0,0,0'\nsetlocal capability '${ret:}'\nif '${sts:}' == 'CAPSEQERROR' goto MAIN.SUPPORTEDCAPS.NEXT ; skip items that we can't access right now\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Compare the values for a TW_ONEVALUE...\n;\nsetlocal name '${get:supportedcaps.value} ${getindex:capability:${get:TW_ONEVALUE.Item}} == ${get:valueafterreset}'\nif '${getindex:capability:${get:TW_CAPABILITY.ConType}}' == 'TWON_ARRAY' goto MAIN.COMPARE.ARRAY.EMPTY\nif '${getindex:capability:${get:TW_CAPABILITY.ConType}}' != 'TWON_ONEVALUE' goto MAIN.ERROR.ECHOPASSFAIL\nif '${get:valueafterreset}' contains '|' goto MAIN.MULTIPLE.VALUES\nif '${getindex:capability:${get:TW_ONEVALUE.Item}}' != '${get:valueafterreset}' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\ngoto MAIN.SUPPORTEDCAPS.NEXT\n;\n:MAIN.MULTIPLE.VALUES\nif '|${get:valueafterreset}|' !~contains '|${getindex:capability:${get:TW_ONEVALUE.Item}}|' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\ngoto MAIN.SUPPORTEDCAPS.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Compare the values for a TW_ARRAY that should be empty...\n;\n:MAIN.COMPARE.ARRAY.EMPTY\nsetlocal name '${get:supportedcaps.value} array is empty'\nif '${get:valueafterreset}' != '' goto MAIN.COMPARE.ARRAY.NOTEMPTY\nif '${getindex:capability:${get:TW_ARRAY.ItemList}}' != '' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\ngoto MAIN.SUPPORTEDCAPS.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Compare the values for a TW_ARRAY that has mandatory values...\n;\n:MAIN.COMPARE.ARRAY.NOTEMPTY\nsetlocal name '${get:supportedcaps.value} array with values'\nif '${getindex:capability:${get:TW_ARRAY.ItemList}}' == '' goto MAIN.ERROR.ECHOPASSFAIL\n;\nsetlocal valueafterreset.index '-1'\n:MAIN.VALUE.NEXT\nincrement valueafterreset.index '${get:valueafterreset.index}' 1\nsetlocal value '${getindex:valueafterreset:${get:valueafterreset.index}}'\nif '${get:value}' == '' goto MAIN.SUPPORTEDCAPS.NEXT ; we did okay, go to the next capability\nsetlocal name '${get:supportedcaps.value} contains ${get:value}'\nif '${get:capability}' !~contains '${get:value}' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\ngoto MAIN.VALUE.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Summary and cleanup...\n;\n; We passed...\n:MAIN.PASS\nrun '${folder:certification}/Closeds' '${arg:1}' embedded\necho.passfail 'SUMMARY' 'pass'\nreturn 'pass'\n;\n; Ruh-roh...\n:MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'fail - ${sts:} ${ret:}'\nrun '${folder:certification}/Closeds' '${arg:1}' embedded\necho.passfail 'SUMMARY' 'fail'\nsetglobal '${arg:2}' 'fail'\nreturn 'fail'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/100 - TWAIN Direct Badge/Certification.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; TWAIN Direct Badge\n;   Check if TWAIN Direct is supported by the driver.  This is a badge, meaning that failure will not\n;   invalidate scanner certification.  Instead, passage will add TWAIN Direct support to the cert.\n;\n; Arguments\n;   arg:1 - TW_IDENTITY.ProductName of scanner to test\n;   arg:2 - global to set on fail\n;\n; Globals\n;   g_localcertifyresult - global to report to caller on fail\n;\n; Locals\n;   twidentity.productname - product name of scanner to test\n;   globaltosetonfail - name says it all\n;\n; Returns\n;   (none)\n;\n; History\n;   1.0 - initial release\n;   1.1 - add scanning so msg_settask and twei_twaindirect can be tested\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize stuff, load tables if not already done for us...\n;\necho.titlesuite 'TWAIN Direct Badge v1.1 17-Sep-2020'\necho.yellow '*************************************************************************************'\necho.yellow '*** This tests the TWAIN Direct Badge.  Skipping or failing means the driver      ***'\necho.yellow '*** does not support this functionality.  It does not prevent certification.      ***'\necho.yellow '*************************************************************************************'\n;\nsetlocal twidentity.productname '${arg:1}'\nsetlocal globaltosetonfail '${arg:2}'\nsetglobal g_localcertifyresult 'pass' ; assume success\n;\nif '${get:TW_ARRAY.ItemType}' != '' goto MAIN.LOADTABLES.SKIP\nrun '${folder:certification}/LoadTables'\n:MAIN.LOADTABLES.SKIP\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Run the tests...\n;\ncall CERTIFY '${folder:certification}/Opends'  '${get:twidentity.productname}' 'g_localcertifyresult' 'embedded'\nif '${get:g_localcertifyresult}' == 'fail' goto MAIN.CLOSEDS\n;\ncall CERTIFY 'TWAIN Direct Badge'              '${get:twidentity.productname}' 'g_localcertifyresult'\ncall CERTIFY 'DAT_IMAGEMEMFILEXFER'            '${get:twidentity.productname}' 'g_localcertifyresult' '${folder:parent}'\n;\n:MAIN.CLOSEDS\ncall CERTIFY '${folder:certification}/Closeds' '${get:twidentity.productname}' 'g_localcertifyresult' 'embedded'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Summary and cleanup...\n;\n; Did we pass? (do an extra check)\nif '${get:g_localcertifyresult}' == 'skip' goto MAIN.SKIP\nif '${get:g_localcertifyresult}' != 'pass' goto MAIN.ERROR\necho ''\necho.passfail 'BADGE SUMMARY' 'pass'\nreturn 'pass'\n;\n; Skip...\n:MAIN.SKIP\necho ''\necho.passfail 'BADGE SUMMARY' 'skip'\nsetglobal '${get:globaltosetonfail}' 'skip'\nreturn 'fail'\n;\n; Ruh-roh...\n:MAIN.ERROR\necho ''\necho.passfail 'BADGE SUMMARY' 'fail'\nsetglobal '${get:globaltosetonfail}' 'fail'\nreturn 'fail'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Function: Certify\n; arg:1 - script to run\n; arg:2 - TW_IDENTITY.ProductName of scanner to test\n; arg:3 - global value to update on fail\n; arg:4 - embeded flag for open/close, or folder for DAT_IMAGE*XFER calls\n; returns: (none)\n;\n:CERTIFY\n;\n; If a failure has occurred on a previous test, skip the rest of the tests,\n; except for closing, that would be bad...\nif '${arg:1}' ~contains 'Closeds' goto CERTIFY.RUN\nif '${get:${arg:3}}' == 'skip' goto CERTIFY.SKIP\nif '${get:${arg:3}}' == 'fail' goto CERTIFY.FAIL\n;\n; Run the test...\n:CERTIFY.RUN\nrun '${arg:1}' '${arg:2}' '${arg:4}'\nif '${ret:}' == 'skip' goto CERTIFY.SKIP\nif '${ret:}' != 'pass' goto CERTIFY.FAIL\nreturn 'pass'\n;\n; Handle skipping, set the global so we have a record...\n:CERTIFY.SKIP\nsetglobal '${arg:3}' 'skip'\nreturn 'skip'\n;\n; Handle failure, set the global so we have a record...\n:CERTIFY.FAIL\nsetglobal '${arg:3}' 'fail'\nreturn 'fail'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/100 - TWAIN Direct Badge/DAT_EXTIMAGEINFO.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DAT_EXTIMAGEINFO\n;   Check the return values from DAT_EXTIMAGEINFO to make sure the TWAIN Direct\n;   metadata is properly reported.\n;\n;   Here's the basic flow:\n;       DAT_EXTIMAGEINFO\n;       confirm that we have TWEI_TWAINDIRECTMETADATA\n;       confirm a sheet with no patchcodes\n;           TW_INFO[0].ReturnCode values TWRC_DATANOTAVAILABLE\n;       confirm a sheet with one patch code\n;           all TW_INFO[0].ReturnCode values are TWRC_SUCCESS\n;           all TW_INFO[0].ItemType values match the spec\n;           all TW_INFO[0].NumItems equals 1\n;           all TW_INFO[0].Item handle contains one of the TWPCH_* values\n;\n; Arguments\n;   arg:1 - indent the passfail text\n;   arg:2 - base filename (no extension)\n;\n; Globals\n;   (none)\n;\n; Locals\n;   name - current test being done\n;   indent - indent the passfail text\n;   twaindirectmetadata - the twain direct data\n;\n; Returns\n;   pass/fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get the extended image info, save the data to 'twaindirectmetadata'.\n;\nsetlocal indent '${arg:1}    '\nsetlocal name 'dg_image/dat_extimageinfo/msg_get TWEI_TWAINDIRECTMETADATA'\ndsmentry src ds dg_image dat_extimageinfo msg_get '1,TWEI_TWAINDIRECTMETADATA,0,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal twaindirectmetadata '${ret:}'\nfilewrite '${arg:2}_extimageinfo.txt' '${get:patchcodedata}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Confirm that we got back all the twain direct extimageinfo data...\n;\nsetlocal name 'Found TWEI_TWAINDIRECTMETADATA'\nif ',${get:twaindirectmetadata},' !contains 'TWEI_TWAINDIRECTMETADATA' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Start validating the contents of TWEI_TWAINDIRECTMETADATA, which is TW_INFO[0],\n; we expect to find the correct id and TWRC_SUCCESS...\nsetlocal name 'TW_INFO[0].InfoID is TWEI_TWAINDIRECTMETADATA'\nif '${getindex:twaindirectmetadata:${get:TW_INFO.InfoID}}' != 'TWEI_TWAINDIRECTMETADATA' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'TW_INFO[0].ReturnCode is TWRC_SUCCESS'\nif '${getindex:twaindirectmetadata:${get:TW_INFO.ReturnCode}}' != 'TWRC_SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Process TWRC_SUCCESS...\n;\n:MAIN.TWINFO.SUCCESS\nsetlocal name 'TW_INFO[0].ReturnCode is TWRC_SUCCESS'\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'TW_INFO[0].ItemType is TWTY_HANDLE'\nif '${getindex:twaindirectmetadata:${get:TW_INFO.ItemType}}' != 'TWTY_HANDLE' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'TW_INFO[0].NumItems is 1'\nif '${getindex:twaindirectmetadata:${get:TW_INFO.NumItems}}' != '1' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'TW_INFO[0].Item contains metadata'\nif '${gethandle:${getindex:twaindirectmetadata:${get:TW_INFO.Item}}:TWTY_HANDLE:-1}' !contains 'metadata' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\necho \n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Summary and cleanup...\n;\n; We passed...\n:MAIN.PASS\nreturn 'pass'\n;\n; Ruh-roh...\n:MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'fail - ${sts:} ${ret:}'\nreturn 'fail'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/100 - TWAIN Direct Badge/DAT_IMAGEMEMFILEXFER.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DAT_IMAGEMEMFILEXFER\n;   This test issues multiple image transfer sessions using DAT_IMAGEMEMFILEXFER. It is performed\n;   for all available image sources (unspecified, flatbed and/or ADF). Only one image is transferred\n;   per session.\n;\n;   We follow the capability ordering, so the loops take the form:\n;   set ICAP_XFERMECH TWSX_MEMFILE\n;   foreach CAP_FEEDERENABLED\n;     foreach ICAP_PIXELTYPE\n;       scan\n;     end\n;   end\n;\n; Arguments\n;   arg:1 - ignore\n;   arg:2 - test name for the image folder\n;\n; Globals\n;   (none)\n;\n; Locals\n;   name - current test being done\n;   indent - indent the passfail text\n;   imagememxfer - result of DAT_IMAGEMEMXFER call\n;   setupmemxfer.preferred - preferred field from DAT_SETUPMEMXFER call\n;\n;   image.count - count of images from 1\n;   image.folder - folder to put the images in\n;   image.prefix - adf or fb\n;\n; Returns\n;   pass/fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize...\n;\necho.titletest 'DAT_IMAGEMEMFILEXFER'\nsetlocal indent ''\nsetlocal image.pointer '0'\nsetlocal image.count '0'\nsetlocal image.folder '${folder:certimages}/${arg:2}/DAT_IMAGEMEMFILEXFER'\nsetlocal image.prefix 'fb'\nsetlocal task.handle '0'\nsetlocal reply.handle '0'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Clean the image folder for this test...\n;\nimage cleanfolder '${get:image.folder}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; MSG_RESETALL\n; If return code is not TWRC_SUCCESS, end with an error\n;\nsetlocal name 'MSG_RESETALL'\ndsmentry src ds dg_control dat_capability msg_resetall '0,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set ICAP_XFERMECH to TWSX_MEMFILE...\n;\nsetlocal name 'ICAP_XFERMECH MSG_SET TWSX_MEMFILE'\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_XFERMECH,TWON_ONEVALUE,TWTY_UINT16,TWSX_MEMFILE'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set CAP_IMAGEFILEFORMAT to TWFF_PDFRASTER...\n;\nsetlocal name 'ICAP_IMAGEFILEFORMAT MSG_SET TWFF_PDFRASTER'\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_IMAGEFILEFORMAT,TWON_ONEVALUE,TWTY_UINT32,TWFF_PDFRASTER'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Lists of things we'll be checking with tasks...\n;\nsetlocal source.index -1\nsetlocal source.list 'any,flatbed,adf'\n;\nsetlocal pixelformat.index -1\nsetlocal pixelformat.list 'any,bw1,gray8,rgb24'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Select the source, when we run out, we're done...\n;\n:MAIN.SOURCE.NEXT\nincrement source.index ${get:source.index} 1\nsetlocal source.value ${getindex:source.list:${get:source.index}}\nif '${get:source.value}' == '' goto MAIN.PASS\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Select the pixelformat, when we run out, go to the next source...\n;\n:MAIN.PIXELFORMAT.NEXT\nincrement pixelformat.index ${get:pixelformat.index} 1\nsetlocal pixelformat.value ${getindex:pixelformat.list:${get:pixelformat.index}}\nif '${get:pixelformat.value}' == '' goto MAIN.SOURCE.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get the preferred size for memory transfers, and allocate\n; a pointer for the memory transfers...\n;\nsetlocal indent '    '\nsetlocal name 'dg_control/dat_setupmemxfer/msg_get'\ndsmentry src ds dg_control dat_setupmemxfer msg_get '0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'TW_SETUPMEMXFER.Preferred > 0'\nsetlocal setupmemxfer.preferred '${ret:${get:TW_SETUPMEMXFER.Preferred}}'\nif '${get:setupmemxfer.preferred}' <= '0' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'allocate pointer for ${get:setupmemxfer.preferred} bytes'\nfree pointer image.pointer ; for the last loop\nallocate pointer image.pointer '${get:setupmemxfer.preferred}'\nif '${get:image.pointer}' == '0' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set DAT_SETUPFILEXFER to TWFF_PDFRASTER...\n;\nsetlocal name 'dg_control/dat_setupfilexfer/msg_set TWFF_PDFRASTER'\ndsmentry src null dg_control dat_setupfilexfer msg_set 'file,TWFF_PDFRASTER,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Check for paper in the feeder...\n;\ndsmentry src ds dg_control dat_capability msg_getcurrent 'CAP_FEEDERLOADED,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.FEEDERLOADED.DONE\nif '${ret:${get:TW_ONEVALUE.Item}}' ~~ 'TRUE' goto MAIN.FEEDERLOADED.DONE\necho.prompt\necho.prompt \"Place paper in the scanner's feeder.\"\npause '(press the ENTER key when ready to continue)'\n:MAIN.FEEDERLOADED.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Build the task...\n;\nsetlocal task.string ''\nsetlocal task.string '${get:task.string}{\"actions\":['\nsetlocal task.string '${get:task.string}{\"action\":\"encryptionProfiles\",\"encryptionProfiles\":[{\"name\":\"\",\"profile\":\"\"}]},'\nsetlocal task.string '${get:task.string}{\"action\":\"configure\",\"streams\":[{\"sources\":[{\"source\":\"${get:source.value}\",\"pixelFormats\":[{\"pixelFormat\":\"${get:pixelformat.value}\",\"attributes\":[{\"attribute\":\"compression\",\"values\":[{\"value\":\"autoVersion1\"}]},{\"attribute\":\"numberOfSheets\",\"values\":[{\"value\":1}]}]}]}]}]}'\nsetlocal task.string '${get:task.string}]}'\nsetlocal task.bytes  '${getbytes:task.string:utf8}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Send the task to the scanner...\n;\nsetlocal name 'dg_control/dat_twaindirect/msg_settask ${get:source} ${get:pixelformat}'\nallocate handle task.handle '${get:task.bytes}'\ncopybytes utf8handle task.string ${get:task.handle} ${get:task.bytes}\n;\ndsmentry src ds dg_control dat_twaindirect msg_settask '${sizeof:TW_TWAINDIRECT},0,${get:task.handle},${get:task.bytes},0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\nsetlocal reply.twtwaindirect '${ret:}'\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal reply.handle '${getindex:reply.twtwaindirect:${get:TW_TWAINDIRECT.Receive}}\nsetlocal reply.bytes '${getindex:reply.twtwaindirect:${get:TW_TWAINDIRECT.ReceiveSize}}\ncopybytes handleutf8 ${get:reply.handle} ${get:reply.bytes} reply.string\n;\nfree handle task.handle\nfree handle reply.handle\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Check the reply for success...\n;\nsetlocal name 'Check encryptionProfiles for success'\nif '${get:reply.string}' !~contains '{\"action\":\"encryptionProfiles\",\"results\":{\"success\":true}' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'Check configure for success'\nif '${get:reply.string}' !~contains '{\"action\":\"configure\",\"results\":{\"success\":true}' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Start scanning...\n;\nsetlocal name 'dg_control/dat_userinterface/msg_enableds'\nwait reset\ndsmentry src null dg_control dat_userinterface msg_enableds '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Wait for MSG_XFERREADY, if we don't see it then scoot...\n;\nsetlocal name 'wait ${get:sys_waittimeout} seconds for MSG_XFERREADY'\nwait '${get:sys_waittimeout}000'\nif '${ret:}' !~contains 'msg_xferready' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Do a memory file transfer...\n; This little song and dance with the states is so that we can\n; start the transfer in state 6 with each new image, but switch\n; to state 7 if we need multiple calls to capture the current\n; image...\n;\n; The saved images will be in TIFF format, which includes TIFF\n; JPEG (the better form, where a simple TIFF header is added).\n;\nincrement image.count '${get:image.count}' 1\nimage free memfileimage\n;\n:MAIN.IMAGEMEMFILEXFER.NEXT\nsetlocal name 'dg_image/dat_imagememfilexfer/msg_get'\ndsmentry src ds dg_image dat_imagememfilexfer msg_get '0,0,0,0,0,0,0,9,${get:setupmemxfer.preferred},${get:image.pointer}'\nsetlocal imagememxfer '${ret:}'\nif '${sts:}' == 'XFERDONE' goto MAIN.IMAGEMEMFILEXFER.XFERDONE\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\n;\necho.passfail '${get:indent}${get:name} SUCCESS' 'pass'\nimage append memfileimage '${get:imagememxfer}'\ngoto MAIN.IMAGEMEMFILEXFER.NEXT\n;\n:MAIN.IMAGEMEMFILEXFER.XFERDONE\necho.passfail '${get:indent}${get:name} XFERDONE' 'pass'\nimage append memfileimage '${get:imagememxfer}'\nimage save memfileimage memfile '${get:image.folder}/${get:image.prefix}${format:D6|${get:image.count}}'\necho.passfail '${get:indent}image <${ret:}>' 'pass'\nimage free memfileimage\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DAT_EXTIMAGEINFO\n; Check the twaindirect metadata...\n;\nrun DAT_EXTIMAGEINFO '${get:indent}' '${get:image.folder}/adf${format:D6|${get:image.count}}'\nif '${ret:}' != 'pass' goto MAIN.ERROR.FAIL\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; End the transfer, see if we're done...\n;\nsetlocal name 'dg_control/dat_pendingxfers/msg_endxfer'\ndsmentry src ds dg_control dat_pendingxfers msg_endxfer '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nif '${ret:${get:TW_PENDINGXFERS.Count}}' != '0' goto MAIN.IMAGEMEMFILEXFER.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We're out of images, so disable and go back up to\n; do the next ICAP_PIXELTYPE...\n;\nsetlocal name 'dg_control/dat_userinterface/msg_disableds'\ndsmentry src ds dg_control dat_userinterface msg_disableds '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\ngoto MAIN.PIXELFORMAT.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Summary and cleanup...\n;\n; We passed...\n:MAIN.PASS\necho.passfail 'SUMMARY' 'pass'\nimage free memfileimage\nfree pointer image.pointer\nreturn 'pass'\n;\n; Ruh-roh...\n:MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'fail - ${sts:} ${ret:}'\necho.passfail 'SUMMARY' 'fail'\nimage free memfileimage\nfree pointer image.pointer\nreturn 'fail'\n;\n; Ruh-roh...\n:MAIN.ERROR.FAIL\necho.passfail 'SUMMARY' 'fail'\nimage free memfileimage\nfree pointer image.pointer\nreturn 'fail'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/100 - TWAIN Direct Badge/TWAIN Direct Badge.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; TWAIN Direct Badge\n;   These tests match those found in the TwainDirect.OnTwain/ProcessSwordTask/TwainInquiry function,\n;   in the section that determines if a driver has DeviceRegister.TwainDirectSupport.Driver support.\n;\n;   While some of these tests are redundent in light of prior testing, the complete suite will be\n;   done to keep in sync with the TWAIN Direct code.\n;\n;   ************************************************************************\n;   **                                                                    **\n;   ** DO NOT MODIFY THE TESTS HERE, UNLESS THEY HAVE BEEN UPDATED IN THE **\n;   ** 'TwainDirect.OnTwain/ProcessSwordTask/TwainInquiry' FUNCTION.      **\n;   **                                                                    **\n;   ************************************************************************\n;\n; Arguments\n;   arg:1 - TW_IDENTITY.ProductName of scanner to test\n;\n; Globals\n;   (none)\n;\n; Locals\n;   certifyresult - track if we fail\n;\n; Returns\n;   pass/fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize...\n;\nsetlocal certifyresult 'pass' ; assume we'll pass\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Check if this driver claims support for TWAIN Direct...\n;\nsetlocal name 'DG_CONTROL|DAT_TWAINDIRECT found in CAP_SUPPORTEDDATS'\ndsmentry src ds dg_control dat_capability msg_getcurrent 'CAP_SUPPORTEDDATS,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.SUPPORTEDDATS.FAIL\nif ',${ret:},' !~contains ',DG_CONTROL|DAT_TWAINDIRECT,' goto MAIN.SUPPORTEDDATS.SKIP\necho.passfail '${get:name}' 'pass'\ngoto MAIN.SUPPORTEDATS.DONE\n;\n:MAIN.SUPPORTEDDATS.SKIP\necho.passfail '${get:name}' 'skip'\nsetlocal certifyresult 'skip'\ngoto MAIN.DONE\n;\n:MAIN.SUPPORTEDDATS.FAIL\necho.passfail '${get:name}' 'fail - ${sts:} ${ret:}'\nsetlocal certifyresult 'fail'\ngoto MAIN.DONE\n;\n:MAIN.SUPPORTEDATS.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; CAP_DEVICEONLINE must be TRUE\n;\nsetlocal name 'CAP_DEVICEONLINE is TRUE'\ndsmentry src ds dg_control dat_capability msg_getcurrent 'CAP_DEVICEONLINE,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.DEVICEONLINE.FAIL\nif ',${ret:},' !~contains ',TRUE,' goto MAIN.DEVICEONLINE.FAIL\necho.passfail '${get:name}' 'pass'\ngoto MAIN.DEVICEONLINE.DONE\n;\n:MAIN.DEVICEONLINE.FAIL\necho.passfail '${get:name}' 'fail - ${sts:} ${ret:}'\nsetlocal certifyresult 'fail'\n:MAIN.DEVICEONLINE.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; CAP_UICONTROLLABLE must be TRUE\n;\nsetlocal name 'CAP_UICONTROLLABLE is TRUE'\ndsmentry src ds dg_control dat_capability msg_getcurrent 'CAP_UICONTROLLABLE,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.UICONTROLLABLE.FAIL\nif ',${ret:},' !~contains ',TRUE,' goto MAIN.UICONTROLLABLE.FAIL\necho.passfail '${get:name}' 'pass'\ngoto MAIN.UICONTROLLABLE.DONE\n;\n:MAIN.UICONTROLLABLE.FAIL\necho.passfail '${get:name}' 'fail - ${sts:} ${ret:}'\nsetlocal certifyresult 'fail'\n:MAIN.UICONTROLLABLE.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DAT_EXTIMAGEINFO supported\n;\nsetlocal name 'DAT_EXTIMAGEINFO supported'\ndsmentry src ds dg_control dat_capability msg_get 'CAP_SUPPORTEDDATS,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.EXTIMAGEINFO.FAIL\nif ',${ret:},' !~contains ',DG_IMAGE|DAT_EXTIMAGEINFO,' goto MAIN.EXTIMAGEINFO.FAIL\necho.passfail '${get:name}' 'pass'\ngoto MAIN.EXTIMAGEINFO.DONE\n;\n:MAIN.EXTIMAGEINFO.FAIL\necho.passfail '${get:name}' 'fail - ${sts:} ${ret:}'\nsetlocal certifyresult 'fail'\n:MAIN.EXTIMAGEINFO.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; TWEI_TWAINDIRECTMETADATA supported\n;\nsetlocal name 'TWEI_TWAINDIRECTMETADATA supported'\ndsmentry src ds dg_control dat_capability msg_get 'ICAP_SUPPORTEDEXTIMAGEINFO,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.TWAINDIRECTMETADATA.FAIL\nif ',${ret:},' !~contains ',TWEI_TWAINDIRECTMETADATA,' goto MAIN.TWAINDIRECTMETADATA.FAIL\necho.passfail '${get:name}' 'pass'\ngoto MAIN.TWAINDIRECTMETADATA.DONE\n;\n:MAIN.TWAINDIRECTMETADATA.FAIL\necho.passfail '${get:name}' 'fail - ${sts:} ${ret:}'\nsetlocal certifyresult 'fail'\n:MAIN.TWAINDIRECTMETADATA.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; TWSX_MEMFILE supported\n;\nsetlocal name 'TWSX_MEMFILE supported'\ndsmentry src ds dg_control dat_capability msg_get 'ICAP_XFERMECH,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.MEMFILE.FAIL\nif ',${ret:},' !~contains ',TWSX_MEMFILE,' goto MAIN.MEMFILE.FAIL\necho.passfail '${get:name}' 'pass'\ngoto MAIN.MEMFILE.DONE\n;\n:MAIN.MEMFILE.FAIL\necho.passfail '${get:name}' 'fail - ${sts:} ${ret:}'\nsetlocal certifyresult 'fail'\n:MAIN.MEMFILE.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; TWFF_PDFRASTER supported\n;\nsetlocal name 'TWFF_PDFRASTER supported'\ndsmentry src ds dg_control dat_capability msg_get 'ICAP_IMAGEFILEFORMAT,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.PDFRASTER.FAIL\nif ',${ret:},' !~contains ',TWFF_PDFRASTER,' goto MAIN.PDFRASTER.FAIL\necho.passfail '${get:name}' 'pass'\ngoto MAIN.PDFRASTER.DONE\n;\n:MAIN.PDFRASTER.FAIL\necho.passfail '${get:name}' 'fail - ${sts:} ${ret:}'\nsetlocal certifyresult 'fail'\n:MAIN.PDFRASTER.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DG_CONTROL/DAT_PENDINGXFERS/MSG_RESET supported\n;\nsetlocal name 'DG_CONTROL/DAT_PENDINGXFERS/MSG_RESET supported'\ndsmentry src ds dg_control dat_pendingxfers msg_reset '0,0'\nif '${sts:}' != 'SEQERROR' goto MAIN.RESET.FAIL\necho.passfail '${get:name}' 'pass'\ngoto MAIN.RESET.DONE\n;\n:MAIN.RESET.FAIL\necho.passfail '${get:name}' 'fail - ${sts:} ${ret:}'\nsetlocal certifyresult 'fail'\n:MAIN.RESET.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; ADF check, skip if no ADF\n;\nsetlocal name 'ADF check'\ndsmentry src ds dg_control dat_capability msg_get 'CAP_FEEDERENABLED,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ADFCHECK.FAIL\nif ',${ret:},' !~contains ',TRUE,' goto MAIN.ADFCHECK.SKIP\n;\ndsmentry src ds dg_control dat_capability msg_set 'CAP_FEEDERENABLED,TWON_ONEVALUE,TWTY_BOOL,TRUE'\nif '${sts:}' != 'SUCCESS' goto MAIN.ADFCHECK.FAIL\necho.passfail '${get:name}' 'pass'\ngoto MAIN.ADFCHECK.DONE\n;\n:MAIN.ADFCHECK.FAIL\necho.passfail '${get:name}' 'fail - ${sts:} ${ret:}'\nsetlocal certifyresult 'fail'\ngoto MAIN.DONE\n;\n:MAIN.ADFCHECK.SKIP\necho.passfail '${get:name}' 'skip'\ngoto MAIN.DONE\n:MAIN.ADFCHECK.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DG_CONTROL/DAT_PENDINGXFERS/MSG_STOPFEEDER supported\n;\nsetlocal name 'DG_CONTROL/DAT_PENDINGXFERS/MSG_STOPFEEDER supported'\ndsmentry src ds dg_control dat_pendingxfers msg_stopfeeder '0,0'\nif '${sts:}' != 'SEQERROR' goto MAIN.STOPFEEDER.FAIL\necho.passfail '${get:name}' 'pass'\ngoto MAIN.STOPFEEDER.DONE\n;\n:MAIN.STOPFEEDER.FAIL\necho.passfail '${get:name}' 'fail - ${sts:} ${ret:}'\nsetlocal certifyresult 'fail'\n:MAIN.STOPFEEDER.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; CAP_PAPERDETECTABLE must be TRUE\n;\nsetlocal name 'CAP_PAPERDETECTABLE is TRUE'\ndsmentry src ds dg_control dat_capability msg_getcurrent 'CAP_PAPERDETECTABLE,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.PAPERDETECTABLE.FAIL\nif ',${ret:},' !~contains ',TRUE,' goto MAIN.PAPERDETECTABLE.FAIL\necho.passfail '${get:name}' 'pass'\ngoto MAIN.PAPERDETECTABLE.DONE\n;\n:MAIN.PAPERDETECTABLE.FAIL\necho.passfail '${get:name}' 'fail - ${sts:} ${ret:}'\nsetlocal certifyresult 'fail'\n:MAIN.PAPERDETECTABLE.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; All done...\n;\n:MAIN.DONE\nreturn '${get:certifyresult}'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/110 - Printing Badge/Certification.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Printing Badge\n;   Check if Printing is supported by the driver.  This is a badge, failure does not\n;   invalidate scanner certification.  Passage adds Printing support to the cert.\n;\n;   Printing is complex.  This badge checks that a driver allows the basic ability to\n;   print on a document.  It does not require all the possible printing features\n;   described by TWAIN.\n;\n; Arguments\n;   arg:1 - TW_IDENTITY.ProductName of scanner to test\n;   arg:2 - global to set on fail\n;\n; Globals\n;   g_localcertifyresult - global to report to caller on fail\n;\n; Locals\n;   twidentity.productname - product name of scanner to test\n;   globaltosetonfail - name says it all\n;\n; Returns\n;   (none)\n;\n; History\n;   1.0 - initial release\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize stuff, load tables if not already done for us...\n;\necho.titlesuite 'Printing Badge v1.0 17-Sep-2021'\necho.yellow '*************************************************************************************'\necho.yellow '*** This tests the Printing Badge.  Skipping or failing means the driver does     ***'\necho.yellow '*** not support this functionality.  It does not prevent certification.           ***'\necho.yellow '*************************************************************************************'\n;\nsetlocal twidentity.productname '${arg:1}'\nsetlocal globaltosetonfail '${arg:2}'\nsetglobal g_localcertifyresult 'pass' ; assume success\n;\nif '${get:TW_ARRAY.ItemType}' != '' goto MAIN.LOADTABLES.SKIP\nrun '${folder:certification}/LoadTables'\n:MAIN.LOADTABLES.SKIP\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Run the tests...\n;\ncall CERTIFY '${folder:certification}/Opends'  '${get:twidentity.productname}' 'g_localcertifyresult' 'embedded'\nif '${get:g_localcertifyresult}' == 'fail' goto MAIN.CLOSEDS\n;\ncall CERTIFY 'Printing Badge'                  '${get:twidentity.productname}' 'g_localcertifyresult'\ncall CERTIFY 'DAT_IMAGENATIVEXFER'             '${get:twidentity.productname}' 'g_localcertifyresult' '${folder:parent}'\ncall CERTIFY 'DAT_IMAGEMEMXFER'                '${get:twidentity.productname}' 'g_localcertifyresult' '${folder:parent}'\ncall CERTIFY 'DAT_IMAGEFILEXFER'               '${get:twidentity.productname}' 'g_localcertifyresult' '${folder:parent}'\ncall CERTIFY 'DAT_IMAGEMEMFILEXFER'            '${get:twidentity.productname}' 'g_localcertifyresult' '${folder:parent}'\n;\n:MAIN.CLOSEDS\ncall CERTIFY '${folder:certification}/Closeds' '${get:twidentity.productname}' 'g_localcertifyresult' 'embedded'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Summary and cleanup...\n;\n; Did we pass? (do an extra check)\nif '${get:g_localcertifyresult}' == 'skip' goto MAIN.SKIP\nif '${get:g_localcertifyresult}' != 'pass' goto MAIN.ERROR\necho ''\necho.passfail 'BADGE SUMMARY' 'pass'\nreturn 'pass'\n;\n; Unsupported...\n:MAIN.SKIP\necho ''\necho.passfail 'BADGE SUMMARY' 'skip'\nsetglobal '${get:globaltosetonfail}' 'skip'\nreturn 'skip'\n;\n; Ruh-roh...\n:MAIN.ERROR\necho ''\necho.passfail 'BADGE SUMMARY' 'fail'\nsetglobal '${get:globaltosetonfail}' 'fail'\nreturn 'fail'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Function: Certify\n; arg:1 - script to run\n; arg:2 - TW_IDENTITY.ProductName of scanner to test\n; arg:3 - global value to update on fail\n; arg:4 - embeded flag for open/close, or folder for DAT_IMAGE*XFER calls\n; returns: (none)\n;\n:CERTIFY\n;\n; If a failure has occurred on a previous test, skip the rest of the tests,\n; except for closing, that would be bad...\nif '${arg:1}' ~contains 'Closeds' goto CERTIFY.RUN\nif '${get:${arg:3}}' == 'skip' goto CERTIFY.SKIP\nif '${get:${arg:3}}' == 'fail' goto CERTIFY.FAIL\n;\n; Run the test...\n:CERTIFY.RUN\nrun '${arg:1}' '${arg:2}' '${arg:4}'\nif '${ret:}' == 'skip' goto CERTIFY.SKIP\nif '${ret:}' != 'pass' goto CERTIFY.FAIL\nreturn 'pass'\n;\n; Handle skipping, set the global so we have a record...\n:CERTIFY.SKIP\nsetglobal '${arg:3}' 'skip'\nreturn 'skip'\n;\n; Handle failure, set the global so we have a record...\n:CERTIFY.FAIL\nsetglobal '${arg:3}' 'fail'\nreturn 'fail'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/110 - Printing Badge/DAT_EXTIMAGEINFO.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DAT_EXTIMAGEINFO\n;   Check the return values from DAT_EXTIMAGEINFO to make sure the printer\n;   metadata is being properly reported.\n;\n;   Here's the basic flow:\n;       DAT_EXTIMAGEINFO\n;       confirm that we have the following TWEI_PRINTER* items\n;           TWEI_PRINTERTEXT\n;           TWEI_PRINTER\n;\n; Arguments\n;   arg:1 - indent the passfail text\n;   arg:2 - base filename (no extension)\n;   arg:3 - expected value for TWEI_PRINTER\n;\n; Locals\n;   printerdata - the return value from DAT_EXTIMAGEINFO\n;   name - current test being done\n;   indent - indent the passfail text\n;   twinfo.infoid.index - index to TW_INFO[n].infoid from the start of barcodedata\n;   twinfo.itemtype.index - index to TW_INFO[n].itemtype from the start of barcodedata\n;   twinfo.numitems.index - index to TW_INFO[n].numitems from the start of barcodedata\n;   twinfo.returncode.index - index to TW_INFO[n].returncode from the start of barcodedata\n;   twinfo.item.index - index to TW_INFO[n].item from the start of barcodedata\n;\n; Returns\n;   pass or fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get the extended image info, save the data to 'printerdata'.\n;\nsetlocal indent '${arg:1}    '\nsetlocal name 'dg_image/dat_extimageinfo/msg_get TWEI_PRINTER/TWEI_PRINTERTEXT'\ndsmentry src ds dg_image dat_extimageinfo msg_get '2,TWEI_PRINTER,0,0,0,0,TWEI_PRINTERTEXT,0,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal printerdata '${ret:}'\nfilewrite '${arg:2}_extimageinfo.txt' '${get:printerdata}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Confirm that we got back all the printer extimageinfo data...\n;\nsetlocal name 'Found TWEI_PRINTER'\nif '${get:printerdata}' !contains ',TWEI_PRINTER,' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal name 'Found TWEI_PRINTERTEXT'\nif '${get:printerdata}' !contains ',TWEI_PRINTERTEXT,' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Init our TWINFO indecies for TW_INFO[0]...\n;\nsetlocal twinfo.infoid.index '${get:TW_INFO.InfoID}'\nsetlocal twinfo.itemtype.index '${get:TW_INFO.ItemType}'\nsetlocal twinfo.numitems.index '${get:TW_INFO.NumItems}'\nsetlocal twinfo.returncode.index '${get:TW_INFO.ReturnCode}'\nsetlocal twinfo.item.index '${get:TW_INFO.Item}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Validate the contents of TWEI_PRINTER, which is in TW_INFO[0]...\n;\nsetlocal name 'TW_INFO[0].InfoID is TWEI_PRINTER'\nif '${getindex:printerdata:${get:twinfo.infoid.index}}' != 'TWEI_PRINTER' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'TW_INFO[0].ItemType is TWTY_UINT16'\nif '${getindex:printerdata:${get:twinfo.itemtype.index}}' != 'TWTY_UINT16' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'TW_INFO[0].NumItems is 1'\nif '${getindex:printerdata:${get:twinfo.numitems.index}}' != '1' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'TW_INFO[0].ReturnCode is TWRC_SUCCESS'\nif '${getindex:printerdata:${get:twinfo.returncode.index}}' != 'TWRC_SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'TW_INFO[0].Item is ${arg:3}'\nif '${gettwei:TWEI_PRINTER:${getindex:printerdata:${get:twinfo.item.index}}}' != '${arg:3}' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Increment our TWINFO indecies for TW_INFO[1]...\n;\nincrement twinfo.infoid.index '${get:twinfo.infoid.index}' 5 ; skip to the InfoID in the next TW_INFO\nincrement twinfo.itemtype.index '${get:twinfo.itemtype.index}' 5 ; skip to the InfoID in the next TW_INFO\nincrement twinfo.numitems.index '${get:twinfo.numitems.index}' 5 ; skip to the NumItems in the next TW_INFO\nincrement twinfo.returncode.index '${get:twinfo.returncode.index}' 5 ; skip to the ReturnCode in the next TW_INFO\nincrement twinfo.item.index '${get:twinfo.item.index}' 5 ; skip to the ReturnCode in the next TW_INFO\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Validate the contents of TWEI_PRINTERTEXT, which is in TW_INFO[1]...\n;\nsetlocal name 'TW_INFO[1].InfoID is TWEI_PRINTERTEXT'\nif '${getindex:printerdata:${get:twinfo.infoid.index}}' != 'TWEI_PRINTERTEXT' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'TW_INFO[1].ItemType is TWTY_STR255'\nif '${getindex:printerdata:${get:twinfo.itemtype.index}}' != 'TWTY_STR255' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'TW_INFO[1].NumItems is 1'\nif '${getindex:printerdata:${get:twinfo.numitems.index}}' != '1' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'TW_INFO[1].ReturnCode is TWRC_SUCCESS'\nif '${getindex:printerdata:${get:twinfo.returncode.index}}' != 'TWRC_SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n; The printer text is behind a handle...\nsetlocal handle ${getindex:printerdata:${get:twinfo.item.index}}\nsetlocal printertext '${gethandle:${get:handle}:TWTY_STR255:0}'\n;\nsetlocal name 'TW_INFO[1].Item contains \"TWAIN\" (${get:printertext})'\nif '${get:printertext}' !contains 'TWAIN' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'TW_INFO[1].Item contains \"TEST\" (${get:printertext})'\nif '${get:printertext}' !contains 'TEST' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nfree handle handle\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Summary and cleanup...\n;\n; We passed...\n:MAIN.PASS\nreturn 'pass'\n;\n; Ruh-roh...\n:MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'fail - ${sts:} ${ret:}'\nreturn 'fail'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/110 - Printing Badge/DAT_IMAGEFILEXFER.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DAT_IMAGEFILEXFER\n;   This test scans one sheet of paper for the default pixeltype.  An ADF\n;   is required to pass this test, but that was already been tested before\n;   we got to this function.\n;\n;   Here's the basic flow:\n;       SetCapabilities\n;       start scanning\n;       while images\n;           transfer image\n;           DAT_EXTIMAGEINFO\n;           end image\n;       end\n;       end scanning\n;       verify the results\n;\n;   The test passes if:\n;       - all of the capabilities can be set\n;       - TWEI_PRINTER matches CAP_PRINTER\n;       - TWEI_PRINTERSTRING starts with 'TWAIN' and ends with 'TEST'\n;\n; Arguments\n;   arg:1 - TW_IDENTITY.ProductName of scanner to test\n;   arg:2 - test name for the image folder\n;\n; Globals\n;   g_capprinter - value of CAP_PRINTER, used to check TWEI_PRINTER\n;\n; Locals\n;   name - current test being done\n;   indent - indent the passfail text\n;   twimageinfo.compression - compression for current image\n;   image.count - count of images from 1\n;   image.folder - folder to put the images in\n;\n; Returns\n;   pass or fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; If not supported, quietly leave...\n;\nif '${get:g_xfermech}' ~contains 'TWSX_FILE' goto MAIN.CONTINUE\nreturn 'pass'\n:MAIN.CONTINUE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize...\n;\necho.titletest 'DAT_IMAGEFILEXFER'\n;\nsetlocal indent ''\nsetlocal image.count '0'\nsetlocal image.folder '${folder:certimages}/${arg:2}/DAT_IMAGEFILEXFER'\nsetlocal image.showname ''\n;\nsetglobal g_capprinter ''\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Prompt the user...\n;\necho.prompt\necho.prompt \"Scanning will take place during this test.  There will be no\"\necho.prompt \"need to press any button on the TWAIN user interface to start\"\necho.prompt \"the scanner.  A progress indicator may appear during scanning.\"\necho.prompt\necho.prompt \"Place 1 sheet in the scanner's feeder.  The scanner will print\"\necho.prompt \"text on this sheet.\"\necho.prompt\npause '(press the ENTER key when ready to continue)'\necho.prompt\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Clean the image folder for this test...\n;\nimage cleanfolderandmeta '${get:image.folder}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; SetCapabilities\n; This resets the driver and sets all the capabilities we need for the test.\n; If its return code is not 'pass', end with an error\n;\nrun SetCapabilities 'TWSX_FILE' '${get:indent}' g_capprinter\nif '${ret:}' != 'pass' goto MAIN.ERROR.FAIL\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Check for paper in the feeder, prompt the user if we don't find any...\n;\ndsmentry src ds dg_control dat_capability msg_getcurrent 'CAP_FEEDERLOADED,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.FEEDERLOADED.DONE\nif '${ret:${get:TW_ONEVALUE.Item}}' ~~ 'TRUE' goto MAIN.FEEDERLOADED.DONE\necho.prompt\necho.prompt \"Place paper in the scanner's feeder.\"\npause '(press the ENTER key when ready to continue)'\n:MAIN.FEEDERLOADED.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Start scanning...\n;\nsetlocal name 'dg_control/dat_userinterface/msg_enableds'\nwait reset\ndsmentry src null dg_control dat_userinterface msg_enableds '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Wait for MSG_XFERREADY, if we don't see it then scoot...\n;\nsetlocal name 'wait ${get:sys_waittimeout} seconds for MSG_XFERREADY'\nwait '${get:sys_waittimeout}000'\nif '${ret:}' !~contains 'msg_xferready' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get information about the image...\n;\n:MAIN.IMAGEINFO.NEXT\nsetlocal name 'dg_image/dat_imageinfo/msg_get'\ndsmentry src ds dg_image dat_imageinfo msg_get '0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\nsetlocal twimageinfo.compression '${ret:${get:index.twimageinfo.compression}}'\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set up the file transfer...\n;\nincrement image.count '${get:image.count}' 1\nif '${get:twimageinfo.compression}' == 'JPEG' goto MAIN.SETUPFILEXFER.JPEG\nsetlocal image.showname 'DAT_IMAGEFILEXFER/adf${format:D6|${get:image.count}}.tif'\nsetlocal twsetupfilexfer.filename '${get:image.folder}/adf${format:D6|${get:image.count}}.tif'\nsetlocal twsetupfilexfer.format 'TWFF_TIFF'\ngoto MAIN.SETUPFILEXFER\n:MAIN.SETUPFILEXFER.JPEG\nsetlocal image.showname 'DAT_IMAGEFILEXFER/adf${format:D6|${get:image.count}}.jpg'\nsetlocal twsetupfilexfer.filename '${get:image.folder}/adf${format:D6|${get:image.count}}.jpg'\nsetlocal twsetupfilexfer.format 'TWFF_JFIF'\n:MAIN.SETUPFILEXFER\nsetlocal name 'dg_control/dat_setupfilexfer/msg_set'\ndsmentry src ds dg_control dat_setupfilexfer msg_set '\"${get:twsetupfilexfer.filename}\",${get:twsetupfilexfer.format},0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Transfer the image...\n;\nsetlocal name 'dg_image/dat_imagefilexfer/msg_get'\ndsmentry src ds dg_image dat_imagefilexfer msg_get null\nif '${sts:}' != 'XFERDONE' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\necho.passfail '${get:indent}image <${get:image.showname}>' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DAT_EXTIMAGEINFO\n; Check the printer metadata...\n;\nrun DAT_EXTIMAGEINFO '${get:indent}' '${get:image.folder}/adf${format:D6|${get:image.count}}' ${get:g_capprinter}\nif '${ret:}' != 'pass' goto MAIN.ERROR.FAIL\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; End the transfer, see if we're done...\n;\nsetlocal name 'dg_control/dat_pendingxfers/msg_endxfer'\ndsmentry src ds dg_control dat_pendingxfers msg_endxfer '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nif '${ret:${get:TW_PENDINGXFERS.Count}}' != '0' goto MAIN.IMAGEINFO.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We're out of images, so disable...\n;\nsetlocal name 'dg_control/dat_userinterface/msg_disableds'\ndsmentry src ds dg_control dat_userinterface msg_disableds '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Summary and cleanup...\n;\n; We passed...\n:MAIN.PASS\necho.passfail 'SUMMARY' 'pass'\nreturn 'pass'\n;\n; Ruh-roh...\n:MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'fail - ${sts:} ${ret:}'\necho.passfail 'SUMMARY' 'fail'\nrollback state4\nreturn 'fail'\n;\n; Ruh-roh...\n:MAIN.ERROR.FAIL\necho.passfail 'SUMMARY' 'fail'\nrollback state4\nreturn 'fail'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/110 - Printing Badge/DAT_IMAGEMEMFILEXFER.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DAT_IMAGEMEMFILEXFER\n;   This test scans one sheet of paper for the default pixeltype.  An ADF\n;   is required to pass this test, but that was already been tested before\n;   we got to this function.\n;\n;   Here's the basic flow:\n;       SetCapabilities\n;       start scanning\n;       while images\n;           transfer image\n;           DAT_EXTIMAGEINFO\n;           end image\n;       end\n;       end scanning\n;       verify the results\n;\n;   The test passes if:\n;       - all of the capabilities can be set\n;       - TWEI_PRINTER matches CAP_PRINTER\n;       - TWEI_PRINTERSTRING starts with 'TWAIN' and ends with 'TEST'\n;\n; Arguments\n;   arg:1 - TW_IDENTITY.ProductName of scanner to test\n;   arg:2 - test name for the image folder\n;\n; Globals\n;   g_capprinter - value of CAP_PRINTER, used to check TWEI_PRINTER\n;\n; Locals\n;   name - current test being done\n;   indent - indent the passfail text\n;   imagememxfer - result of DAT_IMAGEMEMXFER call\n;   setupmemxfer.preferred - preferred field from DAT_SETUPMEMXFER call\n;   image.count - count of images from 1\n;   image.folder - folder to put the images in\n;\n; Returns\n;   pass/fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; If not supported, quietly leave...\n;\nif '${get:g_xfermech}' ~contains 'TWSX_MEMFILE' goto MAIN.CONTINUE\nreturn 'pass'\n:MAIN.CONTINUE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize...\n;\necho.titletest 'DAT_IMAGEMEMFILEXFER'\n;\nsetlocal indent ''\nsetlocal image.pointer '0'\nsetlocal image.count '0'\nsetlocal image.folder '${folder:certimages}/${arg:2}/DAT_IMAGEMEMFILEXFER'\n;\nsetglobal g_capprinter ''\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Prompt the user...\n;\necho.prompt\necho.prompt \"Scanning will take place during this test.  There will be no\"\necho.prompt \"need to press any button on the TWAIN user interface to start\"\necho.prompt \"the scanner.  A progress indicator may appear during scanning.\"\necho.prompt\necho.prompt \"Place 1 sheet in the scanner's feeder.  The scanner will print\"\necho.prompt \"text on this sheet.\"\necho.prompt\npause '(press the ENTER key when ready to continue)'\necho.prompt\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Clean the image folder for this test...\n;\nimage cleanfolderandmeta '${get:image.folder}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; SetCapabilities\n; This resets the driver and sets all the capabilities we need for the test.\n; If its return code is not 'pass', end with an error\n;\nrun SetCapabilities 'TWSX_MEMFILE' '${get:indent}' g_capprinter\nif '${ret:}' != 'pass' goto MAIN.ERROR.FAIL\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Check for paper in the feeder, prompt the user if we don't find any...\n;\ndsmentry src ds dg_control dat_capability msg_getcurrent 'CAP_FEEDERLOADED,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.FEEDERLOADED.DONE\nif '${ret:${get:TW_ONEVALUE.Item}}' ~~ 'TRUE' goto MAIN.FEEDERLOADED.DONE\necho.prompt\necho.prompt \"Place paper in the scanner's feeder.\"\npause '(press the ENTER key when ready to continue)'\n:MAIN.FEEDERLOADED.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get the preferred size for memory transfers, and allocate\n; a pointer for the memory transfers...\n;\nsetlocal indent '    '\nsetlocal name 'dg_control/dat_setupmemxfer/msg_get'\ndsmentry src ds dg_control dat_setupmemxfer msg_get '0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'TW_SETUPMEMXFER.Preferred > 0'\nsetlocal setupmemxfer.preferred '${ret:${get:TW_SETUPMEMXFER.Preferred}}'\nif '${get:setupmemxfer.preferred}' <= '0' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'allocate pointer for ${get:setupmemxfer.preferred} bytes'\nfree pointer image.pointer ; for the last loop\nallocate pointer image.pointer '${get:setupmemxfer.preferred}'\nif '${get:image.pointer}' == '0' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set DAT_SETUPFILEXFER to TWFF_TIFF\n;\nsetlocal name 'dg_control/dat_setupfilexfer/msg_set TWFF_TIFF'\ndsmentry src null dg_control dat_setupfilexfer msg_set 'file,TWFF_TIFF,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Start scanning...\n;\nsetlocal name 'dg_control/dat_userinterface/msg_enableds'\nwait reset\ndsmentry src null dg_control dat_userinterface msg_enableds '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Wait for MSG_XFERREADY, if we don't see it then scoot...\n;\nsetlocal name 'wait ${get:sys_waittimeout} seconds for MSG_XFERREADY'\nwait '${get:sys_waittimeout}000'\nif '${ret:}' !~contains 'msg_xferready' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Do a memory file transfer...\n; This little song and dance with the states is so that we can\n; start the transfer in state 6 with each new image, but switch\n; to state 7 if we need multiple calls to capture the current\n; image...\n;\n; The saved images will be in TIFF format, which includes TIFF\n; JPEG (the better form, where a simple TIFF header is added).\n;\nincrement image.count '${get:image.count}' 1\nimage free memfileimage\n;\n:MAIN.IMAGEMEMFILEXFER.NEXT\nsetlocal name 'dg_image/dat_imagememxfer/msg_get'\ndsmentry src ds dg_image dat_imagememfilexfer msg_get '0,0,0,0,0,0,0,9,${get:setupmemxfer.preferred},${get:image.pointer}'\nsetlocal imagememxfer '${ret:}'\nif '${sts:}' == 'XFERDONE' goto MAIN.IMAGEMEMFILEXFER.XFERDONE\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\n;\necho.passfail '${get:indent}${get:name} SUCCESS' 'pass'\nimage append memfileimage '${get:imagememxfer}'\ngoto MAIN.IMAGEMEMFILEXFER.NEXT\n;\n:MAIN.IMAGEMEMFILEXFER.XFERDONE\necho.passfail '${get:indent}${get:name} XFERDONE' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Append the last strip transferred, and save the image...\n;\nimage append memfileimage '${get:imagememxfer}'\nimage save memfileimage memfile '${get:image.folder}/adf${format:D6|${get:image.count}}'\necho.passfail '${get:indent}image <${ret:}>' 'pass'\nimage free memfileimage\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DAT_EXTIMAGEINFO\n; Check the printer metadata...\n;\nrun DAT_EXTIMAGEINFO '${get:indent}' '${get:image.folder}/adf${format:D6|${get:image.count}}' ${get:g_capprinter}\nif '${ret:}' != 'pass' goto MAIN.ERROR.FAIL\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; End the transfer, see if we're done...\n;\nsetlocal name 'dg_control/dat_pendingxfers/msg_endxfer'\ndsmentry src ds dg_control dat_pendingxfers msg_endxfer '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nincrement image.count '${get:image.count}' 1\nif '${ret:${get:TW_PENDINGXFERS.Count}}' != '0' goto MAIN.IMAGEMEMFILEXFER.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We're out of images, so disable...\n;\nsetlocal name 'dg_control/dat_userinterface/msg_disableds'\ndsmentry src ds dg_control dat_userinterface msg_disableds '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Summary and cleanup...\n;\n; We passed...\n:MAIN.PASS\nimage free memfileimage\nfree pointer image.pointer\necho.passfail 'SUMMARY' 'pass'\nreturn 'pass'\n;\n; Ruh-roh...\n:MAIN.ERROR.ECHOPASSFAIL\nimage free memfileimage\nfree pointer image.pointer\necho.passfail '${get:indent}${get:name}' 'fail - ${sts:} ${ret:}'\necho.passfail 'SUMMARY' 'fail'\nrollback state4\nreturn 'fail'\n;\n; Ruh-roh...\n:MAIN.ERROR.FAIL\nimage free memfileimage\nfree pointer image.pointer\necho.passfail 'SUMMARY' 'fail'\nrollback state4\nreturn 'fail'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/110 - Printing Badge/DAT_IMAGEMEMXFER.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DAT_IMAGEMEMXFER\n;   This test scans one sheet of paper for the default pixeltype.  An ADF\n;   is required to pass this test, but that was already been tested before\n;   we got to this function.\n;\n;   Here's the basic flow:\n;       SetCapabilities\n;       start scanning\n;       while images\n;           transfer image\n;           DAT_EXTIMAGEINFO\n;           end image\n;       end\n;       end scanning\n;       verify the results\n;\n;   The test passes if:\n;       - all of the capabilities can be set\n;       - TWEI_PRINTER matches CAP_PRINTER\n;       - TWEI_PRINTERSTRING starts with 'TWAIN' and ends with 'TEST'\n;\n; Arguments\n;   arg:1 - TW_IDENTITY.ProductName of scanner to test\n;   arg:2 - test name for the image folder\n;\n; Globals\n;   g_capprinter - value of CAP_PRINTER, used to check TWEI_PRINTER\n;\n; Locals\n;   name - current test being done\n;   indent - indent the passfail text\n;   imageinfo - metadata for the current image\n;   imagememxfer - result of DAT_IMAGEMEMXFER call\n;   setupmemxfer.preferred - preferred field from DAT_SETUPMEMXFER call\n;   image.count - count of images from 1\n;   image.folder - folder to put the images in\n;\n; Returns\n;   pass/fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize...\n;\necho.titletest 'DAT_IMAGEMEMXFER'\n;\nsetlocal indent ''\nsetlocal image.pointer '0'\nsetlocal image.count '0'\nsetlocal image.folder '${folder:certimages}/${arg:2}/DAT_IMAGEMEMXFER'\n;\nsetglobal g_capprinter ''\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Prompt the user...\n;\necho.prompt\necho.prompt \"Scanning will take place during this test.  There will be no\"\necho.prompt \"need to press any button on the TWAIN user interface to start\"\necho.prompt \"the scanner.  A progress indicator may appear during scanning.\"\necho.prompt\necho.prompt \"Place 1 sheet in the scanner's feeder.  The scanner will print\"\necho.prompt \"text on this sheet.\"\necho.prompt\npause '(press the ENTER key when ready to continue)'\necho.prompt\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Clean the image folder for this test...\n;\nimage cleanfolderandmeta '${get:image.folder}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; SetCapabilities\n; This resets the driver and sets all the capabilities we need for the test.\n; If its return code is not 'pass', end with an error\n;\nrun SetCapabilities 'TWSX_MEMORY' '${get:indent}' g_capprinter\nif '${ret:}' != 'pass' goto MAIN.ERROR.FAIL\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Check for paper in the feeder, prompt the user if we don't find any...\n;\ndsmentry src ds dg_control dat_capability msg_getcurrent 'CAP_FEEDERLOADED,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.FEEDERLOADED.DONE\nif '${ret:${get:TW_ONEVALUE.Item}}' ~~ 'TRUE' goto MAIN.FEEDERLOADED.DONE\necho.prompt\necho.prompt \"Place paper in the scanner's feeder.\"\npause '(press the ENTER key when ready to continue)'\n:MAIN.FEEDERLOADED.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get the preferred size for memory transfers, and allocate\n; a pointer for the memory transfers...\n;\nsetlocal indent '    '\nsetlocal name 'dg_control/dat_setupmemxfer/msg_get'\ndsmentry src ds dg_control dat_setupmemxfer msg_get '0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'TW_SETUPMEMXFER.Preferred > 0'\nsetlocal setupmemxfer.preferred '${ret:${get:TW_SETUPMEMXFER.Preferred}}'\nif '${get:setupmemxfer.preferred}' <= '0' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'allocate pointer for ${get:setupmemxfer.preferred} bytes'\nfree pointer image.pointer ; for the last loop\nallocate pointer image.pointer '${get:setupmemxfer.preferred}'\nif '${get:image.pointer}' == '0' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Start scanning...\n;\nsetlocal name 'dg_control/dat_userinterface/msg_enableds'\nwait reset\ndsmentry src null dg_control dat_userinterface msg_enableds '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Wait for MSG_XFERREADY, if we don't see it then scoot...\n;\nsetlocal name 'wait ${get:sys_waittimeout} seconds for MSG_XFERREADY'\nwait '${get:sys_waittimeout}000'\nif '${ret:}' !~contains 'msg_xferready' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Do a memory transfer...\n; This little song and dance with the states is so that we can\n; start the transfer in state 6 with each new image, but switch\n; to state 7 if we need multiple calls to capture the current\n; image...\n;\n; The saved images will be in TIFF format, which includes TIFF\n; JPEG (the better form, where a simple TIFF header is added).\n;\nincrement image.count '${get:image.count}' 1\nimage free memimage\n;\n:MAIN.IMAGEMEMXFER.NEXT\nsetlocal name 'dg_image/dat_imagememxfer/msg_get'\ndsmentry src ds dg_image dat_imagememxfer msg_get '0,0,0,0,0,0,0,9,${get:setupmemxfer.preferred},${get:image.pointer}'\nsetlocal imagememxfer '${ret:}'\nif '${sts:}' == 'XFERDONE' goto MAIN.IMAGEMEMXFER.XFERDONE\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\n;\necho.passfail '${get:indent}${get:name} SUCCESS' 'pass'\nimage append memimage '${get:imagememxfer}'\ngoto MAIN.IMAGEMEMXFER.NEXT\n;\n:MAIN.IMAGEMEMXFER.XFERDONE\necho.passfail '${get:indent}${get:name} XFERDONE' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We need image info to make sense of this data...\n;\nsetlocal name 'dg_image/dat_imageinfo/msg_get'\ndsmentry src ds dg_image dat_imageinfo msg_get '0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0'\nsetlocal imageinfo '${ret:}'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Append the last strip transferred, and save the image...\n;\nimage append memimage '${get:imagememxfer}'\nimage addheader memimage '${get:imageinfo}'\nimage save memimage memory '${get:image.folder}/adf${format:D6|${get:image.count}}'\necho.passfail '${get:indent}image <${ret:}>' 'pass'\nimage free memimage\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DAT_EXTIMAGEINFO\n; Check the printer metadata...\n;\nrun DAT_EXTIMAGEINFO '${get:indent}' '${get:image.folder}/adf${format:D6|${get:image.count}}' ${get:g_capprinter}\nif '${ret:}' != 'pass' goto MAIN.ERROR.FAIL\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; End the transfer, see if we're done.  If not, go back\n; to MAIN.IMAGENATIVEXFER.NEXT for another image...\n;\nsetlocal name 'dg_control/dat_pendingxfers/msg_endxfer'\ndsmentry src ds dg_control dat_pendingxfers msg_endxfer '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nincrement image.count '${get:image.count}' 1\nif '${ret:${get:TW_PENDINGXFERS.Count}}' != '0' goto MAIN.IMAGEMEMXFER.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We're out of images, so disable...\n;\nsetlocal name 'dg_control/dat_userinterface/msg_disableds'\ndsmentry src ds dg_control dat_userinterface msg_disableds '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Summary and cleanup...\n;\n; We passed...\n:MAIN.PASS\nimage free memimage\nfree pointer image.pointer\necho.passfail 'SUMMARY' 'pass'\nreturn 'pass'\n;\n; Ruh-roh...\n:MAIN.ERROR.ECHOPASSFAIL\nimage free memimage\nfree pointer image.pointer\necho.passfail '${get:indent}${get:name}' 'fail - ${sts:} ${ret:}'\necho.passfail 'SUMMARY' 'fail'\nrollback state4\nreturn 'fail'\n;\n; Ruh-roh...\n:MAIN.ERROR.FAIL\nimage free memimage\nfree pointer image.pointer\necho.passfail 'SUMMARY' 'fail'\nrollback state4\nreturn 'fail'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/110 - Printing Badge/DAT_IMAGENATIVEXFER.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DAT_IMAGENATIVEXFER\n;   This test scans one sheet of paper for the default pixeltype.  An ADF\n;   is required to pass this test, but that was already been tested before\n;   we got to this function.\n;\n;   Here's the basic flow:\n;       SetCapabilities\n;       start scanning\n;       while images\n;           transfer image\n;           DAT_EXTIMAGEINFO\n;           end image\n;       end\n;       end scanning\n;       verify the results\n;\n;   The test passes if:\n;       - all of the capabilities can be set\n;       - TWEI_PRINTER matches CAP_PRINTER\n;       - TWEI_PRINTERSTRING starts with 'TWAIN' and ends with 'TEST'\n;\n; Arguments\n;   arg:1 - ignore\n;   arg:2 - test name for the image folder\n;\n; Globals\n;   g_capprinter - value of CAP_PRINTER, used to check TWEI_PRINTER\n;\n; Locals\n;   name - current test being done\n;   indent - indent the passfail text\n;   image.handle - native handle\n;   image.count - count of images from 1\n;   image.folder - folder to put the images in\n;\n; Returns\n;   pass/fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize...\n;\necho.titletest 'DAT_IMAGENATIVEXFER'\n;\nsetlocal indent ''\nsetlocal image.handle '0'\nsetlocal image.count '1'\nsetlocal image.folder '${folder:certimages}/${arg:2}/DAT_IMAGENATIVEXFER'\n;\nsetglobal g_capprinter ''\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Prompt the user...\n;\necho.prompt\necho.prompt \"Scanning will take place during this test.  There will be no\"\necho.prompt \"need to press any button on the TWAIN user interface to start\"\necho.prompt \"the scanner.  A progress indicator may appear during scanning.\"\necho.prompt\necho.prompt \"Place 1 sheet in the scanner's feeder.  The scanner will print\"\necho.prompt \"text on this sheet.\"\necho.prompt\npause '(press the ENTER key when ready to continue)'\necho.prompt\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Clean the image folder for this test...\n;\nimage cleanfolderandmeta '${get:image.folder}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; SetCapabilities\n; This resets the driver and sets all the capabilities we need for the test.\n; If its return code is not 'pass', end with an error\n;\nrun SetCapabilities 'TWSX_NATIVE' '${get:indent}' 'g_capprinter'\nif '${ret:}' != 'pass' goto MAIN.ERROR.FAIL\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Check for paper in the feeder, prompt the user if we don't find any...\n;\ndsmentry src ds dg_control dat_capability msg_getcurrent 'CAP_FEEDERLOADED,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.FEEDERLOADED.DONE\nif '${ret:${get:TW_ONEVALUE.Item}}' ~~ 'TRUE' goto MAIN.FEEDERLOADED.DONE\necho.prompt\necho.prompt \"Place paper in the scanner's feeder.\"\npause '(press the ENTER key when ready to continue)'\n:MAIN.FEEDERLOADED.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Start scanning...\n;\nsetlocal indent '    '\nsetlocal name 'dg_control/dat_userinterface/msg_enableds'\nwait reset\ndsmentry src null dg_control dat_userinterface msg_enableds '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Wait for MSG_XFERREADY, if we don't see it then scoot...\n;\nsetlocal name 'wait ${get:sys_waittimeout} seconds for MSG_XFERREADY'\nwait '${get:sys_waittimeout}000'\nif '${ret:}' !~contains 'msg_xferready' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Do a native transfer...\n;\n:MAIN.IMAGENATIVEXFER.NEXT\nsetlocal indent '    '\nsetlocal name 'dg_control/dat_imagenativexfer/msg_get'\ndsmentry src ds dg_image dat_imagenativexfer msg_get '0'\nsetlocal image.handle '${ret:}'\nif '${sts:}' != 'XFERDONE' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Save the image...\n;\nimage save image.handle native '${get:image.folder}/adf${format:D6|${get:image.count}}'\necho.passfail '${get:indent}image <${ret:}>' 'pass'\nfree handle image.handle\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DAT_EXTIMAGEINFO\n; Check the printer metadata...\n;\nrun DAT_EXTIMAGEINFO '${get:indent}' '${get:image.folder}/adf${format:D6|${get:image.count}}' ${get:g_capprinter}\nif '${ret:}' != 'pass' goto MAIN.ERROR.FAIL\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; End the transfer, see if we're done.  If not, go back\n; to MAIN.IMAGENATIVEXFER.NEXT for another image...\n;\nsetlocal name 'dg_control/dat_pendingxfers/msg_endxfer'\ndsmentry src ds dg_control dat_pendingxfers msg_endxfer '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nincrement image.count '${get:image.count}' 1 ; count the image\nif '${ret:${get:TW_PENDINGXFERS.Count}}' != '0' goto MAIN.IMAGENATIVEXFER.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We're out of images, so disable...\n;\nsetlocal name 'dg_control/dat_userinterface/msg_disableds'\ndsmentry src ds dg_control dat_userinterface msg_disableds '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Summary and cleanup...\n;\n; We passed...\n:MAIN.PASS\nfree handle image.handle\necho.passfail 'SUMMARY' 'pass'\nreturn 'pass'\n;\n; Ruh-roh...\n:MAIN.ERROR.ECHOPASSFAIL\nfree handle image.handle\necho.passfail '${get:indent}${get:name}' 'fail - ${sts:} ${ret:}'\necho.passfail 'SUMMARY' 'fail'\nrollback state4\nreturn 'fail'\n;\n; Ruh-roh...\n:MAIN.ERROR.FAIL\nfree handle image.handle\necho.passfail 'SUMMARY' 'fail'\nrollback state4\nreturn 'fail'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/110 - Printing Badge/Printing Badge.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Printing Badge\n;   These tests establish the minimum requirements for a TWAIN driver to claim that is has printing\n;   support.  To pass the driver must support the following capabilites:\n;      CAP_PRINTERENABLED\n;      CAP_PRINTER\n;      CAP_PRINTERMODE\n;      CAP_PRINTERSTRING\n;      CAP_PRINTERINDEX\n;      CAP_PRINTERSUFFIX\n;      CAP_PRINTERVERTICALOFFSET\n;\n;   And the following extended image info items:\n;      TWEI_PRINTERTEXT\n;      TWEI_PRINTER\n;\n; Arguments\n;   (none)\n;\n; Globals\n;   (none)\n;\n; Locals\n;   name - name of a test\n;   certifyresult - track if we fail\n;\n; Returns\n;   pass/fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize...\n;\nsetlocal certifyresult 'pass' ; assume we'll pass, this is our return value\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Reset to a known state, this is mandatory...\n;\nsetlocal name 'MSG_RESETALL'\ndsmentry src ds dg_control dat_capability msg_resetall '0,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.MSG_RESETALL.FAIL\necho.passfail '${get:name}' 'pass'\ngoto MAIN.MSG_RESETALL.DONE\n;\n:MAIN.MSG_RESETALL.FAIL\necho.passfail '${get:name}' 'skip - ${sts:} ${ret:}'\nsetlocal certifyresult 'fail'\ngoto MAIN.DONE\n:MAIN.MSG_RESETALL.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; CAP_PRINTERENABLED must be supported, and must offer both TRUE\n; and FALSE, and must currently be FALSE (as a result of MSG_RESETALL,\n; otherwise skip it all...\n;\nsetlocal name 'CAP_PRINTERENBLED is supported'\ndsmentry src ds dg_control dat_capability msg_get 'CAP_PRINTERENABLED,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.CAP_PRINTERENABLEDSUPPORTED.SKIP\nif ',${ret:},' !~contains ',TRUE,' goto MAIN.CAP_PRINTERENABLEDSUPPORTED.SKIP\nif ',${ret:},' !~contains ',FALSE,' goto MAIN.CAP_PRINTERENABLEDSUPPORTED.SKIP\necho.passfail '${get:name}' 'pass'\ngoto MAIN.CAP_PRINTERENABLEDSUPPORTED.DONE\n;\n:MAIN.CAP_PRINTERENABLEDSUPPORTED.SKIP\necho.passfail '${get:name}' 'skip - ${sts:} ${ret:}'\nsetlocal certifyresult 'skip'\ngoto MAIN.DONE\n:MAIN.CAP_PRINTERENABLEDSUPPORTED.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; CAP_SUPPORTEDCAPS: check that all required capabilities are reported\n;\nsetlocal name 'CAP_SUPPORTEDCAPS MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'CAP_SUPPORTEDCAPS,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.CAP_SUPPORTEDCAPS.FAIL\necho.passfail '${get:name}' 'pass'\n;\nsetlocal name 'CAP_SUPPORTEDCAPS CAP_PRINTERENABLED found'\nif ',${ret:},' !~contains ',CAP_PRINTERENABLED,' goto MAIN.CAP_SUPPORTEDCAPS.FAIL\necho.passfail '${get:name}' 'pass'\n;\nsetlocal name 'CAP_SUPPORTEDCAPS CAP_PRINTER found'\nif ',${ret:},' !~contains ',CAP_PRINTER,' goto MAIN.CAP_SUPPORTEDCAPS.FAIL\necho.passfail '${get:name}' 'pass'\n;\nsetlocal name 'CAP_SUPPORTEDCAPS CAP_PRINTERMODE found'\nif ',${ret:},' !~contains ',CAP_PRINTERMODE,' goto MAIN.CAP_SUPPORTEDCAPS.FAIL\necho.passfail '${get:name}' 'pass'\n;\nsetlocal name 'CAP_SUPPORTEDCAPS CAP_PRINTERSTRING found'\nif ',${ret:},' !~contains ',CAP_PRINTERSTRING,' goto MAIN.CAP_SUPPORTEDCAPS.FAIL\necho.passfail '${get:name}' 'pass'\n;\nsetlocal name 'CAP_SUPPORTEDCAPS CAP_PRINTERINDEX found'\nif ',${ret:},' !~contains ',CAP_PRINTERINDEX,' goto MAIN.CAP_SUPPORTEDCAPS.FAIL\necho.passfail '${get:name}' 'pass'\n;\nsetlocal name 'CAP_SUPPORTEDCAPS CAP_PRINTERSUFFIX found'\nif ',${ret:},' !~contains ',CAP_PRINTERSUFFIX,' goto MAIN.CAP_SUPPORTEDCAPS.FAIL\necho.passfail '${get:name}' 'pass'\n;\nsetlocal name 'CAP_SUPPORTEDCAPS CAP_PRINTERVERTICALOFFSET found'\nif ',${ret:},' !~contains ',CAP_PRINTERVERTICALOFFSET,' goto MAIN.CAP_SUPPORTEDCAPS.FAIL\necho.passfail '${get:name}' 'pass'\ngoto MAIN.CAP_SUPPORTEDCAPS.DONE\n;\n:MAIN.CAP_SUPPORTEDCAPS.FAIL\necho.passfail '${get:name}' 'fail - ${sts:} ${ret:}'\nsetlocal certifyresult 'fail'\ngoto MAIN.DONE\n:MAIN.CAP_SUPPORTEDCAPS.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; ICAP_SUPPORTEDEXTIMAGEINFO: check that all metadata is reported\n;\nsetlocal name 'ICAP_SUPPORTEDEXTIMAGEINFO MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'ICAP_SUPPORTEDEXTIMAGEINFO,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ICAP_SUPPORTEDEXTIMAGEINFO.FAIL\necho.passfail '${get:name}' 'pass'\n;\nsetlocal name 'ICAP_SUPPORTEDEXTIMAGEINFO TWEI_PRINTERTEXT found'\nif ',${ret:},' !~contains ',TWEI_PRINTERTEXT,' goto MAIN.ICAP_SUPPORTEDEXTIMAGEINFO.FAIL\necho.passfail '${get:name}' 'pass'\n;\nsetlocal name 'ICAP_SUPPORTEDEXTIMAGEINFO TWEI_PRINTER found'\nif ',${ret:},' !~contains ',TWEI_PRINTER,' goto MAIN.ICAP_SUPPORTEDEXTIMAGEINFO.FAIL\necho.passfail '${get:name}' 'pass'\ngoto MAIN.ICAP_SUPPORTEDEXTIMAGEINFO.DONE\n;\n:MAIN.ICAP_SUPPORTEDEXTIMAGEINFO.FAIL\necho.passfail '${get:name}' 'fail - ${sts:} ${ret:}'\nsetlocal certifyresult 'fail'\n:MAIN.ICAP_SUPPORTEDEXTIMAGEINFO.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; ICAP_XFERMECH: get the xfermech so we know which tests to run\n;\nsetlocal name 'ICAP_XFERMECH MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'ICAP_XFERMECH,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ICAP_XFERMECH.FAIL\necho.passfail '${get:name}' 'pass'\nsetglobal g_xfermech '${ret:}\ngoto MAIN.ICAP_XFERMECH.DONE\n;\n:MAIN.ICAP_XFERMECH.FAIL\necho.passfail '${get:name}' 'fail - ${sts:} ${ret:}'\nsetlocal certifyresult 'fail'\n:MAIN.ICAP_XFERMECH.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; All done...\n;\n:MAIN.DONE\nreturn '${get:certifyresult}'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/110 - Printing Badge/SetCapabilities.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; SetCapabilities\n;   Reset the driver's capabilites, and then set capabilities for this test.  Note that one can only\n;   get this badge for the ADF.  This is a production mode feature, so we're not testing the flatbed.\n;   Printing performs two main tasks: it endorses a sheet of paper to confirm it passed through the\n;   scanner, and the string printed on the sheet of paper may allow the user to find the corresponding\n;   image, if it's printed before the image is scanned.\n;\n;   We follow the capability ordering:\n;   MSG_RESETALL\n;   set ICAP_XFERMECH.....................${arg:1}\n;   set CAP_FEEDERENABLED.................TRUE\n;   set CAP_XFERCOUNT.....................1\n;   set ICAP_EXTIMAGEINFO.................TRUE\n;   set CAP_PRINTERENABLED................TRUE\n;   set CAP_PRINTER.......................TWPR_IMPRINTERTOPBEFORE, TWPR_IMPRINTERTOPAFTER,\n;                                         TWPR_IMPRINTERBOTTOMBEFORE,or TWPR_IMPRINTERBOTTOMAFTER\n;   set CAP_PRINTERMODE...................TWPM_COMPOUNDSTRING\n;   set CAP_PRINTERSTRING.................TWAIN\n;   set CAP_PRINTERINDEX..................TWAIN\n;   set CAP_PRINTERSUFFIX.................TWAIN\n;   set CAP_PRINTERVERTICALOFFSET.........set to its max value\n;\n;   The test passes if all operations return TWRC_SUCCESS.\n;\n; Arguments\n;   arg:1 - TWSX_* value for ICAP_XFERMECH\n;   arg:2 - value of caller's indent\n;   arg:3 - global variable to store the CAP_PRINTER value\n;\n; Locals\n;   capprintervariable - global variable to store the CAP_PRINTER value\n;   indent - indent the passfail text\n;   name - name of the current test\n;   twsx - TWSX_* value for ICAP_XFERMECH\n;\n; Returns\n;   pass or fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize...\n;\nsetlocal twsx '${arg:1}'\nsetlocal indent '${arg:2}'\nsetlocal capprintervariable '${arg:3}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; MSG_RESETALL\n; If return code is not TWRC_SUCCESS, end with an error\n;\nsetlocal name 'MSG_RESETALL'\ndsmentry src ds dg_control dat_capability msg_resetall '0,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set ICAP_XFERMECH...\n;\nsetlocal name 'ICAP_XFERMECH MSG_SET ${get:twsx}'\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_XFERMECH,TWON_ONEVALUE,TWTY_UINT16,${get:twsx}'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set CAP_FEEDERENABLED to TRUE\n;\nsetlocal name 'CAP_FEEDERENABLED MSG_SET TRUE'\ndsmentry src ds dg_control dat_capability msg_set 'CAP_FEEDERENABLED,TWON_ONEVALUE,TWTY_BOOL,TRUE'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set CAP_XFERCOUNT to 1\n;\nsetlocal name 'CAP_XFERCOUNT MSG_SET 1'\ndsmentry src ds dg_control dat_capability msg_set 'CAP_XFERCOUNT,TWON_ONEVALUE,TWTY_INT16,1'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set ICAP_EXTIMAGEINFO to TRUE\n;\nsetlocal name 'ICAP_EXTIMAGEINFO MSG_SET TRUE'\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_EXTIMAGEINFO,TWON_ONEVALUE,TWTY_BOOL,TRUE'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; CAP_PRINTERENABLED must currently be FALSE\n;\nsetlocal name 'CAP_PRINTERENBLED resets to FALSE'\ndsmentry src ds dg_control dat_capability msg_getcurrent 'CAP_PRINTERENABLED,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\nif ',${ret:},' !~contains ',FALSE,' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; CAP_PRINTERENABLED set to TRUE\n;\nsetlocal name 'CAP_PRINTERENBLED set to TRUE'\ndsmentry src ds dg_control dat_capability msg_set 'CAP_PRINTERENABLED,TWON_ONEVALUE,TWTY_BOOL,TRUE'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\ndsmentry src ds dg_control dat_capability msg_getcurrent 'CAP_PRINTERENABLED,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\nif ',${ret:},' !~contains ',TRUE,' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; CAP_PRINTER must be supported with at least one of the printer values,\n; squirrel away the value in the global argument stored in capprintervariable\n;\nsetlocal name 'CAP_PRINTER is supported'\ndsmentry src ds dg_control dat_capability msg_getcurrent 'CAP_PRINTER,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\nif ',${ret:},' ~contains ',TWPR_IMPRINTERTOPBEFORE,' goto MAIN.PRINTER.PASS\nif ',${ret:},' ~contains ',TWPR_IMPRINTERTOPAFTER,' goto MAIN.PRINTER.PASS\nif ',${ret:},' ~contains ',TWPR_IMPRINTERBOTTOMBEFORE,' goto MAIN.PRINTER.PASS\nif ',${ret:},' ~contains ',TWPR_IMPRINTERBOTTOMAFTER,' goto MAIN.PRINTER.PASS\ngoto MAIN.ERROR.ECHOPASSFAIL\n;\n; Save the value so we can set it later...\n:MAIN.PRINTER.PASS\nsetglobal ${get:capprintervariable} ${ret:${get:TW_ONEVALUE.Item}}\necho.passfail '${get:indent}${get:name}' 'pass (${get:${get:capprintervariable}})'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; CAP_PRINTERMODE must be supported, and allow TWPM_COMPOUNDSTRING\n;\nsetlocal name 'CAP_PRINTERMODE is supported'\ndsmentry src ds dg_control dat_capability msg_set 'CAP_PRINTERMODE,TWON_ONEVALUE,TWTY_UINT16,TWPM_COMPOUNDSTRING'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; CAP_PRINTERSTRING must be supported, and allow setting to 'TWAIN'...\n;\nsetlocal name 'CAP_PRINTERSTRING is supported'\ndsmentry src ds dg_control dat_capability msg_set 'CAP_PRINTERSTRING,TWON_ONEVALUE,TWTY_STR255,TWAIN'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; CAP_PRINTERINDEX must be supported, and allow setting to 1...\n;\nsetlocal name 'CAP_PRINTERINDEX is supported'\ndsmentry src ds dg_control dat_capability msg_set 'CAP_PRINTERINDEX,TWON_ONEVALUE,TWTY_UINT32,1'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; CAP_PRINTERSUFFIX must be supported, and allow setting to 'TEST'...\n;\nsetlocal name 'CAP_PRINTERSUFFIX is supported'\ndsmentry src ds dg_control dat_capability msg_set 'CAP_PRINTERSUFFIX,TWON_ONEVALUE,TWTY_STR255,TEST'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; CAP_PRINTERVERTICALOFFSET must be supported, and allow setting to the current value...\n;\nsetlocal name 'CAP_PRINTERVERTICALOFFSET is supported'\ndsmentry src ds dg_control dat_capability msg_getcurrent 'CAP_PRINTERVERTICALOFFSET'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\ndsmentry src ds dg_control dat_capability msg_set 'CAP_PRINTERVERTICALOFFSET,TWON_ONEVALUE,TWTY_FIX32,${ret:${get:TW_ONEVALUE.Item}}'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Summary and cleanup...\n;\n; We passed...\n:MAIN.PASS\nreturn 'pass'\n;\n; Skip this item...\n:MAIN.SKIP\necho.passfail '${get:name}' 'skip - ${sts:} ${ret:}'\nreturn 'skip'\n;\n; Ruh-roh...\n:MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'fail - ${sts:} ${ret:}'\nreturn 'fail'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/120 - Patch Code Badge/Certification.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Patch Code Badge\n;   Check if Patch Code is supported by the driver.  This is a badge, failure does not\n;   invalidate scanner certification.  Passage adds Patch Code support to the cert.\n;\n; Arguments\n;   arg:1 - TW_IDENTITY.ProductName of scanner to test\n;   arg:2 - global to set on fail\n;\n; Globals\n;   g_localcertifyresult - global to report to caller on fail\n;   g_xfermech - transfer mechanism currently in use\n;\n; Locals\n;   twidentity.productname - product name of scanner to test\n;   globaltosetonfail - name says it all\n;\n; Returns\n;   (none)\n;\n; History\n;   1.0 - initial release\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize stuff, load tables if not already done for us...\n;\necho.titlesuite 'Patch Code Badge v1.0 17-Sep-2021'\necho.yellow '*************************************************************************************'\necho.yellow '*** This tests the Patch Code Badge.  Skipping or failing means the driver does   ***'\necho.yellow '*** not support this functionality.  It does not prevent certification.           ***'\necho.yellow '*************************************************************************************'\n;\nsetlocal twidentity.productname '${arg:1}'\nsetlocal globaltosetonfail '${arg:2}'\nsetglobal g_localcertifyresult 'pass' ; assume success\nsetglobal g_xfermech '' ; this will be set later\n;\nif '${get:TW_ARRAY.ItemType}' != '' goto MAIN.LOADTABLES.SKIP\nrun '${folder:certification}/LoadTables'\n:MAIN.LOADTABLES.SKIP\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Run the tests...\n;\ncall CERTIFY '${folder:certification}/Opends'  '${get:twidentity.productname}' 'g_localcertifyresult' 'embedded'\nif '${get:g_localcertifyresult}' == 'fail' goto MAIN.CLOSEDS\n;\ncall CERTIFY 'Patch Code Badge'                '${get:twidentity.productname}' 'g_localcertifyresult'\ncall CERTIFY 'DAT_IMAGENATIVEXFER'             '${get:twidentity.productname}' 'g_localcertifyresult' '${folder:parent}'\ncall CERTIFY 'DAT_IMAGEMEMXFER'                '${get:twidentity.productname}' 'g_localcertifyresult' '${folder:parent}'\ncall CERTIFY 'DAT_IMAGEFILEXFER'               '${get:twidentity.productname}' 'g_localcertifyresult' '${folder:parent}'\ncall CERTIFY 'DAT_IMAGEMEMFILEXFER'            '${get:twidentity.productname}' 'g_localcertifyresult' '${folder:parent}'\n;\n:MAIN.CLOSEDS\ncall CERTIFY '${folder:certification}/Closeds' '${get:twidentity.productname}' 'g_localcertifyresult' 'embedded'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Summary and cleanup...\n;\n; Did we pass? (do an extra check)\nif '${get:g_localcertifyresult}' == 'skip' goto MAIN.SKIP\nif '${get:g_localcertifyresult}' != 'pass' goto MAIN.ERROR\necho ''\necho.passfail 'BADGE SUMMARY' 'pass'\nreturn 'pass'\n;\n; Unsupported...\n:MAIN.SKIP\necho ''\necho.passfail 'BADGE SUMMARY' 'skip'\nsetglobal '${get:globaltosetonfail}' 'skip'\nreturn 'skip'\n;\n; Ruh-roh...\n:MAIN.ERROR\necho ''\necho.passfail 'BADGE SUMMARY' 'fail'\nsetglobal '${get:globaltosetonfail}' 'fail'\nreturn 'fail'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Function: Certify\n; arg:1 - script to run\n; arg:2 - TW_IDENTITY.ProductName of scanner to test\n; arg:3 - global value to update on fail\n; arg:4 - embeded flag for open/close, or folder for DAT_IMAGE*XFER calls\n; returns: (none)\n;\n:CERTIFY\n;\n; If a failure has occurred on a previous test, skip the rest of the tests,\n; except for closing, that would be bad...\nif '${arg:1}' ~contains 'Closeds' goto CERTIFY.RUN\nif '${get:${arg:3}}' == 'skip' goto CERTIFY.SKIP\nif '${get:${arg:3}}' == 'fail' goto CERTIFY.FAIL\n;\n; Run the test...\n:CERTIFY.RUN\nrun '${arg:1}' '${arg:2}' '${arg:4}'\nif '${ret:}' == 'skip' goto CERTIFY.SKIP\nif '${ret:}' != 'pass' goto CERTIFY.FAIL\nreturn 'pass'\n;\n; Handle skipping, set the global so we have a record...\n:CERTIFY.SKIP\nsetglobal '${arg:3}' 'skip'\nreturn 'skip'\n;\n; Handle failure, set the global so we have a record...\n:CERTIFY.FAIL\nsetglobal '${arg:3}' 'fail'\nreturn 'fail'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/120 - Patch Code Badge/DAT_EXTIMAGEINFO.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DAT_EXTIMAGEINFO\n;   Check the return values from DAT_EXTIMAGEINFO to make sure the patch code\n;   metadata is properly reported.\n;\n;   Here's the basic flow:\n;       DAT_EXTIMAGEINFO\n;       confirm that we have TWEI_PATCHCODE\n;       confirm a sheet with no patchcodes\n;           TW_INFO[0].ReturnCode values TWRC_DATANOTAVAILABLE\n;       confirm a sheet with one patch code\n;           all TW_INFO[0].ReturnCode values are TWRC_SUCCESS\n;           all TW_INFO[0].ItemType values match the spec\n;           all TW_INFO[0].NumItems equals 1\n;           all TW_INFO[0].Item handle contains one of the TWPCH_* values\n;\n;   The test passes if:\n;       - g_patchcodecount.none >= 1\n;         and (g_patchcodecount.one >= 1)\n;\n; Arguments\n;   arg:1 - indent the passfail text\n;   arg:2 - base filename (no extension)\n;\n; Globals\n;   g_patchcodecount.none - increment if no patchcodes are found\n;   g_patchcodecount.one - increment if one patchcodes is found\n;\n; Locals\n;   patchcodecount - the number of patchcodes found on the image\n;   patchcodedata - the return value from DAT_EXTIMAGEINFO\n;   name - current test being done\n;   indent - indent the passfail text\n;   twinfo.infoid.index - index to TW_INFO[n].infoid from the start of patchcodedata\n;   twinfo.itemtype.index - index to TW_INFO[n].itemtype from the start of patchcodedata\n;   twinfo.numitems.index - index to TW_INFO[n].numitems from the start of patchcodedata\n;   twinfo.returncode.index - index to TW_INFO[n].returncode from the start of patchcodedata\n;   twinfo.item.index - index to TW_INFO[n].item from the start of patchcodedata\n;\n; Returns\n;   pass/fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get the extended image info, save the data to 'patchcodedata'.\n;\nsetlocal indent '${arg:1}    '\nsetlocal name 'dg_image/dat_extimageinfo/msg_get TWEI_PATCHCODE'\ndsmentry src ds dg_image dat_extimageinfo msg_get '1,TWEI_PATCHCODE,0,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal patchcodedata '${ret:}'\nfilewrite '${arg:2}_extimageinfo.txt' '${get:patchcodedata}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Confirm that we got back all the patch code extimageinfo data...\n;\nsetlocal name 'Found TWEI_PATCHCODE'\nif ',${get:patchcodedata},' !contains 'TWEI_PATCHCODE' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Start validating the contents of TWEI_PATCHCODE, which is TW_INFO[0],\n; we expect to find the correct id and either TWRC_SUCCESS or TWRC_DATANOTAVAILABLE...\nsetlocal name 'TW_INFO[0].InfoID is TWEI_PATCHCODE'\nif '${getindex:patchcodedata:${get:TW_INFO.InfoID}}' != 'TWEI_PATCHCODE' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'TW_INFO[0].ReturnCode is TWRC_SUCCESS or TWRC_DATANOTAVAILABLE'\nif '${getindex:patchcodedata:${get:TW_INFO.ReturnCode}}' == 'TWRC_SUCCESS' goto MAIN.TWINFO.SUCCESS\nif '${getindex:patchcodedata:${get:TW_INFO.ReturnCode}}' == 'TWRC_DATANOTAVAILABLE' goto MAIN.TWINFO.NODATAFOUND\ngoto MAIN.ERROR.ECHOPASSFAIL\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Process TWRC_SUCCESS...\n;\n:MAIN.TWINFO.SUCCESS\nsetlocal name 'TW_INFO[0].ReturnCode is TWRC_SUCCESS'\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'TW_INFO[0].ItemType is TWTY_UINT16'\nif '${getindex:patchcodedata:${get:TW_INFO.ItemType}}' != 'TWTY_UINT16' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'TW_INFO[0].NumItems is 1'\nif '${getindex:patchcodedata:${get:TW_INFO.NumItems}}' != '1' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n;\nsetlocal tweipatchcode '${gettwei:TWEI_PATCHCODE:${getindex:patchcodedata:${get:TW_INFO.Item}}}'\nsetlocal name 'TW_INFO[0].Item is a TWPCH_PATCH1 value'\nif '${get:tweipatchcode}' == 'TWPCH_PATCH1' goto MAIN.TWINFO.SUCCESS.INCREMENT\nsetlocal name 'TW_INFO[0].Item is a TWPCH_PATCH2 value'\nif '${get:tweipatchcode}' == 'TWPCH_PATCH2' goto MAIN.TWINFO.SUCCESS.INCREMENT\nsetlocal name 'TW_INFO[0].Item is a TWPCH_PATCH3 value'\nif '${get:tweipatchcode}' == 'TWPCH_PATCH3' goto MAIN.TWINFO.SUCCESS.INCREMENT\nsetlocal name 'TW_INFO[0].Item is a TWPCH_PATCH4 value'\nif '${get:tweipatchcode}' == 'TWPCH_PATCH4' goto MAIN.TWINFO.SUCCESS.INCREMENT\nsetlocal name 'TW_INFO[0].Item is a TWPCH_PATCH6 value'\nif '${get:tweipatchcode}' == 'TWPCH_PATCH6' goto MAIN.TWINFO.SUCCESS.INCREMENT\nsetlocal name 'TW_INFO[0].Item is a TWPCH_PATCHT value'\nif '${get:tweipatchcode}' == 'TWPCH_PATCHT' goto MAIN.TWINFO.SUCCESS.INCREMENT\nsetlocal name 'TW_INFO[0].Item is an unrecognized ${getindex:patchcodedata:${get:TW_INFO.Item}} value'\ngoto MAIN.ERROR.ECHOPASSFAIL\n;\n:MAIN.TWINFO.SUCCESS.INCREMENT\necho.passfail '${get:indent}${get:name}' 'pass'\nincrement g_patchcodecount.one ${get:g_patchcodecount.one} 1\ngoto MAIN.PASS\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Process TWRC_DATANOTAVAILABLE...\n;\n:MAIN.TWINFO.NODATAFOUND\nsetlocal name 'TW_INFO[0].ReturnCode is TWRC_DATANOTAVAILABLE'\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nincrement g_patchcodecount.none ${get:g_patchcodecount.none} 1\ngoto MAIN.PASS\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Summary and cleanup...\n;\n; We passed...\n:MAIN.PASS\nreturn 'pass'\n;\n; Ruh-roh...\n:MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'fail - ${sts:} ${ret:}'\nreturn 'fail'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/120 - Patch Code Badge/DAT_IMAGEFILEXFER.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DAT_IMAGEFILEXFER\n;   This test scans two sheets of paper for the default pixeltype.  An ADF\n;   is required to pass this test, but that was already been checked before\n;   we got to this function.  The two sheets are as follows but don't have\n;   to be in any special order:\n;\n;       - one without any patch codes, which must report TWRC_DATANOTAVAILABLE\n;\n;\t    - one with a single patch code, which must report TWRC_SUCCESS for the\n;         TWEI_PATCHCODE\n;\n;   Here's the basic flow:\n;       SetCapabilities\n;       start scanning\n;       while images\n;           transfer image\n;           DAT_EXTIMAGEINFO\n;           end image\n;       end\n;       end scanning\n;       verify the results\n;\n;   The test passes if:\n;       - g_patchcodecount.none >= 1\n;         and (g_patchcodecount.one >= 1)\n;\n; Arguments\n;   arg:1 - ignore\n;   arg:2 - test name for the image folder\n;\n; Globals\n;   g_patchcodecount.none - increment if no patch codes are found\n;   g_patchcodecount.one - increment if one patch code is found\n;\n; Locals\n;   name - current test being done\n;   indent - indent the passfail text\n;   twimageinfo.compression - compression for current image\n;\n;   image.count - count of images from 1\n;   image.folder - folder to put the images in\n;\n; Returns\n;   pass/fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; If not supported, quietly leave...\n;\nif '${get:g_xfermech}' ~contains 'TWSX_FILE' goto MAIN.CONTINUE\nreturn 'pass'\n:MAIN.CONTINUE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize...\n;\necho.titletest 'DAT_IMAGEFILEXFER'\n;\nsetlocal indent ''\nsetlocal image.count '0'\nsetlocal image.folder '${folder:certimages}/${arg:2}/DAT_IMAGEFILEXFER'\nsetlocal image.showname ''\n;\nsetglobal g_patchcodecount.none '0'\nsetglobal g_patchcodecount.one '0'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Clean the image folder for this test...\n;\nimage cleanfolderandmeta '${get:image.folder}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; SetCapabilities\n; This resets the driver and sets all the capabilities we need for the test.\n; If its return code is not 'pass', end with an error\n;\nrun SetCapabilities 'TWSX_FILE' '${get:indent}'\nif '${ret:}' != 'pass' goto MAIN.ERROR.FAIL\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Prompt the user...\n;\necho.prompt\necho.prompt \"Scanning will take place during this test.  There will be no\"\necho.prompt \"need to press any button on the TWAIN user interface to start\"\necho.prompt \"the scanner.  A progress indicator may appear during scanning.\"\necho.prompt\necho.prompt \"Place at least 2 sheets in the scanner's feeder in no particular\necho.prompt \"order: at least one sheet has no patch codes, and one has a\"\necho.prompt \"single patch code that the scanner is known to recognize.\"\necho.prompt\npause '(press the ENTER key when ready to continue)'\necho.prompt\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Start scanning...\n;\n:MAIN.USERINTERFACE\nsetlocal name 'dg_control/dat_userinterface/msg_enableds'\nwait reset\ndsmentry src null dg_control dat_userinterface msg_enableds '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Wait for MSG_XFERREADY, if we don't see it then scoot...\n;\nsetlocal name 'wait ${get:sys_waittimeout} seconds for MSG_XFERREADY'\nwait '${get:sys_waittimeout}000'\nif '${ret:}' !~contains 'msg_xferready' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get information about the image...\n;\n:MAIN.IMAGEINFO.NEXT\nsetlocal name 'dg_image/dat_imageinfo/msg_get'\ndsmentry src ds dg_image dat_imageinfo msg_get '0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\nsetlocal twimageinfo.compression '${ret:${get:index.twimageinfo.compression}}'\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set up the file transfer...\n;\nincrement image.count '${get:image.count}' 1\nif '${get:twimageinfo.compression}' == 'JPEG' goto MAIN.SETUPFILEXFER.JPEG\nsetlocal image.showname 'DAT_IMAGEFILEXFER/adf${format:D6|${get:image.count}}.tif'\nsetlocal twsetupfilexfer.filename '${get:image.folder}/adf${format:D6|${get:image.count}}.tif'\nsetlocal twsetupfilexfer.format 'TWFF_TIFF'\ngoto MAIN.SETUPFILEXFER\n:MAIN.SETUPFILEXFER.JPEG\nsetlocal image.showname 'DAT_IMAGEFILEXFER/adf${format:D6|${get:image.count}}.jpg'\nsetlocal twsetupfilexfer.filename '${get:image.folder}/adf${format:D6|${get:image.count}}.jpg'\nsetlocal twsetupfilexfer.format 'TWFF_JFIF'\n:MAIN.SETUPFILEXFER\nsetlocal name 'dg_control/dat_setupfilexfer/msg_set'\ndsmentry src ds dg_control dat_setupfilexfer msg_set '\"${get:twsetupfilexfer.filename}\",${get:twsetupfilexfer.format},0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Transfer the image...\n;\nsetlocal name 'dg_image/dat_imagefilexfer/msg_get'\ndsmentry src ds dg_image dat_imagefilexfer msg_get null\nif '${sts:}' != 'XFERDONE' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\necho.passfail '${get:indent}image <${get:image.showname}>' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DAT_EXTIMAGEINFO\n; Check the patch code metadata...\n;\nrun DAT_EXTIMAGEINFO '${get:indent}' '${get:image.folder}/adf${format:D6|${get:image.count}}'\nif '${ret:}' != 'pass' goto MAIN.ERROR.FAIL\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; End the transfer, see if we're done...\n;\nsetlocal name 'dg_control/dat_pendingxfers/msg_endxfer'\ndsmentry src ds dg_control dat_pendingxfers msg_endxfer '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nif '${ret:${get:TW_PENDINGXFERS.Count}}' != '0' goto MAIN.IMAGEINFO.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We're out of images, so disable...\n;\nsetlocal name 'dg_control/dat_userinterface/msg_disableds'\ndsmentry src ds dg_control dat_userinterface msg_disableds '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Check to see if we passed.  We need one or more sheets of paper with no patch codes,\n; and one or more sheets with one patch code.\n;\nsetlocal name 'Final Check: detected sheets with 0 patch codes\nif '${get:g_patchcodecount.none}' < '1' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'Final Check: detected sheets with 1 patch code'\nif '${get:g_patchcodecount.one}' < '1' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Summary and cleanup...\n;\n; We passed...\n:MAIN.PASS\necho.passfail 'SUMMARY' 'pass'\nreturn 'pass'\n;\n; Ruh-roh...\n:MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'fail - ${sts:} ${ret:}'\necho.passfail 'SUMMARY' 'fail'\nrollback state4\nreturn 'fail'\n;\n; Ruh-roh...\n:MAIN.ERROR.FAIL\necho.passfail 'SUMMARY' 'fail'\nrollback state4\nreturn 'fail'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/120 - Patch Code Badge/DAT_IMAGEMEMFILEXFER.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DAT_IMAGEMEMFILEXFER\n;   This test scans two sheets of paper for the default pixeltype.  An ADF\n;   is required to pass this test, but that was already been checked before\n;   we got to this function.  The two sheets are as follows but don't have\n;   to be in any special order:\n;\n;       - one without any patch codes, which must report TWRC_DATANOTAVAILABLE\n;\n;\t    - one with a single patch code, which must report TWRC_SUCCESS for\n;         TWEI_PATCHCODE\n;\n;   Here's the basic flow:\n;       SetCapabilities\n;       start scanning\n;       while images\n;           transfer image\n;           DAT_EXTIMAGEINFO\n;           end image\n;       end\n;       end scanning\n;       verify the results\n;\n;   The test passes if:\n;       - g_patchcodecount.none >= 1\n;         and (g_patchcodecount.one >= 1)\n;\n; Arguments\n;   arg:1 - ignore\n;   arg:2 - test name for the image folder\n;\n; Globals\n;   g_patchcodecount.none - increment if nopatchcodes are found\n;   g_patchcodecount.one - increment if one patchcode is found\n;\n; Locals\n;   name - current test being done\n;   indent - indent the passfail text\n;   imagememxfer - result of DAT_IMAGEMEMXFER call\n;   setupmemxfer.preferred - preferred field from DAT_SETUPMEMXFER call\n;\n;   image.count - count of images from 1\n;   image.folder - folder to put the images in\n;\n; Returns\n;   pass or fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; If not supported, quietly leave...\n;\nif '${get:g_xfermech}' ~contains 'TWSX_MEMFILE' goto MAIN.CONTINUE\nreturn 'pass'\n:MAIN.CONTINUE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize...\n;\necho.titletest 'DAT_IMAGEMEMFILEXFER'\n;\nsetlocal indent ''\nsetlocal image.pointer '0'\nsetlocal image.count '0'\nsetlocal image.folder '${folder:certimages}/${arg:2}/DAT_IMAGEMEMFILEXFER'\n;\nsetglobal g_patchcodecount.none '0'\nsetglobal g_patchcodecount.one '0'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Clean the image folder for this test...\n;\nimage cleanfolderandmeta '${get:image.folder}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; SetCapabilities\n; This resets the driver and sets all the capabilities we need for the test.\n; If its return code is not 'pass', end with an error\n;\nrun SetCapabilities 'TWSX_MEMFILE' '${get:indent}'\nif '${ret:}' != 'pass' goto MAIN.ERROR.FAIL\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get the preferred size for memory transfers, and allocate\n; a pointer for the memory transfers...\n;\nsetlocal indent '    '\nsetlocal name 'dg_control/dat_setupmemxfer/msg_get'\ndsmentry src ds dg_control dat_setupmemxfer msg_get '0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'TW_SETUPMEMXFER.Preferred > 0'\nsetlocal setupmemxfer.preferred '${ret:${get:TW_SETUPMEMXFER.Preferred}}'\nif '${get:setupmemxfer.preferred}' <= '0' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'allocate pointer for ${get:setupmemxfer.preferred} bytes'\nfree pointer image.pointer ; for the last loop\nallocate pointer image.pointer '${get:setupmemxfer.preferred}'\nif '${get:image.pointer}' == '0' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set DAT_SETUPFILEXFER to TWFF_TIFF\n;\nsetlocal name 'dg_control/dat_setupfilexfer/msg_set TWFF_TIFF'\ndsmentry src null dg_control dat_setupfilexfer msg_set 'file,TWFF_TIFF,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Prompt the user...\n;\necho.prompt\necho.prompt \"Scanning will take place during this test.  There will be no\"\necho.prompt \"need to press any button on the TWAIN user interface to start\"\necho.prompt \"the scanner.  A progress indicator may appear during scanning.\"\necho.prompt\necho.prompt \"Place at least 2 sheets in the scanner's feeder in no particular\necho.prompt \"order: at least one sheet has no patch codes, and one has a\"\necho.prompt \"single patch code that the scanner is known to recognize.\"\necho.prompt\npause '(press the ENTER key when ready to continue)'\necho.prompt\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Start scanning...\n;\n:MAIN.USERINTERFACE\nsetlocal name 'dg_control/dat_userinterface/msg_enableds'\nwait reset\ndsmentry src null dg_control dat_userinterface msg_enableds '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Wait for MSG_XFERREADY, if we don't see it then scoot...\n;\nsetlocal name 'wait ${get:sys_waittimeout} seconds for MSG_XFERREADY'\nwait '${get:sys_waittimeout}000'\nif '${ret:}' !~contains 'msg_xferready' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Do a memory file transfer...\n; This little song and dance with the states is so that we can\n; start the transfer in state 6 with each new image, but switch\n; to state 7 if we need multiple calls to capture the current\n; image...\n;\n; The saved images will be in TIFF format, which includes TIFF\n; JPEG (the better form, where a simple TIFF header is added).\n;\nincrement image.count '${get:image.count}' 1\nimage free memfileimage\n;\n:MAIN.IMAGEMEMFILEXFER.NEXT\nsetlocal name 'dg_image/dat_imagememxfer/msg_get'\ndsmentry src ds dg_image dat_imagememfilexfer msg_get '0,0,0,0,0,0,0,9,${get:setupmemxfer.preferred},${get:image.pointer}'\nsetlocal imagememxfer '${ret:}'\nif '${sts:}' == 'XFERDONE' goto MAIN.IMAGEMEMFILEXFER.XFERDONE\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\n;\necho.passfail '${get:indent}${get:name} SUCCESS' 'pass'\nimage append memfileimage '${get:imagememxfer}'\ngoto MAIN.IMAGEMEMFILEXFER.NEXT\n;\n:MAIN.IMAGEMEMFILEXFER.XFERDONE\necho.passfail '${get:indent}${get:name} XFERDONE' 'pass'\nimage append memfileimage '${get:imagememxfer}'\nimage save memfileimage memfile '${get:image.folder}/adf${format:D6|${get:image.count}}'\necho.passfail '${get:indent}image <${ret:}>' 'pass'\nimage free memfileimage\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DAT_EXTIMAGEINFO\n; Check the patch code metadata...\n;\nrun DAT_EXTIMAGEINFO '${get:indent}' '${get:image.folder}/adf${format:D6|${get:image.count}}'\nif '${ret:}' != 'pass' goto MAIN.ERROR.FAIL\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; End the transfer, see if we're done...\n;\nsetlocal name 'dg_control/dat_pendingxfers/msg_endxfer'\ndsmentry src ds dg_control dat_pendingxfers msg_endxfer '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nincrement image.count '${get:image.count}' 1\nif '${ret:${get:TW_PENDINGXFERS.Count}}' != '0' goto MAIN.IMAGEMEMFILEXFER.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We're out of images, so disable...\n;\nsetlocal name 'dg_control/dat_userinterface/msg_disableds'\ndsmentry src ds dg_control dat_userinterface msg_disableds '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Check to see if we passed.  We need one or more sheets of paper with no patch codes,\n; and one or more sheets with one patch code.\n;\nsetlocal name 'Final Check: detected sheets with 0 patch codes\nif '${get:g_patchcodecount.none}' < '1' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'Final Check: detected sheets with 1 patch code'\nif '${get:g_patchcodecount.one}' < '1' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Summary and cleanup...\n;\n; We passed...\n:MAIN.PASS\nimage free memfileimage\nfree pointer image.pointer\necho.passfail 'SUMMARY' 'pass'\nreturn 'pass'\n;\n; Ruh-roh...\n:MAIN.ERROR.ECHOPASSFAIL\nimage free memfileimage\nfree pointer image.pointer\necho.passfail '${get:indent}${get:name}' 'fail - ${sts:} ${ret:}'\necho.passfail 'SUMMARY' 'fail'\nrollback state4\nreturn 'fail'\n;\n; Ruh-roh...\n:MAIN.ERROR.FAIL\nimage free memfileimage\nfree pointer image.pointer\necho.passfail 'SUMMARY' 'fail'\nrollback state4\nreturn 'fail'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/120 - Patch Code Badge/DAT_IMAGEMEMXFER.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DAT_IMAGEMEMXFER\n;   This test scans two sheets of paper for the default pixeltype.  An ADF\n;   is required to pass this test, but that was already been checked before\n;   we got to this function.  The two sheets are as follows but don't have\n;   to be in any special order:\n;\n;       - one without any patch codes, which must report TWRC_DATANOTAVAILABLE\n;\n;\t    - one with a single patch code, which must report TWRC_SUCCESS for\n;         TWEI_PATCHCODE\n;\n;   Here's the basic flow:\n;       SetCapabilities\n;       start scanning\n;       while images\n;           transfer image\n;           DAT_EXTIMAGEINFO\n;           end image\n;       end\n;       end scanning\n;       verify the results\n;\n;   The test passes if:\n;       - g_patchcodecount.none >= 1\n;         and (g_patchcodecount.one >= 1)\n;\n; Arguments\n;   arg:1 - ignore\n;   arg:2 - test name for the image folder\n;\n; Globals\n;   g_patchcodecount.none - increment if no patchcodes are found\n;   g_patchcodecount.one - increment if one patchcode is found\n;\n; Locals\n;   name - current test being done\n;   indent - indent the passfail text\n;   imageinfo - metadata for the current image\n;   imagememxfer - result of DAT_IMAGEMEMXFER call\n;   setupmemxfer.preferred - preferred field from DAT_SETUPMEMXFER call\n;\n;   image.count - count of images from 1\n;   image.folder - folder to put the images in\n;\n; Returns\n;   pass/fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize...\n;\necho.titletest 'DAT_IMAGEMEMXFER'\n;\nsetlocal indent ''\nsetlocal image.pointer '0'\nsetlocal image.count '0'\nsetlocal image.folder '${folder:certimages}/${arg:2}/DAT_IMAGEMEMXFER'\n;\nsetglobal g_patchcodecount.none '0'\nsetglobal g_patchcodecount.one '0'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Clean the image folder for this test...\n;\nimage cleanfolderandmeta '${get:image.folder}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; SetCapabilities\n; This resets the driver and sets all the capabilities we need for the test.\n; If its return code is not 'pass', end with an error\n;\nrun SetCapabilities 'TWSX_MEMORY' '${get:indent}'\nif '${ret:}' != 'pass' goto MAIN.ERROR.FAIL\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get the preferred size for memory transfers, and allocate\n; a pointer for the memory transfers...\n;\nsetlocal indent '    '\nsetlocal name 'dg_control/dat_setupmemxfer/msg_get'\ndsmentry src ds dg_control dat_setupmemxfer msg_get '0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'TW_SETUPMEMXFER.Preferred > 0'\nsetlocal setupmemxfer.preferred '${ret:${get:TW_SETUPMEMXFER.Preferred}}'\nif '${get:setupmemxfer.preferred}' <= '0' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'allocate pointer for ${get:setupmemxfer.preferred} bytes'\nfree pointer image.pointer ; for the last loop\nallocate pointer image.pointer '${get:setupmemxfer.preferred}'\nif '${get:image.pointer}' == '0' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Prompt the user...\n;\necho.prompt\necho.prompt \"Scanning will take place during this test.  There will be no\"\necho.prompt \"need to press any button on the TWAIN user interface to start\"\necho.prompt \"the scanner.  A progress indicator may appear during scanning.\"\necho.prompt\necho.prompt \"Place at least 2 sheets in the scanner's feeder in no particular\necho.prompt \"order: at least one sheet has no patch codes, and one has a\"\necho.prompt \"single patch code that the scanner is known to recognize.\"\necho.prompt\npause '(press the ENTER key when ready to continue)'\necho.prompt\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Start scanning...\n;\n:MAIN.USERINTERFACE\nsetlocal name 'dg_control/dat_userinterface/msg_enableds'\nwait reset\ndsmentry src null dg_control dat_userinterface msg_enableds '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Wait for MSG_XFERREADY, if we don't see it then scoot...\n;\nsetlocal name 'wait ${get:sys_waittimeout} seconds for MSG_XFERREADY'\nwait '${get:sys_waittimeout}000'\nif '${ret:}' !~contains 'msg_xferready' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Do a memory transfer...\n; This little song and dance with the states is so that we can\n; start the transfer in state 6 with each new image, but switch\n; to state 7 if we need multiple calls to capture the current\n; image...\n;\n; The saved images will be in TIFF format, which includes TIFF\n; JPEG (the better form, where a simple TIFF header is added).\n;\nincrement image.count '${get:image.count}' 1\nimage free memimage\n;\n:MAIN.IMAGEMEMXFER.NEXT\nsetlocal name 'dg_image/dat_imagememxfer/msg_get'\ndsmentry src ds dg_image dat_imagememxfer msg_get '0,0,0,0,0,0,0,9,${get:setupmemxfer.preferred},${get:image.pointer}'\nsetlocal imagememxfer '${ret:}'\nif '${sts:}' == 'XFERDONE' goto MAIN.IMAGEMEMXFER.XFERDONE\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\n;\necho.passfail '${get:indent}${get:name} SUCCESS' 'pass'\nimage append memimage '${get:imagememxfer}'\ngoto MAIN.IMAGEMEMXFER.NEXT\n;\n:MAIN.IMAGEMEMXFER.XFERDONE\necho.passfail '${get:indent}${get:name} XFERDONE' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We need image info to make sense of this data...\n;\nsetlocal name 'dg_image/dat_imageinfo/msg_get'\ndsmentry src ds dg_image dat_imageinfo msg_get '0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0'\nsetlocal imageinfo '${ret:}'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Save the image...\n;\nimage append memimage '${get:imagememxfer}'\nimage addheader memimage '${get:imageinfo}'\nimage save memimage memory '${get:image.folder}/adf${format:D6|${get:image.count}}'\necho.passfail '${get:indent}image <${ret:}>' 'pass'\nimage free memimage\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DAT_EXTIMAGEINFO\n; Check the patch code metadata...\n;\nrun DAT_EXTIMAGEINFO '${get:indent}' '${get:image.folder}/adf${format:D6|${get:image.count}}'\nif '${ret:}' != 'pass' goto MAIN.ERROR.FAIL\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; End the transfer, see if we're done...\n;\nsetlocal name 'dg_control/dat_pendingxfers/msg_endxfer'\ndsmentry src ds dg_control dat_pendingxfers msg_endxfer '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nincrement image.count '${get:image.count}' 1\nif '${ret:${get:TW_PENDINGXFERS.Count}}' != '0' goto MAIN.IMAGEMEMXFER.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We're out of images, so disable...\n;\nsetlocal name 'dg_control/dat_userinterface/msg_disableds'\ndsmentry src ds dg_control dat_userinterface msg_disableds '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Check to see if we passed.  We need one or more sheets of paper with no patch codes,\n; and one or more sheets with one patch code.\n;\nsetlocal name 'Final Check: detected sheets with 0 patch codes\nif '${get:g_patchcodecount.none}' < '1' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'Final Check: detected sheets with 1 patch code'\nif '${get:g_patchcodecount.one}' < '1' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Summary and cleanup...\n;\n; We passed...\n:MAIN.PASS\nimage free memimage\nfree pointer image.pointer\necho.passfail 'SUMMARY' 'pass'\nreturn 'pass'\n;\n; Ruh-roh...\n:MAIN.ERROR.ECHOPASSFAIL\nimage free memimage\nfree pointer image.pointer\necho.passfail '${get:indent}${get:name}' 'fail - ${sts:} ${ret:}'\necho.passfail 'SUMMARY' 'fail'\nrollback state4\nreturn 'fail'\n;\n; Ruh-roh...\n:MAIN.ERROR.FAIL\nimage free memimage\nfree pointer image.pointer\necho.passfail 'SUMMARY' 'fail'\nrollback state4\nreturn 'fail'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/120 - Patch Code Badge/DAT_IMAGENATIVEXFER.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DAT_IMAGENATIVEXFER\n;   This test scans two sheets of paper for the default pixeltype.  An ADF\n;   is required to pass this test, but that was already been checked before\n;   we got to this function.  The two sheets are as follows but don't have\n;   to be in any special order:\n;\n;       - one without any patch codes, which must report TWRC_DATANOTAVAILABLE\n;\n;\t    - one with a single patch code, which must report TWRC_SUCCESS for\n;         TWEI_PATCHCODE\n;\n;   Here's the basic flow:\n;       SetCapabilities\n;       start scanning\n;       while images\n;           transfer image\n;           DAT_EXTIMAGEINFO\n;           end image\n;       end\n;       end scanning\n;       verify the results\n;\n;   The test passes if:\n;       - g_patchcodecount.none >= 1\n;         and (g_patchcodecount.one >= 1)\n;\n; Arguments\n;   arg:1 - ignore\n;   arg:2 - test name for the image folder\n;\n; Globals\n;   g_patchcodecount.none - increment if no patchcodes are found\n;   g_patchcodecount.one - increment if one patchcode is found\n;\n; Locals\n;   name - current test being done\n;   indent - indent the passfail text\n;   image.handle - native handle\n;   image.count - count of images from 1\n;   image.folder - folder to put the images in\n;\n; Returns\n;   pass/fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize...\n;\necho.titletest 'DAT_IMAGENATIVEXFER'\n;\nsetlocal indent ''\nsetlocal image.handle '0'\nsetlocal image.count '1'\nsetlocal image.folder '${folder:certimages}/${arg:2}/DAT_IMAGENATIVEXFER'\n;\nsetglobal g_patchcodecount.none '0'\nsetglobal g_patchcodecount.one '0'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Prompt the user...\n;\necho.prompt\necho.prompt \"Scanning will take place during this test.  There will be no\"\necho.prompt \"need to press any button on the TWAIN user interface to start\"\necho.prompt \"the scanner.  A progress indicator may appear during scanning.\"\necho.prompt\necho.prompt \"Place at least 2 sheets in the scanner's feeder in no particular\necho.prompt \"order: at least one sheet has no patch codes, and one has a\"\necho.prompt \"single patch code that the scanner is known to recognize.\"\necho.prompt\npause '(press the ENTER key when ready to continue)'\necho.prompt\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Clean the image folder for this test...\n;\nimage cleanfolderandmeta '${get:image.folder}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; SetCapabilities\n; This resets the driver and sets all the capabilities we need for the test.\n; If its return code is not 'pass', end with an error\n;\nrun SetCapabilities 'TWSX_NATIVE' '${get:indent}'\nif '${ret:}' != 'pass' goto MAIN.ERROR.FAIL\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Check for paper in the feeder, prompt the user if we don't find any...\n;\n:MAIN.FEEDERLOADED\ndsmentry src ds dg_control dat_capability msg_getcurrent 'CAP_FEEDERLOADED,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.FEEDERLOADED.DONE\nif '${ret:${get:TW_ONEVALUE.Item}}' ~~ 'TRUE' goto MAIN.FEEDERLOADED.DONE\necho.prompt\necho.prompt \"Place paper in the scanner's feeder.\"\npause '(press the ENTER key when ready to continue)'\n:MAIN.FEEDERLOADED.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Start scanning...\n;\nsetlocal indent '    '\nsetlocal name 'dg_control/dat_userinterface/msg_enableds'\nwait reset\ndsmentry src null dg_control dat_userinterface msg_enableds '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Wait for MSG_XFERREADY, if we don't see it then scoot...\n;\nsetlocal name 'wait ${get:sys_waittimeout} seconds for MSG_XFERREADY'\nwait '${get:sys_waittimeout}000'\nif '${ret:}' !~contains 'msg_xferready' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Do a native transfer...\n;\n:MAIN.IMAGENATIVEXFER.NEXT\nsetlocal indent '    '\nsetlocal name 'dg_control/dat_imagenativexfer/msg_get'\ndsmentry src ds dg_image dat_imagenativexfer msg_get '0'\nsetlocal image.handle '${ret:}'\nif '${sts:}' != 'XFERDONE' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nimage save image.handle native '${get:image.folder}/adf${format:D6|${get:image.count}}'\necho.passfail '${get:indent}image <${ret:}>' 'pass'\nfree handle image.handle\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DAT_EXTIMAGEINFO\n; Check the patch code metadata...\n;\nrun DAT_EXTIMAGEINFO '${get:indent}' '${get:image.folder}/adf${format:D6|${get:image.count}}'\nif '${ret:}' != 'pass' goto MAIN.ERROR.FAIL\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; End the transfer, see if we're done.  If not, go back\n; to MAIN.IMAGENATIVEXFER.NEXT for another image...\n;\n:MAIN.PENDINGXFERS\nsetlocal name 'dg_control/dat_pendingxfers/msg_endxfer'\ndsmentry src ds dg_control dat_pendingxfers msg_endxfer '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nincrement image.count '${get:image.count}' 1 ; count the image\nif '${ret:${get:TW_PENDINGXFERS.Count}}' != '0' goto MAIN.IMAGENATIVEXFER.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We're out of images, so disable...\n;\nsetlocal name 'dg_control/dat_userinterface/msg_disableds'\ndsmentry src ds dg_control dat_userinterface msg_disableds '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Check to see if we passed.  We need one or more sheets of paper with no patch codes,\n; and one or more sheets with one patch code.\n;\nsetlocal name 'Final Check: detected ${get:g_patchcodecount.none} image(s) with no patch codes\nif '${get:g_patchcodecount.none}' < '1' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'Final Check: detected ${get:g_patchcodecount.one} image(s) with a patch code'\nif '${get:g_patchcodecount.one}' < '1' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Summary and cleanup...\n;\n; We passed...\n:MAIN.PASS\nfree handle image.handle\necho.passfail 'SUMMARY' 'pass'\nreturn 'pass'\n;\n; Ruh-roh...\n:MAIN.ERROR.ECHOPASSFAIL\nfree handle image.handle\necho.passfail '${get:indent}${get:name}' 'fail - ${sts:} ${ret:}'\necho.passfail 'SUMMARY' 'fail'\nrollback state4\nreturn 'fail'\n;\n; Ruh-roh...\n:MAIN.ERROR.FAIL\nfree handle image.handle\necho.passfail 'SUMMARY' 'fail'\nrollback state4\nreturn 'fail'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/120 - Patch Code Badge/Patch Code Badge.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Barcode Badge\n;   These tests establish the minimum requirements for a TWAIN driver to claim it supports patch\n;   codes.  It focuses on the ability to turn patch code detection on and off, identifying which\n;   patch codes are supported, and making sure patch code metadata is reported.\n;\n; Arguments\n;   (none)\n;\n; Globals\n;  g_xfermech - transfer mechanism currently in use\n;  g_capsupportedcaps - list of supported capabilities\n;\n; Locals\n;   name - name of a test\n;   certifyresult - status we're going to return\n;\n; Returns\n;   pass/fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize...\n;\nsetlocal certifyresult 'pass' ; assume we'll pass, this is our return value\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Reset the driver's capabilities, this is mandatory...\n;\nsetlocal name 'MSG_RESETALL'\ndsmentry src ds dg_control dat_capability msg_resetall '0,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.MSG_RESETALL.FAIL\necho.passfail '${get:name}' 'pass'\ngoto MAIN.MSG_RESETALL.DONE\n;\n:MAIN.MSG_RESETALL.FAIL\necho.passfail '${get:name}' 'skip - ${sts:} ${ret:}'\nsetlocal certifyresult 'fail'\ngoto MAIN.DONE\n:MAIN.MSG_RESETALL.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; ICAP_PATCHCODEDETECTIONENABLED must be supported, and must offer both TRUE\n; and FALSE, and must currently be FALSE (as a result of MSG_RESETALL, otherwise\n; skip it all...\n;\nsetlocal name 'ICAP_PATCHCODEDETECTIONENABLED is supported'\ndsmentry src ds dg_control dat_capability msg_get 'ICAP_PATCHCODEDETECTIONENABLED,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ICAP_PATCHCODEDETECTIONENABLEDSUPPORTED.SKIP\nif ',${ret:},' !~contains ',TRUE,' goto MAIN.ICAP_PATCHCODEDETECTIONENABLEDSUPPORTED.SKIP\nif ',${ret:},' !~contains ',FALSE,' goto MAIN.ICAP_PATCHCODEDETECTIONENABLEDSUPPORTED.SKIP\necho.passfail '${get:name}' 'pass'\ngoto MAIN.ICAP_PATCHCODEDETECTIONENABLEDSUPPORTED.DONE\n;\n:MAIN.ICAP_PATCHCODEDETECTIONENABLEDSUPPORTED.SKIP\necho.passfail '${get:name}' 'skip - ${sts:} ${ret:}'\nsetlocal certifyresult 'skip'\ngoto MAIN.DONE\n:MAIN.ICAP_PATCHCODEDETECTIONENABLEDSUPPORTED.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; CAP_SUPPORTEDCAPS: check that all required capabilities are reported\n; We're not requiring the presence of ICAP_PATCHCODEMAXRETRIES or\n; ICAP_PATCHCODETIMEOUT.  If present it's assumed the driver will default\n; these to meaningful values that support the best chance of detecting\n; a patch code.\n;\nsetlocal name 'CAP_SUPPORTEDCAPS MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'CAP_SUPPORTEDCAPS,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.CAP_SUPPORTEDCAPS.FAIL\nsetglobal g_capsupportedcaps '${ret:}'\necho.passfail '${get:name}' 'pass'\n;\nsetlocal name 'CAP_SUPPORTEDCAPS ICAP_PATCHCODEDETECTIONENABLED found'\nif ',${get:g_capsupportedcaps},' !~contains ',ICAP_PATCHCODEDETECTIONENABLED,' goto MAIN.CAP_SUPPORTEDCAPS.FAIL\necho.passfail '${get:name}' 'pass'\n;\nsetlocal name 'CAP_SUPPORTEDCAPS ICAP_PATCHCODEMAXSEARCHPRIORITIES found'\nif ',${get:g_capsupportedcaps},' !~contains ',ICAP_PATCHCODEMAXSEARCHPRIORITIES,' goto MAIN.CAP_SUPPORTEDCAPS.FAIL\necho.passfail '${get:name}' 'pass'\n;\nsetlocal name 'CAP_SUPPORTEDCAPS ICAP_PATCHCODESEARCHMODE found'\nif ',${get:g_capsupportedcaps},' !~contains ',ICAP_PATCHCODESEARCHMODE,' goto MAIN.CAP_SUPPORTEDCAPS.FAIL\necho.passfail '${get:name}' 'pass'\n;\nsetlocal name 'CAP_SUPPORTEDCAPS ICAP_PATCHCODESEARCHPRIORITIES found'\nif ',${get:g_capsupportedcaps},' !~contains ',ICAP_PATCHCODESEARCHPRIORITIES,' goto MAIN.CAP_SUPPORTEDCAPS.FAIL\necho.passfail '${get:name}' 'pass'\n;\nsetlocal name 'CAP_SUPPORTEDCAPS ICAP_SUPPORTEDPATCHCODETYPES found'\nif ',${get:g_capsupportedcaps},' !~contains ',ICAP_SUPPORTEDPATCHCODETYPES,' goto MAIN.CAP_SUPPORTEDCAPS.FAIL\necho.passfail '${get:name}' 'pass'\n;\ngoto MAIN.CAP_SUPPORTEDCAPS.DONE\n:MAIN.CAP_SUPPORTEDCAPS.FAIL\necho.passfail '${get:name}' 'fail - ${sts:} ${get:g_capsupportedcaps}'\nsetlocal certifyresult 'fail'\ngoto MAIN.DONE\n:MAIN.CAP_SUPPORTEDCAPS.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; ICAP_SUPPORTEDEXTIMAGEINFO: check that all metadata is reported\n;\nsetlocal name 'ICAP_SUPPORTEDEXTIMAGEINFO MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'ICAP_SUPPORTEDEXTIMAGEINFO,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ICAP_SUPPORTEDEXTIMAGEINFO.FAIL\necho.passfail '${get:name}' 'pass'\n;\nsetlocal name 'ICAP_SUPPORTEDEXTIMAGEINFO TWEI_PATCHCODE found'\nif ',${ret:},' !~contains ',TWEI_PATCHCODE,' goto MAIN.ICAP_SUPPORTEDEXTIMAGEINFO.FAIL\necho.passfail '${get:name}' 'pass'\n;\ngoto MAIN.ICAP_SUPPORTEDEXTIMAGEINFO.DONE\n:MAIN.ICAP_SUPPORTEDEXTIMAGEINFO.FAIL\necho.passfail '${get:name}' 'fail - ${sts:} ${ret:}'\nsetlocal certifyresult 'fail'\n:MAIN.ICAP_SUPPORTEDEXTIMAGEINFO.DONE\n\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; ICAP_PATCHCODEDETECTIONENABLED must currently be FALSE\n;\nsetlocal name 'ICAP_PATCHCODEDETECTIONENABLED resets to FALSE'\ndsmentry src ds dg_control dat_capability msg_getcurrent 'ICAP_PATCHCODEDETECTIONENABLED,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ICAP_PATCHCODEDETECTIONENABLEDFALSE.FAIL\nif ',${ret:},' !~contains ',FALSE,' goto MAIN.ICAP_PATCHCODEDETECTIONENABLEDFALSE.FAIL\necho.passfail '${get:name}' 'pass'\ngoto MAIN.ICAP_PATCHCODEDETECTIONENABLEDFALSE.DONE\n;\n:MAIN.ICAP_PATCHCODEDETECTIONENABLEDFALSE.FAIL\necho.passfail '${get:name}' 'skip - ${sts:} ${ret:}'\nsetlocal certifyresult 'fail'\ngoto MAIN.DONE\n:MAIN.ICAP_PATCHCODEDETECTIONENABLEDFALSE.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; ICAP_PATCHCODEDETECTIONENABLED set to TRUE\n;\nsetlocal name 'ICAP_PATCHCODEDETECTIONENABLED set to TRUE'\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_PATCHCODEDETECTIONENABLED,TWON_ONEVALUE,TWTY_BOOL,TRUE'\nif '${sts:}' != 'SUCCESS' goto MAIN.ICAP_PATCHCODEDETECTIONENABLEDTRUE.FAIL\ndsmentry src ds dg_control dat_capability msg_getcurrent 'ICAP_PATCHCODEDETECTIONENABLED,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ICAP_PATCHCODEDETECTIONENABLEDTRUE.FAIL\nif ',${ret:},' !~contains ',TRUE,' goto MAIN.ICAP_PATCHCODEDETECTIONENABLEDTRUE.FAIL\necho.passfail '${get:name}' 'pass'\ngoto MAIN.ICAP_PATCHCODEDETECTIONENABLEDTRUE.DONE\n;\n:MAIN.ICAP_PATCHCODEDETECTIONENABLEDTRUE.FAIL\necho.passfail '${get:name}' 'skip - ${sts:} ${ret:}'\nsetlocal certifyresult 'fail'\ngoto MAIN.DONE\n:MAIN.ICAP_PATCHCODEDETECTIONENABLEDTRUE.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get ICAP_XFERMECH...\n;\nsetlocal name 'ICAP_XFERMECH MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'ICAP_XFERMECH,0,0,0'\nif '${sts:}' == 'SUCCESS' goto MAIN.ICAP_XFERMECH.DONE\necho.passfail '${get:name}' 'fail - ${sts:} ${ret:}'\nsetlocal certifyresult 'fail'\ngoto MAIN.DONE\n;\n:MAIN.ICAP_XFERMECH.DONE\nsetglobal g_xfermech '${ret:}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; All done...\n;\n:MAIN.DONE\nreturn '${get:certifyresult}'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/120 - Patch Code Badge/SetCapabilities.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; SetCapabilities\n;   Reset the driver's capabilites, and then set capabilities for this test.  Note that one can only\n;   get this badge for the ADF.  This is a production mode feature, so we're not testing the flatbed.\n;\n;   We follow the capability ordering:\n;   MSG_RESETALL\n;   set ICAP_XFERMECH.......................${arg:1}\n;   set CAP_FEEDERENABLED...................TRUE\n;   set CAP_XFERCOUNT.......................-1\n;   set ICAP_EXTIMAGEINFO...................TRUE\n;   set ICAP_PATCHCODETECTIONENABLED........TRUE\n;   set ICAP_PATCHCODESEARCHMODE............TWBD_HORZVERT, TWBD_VERTHORZ, TWBD_HORZ, or TWBD_VERT\n;   set ICAP_PATCHCODEMAXSEARCHPRIORITIES...set to its max value\n;   get ICAP_SUPPORTEDPATCHCODETYPES\n;   set ICAP_PATCHCODESEARCHPRIORITIES......set to first ICAP_PATCHCODEMAXSEARCHPRIORITIES of ICAP_SUPPORTEDPATCHCODETYPES\n;\n;   The test passes if all operations return TWRC_SUCCESS.\n;\n;   We are not testing ICAP_PATCHCODEMAXRETRIES or ICAP_PATCHCODETIMEOUT.  We're going to assume that the driver's\n;   default values offer the best user experience.  ICAP_PATCHCODETIMEOUT is especially problematic, since the\n;   spec doesn't tell us the units.\n;\n; Arguments\n;   arg:1 - TWSX_* value for ICAP_XFERMECH\n;   arg:2 - value of caller's indent\n;\n; Globals\n;   g_patchcodemaxsearchpriorities.max - maximum patchcodes we can get (max of ICAP_PATCHCODEMAXSEARCHPRIORITIES)\n;   g_capsupportedcaps - list of supported capabilities\n;\n; Locals\n;   patchcodesearchpriorities.itemlist - first ICAP_PATCHCODEMAXSEARCHPRIORITIES of ICAP_SUPPORTEDPATCHCODETYPES\n;   comma - used to construct the value for ICAP_PATCHCODESEARCHPRIORITIES\n;   indent - indent the passfail text\n;   name - name of the current test\n;   supportedpatchcodetypes.itemlist - return value from MSG_GET of ICAP_SUPPORTEDPATCHCODETYPES\n;   supportedpatchcodetypes.index - index counter for ICAP_SUPPORTEDPATCHCODETYPES\n;   supportedpatchcodetypes.lastindex - index of ICAP_PATCHCODEMAXSEARCHPRIORITIES item in ICAP_SUPPORTEDPATCHCODETYPES\n;   twsx - TWSX_* value for ICAP_XFERMECH\n;\n; Returns\n;   pass/fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize...\n;\nsetlocal twsx '${arg:1}'\nsetlocal indent '${arg:2}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; MSG_RESETALL\n; If return code is not TWRC_SUCCESS, end with an error\n;\nsetlocal name 'MSG_RESETALL'\ndsmentry src ds dg_control dat_capability msg_resetall '0,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set ICAP_XFERMECH...\n;\nsetlocal name 'ICAP_XFERMECH MSG_SET ${get:twsx}'\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_XFERMECH,TWON_ONEVALUE,TWTY_UINT16,${get:twsx}'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set CAP_FEEDERENABLED to TRUE\n;\nsetlocal name 'CAP_FEEDERENABLED MSG_SET TRUE'\ndsmentry src ds dg_control dat_capability msg_set 'CAP_FEEDERENABLED,TWON_ONEVALUE,TWTY_BOOL,TRUE'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set CAP_SHEETCOUNT to 7, this is enough to test all standard patch codes and\n; one sheet with no patch code.  The user can feed fewer sheets, as one as there\n; is one with a patch code and one without a patch code...\n;\nsetlocal name 'CAP_SHEETCOUNT MSG_SET 7'\ndsmentry src ds dg_control dat_capability msg_set 'CAP_SHEETCOUNT,TWON_ONEVALUE,TWTY_INT16,7'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set ICAP_EXTIMAGEINFO to TRUE\n;\nsetlocal name 'ICAP_EXTIMAGEINFO MSG_SET TRUE'\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_EXTIMAGEINFO,TWON_ONEVALUE,TWTY_BOOL,TRUE'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Some scanners need image addressing on to detect patches,\n; so if we detect that, enable it and set values for all\n; of the fields...\n;\nsetlocal name 'Image Address skipped'\nif ',${get:g_capsupportedcaps},' !~contains 'CAP_IMAGEADDRESSENABLED' goto MAIN.IMAGEADDRESSENABLED.SKIP\n;\ndsmentry src ds dg_control dat_capability msg_set 'CAP_IMAGEADDRESSENABLED,TWON_ONEVALUE,TWTY_BOOL,TRUE'\nif '${sts:}' != 'SUCCESS' goto MAIN.IMAGEADDRESSENABLED.SKIP\n;\ndsmentry src ds dg_control dat_capability msg_set 'CAP_IAFIELDA_LEVEL,TWON_ONEVALUE,TWTY_UINT32,TWIA_FIXED'\nif '${sts:}' != 'SUCCESS' goto MAIN.IMAGEADDRESSENABLED.SKIP\ndsmentry src ds dg_control dat_capability msg_set 'CAP_IAFIELDB_LEVEL,TWON_ONEVALUE,TWTY_UINT32,TWIA_LEVEL3'\nif '${sts:}' != 'SUCCESS' goto MAIN.IMAGEADDRESSENABLED.SKIP\ndsmentry src ds dg_control dat_capability msg_set 'CAP_IAFIELDC_LEVEL,TWON_ONEVALUE,TWTY_UINT32,TWIA_LEVEL2'\nif '${sts:}' != 'SUCCESS' goto MAIN.IMAGEADDRESSENABLED.SKIP\ndsmentry src ds dg_control dat_capability msg_set 'CAP_IAFIELDD_LEVEL,TWON_ONEVALUE,TWTY_UINT32,TWIA_LEVEL1'\nif '${sts:}' != 'SUCCESS' goto MAIN.IMAGEADDRESSENABLED.SKIP\n;\ndsmentry src ds dg_control dat_capability msg_set 'CAP_IAFIELDA_PRINTFORMAT,TWON_ONEVALUE,TWTY_STR32,#####'\nif '${sts:}' != 'SUCCESS' goto MAIN.IMAGEADDRESSENABLED.SKIP\ndsmentry src ds dg_control dat_capability msg_set 'CAP_IAFIELDB_PRINTFORMAT,TWON_ONEVALUE,TWTY_STR32,###'\nif '${sts:}' != 'SUCCESS' goto MAIN.IMAGEADDRESSENABLED.SKIP\ndsmentry src ds dg_control dat_capability msg_set 'CAP_IAFIELDC_PRINTFORMAT,TWON_ONEVALUE,TWTY_STR32,###'\nif '${sts:}' != 'SUCCESS' goto MAIN.IMAGEADDRESSENABLED.SKIP\ndsmentry src ds dg_control dat_capability msg_set 'CAP_IAFIELDD_PRINTFORMAT,TWON_ONEVALUE,TWTY_STR32,###'\nif '${sts:}' != 'SUCCESS' goto MAIN.IMAGEADDRESSENABLED.SKIP\n;\ndsmentry src ds dg_control dat_capability msg_set 'CAP_IAFIELDA_VALUE,TWON_ONEVALUE,TWTY_STR32,FIXED'\nif '${sts:}' != 'SUCCESS' goto MAIN.IMAGEADDRESSENABLED.SKIP\ndsmentry src ds dg_control dat_capability msg_set 'CAP_IAFIELDB_VALUE,TWON_ONEVALUE,TWTY_STR32,300'\nif '${sts:}' != 'SUCCESS' goto MAIN.IMAGEADDRESSENABLED.SKIP\ndsmentry src ds dg_control dat_capability msg_set 'CAP_IAFIELDC_VALUE,TWON_ONEVALUE,TWTY_STR32,20'\nif '${sts:}' != 'SUCCESS' goto MAIN.IMAGEADDRESSENABLED.SKIP\ndsmentry src ds dg_control dat_capability msg_set 'CAP_IAFIELDD_VALUE,TWON_ONEVALUE,TWTY_STR32,1'\nif '${sts:}' != 'SUCCESS' goto MAIN.IMAGEADDRESSENABLED.SKIP\n;\nsetlocal name 'Image Address set'\n:MAIN.IMAGEADDRESSENABLED.SKIP\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set ICAP_PATCHCODEDETECTIONENABLED to TRUE\n;\nsetlocal name 'ICAP_PATCHCODEDETECTIONENABLED MSG_SET TRUE'\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_PATCHCODEDETECTIONENABLED,TWON_ONEVALUE,TWTY_BOOL,TRUE'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Try to set ICAP_PATCHCODESEARCHMODE to TWBD_HORZVERT, TWBD_VERTHORZ, TWBD_HORZ, or TWBD_VERT.\n; Patch code sheets can have bars on all sides, so we're not requiring that any particular mode\n; has to be supported.  We just need one.\n;\nsetlocal name 'ICAP_PATCHCODESEARCHMODE MSG_SET TWBD_HORZVERT, TWBD_VERTHORZ, TWBD_HORZ, or TWBD_VERT'\ndsmentry src ds dg_control dat_capability msg_get 'ICAP_PATCHCODESEARCHMODE'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\n;\nif '${ret:}' contains 'TWBD_HORZVERT' goto MAIN.ICAP_PATCHCODESEARCHMODE.TWBD_HORZVERT\nif '${ret:}' contains 'TWBD_VERTHORZ' goto MAIN.ICAP_PATCHCODESEARCHMODE.TWBD_VERTHORZ\nif '${ret:}' contains 'TWBD_VERT' goto MAIN.ICAP_PATCHCODESEARCHMODE.TWBD_VERT\n;\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_PATCHCODESEARCHMODE,TWON_ONEVALUE,TWTY_UINT16,TWBD_HORZ'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\ngoto MAIN.ICAP_PATCHCODESEARCHMODE.DONE\n;\n:MAIN.ICAP_PATCHCODESEARCHMODE.TWBD_HORZVERT\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_PATCHCODESEARCHMODE,TWON_ONEVALUE,TWTY_UINT16,TWBD_HORZVERT'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\ngoto MAIN.ICAP_PATCHCODESEARCHMODE.DONE\n;\n:MAIN.ICAP_PATCHCODESEARCHMODE.TWBD_VERTHORZ\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_PATCHCODESEARCHMODE,TWON_ONEVALUE,TWTY_UINT16,TWBD_VERTHORZ'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\ngoto MAIN.ICAP_PATCHCODESEARCHMODE.DONE\n;\n:MAIN.ICAP_PATCHCODESEARCHMODE.TWBD_VERT\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_PATCHCODESEARCHMODE,TWON_ONEVALUE,TWTY_UINT16,TWBD_VERT'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\ngoto MAIN.ICAP_PATCHCODESEARCHMODE.DONE\n;\n:MAIN.ICAP_PATCHCODESEARCHMODE.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Try to set ICAP_PATCHCODEMAXSEARCHPRIORITIES to its maximum value...\n;\nsetlocal name 'ICAP_PATCHCODEMAXSEARCHPRIORITIES MSG_SET max value'\ndsmentry src ds dg_control dat_capability msg_get 'ICAP_PATCHCODEMAXSEARCHPRIORITIES'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\nsetglobal g_patchcodemaxsearchpriorities.max '${ret:${get:TW_RANGE.MaxValue}}'\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_PATCHCODEMAXSEARCHPRIORITIES,TWON_ONEVALUE,TWTY_UINT32,${get:g_patchcodemaxsearchpriorities.max}'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get the ICAP_SUPPORTEDPATCHCODETYPES...\n;\nsetlocal name 'ICAP_SUPPORTEDPATCHCODETYPES MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'ICAP_SUPPORTEDPATCHCODETYPES'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\nsetlocal supportedpatchcodetypes.itemlist '${ret:}'\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Pare the ICAP_SUPPORTEDPATCHCODETYPES list down to the first ICAP_PATCHCODEMAXSEARCHPRIORITIES items,\n; all of the standard patch codes should be supported, but we're not going to require that. \n;\nsetlocal comma ''\nsetlocal name 'Get the first ${get:g_patchcodemaxsearchpriorities.max} from ICAP_SUPPORTEDPATCHCODETYPES'\nsetlocal patchcodesearchpriorities.itemlist ''\n;\nsetlocal supportedpatchcodetypes.index '${get:TW_ARRAY.NumItems}' ; TW_ARRAY.ItemList - 1\nincrement supportedpatchcodetypes.lastindex '${get:supportedpatchcodetypes.index}' 1                                             ; first index\nincrement supportedpatchcodetypes.lastindex '${get:supportedpatchcodetypes.lastindex}' ${get:g_patchcodemaxsearchpriorities.max} ; + g_patchcodemaxsearchpriorities.max\n;\n:MAIN.PATCHCODESEARCHPRIORITIES.NEXT\nincrement supportedpatchcodetypes.index '${get:supportedpatchcodetypes.index}' 1\nif '${get:supportedpatchcodetypes.index}' > '${get:supportedpatchcodetypes.lastindex}' goto MAIN.PATCHCODESEARCHPRIORITIES.DONE\nsetlocal patchcodesearchpriorities.value '${getindex:supportedpatchcodetypes.itemlist:${get:supportedpatchcodetypes.index}}'\nif '${get:patchcodesearchpriorities.value}' == '' goto MAIN.PATCHCODESEARCHPRIORITIES.DONE\nsetlocal patchcodesearchpriorities.itemlist '${get:patchcodesearchpriorities.itemlist}${get:comma}${get:patchcodesearchpriorities.value}'\nsetlocal comma ','\ngoto MAIN.PATCHCODESEARCHPRIORITIES.NEXT\n;\n:MAIN.PATCHCODESEARCHPRIORITIES.DONE\necho.passfail '${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set ICAP_PATCHCODESEARCHPRIORITIES to first g_patchcodemaxsearchpriorities.max\n; of ICAP_SUPPORTEDPATCHCODETYPES...\n;\nsetlocal name 'ICAP_PATCHCODESEARCHPRIORITIES MSG_SET first ${get:g_patchcodemaxsearchpriorities.max} of ICAP_SUPPORTEDPATCHCODETYPES'\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_PATCHCODESEARCHPRIORITIES,TWON_ARRAY,TWTY_UINT16,${get:g_patchcodemaxsearchpriorities.max},${get:patchcodesearchpriorities.itemlist}'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Summary and cleanup...\n;\n; We passed...\n:MAIN.PASS\nreturn 'pass'\n;\n; Ruh-roh...\n:MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'fail - ${sts:} ${ret:}'\nreturn 'fail'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/120 - Patch Code Badge/_README.txt",
    "content": "Patch Codes can be found online.\nHere are some resources as of 19-Aug-2021\n\nhttps://patchcode.kodakalaris.com/en/index.html\nhttp://www.alliancegroup.co.uk/patch-codes.htm\n\nIf the links don't work, search for:\nPatch Code Samples\nPatch Code Creator\nPatch Code Generator\n\nNote that TWAIN only recognizes the following patches, ones other\nthan these may be recognized by a TWAIN driver as a custom feature,\nbut will not be recognized by the certification test.\n  PATCH 1\n  PATCH 2\n  PATCH 3\n  PATCH 4\n  PATCH 6\n  PATCH T (transfer)\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/130 - Barcode Badge/Barcode Badge.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Barcode Badge\n;   These tests establish the minimum requirements for a TWAIN driver to claim that it has barcode\n;   support.  It focuses on the ability to turn barcode detection on and off, identifying which\n;   barcodes are supported, and making sure barcode metadata is reported.\n;\n; Arguments\n;   arg:1 - TW_IDENTITY.ProductName of scanner to test\n;\n; Globals\n;   (none)\n;\n; Locals\n;   certifyresult - track if we fail\n;\n; Returns\n;   pass/fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize...\n;\nsetlocal certifyresult 'pass' ; assume we'll pass\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Reset to a known state...\n;\nsetlocal name 'MSG_RESETALL'\ndsmentry src ds dg_control dat_capability msg_resetall '0,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.MSG_RESETALL.FAIL\necho.passfail '${get:name}' 'pass'\ngoto MAIN.MSG_RESETALL.DONE\n;\n:MAIN.MSG_RESETALL.FAIL\necho.passfail '${get:name}' 'skip - ${sts:} ${ret:}'\nsetlocal certifyresult 'fail'\ngoto MAIN.DONE\n:MAIN.MSG_RESETALL.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; ICAP_BARCODEDETECTIONENABLED must be supported, and must offer both TRUE\n; and FALSE, and must currently be FALSE, otherwise skip it all\n;\nsetlocal name 'ICAP_BARCODEDETECTIONENABLED is supported'\ndsmentry src ds dg_control dat_capability msg_get 'ICAP_BARCODEDETECTIONENABLED,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ICAP_BARCODEDETECTIONENABLEDSUPPORTED.SKIP\nif ',${ret:},' !~contains ',TRUE,' goto MAIN.ICAP_BARCODEDETECTIONENABLEDSUPPORTED.SKIP\nif ',${ret:},' !~contains ',FALSE,' goto MAIN.ICAP_BARCODEDETECTIONENABLEDSUPPORTED.SKIP\necho.passfail '${get:name}' 'pass'\ngoto MAIN.ICAP_BARCODEDETECTIONENABLEDSUPPORTED.DONE\n;\n:MAIN.ICAP_BARCODEDETECTIONENABLEDSUPPORTED.SKIP\necho.passfail '${get:name}' 'skip - ${sts:} ${ret:}'\nsetlocal certifyresult 'skip'\ngoto MAIN.DONE\n:MAIN.ICAP_BARCODEDETECTIONENABLEDSUPPORTED.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; CAP_SUPPORTEDCAPS: check that all required capabilities are reported\n; We're not requiring the presence of ICAP_BARCODEMAXRETRIES or\n; ICAP_BARODETIMEOUT.  If present it's assumed the driver will default\n; these to meaningful values that support the best chance of detecting\n; a barcode.\n;\nsetlocal name 'CAP_SUPPORTEDCAPS MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'CAP_SUPPORTEDCAPS,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.CAP_SUPPORTEDCAPS.FAIL\necho.passfail '${get:name}' 'pass'\n;\nsetlocal name 'CAP_SUPPORTEDCAPS ICAP_BARCODEDETECTIONENABLED found'\nif ',${ret:},' !~contains ',ICAP_BARCODEDETECTIONENABLED,' goto MAIN.CAP_SUPPORTEDCAPS.FAIL\necho.passfail '${get:name}' 'pass'\n;\nsetlocal name 'CAP_SUPPORTEDCAPS ICAP_BARCODEMAXSEARCHPRIORITIES found'\nif ',${ret:},' !~contains ',ICAP_BARCODEMAXSEARCHPRIORITIES,' goto MAIN.CAP_SUPPORTEDCAPS.FAIL\necho.passfail '${get:name}' 'pass'\n;\nsetlocal name 'CAP_SUPPORTEDCAPS ICAP_BARCODESEARCHMODE found'\nif ',${ret:},' !~contains ',ICAP_BARCODESEARCHMODE,' goto MAIN.CAP_SUPPORTEDCAPS.FAIL\necho.passfail '${get:name}' 'pass'\n;\nsetlocal name 'CAP_SUPPORTEDCAPS ICAP_BARCODESEARCHPRIORITIES found'\nif ',${ret:},' !~contains ',ICAP_BARCODESEARCHPRIORITIES,' goto MAIN.CAP_SUPPORTEDCAPS.FAIL\necho.passfail '${get:name}' 'pass'\n;\nsetlocal name 'CAP_SUPPORTEDCAPS ICAP_SUPPORTEDBARCODETYPES found'\nif ',${ret:},' !~contains ',ICAP_SUPPORTEDBARCODETYPES,' goto MAIN.CAP_SUPPORTEDCAPS.FAIL\necho.passfail '${get:name}' 'pass'\n;\ngoto MAIN.CAP_SUPPORTEDCAPS.DONE\n:MAIN.CAP_SUPPORTEDCAPS.FAIL\necho.passfail '${get:name}' 'fail - ${sts:} ${ret:}'\nsetlocal certifyresult 'fail'\ngoto MAIN.DONE\n:MAIN.CAP_SUPPORTEDCAPS.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; ICAP_SUPPORTEDEXTIMAGEINFO: check that all metadata is reported\n;\nsetlocal name 'ICAP_SUPPORTEDEXTIMAGEINFO MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'ICAP_SUPPORTEDEXTIMAGEINFO,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ICAP_SUPPORTEDEXTIMAGEINFO.FAIL\necho.passfail '${get:name}' 'pass'\n;\nsetlocal name 'ICAP_SUPPORTEDEXTIMAGEINFO TWEI_BARCODECONFIDENCE found'\nif ',${ret:},' !~contains ',TWEI_BARCODECONFIDENCE,' goto MAIN.ICAP_SUPPORTEDEXTIMAGEINFO.FAIL\necho.passfail '${get:name}' 'pass'\n;\nsetlocal name 'ICAP_SUPPORTEDEXTIMAGEINFO TWEI_BARCODECOUNT found'\nif ',${ret:},' !~contains ',TWEI_BARCODECOUNT,' goto MAIN.ICAP_SUPPORTEDEXTIMAGEINFO.FAIL\necho.passfail '${get:name}' 'pass'\n;\nsetlocal name 'ICAP_SUPPORTEDEXTIMAGEINFO TWEI_BARCODEROTATION found'\nif ',${ret:},' !~contains ',TWEI_BARCODEROTATION,' goto MAIN.ICAP_SUPPORTEDEXTIMAGEINFO.FAIL\necho.passfail '${get:name}' 'pass'\n;\nsetlocal name 'ICAP_SUPPORTEDEXTIMAGEINFO TWEI_BARCODETEXT2 found'\nif ',${ret:},' !~contains ',TWEI_BARCODETEXT2,' goto MAIN.ICAP_SUPPORTEDEXTIMAGEINFO.FAIL\necho.passfail '${get:name}' 'pass'\n;\nsetlocal name 'ICAP_SUPPORTEDEXTIMAGEINFO TWEI_BARCODETEXTLENGTH found'\nif ',${ret:},' !~contains ',TWEI_BARCODETEXTLENGTH,' goto MAIN.ICAP_SUPPORTEDEXTIMAGEINFO.FAIL\necho.passfail '${get:name}' 'pass'\n;\nsetlocal name 'ICAP_SUPPORTEDEXTIMAGEINFO TWEI_BARCODETYPE found'\nif ',${ret:},' !~contains ',TWEI_BARCODETYPE,' goto MAIN.ICAP_SUPPORTEDEXTIMAGEINFO.FAIL\necho.passfail '${get:name}' 'pass'\n;\nsetlocal name 'ICAP_SUPPORTEDEXTIMAGEINFO TWEI_BARCODEX found'\nif ',${ret:},' !~contains ',TWEI_BARCODEX,' goto MAIN.ICAP_SUPPORTEDEXTIMAGEINFO.FAIL\necho.passfail '${get:name}' 'pass'\n;\nsetlocal name 'ICAP_SUPPORTEDEXTIMAGEINFO TWEI_BARCODEY found'\nif ',${ret:},' !~contains ',TWEI_BARCODEY,' goto MAIN.ICAP_SUPPORTEDEXTIMAGEINFO.FAIL\necho.passfail '${get:name}' 'pass'\n;\ngoto MAIN.ICAP_SUPPORTEDEXTIMAGEINFO.DONE\n:MAIN.ICAP_SUPPORTEDEXTIMAGEINFO.FAIL\necho.passfail '${get:name}' 'fail - ${sts:} ${ret:}'\nsetlocal certifyresult 'fail'\n:MAIN.ICAP_SUPPORTEDEXTIMAGEINFO.DONE\n\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; ICAP_BARCODEDETECTIONENABLED must currently be FALSE\n;\nsetlocal name 'ICAP_BARCODEDETECTIONENABLED resets to FALSE'\ndsmentry src ds dg_control dat_capability msg_getcurrent 'ICAP_BARCODEDETECTIONENABLED,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ICAP_BARCODEDETECTIONENABLEDFALSE.FAIL\nif ',${ret:},' !~contains ',FALSE,' goto MAIN.ICAP_BARCODEDETECTIONENABLEDFALSE.FAIL\necho.passfail '${get:name}' 'pass'\ngoto MAIN.ICAP_BARCODEDETECTIONENABLEDFALSE.DONE\n;\n:MAIN.ICAP_BARCODEDETECTIONENABLEDFALSE.SKIP\necho.passfail '${get:name}' 'skip - ${sts:} ${ret:}'\nsetlocal certifyresult 'fail'\ngoto MAIN.DONE\n:MAIN.ICAP_BARCODEDETECTIONENABLEDFALSE.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; ICAP_BARCODEDETECTIONENABLED set to TRUE\n;\nsetlocal name 'ICAP_BARCODEDETECTIONENABLED set to TRUE'\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_BARCODEDETECTIONENABLED,TWON_ONEVALUE,TWTY_BOOL,TRUE'\nif '${sts:}' != 'SUCCESS' goto MAIN.ICAP_BARCODEDETECTIONENABLEDTRUE.FAIL\ndsmentry src ds dg_control dat_capability msg_getcurrent 'ICAP_BARCODEDETECTIONENABLED,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ICAP_BARCODEDETECTIONENABLEDTRUE.FAIL\nif ',${ret:},' !~contains ',TRUE,' goto MAIN.ICAP_BARCODEDETECTIONENABLEDTRUE.FAIL\necho.passfail '${get:name}' 'pass'\ngoto MAIN.ICAP_BARCODEDETECTIONENABLEDTRUE.DONE\n;\n:MAIN.ICAP_BARCODEDETECTIONENABLEDTRUE.FAIL\necho.passfail '${get:name}' 'skip - ${sts:} ${ret:}'\nsetlocal certifyresult 'fail'\ngoto MAIN.DONE\n:MAIN.ICAP_BARCODEDETECTIONENABLEDTRUE.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get ICAP_XFERMECH...\n;\nsetlocal name 'ICAP_XFERMECH MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'ICAP_XFERMECH,0,0,0'\nif '${sts:}' == 'SUCCESS' goto MAIN.ICAP_XFERMECH.DONE\necho.passfail '${get:name}' 'fail - ${sts:} ${ret:}'\nsetlocal certifyresult 'fail'\ngoto MAIN.DONE\n;\n:MAIN.ICAP_XFERMECH.DONE\nsetglobal g_xfermech '${ret:}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; All done...\n;\n:MAIN.DONE\nreturn '${get:certifyresult}'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/130 - Barcode Badge/Certification.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Barcode Badge\n;   Check if Barcode is supported by the driver.  This is a badge, meaning that failure will not\n;   invalidate scanner certification.  Instead, passage will add Barcode support to the cert.\n;\n; Arguments\n;   arg:1 - TW_IDENTITY.ProductName of scanner to test\n;   arg:2 - global to set on fail\n;\n; Globals\n;   g_localcertifyresult - global to report to caller on fail\n;   g_xfermech - current transfer mechanism\n;\n; Locals\n;   twidentity.productname - product name of scanner to test\n;   globaltosetonfail - name says it all\n;\n; Returns\n;   (none)\n;\n; History\n;   1.0 - initial release\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize stuff, load tables if not already done for us...\n;\necho.titlesuite 'Barcode Badge v1.0 17-Sep-2021'\necho.yellow '*************************************************************************************'\necho.yellow '*** This tests the Barcode Badge.  Skipping or failing means the driver does      ***'\necho.yellow '*** not support this functionality.  It does not prevent certification.           ***'\necho.yellow '*************************************************************************************'\n;\nsetlocal twidentity.productname '${arg:1}'\nsetlocal globaltosetonfail '${arg:2}'\nsetglobal g_localcertifyresult 'pass' ; assume success\nsetglobal g_xfermech ''\n;\nif '${get:TW_ARRAY.ItemType}' != '' goto MAIN.LOADTABLES.SKIP\nrun '${folder:certification}/LoadTables'\n:MAIN.LOADTABLES.SKIP\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Run the tests...\n;\ncall CERTIFY '${folder:certification}/Opends'  '${get:twidentity.productname}' 'g_localcertifyresult' 'embedded'\nif '${get:g_localcertifyresult}' == 'fail' goto MAIN.CLOSEDS\n;\ncall CERTIFY 'Barcode Badge'                   '${get:twidentity.productname}' 'g_localcertifyresult'\ncall CERTIFY 'DAT_IMAGENATIVEXFER'             '${get:twidentity.productname}' 'g_localcertifyresult' '${folder:parent}'\ncall CERTIFY 'DAT_IMAGEMEMXFER'                '${get:twidentity.productname}' 'g_localcertifyresult' '${folder:parent}'\ncall CERTIFY 'DAT_IMAGEFILEXFER'               '${get:twidentity.productname}' 'g_localcertifyresult' '${folder:parent}'\ncall CERTIFY 'DAT_IMAGEMEMFILEXFER'            '${get:twidentity.productname}' 'g_localcertifyresult' '${folder:parent}'\n;\n:MAIN.CLOSEDS\ncall CERTIFY '${folder:certification}/Closeds' '${get:twidentity.productname}' 'g_localcertifyresult 'embedded'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Summary and cleanup...\n;\n; Did we pass? (do an extra check)\nif '${get:g_localcertifyresult}' == 'skip' goto MAIN.SKIP\nif '${get:g_localcertifyresult}' != 'pass' goto MAIN.ERROR\necho ''\necho.passfail 'BADGE SUMMARY' 'pass'\nreturn 'pass'\n;\n; Unsupported...\n:MAIN.SKIP\necho ''\necho.passfail 'BADGE SUMMARY' 'skip'\nsetglobal '${get:globaltosetonfail}' 'skip'\nreturn 'skip'\n;\n; Ruh-roh...\n:MAIN.ERROR\necho ''\necho.passfail 'BADGE SUMMARY' 'fail'\nsetglobal '${get:globaltosetonfail}' 'fail'\nreturn 'fail'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Function: Certify\n; arg:1 - script to run\n; arg:2 - TW_IDENTITY.ProductName of scanner to test\n; arg:3 - global value to update on fail\n; arg:4 - embeded flag for open/close, or folder for DAT_IMAGE*XFER calls\n; returns: (none)\n;\n:CERTIFY\n;\n; If a failure has occurred on a previous test, skip the rest of the tests,\n; except for closing, that would be bad...\nif '${arg:1}' ~contains 'Closeds' goto CERTIFY.RUN\nif '${get:${arg:3}}' == 'skip' goto CERTIFY.SKIP\nif '${get:${arg:3}}' == 'fail' goto CERTIFY.FAIL\n;\n; Run the test...\n:CERTIFY.RUN\nrun '${arg:1}' '${arg:2}' '${arg:4}'\nif '${ret:}' == 'skip' goto CERTIFY.SKIP\nif '${ret:}' != 'pass' goto CERTIFY.FAIL\nreturn 'pass'\n;\n; Handle skipping, set the global so we have a record...\n:CERTIFY.SKIP\nsetglobal '${arg:3}' 'skip'\nreturn 'skip'\n;\n; Handle failure, set the global so we have a record...\n:CERTIFY.FAIL\nsetglobal '${arg:3}' 'fail'\nreturn 'fail'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/130 - Barcode Badge/DAT_EXTIMAGEINFO.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DAT_EXTIMAGEINFO\n;   Check the return values from DAT_EXTIMAGEINFO to make sure the barcode\n;   metadata is being properly reported.\n;\n;   Here's the basic flow:\n;       DAT_EXTIMAGEINFO\n;       confirm that we have the following TWEI_BARCODE* items\n;           TWEI_BARCODECOUNT\n;           TWEI_BARCODECONFIDENCE\n;           TWEI_BARCODEROTATION\n;           TWEI_BARCODETYPE\n;           TWEI_BARCODEX\n;           TWEI_BARCODEY\n;           TWEI_BARCODETEXTLENGTH\n;           TWEI_BARCODETEXT2\n;       confirm TWEI_BARCODECOUNT fields in TW_INFO[0]\n;       confirm a sheet with no barcodes  (TWEI_BARCODECOUNT == 0)\n;           all TW_INFO[n].ReturnCode values TWRC_DATANOTAVAILABLE\n;       confirm a sheet with one barcode (TWEI_BARCODECOUNT == 1)\n;           all TW_INFO[n].ReturnCode values are TWRC_SUCCESS\n;           all TW_INFO[n].ItemType values match the spec\n;           all TW_INFO[n].NumItems match ICAP_BARCODECOUNT\n;           all TW_INFO[n].Item handle contains 'TWAIN-Barcode-Test'\n;       confirm a sheet with many barcodes  (TWEI_BARCODECOUNT > 1)\n;           all TW_INFO[n].ReturnCode values are TWRC_SUCCESS\n;           all TW_INFO[n].ItemType values match the spec\n;           all TW_INFO[n].NumItems match ICAP_BARCODECOUNT\n;           all TW_INFO[n].Item handle points to array of handles, and each contains 'TWAIN-Barcode-Test'\n;\n;   The test passes if:\n;       - g_barcodecount.none >= 1\n;         and (((barcodemaxsearchpriorities.max > 1)  and (g_barcodecount.one >= 1) and (g_barcodecount.many >= 1))\n;         or   ((barcodemaxsearchpriorities.max == 1) and (g_barcodecount.one >= 2) and (g_barcodecount.many == 0)))\n;\n; Arguments\n;   arg:1 - indent the passfail text\n;   arg:2 - base filename (no extension)\n;\n; Globals\n;   g_barcodecount.none - increment if no barcodes are found\n;   g_barcodecount.one - increment if one barcodes is found\n;   g_barcodecount.many - increment if many barcodes are found\n;\n; Locals\n;   barcodecount - the number of barcodes found on the image\n;   barcodedata - the return value from DAT_EXTIMAGEINFO\n;   barcodetext2.index - index into the current TWEI_BARCODETEXT2 value\n;   barcodetexthandle - barcodetext2.index handle from TW_INFO[n].Item array of handles \n;   barcodetextlength - one or more comma separated TWEI_BARCODETEXTLENGTH values, depending on TWEI_BARCODECOUNT\n;   barcodetextlength.index - index of the current TWEI_BARCODETEXTLENGTH value\n;   name - current test being done\n;   indent - indent the passfail text\n;   item - data from barcodetexthandle\n;   twinfo.infoid.index - index to TW_INFO[n].infoid from the start of barcodedata\n;   twinfo.itemtype.index - index to TW_INFO[n].itemtype from the start of barcodedata\n;   twinfo.numitems.index - index to TW_INFO[n].numitems from the start of barcodedata\n;   twinfo.returncode.index - index to TW_INFO[n].returncode from the start of barcodedata\n;   twinfo.item.index - index to TW_INFO[n].item from the start of barcodedata\n;\n; Returns\n;   pass/fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get the extended image info, save the data to 'barcodedata'.  We've deliberately\n; asked for TWEI_BARCODECOUNT first, and for TWEI_BARCODETEXTLENGTH before\n; TWEI_BARCODETEXT2 to make it easier to parse the data we get back.  You'll see\n; why further below...\n;\nsetlocal indent '${arg:1}    '\nsetlocal name 'dg_image/dat_extimageinfo/msg_get TWEI_BARCODE*'\ndsmentry src ds dg_image dat_extimageinfo msg_get '8,TWEI_BARCODECOUNT,0,0,0,0,TWEI_BARCODECONFIDENCE,0,0,0,0,TWEI_BARCODEROTATION,0,0,0,0,TWEI_BARCODETYPE,0,0,0,0,TWEI_BARCODEX,0,0,0,0,TWEI_BARCODEY,0,0,0,0,TWEI_BARCODETEXTLENGTH,0,0,0,0,TWEI_BARCODETEXT2,0,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal barcodedata '${ret:}'\nfilewrite '${arg:2}_extimageinfo.txt' '${get:barcodedata}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Confirm that we got back all the barcode extimageinfo data...\n;\nsetlocal name 'Found TWEI_BARCODECOUNT'\nif '${get:barcodedata}' !contains 'TWEI_BARCODECOUNT' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal name 'Found TWEI_BARCODECONFIDENCE'\nif '${get:barcodedata}' !contains 'TWEI_BARCODECONFIDENCE' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal name 'Found TWEI_BARCODEROTATION'\nif '${get:barcodedata}' !contains 'TWEI_BARCODEROTATION' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal name 'Found TWEI_BARCODETYPE'\nif '${get:barcodedata}' !contains 'TWEI_BARCODETYPE' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal name 'Found TWEI_BARCODEX'\nif '${get:barcodedata}' !contains 'TWEI_BARCODEX' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal name 'Found TWEI_BARCODEY'\nif '${get:barcodedata}' !contains 'TWEI_BARCODEY' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal name 'Found TWEI_BARCODETEXTLENGTH'\nif '${get:barcodedata}' !contains 'TWEI_BARCODETEXTLENGTH' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal name 'Found TWEI_BARCODETEXT2'\nif '${get:barcodedata}' !contains 'TWEI_BARCODETEXT2' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Validate the contents of TWEI_BARCODECOUNT, which is TW_INFO[0]...\n;\nsetlocal name 'TW_INFO[0].InfoID is TWEI_BARCODECOUNT'\nif '${getindex:barcodedata:${get:TW_INFO.InfoID}}' != 'TWEI_BARCODECOUNT' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'TW_INFO[0].ItemType is TWTY_UINT32'\nif '${getindex:barcodedata:${get:TW_INFO.ItemType}}' != 'TWTY_UINT32' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'TW_INFO[0].NumItems is 1'\nif '${getindex:barcodedata:${get:TW_INFO.NumItems}}' != '1' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'TW_INFO[0].ReturnCode is TWRC_SUCCESS'\nif '${getindex:barcodedata:${get:TW_INFO.ReturnCode}}' != 'TWRC_SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal barcodecount '${getindex:barcodedata:${get:TW_INFO.Item}}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Jump to the correct analysis section, depending on how many barcodes we detected\n; in the first TW_INFO, which we expect to be TWEI_BARCODECOUNT, because that's where\n; we put it...\n;\nsetlocal twinfo.infoid.index '${get:TW_INFO.InfoID}'\nsetlocal twinfo.itemtype.index '${get:TW_INFO.ItemType}'\nsetlocal twinfo.numitems.index '${get:TW_INFO.NumItems}'\nsetlocal twinfo.returncode.index '${get:TW_INFO.ReturnCode}'\nsetlocal twinfo.item.index '${get:TW_INFO.Item}'\nif '${getindex:barcodedata:${get:TW_INFO.Item}}' == '0' goto MAIN.NOBARCODES\nif '${getindex:barcodedata:${get:TW_INFO.Item}}' == '1' goto MAIN.ONEBARCODE\ngoto MAIN.MANYBARCODES\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Validate what happens when we can't find a barcode, we're looking at the NumItems\n; and the ReturnCodes for all of the TWEI_BARCODE* items.  We expect the number of\n; items to be 0 (matching the value of TWEI_BARCODECOUNT), and we expect the return\n; code to be TWRC_DATANOTAVAILABLE...\n;\n:MAIN.NOBARCODES\nincrement g_barcodecount.none '${get:g_barcodecount.none}' 1\nincrement twinfo.infoid.index '${get:twinfo.infoid.index}' 5 ; skip to the InfoID in the next TW_INFO\nincrement twinfo.itemtype.index '${get:twinfo.itemtype.index}' 5 ; skip to the InfoID in the next TW_INFO\nincrement twinfo.numitems.index '${get:twinfo.numitems.index}' 5 ; skip to the NumItems in the next TW_INFO\nincrement twinfo.returncode.index '${get:twinfo.returncode.index}' 5 ; skip to the ReturnCode in the next TW_INFO\nincrement twinfo.item.index '${get:twinfo.item.index}' 5 ; skip to the ReturnCode in the next TW_INFO\n;\n:MAIN.NOBARCODES.NEXT\nsetlocal name 'No barcodes: '${getindex:barcodedata:${get:twinfo.infoid.index}}'\nif '${getindex:barcodedata:${get:twinfo.infoid.index}}' == '' goto MAIN.PASS ; out of items\nif '${getindex:barcodedata:${get:twinfo.numitems.index}}' != '0' goto MAIN.ERROR.ECHOPASSFAIL\nif '${getindex:barcodedata:${get:twinfo.returncode.index}}' != 'TWRC_DATANOTAVAILABLE' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nincrement twinfo.infoid.index '${get:twinfo.infoid.index}' 5 ; skip to the InfoID in the next TW_INFO\nincrement twinfo.itemtype.index '${get:twinfo.itemtype.index}' 5 ; skip to the InfoID in the next TW_INFO\nincrement twinfo.numitems.index '${get:twinfo.numitems.index}' 5 ; skip to the NumItems in the next TW_INFO\nincrement twinfo.returncode.index '${get:twinfo.returncode.index}' 5 ; skip to the ReturnCode in the next TW_INFO\nincrement twinfo.item.index '${get:twinfo.item.index}' 5 ; skip to the ReturnCode in the next TW_INFO\ngoto MAIN.NOBARCODES.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Validate one barcode item, we're looking at the NumItems and the ReturnCodes\n; for all of the TWEI_BARCODE* items.  We expect the number of items to be 1\n; (matching the value of TWEI_BARCODECOUNT), and we expect the return code to\n; be TWRC_SUCCESS.  We expect all TWEI_BARCODE* itemtypes to be TWTY_UINT32,\n; except for TWEI_BARCODETEXT2, which must be TWTY_HANDLE...\n;\n:MAIN.ONEBARCODE\nincrement g_barcodecount.one '${get:g_barcodecount.one}' 1\n;\n; Increment to the next TW_INFO, this skips TW_INFO[0] for us, bail from the\n; loop when we run out of items...\n:MAIN.ONEBARCODE.NEXT\nincrement twinfo.infoid.index '${get:twinfo.infoid.index}' 5 ; skip to the InfoID in the next TW_INFO\nincrement twinfo.itemtype.index '${get:twinfo.itemtype.index}' 5 ; skip to the InfoID in the next TW_INFO\nincrement twinfo.numitems.index '${get:twinfo.numitems.index}' 5 ; skip to the NumItems in the next TW_INFO\nincrement twinfo.returncode.index '${get:twinfo.returncode.index}' 5 ; skip to the ReturnCode in the next TW_INFO\nincrement twinfo.item.index '${get:twinfo.item.index}' 5 ; skip to the ReturnCode in the next TW_INFO\nif '${getindex:barcodedata:${get:twinfo.infoid.index}}' == '' goto MAIN.PASS ; out of items\n;\n; Check NumItems...\nsetlocal name 'One barcode: ${getindex:barcodedata:${get:twinfo.infoid.index}}.NumItems is TWEI_BARCODECOUNT'\nif '${getindex:barcodedata:${get:twinfo.numitems.index}}' != '${get:barcodecount}' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n; Check ReturnCode...\nsetlocal name 'One barcode: ${getindex:barcodedata:${get:twinfo.infoid.index}}.ReturnCode is TWRC_SUCCESS'\nif '${getindex:barcodedata:${get:twinfo.returncode.index}}' != 'TWRC_SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n; Check ItemType for non-TWEI_BARCODETEXT2 stuff...\nif '${getindex:barcodedata:${get:twinfo.infoid.index}}' == 'TWEI_BARCODETEXT2' goto MAIN.ONEBARCODE.ITEMTYPE.BARCODETEXT2\nsetlocal name 'One barcode: ${getindex:barcodedata:${get:twinfo.infoid.index}}.ItemType is TWTY_UINT32'\nif '${getindex:barcodedata:${get:twinfo.itemtype.index}}' != 'TWTY_UINT32' MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n; Get the length, when we see it...\nif '${getindex:barcodedata:${get:twinfo.infoid.index}}' != 'TWEI_BARCODETEXTLENGTH' goto MAIN.ONEBARCODE.NEXT\nsetlocal barcodetextlength '${getindex:barcodedata:${get:twinfo.item.index}}'\ngoto MAIN.ONEBARCODE.NEXT\n;\n; Check ItemType for TWEI_BARCODETEXT2...\n:MAIN.ONEBARCODE.ITEMTYPE.BARCODETEXT2\nsetlocal name 'One barcode: ${getindex:barcodedata:${get:twinfo.infoid.index}}.ItemType is TWTY_HANDLE'\nif '${getindex:barcodedata:${get:twinfo.itemtype.index}}' != 'TWTY_HANDLE' MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n; Check Item for TWEI_BARCODETEXT2...\n:MAIN.ONEBARCODE.ITEMTYPE.BARCODETEXT2\nsetlocal name 'One barcode: ${getindex:barcodedata:${get:twinfo.infoid.index}}.Item contains TWAIN-Barcode-Test'\nif '${getindex:barcodedata:${get:twinfo.item.index}}' == '0' MAIN.ERROR.ECHOPASSFAIL\nsetlocal item '${gethandle:${getindex:barcodedata:${get:twinfo.item.index}}:TWTY_HANDLE:${get:barcodetextlength}}'\nfilewrite '${arg:2}_barcode.txt' '${get:item}'\nfree handle item\nif '${get:item}' !~contains 'TWAIN-Barcode-Test' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\ngoto MAIN.ONEBARCODE.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Validate many barcodes, we're looking at the NumItems and the ReturnCodes\n; for all of the TWEI_BARCODE* items.  We expect the number of items to be\n; greater than 1 (matching the value of TWEI_BARCODECOUNT), and we expect the\n; return code to be TWRC_SUCCESS.  We expect all TWEI_BARCODE* itemtypes to be\n; TWTY_UINT32, except for TWEI_BARCODETEXT2, which must be a TWTY_HANDLE\n; pointing to an array of TWTY_HANDLES...\n;\n:MAIN.MANYBARCODES\nincrement g_barcodecount.many '${get:g_barcodecount.many}' 1\n;\n; Increment to the next TW_INFO, this skips TW_INFO[0] for us, bail from the\n; loop when we run out of items...\n:MAIN.MANYBARCODES.NEXT\nincrement twinfo.infoid.index '${get:twinfo.infoid.index}' 5 ; skip to the InfoID in the next TW_INFO\nincrement twinfo.itemtype.index '${get:twinfo.itemtype.index}' 5 ; skip to the InfoID in the next TW_INFO\nincrement twinfo.numitems.index '${get:twinfo.numitems.index}' 5 ; skip to the NumItems in the next TW_INFO\nincrement twinfo.returncode.index '${get:twinfo.returncode.index}' 5 ; skip to the ReturnCode in the next TW_INFO\nincrement twinfo.item.index '${get:twinfo.item.index}' 5 ; skip to the ReturnCode in the next TW_INFO\nif '${getindex:barcodedata:${get:twinfo.infoid.index}}' == '' goto MAIN.PASS ; out of items\n;\n; Check NumItems...\nsetlocal name 'Many barcodes: ${getindex:barcodedata:${get:twinfo.infoid.index}}.NumItems is TWEI_BARCODECOUNT'\nif '${getindex:barcodedata:${get:twinfo.numitems.index}}' != '${get:barcodecount}' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n; Check ReturnCode...\nsetlocal name 'Many barcodes: ${getindex:barcodedata:${get:twinfo.infoid.index}}.ReturnCode is TWRC_SUCCESS'\nif '${getindex:barcodedata:${get:twinfo.returncode.index}}' != 'TWRC_SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n; Check ItemType for non-TWEI_BARCODETEXT2 stuff...\nif '${getindex:barcodedata:${get:twinfo.infoid.index}}' == 'TWEI_BARCODETEXT2' goto MAIN.MANYBARCODES.ITEMTYPE.BARCODETEXT2\nsetlocal name 'Many barcodes: ${getindex:barcodedata:${get:twinfo.infoid.index}}.ItemType is TWTY_UINT32'\nif '${getindex:barcodedata:${get:twinfo.itemtype.index}}' != 'TWTY_UINT32' MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n; Get the length, when we see it, we're going to make a comma separated\n; list of all the lengths...\nif '${getindex:barcodedata:${get:twinfo.infoid.index}}' != 'TWEI_BARCODETEXTLENGTH' goto MAIN.MANYBARCODES.NEXT\nsetlocal barcodetextlength ''         ; start empty\nsetlocal barcodetextlength.index '0'  ; index is at 0\nsetlocal comma ''                     ; no comma\n:MAIN.MANYBARCODES.BARCODETEXTLENGTH.NEXT\nsetlocal barcodetextlength '${get:barcodetextlength}${get:comma}${gethandleindex:${getindex:barcodedata:${get:twinfo.item.index}}:${get:barcodetextlength.index}:TWTY_UINT32}' ; gethandleindex:handle:index:type\nsetlocal comma ','\nincrement barcodetextlength.index ${get:barcodetextlength.index} 1\nif '${get:barcodetextlength.index}' >= '${get:barcodecount}' goto MAIN.MANYBARCODES.NEXT ; out of items\ngoto MAIN.MANYBARCODES.BARCODETEXTLENGTH.NEXT ; look into adding another barcodetextlength\n;\n; Check ItemType for TWEI_BARCODETEXT2...\n:MAIN.MANYBARCODES.ITEMTYPE.BARCODETEXT2\nsetlocal name 'Many barcodes: ${getindex:barcodedata:${get:twinfo.infoid.index}}.ItemType is TWTY_HANDLE'\nif '${getindex:barcodedata:${get:twinfo.itemtype.index}}' != 'TWTY_HANDLE' MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n; Check Item for TWEI_BARCODETEXT2...\n:MAIN.MANYBARCODES.ITEM.BARCODETEXT2\nsetlocal barcodetext2.index '0'  ; index starts at 0\n;\n; Look here for every barcodetext2 indexed at 0 to (barcodecount-1)\n:MAIN.MANYBARCODES.ITEM.BARCODETEXT2.NEXT\nsetlocal name 'Many barcodes: ${getindex:barcodedata:${get:twinfo.infoid.index}}.Item contains TWAIN-Barcode-Test'\n;\n; Yeah, okay, these two lines look like a bit of a mess.  But honestly, it's not as insane as you might\n; think.  The first setlocal is going to memlock the TW_INFO[n].Item we're working on.  Then it'll go in\n; and pull out the handle at the current index (barcodetext.index).\n;\n; The second setlocal takes that handle, does a memlock on it, and extracts barcodetextlength bytes of\n; data.  barcodetextlength is an array, since each barcode can have a different size.\nsetlocal barcodetexthandle '${gethandleindex:${getindex:barcodedata:${get:twinfo.item.index}}:${get:barcodetext2.index}:TWTY_HANDLE}' ; gethandleindex:handle:index:TWTY_HANDLE\nsetlocal item '${gethandle:${get:barcodetexthandle}:TWTY_HANDLE:${getindex:barcodetextlength:${get:barcodetext2.index}}}' ; gethandle:handle:TWTY_HANDLE:length\nfilewrite '${arg:2}_barcode_${get:barcodetext2.index}.txt' '${get:item}'\n;\n; The data needs to contain \"TWAIN-Barcode-Test\" (it can contain more stuff).  If that passes, then\n; increment our index and go back to MAIN.MANYBARCODES.ITEM.BARCODETEXT2.NEXT to process the next barcode...\nif '${get:item}' !~contains 'TWAIN-Barcode-Test' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nincrement barcodetext2.index ${get:barcodetext2.index} 1\nif '${get:barcodetext2.index}' >= '${get:barcodecount}' goto MAIN.MANYBARCODES.NEXT ; out of items\ngoto MAIN.MANYBARCODES.ITEM.BARCODETEXT2.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Summary and cleanup...\n;\n; We passed...\n:MAIN.PASS\nreturn 'pass'\n;\n; Ruh-roh...\n:MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'fail - ${sts:} ${ret:}'\nreturn 'fail'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/130 - Barcode Badge/DAT_IMAGEFILEXFER.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DAT_IMAGEFILEXFER\n;   This test scans three sheets of paper for the default pixeltype.  An ADF\n;   is required to pass this test, but that was already been tested before\n;   we got to this function.  The three sheets are as follows.but don't have\n;   to be in any special order:\n;\n;       - one without any barcodes, which must report TWRC_DATANOTAVAILABLE\n;\n;\t    - one with a single barcode, which must report TWRC_SUCCESS for all\n;         of the TWEI_BARCODE* items, and put the data in a TW_HANDLE\n;\n;       - one with multiple barcodes; which must report TWRC_SUCCESS for all\n;         of the TWEI_BARCODE* items, and return a TW_HANDLE that contains\n;         an array of TW_HANDLE value, each of which points to barcode data;\n;         if the scanner cannot return multiple barcodes, it still passes\n;\n;   Here's the basic flow:\n;       SetCapabilities\n;       start scanning\n;       while images\n;           transfer image\n;           DAT_EXTIMAGEINFO\n;           end image\n;       end\n;       end scanning\n;       verify the results\n;\n;   The test passes if:\n;       - g_barcodecount.none >= 1\n;         and (((barcodemaxsearchpriorities.max > 1)  and (g_barcodecount.one >= 1) and (g_barcodecount.many >= 1))\n;         or   ((barcodemaxsearchpriorities.max == 1) and (g_barcodecount.one >= 2) and (g_barcodecount.many == 0)))\n;\n; Arguments\n;   arg:1 - TW_IDENTITY.ProductName of scanner to test\n;   arg:2 - test name for the image folder\n;\n; Globals\n;   g_barcodemaxsearchpriorities.max - maximum barcodes we can get\n;   g_barcodecount.none - increment if no barcodes are found\n;   g_barcodecount.one - increment if one barcodes is found\n;   g_barcodecount.many - increment if many barcodes are found\n;\n; Locals\n;   name - current test being done\n;   indent - indent the passfail text\n;   twimageinfo.compression - compression for current image\n;\n;   image.count - count of images from 1\n;   image.folder - folder to put the images in\n;\n;   feederenabled.list - scanner's feederenabled values\n;   feederenabled.index - index of feederenabled values\n;   feederenabled.value - current feederenabled value\n;\n;   pixeltype.list - scanner's pixeltype values for this feederenabled\n;   pixeltype.index - index of pixeltype values\n;   pixeltype.value - current pixeltype value\n;\n; Returns\n;   pass/fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; If not supported, quietly leave...\n;\nif '${get:g_xfermech}' ~contains 'TWSX_FILE' goto MAIN.CONTINUE\nreturn 'pass'\n:MAIN.CONTINUE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize...\n;\necho.titletest 'DAT_IMAGEFILEXFER'\n;\nsetlocal indent ''\nsetlocal image.count '0'\nsetlocal image.folder '${folder:certimages}/${arg:2}/DAT_IMAGEFILEXFER'\nsetlocal image.showname ''\n;\nsetglobal g_barcodemaxsearchpriorities.max '0'\nsetglobal g_barcodecount.none '0'\nsetglobal g_barcodecount.one '0'\nsetglobal g_barcodecount.many '0'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Clean the image folder for this test...\n;\nimage cleanfolderandmeta '${get:image.folder}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; SetCapabilities\n; This resets the driver and sets all the capabilities we need for the test.\n; If its return code is not 'pass', end with an error\n;\nrun SetCapabilities 'TWSX_FILE' '${get:indent}'\nif '${ret:}' != 'pass' goto MAIN.ERROR.FAIL\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Prompt the user...\n;\necho.prompt\necho.prompt \"Scanning will take place during this test.  There will be no\"\necho.prompt \"need to press any button on the TWAIN user interface to start\"\necho.prompt \"the scanner.  A progress indicator may appear during scanning.\"\necho.prompt\necho.prompt \"Place 3 sheets in the scanner's feeder in no particular order:\"\necho.prompt \"one sheet has no barcodes, one has a single barcode that the\"\necho.prompt \"scanner is known to recognize, and one has multiple barcodes\"\necho.prompt \"that scanner is known to recognize.  If the scanner is only\"\necho.prompt \"able to see one barcode at a time it can still pass the test.\"\necho.prompt\npause '(press the ENTER key when ready to continue)'\necho.prompt\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Start scanning...\n;\n:MAIN.USERINTERFACE\nsetlocal name 'dg_control/dat_userinterface/msg_enableds'\nwait reset\ndsmentry src null dg_control dat_userinterface msg_enableds '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Wait for MSG_XFERREADY, if we don't see it then scoot...\n;\nsetlocal name 'wait ${get:sys_waittimeout} seconds for MSG_XFERREADY'\nwait '${get:sys_waittimeout}000'\nif '${ret:}' !~contains 'msg_xferready' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get information about the image...\n;\n:MAIN.IMAGEINFO.NEXT\nsetlocal name 'dg_image/dat_imageinfo/msg_get'\ndsmentry src ds dg_image dat_imageinfo msg_get '0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\nsetlocal twimageinfo.compression '${ret:${get:index.twimageinfo.compression}}'\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set up the file transfer...\n;\nincrement image.count '${get:image.count}' 1\nif '${get:twimageinfo.compression}' == 'JPEG' goto MAIN.SETUPFILEXFER.JPEG\nsetlocal image.showname 'DAT_IMAGEFILEXFER/adf${format:D6|${get:image.count}}.tif'\nsetlocal twsetupfilexfer.filename '${get:image.folder}/adf${format:D6|${get:image.count}}.tif'\nsetlocal twsetupfilexfer.format 'TWFF_TIFF'\ngoto MAIN.SETUPFILEXFER\n:MAIN.SETUPFILEXFER.JPEG\nsetlocal image.showname 'DAT_IMAGEFILEXFER/adf${format:D6|${get:image.count}}.jpg'\nsetlocal twsetupfilexfer.filename '${get:image.folder}/adf${format:D6|${get:image.count}}.jpg'\nsetlocal twsetupfilexfer.format 'TWFF_JFIF'\n:MAIN.SETUPFILEXFER\nsetlocal name 'dg_control/dat_setupfilexfer/msg_set'\ndsmentry src ds dg_control dat_setupfilexfer msg_set '\"${get:twsetupfilexfer.filename}\",${get:twsetupfilexfer.format},0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Transfer the image...\n;\nsetlocal name 'dg_image/dat_imagefilexfer/msg_get'\ndsmentry src ds dg_image dat_imagefilexfer msg_get null\nif '${sts:}' != 'XFERDONE' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\necho.passfail '${get:indent}image <${get:image.showname}>' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DAT_EXTIMAGEINFO\n; Check the barcode metadata...\n;\nrun DAT_EXTIMAGEINFO '${get:indent}' '${get:image.folder}/adf${format:D6|${get:image.count}}'\nif '${ret:}' != 'pass' goto MAIN.ERROR.FAIL\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; End the transfer, see if we're done...\n;\nsetlocal name 'dg_control/dat_pendingxfers/msg_endxfer'\ndsmentry src ds dg_control dat_pendingxfers msg_endxfer '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nif '${ret:${get:TW_PENDINGXFERS.Count}}' != '0' goto MAIN.IMAGEINFO.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We're out of images, so disable...\n;\nsetlocal name 'dg_control/dat_userinterface/msg_disableds'\ndsmentry src ds dg_control dat_userinterface msg_disableds '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Check to see if we passed.  We need one sheet of paper with no barcodes.  Two or more sheets\n; with one barcode, and no sheets with multiple barecodes if the maximum value of\n; ICAP_BARCODEMAXSEARCHPRIORITIES is 1.  And one or more sheets with one barcode, and one or\n; more sheets with multiple barcodes of ICAP_BARCODEMAXSEARCHPRIORITIES is greater than 1.\n;\nsetlocal name 'Final Check: detected a sheet with 0 barcodes\nif '${get:g_barcodecount.none}' < '1' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nif '${get:g_barcodemaxsearchpriorities.max}' >= '2' goto MAIN.FINALCHECK.MANYBARCODES\nsetlocal name 'Final Check: detected multiple sheets with 1 barcode'\nif '${get:g_barcodecount.one}' < '1' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal name 'Final Check: detected 0 sheets with many barcodes (not supported)'\nif '${get:g_barcodecount.many}' > '0' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\ngoto MAIN.FINALCHECK.DONE\n;\n:MAIN.FINALCHECK.MANYBARCODES\nsetlocal name 'Final Check: detected a sheet with 1 barcode'\nif '${get:g_barcodecount.one}' < '1' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal name 'Final Check: detected a sheet with many barcodes'\nif '${get:g_barcodecount.many}' < '1' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n:MAIN.FINALCHECK.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Summary and cleanup...\n;\n; We passed...\n:MAIN.PASS\necho.passfail 'SUMMARY' 'pass'\nreturn 'pass'\n;\n; Ruh-roh...\n:MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'fail - ${sts:} ${ret:}'\necho.passfail 'SUMMARY' 'fail'\nreturn 'fail'\n;\n; Ruh-roh...\n:MAIN.ERROR.FAIL\necho.passfail 'SUMMARY' 'fail'\nreturn 'fail'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/130 - Barcode Badge/DAT_IMAGEMEMFILEXFER.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DAT_IMAGEMEMFILEXFER\n;   This test scans three sheets of paper for the default pixeltype.  An ADF\n;   is required to pass this test, but that was already been tested before\n;   we got to this function.  The three sheets are as follows.but don't have\n;   to be in any special order:\n;\n;       - one without any barcodes, which must report TWRC_DATANOTAVAILABLE\n;\n;\t    - one with a single barcode, which must report TWRC_SUCCESS for all\n;         of the TWEI_BARCODE* items, and put the data in a TW_HANDLE\n;\n;       - one with multiple barcodes; which must report TWRC_SUCCESS for all\n;         of the TWEI_BARCODE* items, and return a TW_HANDLE that contains\n;         an array of TW_HANDLE value, each of which points to barcode data;\n;         if the scanner cannot return multiple barcodes, it still passes\n;\n;   Here's the basic flow:\n;       SetCapabilities\n;       start scanning\n;       while images\n;           transfer image\n;           DAT_EXTIMAGEINFO\n;           end image\n;       end\n;       end scanning\n;       verify the results\n;\n;   The test passes if:\n;       - g_barcodecount.none >= 1\n;         and (((barcodemaxsearchpriorities.max > 1)  and (g_barcodecount.one >= 1) and (g_barcodecount.many >= 1))\n;         or   ((barcodemaxsearchpriorities.max == 1) and (g_barcodecount.one >= 2) and (g_barcodecount.many == 0)))\n;\n; Arguments\n;   arg:1 - TW_IDENTITY.ProductName of scanner to test\n;   arg:2 - test name for the image folder\n;\n; Globals\n;   g_barcodemaxsearchpriorities.max - maximum barcodes we can get\n;   g_barcodecount.none - increment if no barcodes are found\n;   g_barcodecount.one - increment if one barcodes is found\n;   g_barcodecount.many - increment if many barcodes are found\n;\n; Locals\n;   name - current test being done\n;   indent - indent the passfail text\n;   imagememxfer - result of DAT_IMAGEMEMXFER call\n;   setupmemxfer.preferred - preferred field from DAT_SETUPMEMXFER call\n;\n;   image.count - count of images from 1\n;   image.folder - folder to put the images in\n;\n;   feederenabled.list - scanner's feederenabled values\n;   feederenabled.index - index of feederenabled values\n;   feederenabled.value - current feederenabled value\n;\n;   pixeltype.list - scanner's pixeltype values for this feederenabled\n;   pixeltype.index - index of pixeltype values\n;   pixeltype.value - current pixeltype value\n;\n; Returns\n;   pass/fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; If not supported, quietly leave...\n;\nif '${get:g_xfermech}' ~contains 'TWSX_MEMFILE' goto MAIN.CONTINUE\nreturn 'pass'\n:MAIN.CONTINUE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize...\n;\necho.titletest 'DAT_IMAGEMEMFILEXFER'\n;\nsetlocal indent ''\nsetlocal image.pointer '0'\nsetlocal image.count '0'\nsetlocal image.folder '${folder:certimages}/${arg:2}/DAT_IMAGEMEMFILEXFER'\n;\nsetglobal g_barcodemaxsearchpriorities.max '0'\nsetglobal g_barcodecount.none '0'\nsetglobal g_barcodecount.one '0'\nsetglobal g_barcodecount.many '0'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Clean the image folder for this test...\n;\nimage cleanfolderandmeta '${get:image.folder}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; SetCapabilities\n; This resets the driver and sets all the capabilities we need for the test.\n; If its return code is not 'pass', end with an error\n;\nrun SetCapabilities 'TWSX_MEMFILE' '${get:indent}'\nif '${ret:}' != 'pass' goto MAIN.ERROR.FAIL\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get the preferred size for memory transfers, and allocate\n; a pointer for the memory transfers...\n;\nsetlocal indent '    '\nsetlocal name 'dg_control/dat_setupmemxfer/msg_get'\ndsmentry src ds dg_control dat_setupmemxfer msg_get '0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'TW_SETUPMEMXFER.Preferred > 0'\nsetlocal setupmemxfer.preferred '${ret:${get:TW_SETUPMEMXFER.Preferred}}'\nif '${get:setupmemxfer.preferred}' <= '0' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'allocate pointer for ${get:setupmemxfer.preferred} bytes'\nfree pointer image.pointer ; for the last loop\nallocate pointer image.pointer '${get:setupmemxfer.preferred}'\nif '${get:image.pointer}' == '0' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set DAT_SETUPFILEXFER to TWFF_TIFF\n;\nsetlocal name 'dg_control/dat_setupfilexfer/msg_set TWFF_TIFF'\ndsmentry src null dg_control dat_setupfilexfer msg_set 'file,TWFF_TIFF,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Prompt the user...\n;\necho.prompt\necho.prompt \"Scanning will take place during this test.  There will be no\"\necho.prompt \"need to press any button on the TWAIN user interface to start\"\necho.prompt \"the scanner.  A progress indicator may appear during scanning.\"\necho.prompt\necho.prompt \"Place 3 sheets in the scanner's feeder in no particular order:\"\necho.prompt \"one sheet has no barcodes, one has a single barcode that the\"\necho.prompt \"scanner is known to recognize, and one has multiple barcodes\"\necho.prompt \"that scanner is known to recognize.  If the scanner is only\"\necho.prompt \"able to see one barcode at a time it can still pass the test.\"\necho.prompt\npause '(press the ENTER key when ready to continue)'\necho.prompt\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Start scanning...\n;\n:MAIN.USERINTERFACE\nsetlocal name 'dg_control/dat_userinterface/msg_enableds'\nwait reset\ndsmentry src null dg_control dat_userinterface msg_enableds '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Wait for MSG_XFERREADY, if we don't see it then scoot...\n;\nsetlocal name 'wait ${get:sys_waittimeout} seconds for MSG_XFERREADY'\nwait '${get:sys_waittimeout}000'\nif '${ret:}' !~contains 'msg_xferready' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Do a memory file transfer...\n; This little song and dance with the states is so that we can\n; start the transfer in state 6 with each new image, but switch\n; to state 7 if we need multiple calls to capture the current\n; image...\n;\n; The saved images will be in TIFF format, which includes TIFF\n; JPEG (the better form, where a simple TIFF header is added).\n;\nincrement image.count '${get:image.count}' 1\nimage free memfileimage\n;\n:MAIN.IMAGEMEMFILEXFER.NEXT\nsetlocal name 'dg_image/dat_imagememxfer/msg_get'\ndsmentry src ds dg_image dat_imagememfilexfer msg_get '0,0,0,0,0,0,0,9,${get:setupmemxfer.preferred},${get:image.pointer}'\nsetlocal imagememxfer '${ret:}'\nif '${sts:}' == 'XFERDONE' goto MAIN.IMAGEMEMFILEXFER.XFERDONE\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\n;\necho.passfail '${get:indent}${get:name} SUCCESS' 'pass'\nimage append memfileimage '${get:imagememxfer}'\ngoto MAIN.IMAGEMEMFILEXFER.NEXT\n;\n:MAIN.IMAGEMEMFILEXFER.XFERDONE\necho.passfail '${get:indent}${get:name} XFERDONE' 'pass'\nimage append memfileimage '${get:imagememxfer}'\nimage save memfileimage memfile '${get:image.folder}/adf${format:D6|${get:image.count}}'\necho.passfail '${get:indent}image <${ret:}>' 'pass'\nimage free memfileimage\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DAT_EXTIMAGEINFO\n; Check the barcode metadata...\n;\nrun DAT_EXTIMAGEINFO '${get:indent}' '${get:image.folder}/adf${format:D6|${get:image.count}}'\nif '${ret:}' != 'pass' goto MAIN.ERROR.FAIL\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; End the transfer, see if we're done...\n;\nsetlocal name 'dg_control/dat_pendingxfers/msg_endxfer'\ndsmentry src ds dg_control dat_pendingxfers msg_endxfer '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nincrement image.count '${get:image.count}' 1\nif '${ret:${get:TW_PENDINGXFERS.Count}}' != '0' goto MAIN.IMAGEMEMFILEXFER.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We're out of images, so disable...\n;\nsetlocal name 'dg_control/dat_userinterface/msg_disableds'\ndsmentry src ds dg_control dat_userinterface msg_disableds '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Check to see if we passed.  We need one sheet of paper with no barcodes.  Two or more sheets\n; with one barcode, and no sheets with multiple barecodes if the maximum value of\n; ICAP_BARCODEMAXSEARCHPRIORITIES is 1.  And one or more sheets with one barcode, and one or\n; more sheets with multiple barcodes of ICAP_BARCODEMAXSEARCHPRIORITIES is greater than 1.\n;\nsetlocal name 'Final Check: detected a sheet with 0 barcodes\nif '${get:g_barcodecount.none}' < '1' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nif '${get:g_barcodemaxsearchpriorities.max}' >= '2' goto MAIN.FINALCHECK.MANYBARCODES\nsetlocal name 'Final Check: detected multiple sheets with 1 barcode'\nif '${get:g_barcodecount.one}' < '1' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal name 'Final Check: detected 0 sheets with many barcodes (not supported)'\nif '${get:g_barcodecount.many}' > '0' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\ngoto MAIN.FINALCHECK.DONE\n;\n:MAIN.FINALCHECK.MANYBARCODES\nsetlocal name 'Final Check: detected a sheet with 1 barcode'\nif '${get:g_barcodecount.one}' < '1' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal name 'Final Check: detected a sheet with many barcodes'\nif '${get:g_barcodecount.many}' < '1' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n:MAIN.FINALCHECK.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Summary and cleanup...\n;\n; We passed...\n:MAIN.PASS\nimage free memfileimage\nfree pointer image.pointer\necho.passfail 'SUMMARY' 'pass'\nreturn 'pass'\n;\n; Ruh-roh...\n:MAIN.ERROR.ECHOPASSFAIL\nimage free memfileimage\nfree pointer image.pointer\necho.passfail '${get:indent}${get:name}' 'fail - ${sts:} ${ret:}'\necho.passfail 'SUMMARY' 'fail'\nreturn 'fail'\n;\n; Ruh-roh...\n:MAIN.ERROR.FAIL\nimage free memfileimage\nfree pointer image.pointer\necho.passfail 'SUMMARY' 'fail'\nreturn 'fail'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/130 - Barcode Badge/DAT_IMAGEMEMXFER.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DAT_IMAGEMEMXFER\n;   This test scans three sheets of paper for the default pixeltype.  An ADF\n;   is required to pass this test, but that was already been tested before\n;   we got to this function.  The three sheets are as follows.but don't have\n;   to be in any special order:\n;\n;       - one without any barcodes, which must report TWRC_DATANOTAVAILABLE\n;\n;\t    - one with a single barcode, which must report TWRC_SUCCESS for all\n;         of the TWEI_BARCODE* items, and put the data in a TW_HANDLE\n;\n;       - one with multiple barcodes; which must report TWRC_SUCCESS for all\n;         of the TWEI_BARCODE* items, and return a TW_HANDLE that contains\n;         an array of TW_HANDLE value, each of which points to barcode data;\n;         if the scanner cannot return multiple barcodes, it still passes\n;\n;   Here's the basic flow:\n;       SetCapabilities\n;       start scanning\n;       while images\n;           transfer image\n;           DAT_EXTIMAGEINFO\n;           end image\n;       end\n;       end scanning\n;       verify the results\n;\n;   The test passes if:\n;       - g_barcodecount.none >= 1\n;         and (((barcodemaxsearchpriorities.max > 1)  and (g_barcodecount.one >= 1) and (g_barcodecount.many >= 1))\n;         or   ((barcodemaxsearchpriorities.max == 1) and (g_barcodecount.one >= 2) and (g_barcodecount.many == 0)))\n;\n; Arguments\n;   arg:1 - TW_IDENTITY.ProductName of scanner to test\n;   arg:2 - test name for the image folder\n;\n; Globals\n;   g_barcodemaxsearchpriorities.max - maximum barcodes we can get\n;   g_barcodecount.none - increment if no barcodes are found\n;   g_barcodecount.one - increment if one barcodes is found\n;   g_barcodecount.many - increment if many barcodes are found\n;\n; Locals\n;   name - current test being done\n;   indent - indent the passfail text\n;   imageinfo - metadata for the current image\n;   imagememxfer - result of DAT_IMAGEMEMXFER call\n;   setupmemxfer.preferred - preferred field from DAT_SETUPMEMXFER call\n;\n;   image.count - count of images from 1\n;   image.folder - folder to put the images in\n;\n;   feederenabled.list - scanner's feederenabled values\n;   feederenabled.index - index of feederenabled values\n;   feederenabled.value - current feederenabled value\n;\n;   pixeltype.list - scanner's pixeltype values for this feederenabled\n;   pixeltype.index - index of pixeltype values\n;   pixeltype.value - current pixeltype value\n;\n; Returns\n;   pass/fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize...\n;\necho.titletest 'DAT_IMAGEMEMXFER'\n;\nsetlocal indent ''\nsetlocal image.pointer '0'\nsetlocal image.count '0'\nsetlocal image.folder '${folder:certimages}/${arg:2}/DAT_IMAGEMEMXFER'\n;\nsetglobal g_barcodemaxsearchpriorities.max '0'\nsetglobal g_barcodecount.none '0'\nsetglobal g_barcodecount.one '0'\nsetglobal g_barcodecount.many '0'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Clean the image folder for this test...\n;\nimage cleanfolderandmeta '${get:image.folder}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; SetCapabilities\n; This resets the driver and sets all the capabilities we need for the test.\n; If its return code is not 'pass', end with an error\n;\nrun SetCapabilities 'TWSX_MEMORY' '${get:indent}'\nif '${ret:}' != 'pass' goto MAIN.ERROR.FAIL\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get the preferred size for memory transfers, and allocate\n; a pointer for the memory transfers...\n;\nsetlocal indent '    '\nsetlocal name 'dg_control/dat_setupmemxfer/msg_get'\ndsmentry src ds dg_control dat_setupmemxfer msg_get '0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'TW_SETUPMEMXFER.Preferred > 0'\nsetlocal setupmemxfer.preferred '${ret:${get:TW_SETUPMEMXFER.Preferred}}'\nif '${get:setupmemxfer.preferred}' <= '0' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'allocate pointer for ${get:setupmemxfer.preferred} bytes'\nfree pointer image.pointer ; for the last loop\nallocate pointer image.pointer '${get:setupmemxfer.preferred}'\nif '${get:image.pointer}' == '0' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Prompt the user...\n;\necho.prompt\necho.prompt \"Scanning will take place during this test.  There will be no\"\necho.prompt \"need to press any button on the TWAIN user interface to start\"\necho.prompt \"the scanner.  A progress indicator may appear during scanning.\"\necho.prompt\necho.prompt \"Place 3 sheets in the scanner's feeder in no particular order:\"\necho.prompt \"one sheet has no barcodes, one has a single barcode that the\"\necho.prompt \"scanner is known to recognize, and one has multiple barcodes\"\necho.prompt \"that scanner is known to recognize.  If the scanner is only\"\necho.prompt \"able to see one barcode at a time it can still pass the test.\"\necho.prompt\npause '(press the ENTER key when ready to continue)'\necho.prompt\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Start scanning...\n;\n:MAIN.USERINTERFACE\nsetlocal name 'dg_control/dat_userinterface/msg_enableds'\nwait reset\ndsmentry src null dg_control dat_userinterface msg_enableds '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Wait for MSG_XFERREADY, if we don't see it then scoot...\n;\nsetlocal name 'wait ${get:sys_waittimeout} seconds for MSG_XFERREADY'\nwait '${get:sys_waittimeout}000'\nif '${ret:}' !~contains 'msg_xferready' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Do a memory transfer...\n; This little song and dance with the states is so that we can\n; start the transfer in state 6 with each new image, but switch\n; to state 7 if we need multiple calls to capture the current\n; image...\n;\n; The saved images will be in TIFF format, which includes TIFF\n; JPEG (the better form, where a simple TIFF header is added).\n;\nincrement image.count '${get:image.count}' 1\nimage free memimage\n;\n:MAIN.IMAGEMEMXFER.NEXT\nsetlocal name 'dg_image/dat_imagememxfer/msg_get'\ndsmentry src ds dg_image dat_imagememxfer msg_get '0,0,0,0,0,0,0,9,${get:setupmemxfer.preferred},${get:image.pointer}'\nsetlocal imagememxfer '${ret:}'\nif '${sts:}' == 'XFERDONE' goto MAIN.IMAGEMEMXFER.XFERDONE\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\n;\necho.passfail '${get:indent}${get:name} SUCCESS' 'pass'\nimage append memimage '${get:imagememxfer}'\ngoto MAIN.IMAGEMEMXFER.NEXT\n;\n:MAIN.IMAGEMEMXFER.XFERDONE\necho.passfail '${get:indent}${get:name} XFERDONE' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We need image info to make sense of this data...\n;\nsetlocal name 'dg_image/dat_imageinfo/msg_get'\ndsmentry src ds dg_image dat_imageinfo msg_get '0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0'\nsetlocal imageinfo '${ret:}'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Save the image...\n;\nimage append memimage '${get:imagememxfer}'\nimage addheader memimage '${get:imageinfo}'\nimage save memimage memory '${get:image.folder}/adf${format:D6|${get:image.count}}'\necho.passfail '${get:indent}image <${ret:}>' 'pass'\nimage free memimage\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DAT_EXTIMAGEINFO\n; Check the barcode metadata...\n;\nrun DAT_EXTIMAGEINFO '${get:indent}' '${get:image.folder}/adf${format:D6|${get:image.count}}'\nif '${ret:}' != 'pass' goto MAIN.ERROR.FAIL\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; End the transfer, see if we're done...\n;\nsetlocal name 'dg_control/dat_pendingxfers/msg_endxfer'\ndsmentry src ds dg_control dat_pendingxfers msg_endxfer '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nincrement image.count '${get:image.count}' 1\nif '${ret:${get:TW_PENDINGXFERS.Count}}' != '0' goto MAIN.IMAGEMEMXFER.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We're out of images, so disable...\n;\nsetlocal name 'dg_control/dat_userinterface/msg_disableds'\ndsmentry src ds dg_control dat_userinterface msg_disableds '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Check to see if we passed.  We need one sheet of paper with no barcodes.  Two or more sheets\n; with one barcode, and no sheets with multiple barecodes if the maximum value of\n; ICAP_BARCODEMAXSEARCHPRIORITIES is 1.  And one or more sheets with one barcode, and one or\n; more sheets with multiple barcodes of ICAP_BARCODEMAXSEARCHPRIORITIES is greater than 1.\n;\nsetlocal name 'Final Check: detected a sheet with 0 barcodes\nif '${get:g_barcodecount.none}' < '1' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nif '${get:g_barcodemaxsearchpriorities.max}' >= '2' goto MAIN.FINALCHECK.MANYBARCODES\nsetlocal name 'Final Check: detected multiple sheets with 1 barcode'\nif '${get:g_barcodecount.one}' < '1' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal name 'Final Check: detected 0 sheets with many barcodes (not supported)'\nif '${get:g_barcodecount.many}' > '0' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\ngoto MAIN.FINALCHECK.DONE\n;\n:MAIN.FINALCHECK.MANYBARCODES\nsetlocal name 'Final Check: detected a sheet with 1 barcode'\nif '${get:g_barcodecount.one}' < '1' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal name 'Final Check: detected a sheet with many barcodes'\nif '${get:g_barcodecount.many}' < '1' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n:MAIN.FINALCHECK.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Summary and cleanup...\n;\n; We passed...\n:MAIN.PASS\nimage free memimage\nfree pointer image.pointer\necho.passfail 'SUMMARY' 'pass'\nreturn 'pass'\n;\n; Ruh-roh...\n:MAIN.ERROR.ECHOPASSFAIL\nimage free memimage\nfree pointer image.pointer\necho.passfail '${get:indent}${get:name}' 'fail - ${sts:} ${ret:}'\necho.passfail 'SUMMARY' 'fail'\nreturn 'fail'\n;\n; Ruh-roh...\n:MAIN.ERROR.FAIL\nimage free memimage\nfree pointer image.pointer\necho.passfail 'SUMMARY' 'fail'\nreturn 'fail'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/130 - Barcode Badge/DAT_IMAGENATIVEXFER.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DAT_IMAGENATIVEXFER\n;   This test scans three sheets of paper for the default pixeltype.  An ADF\n;   is required to pass this test, but that was already been tested before\n;   we got to this function.  The three sheets are as follows.but don't have\n;   to be in any special order:\n;\n;       - one without any barcodes, which must report TWRC_DATANOTAVAILABLE\n;\n;\t    - one with a single barcode, which must report TWRC_SUCCESS for all\n;         of the TWEI_BARCODE* items, and put the data in a TW_HANDLE\n;\n;       - one with multiple barcodes; which must report TWRC_SUCCESS for all\n;         of the TWEI_BARCODE* items, and return a TW_HANDLE that contains\n;         an array of TW_HANDLE value, each of which points to barcode data;\n;         if the scanner cannot return multiple barcodes, it still passes\n;\n;   Here's the basic flow:\n;       SetCapabilities\n;       start scanning\n;       while images\n;           transfer image\n;           DAT_EXTIMAGEINFO\n;           end image\n;       end\n;       end scanning\n;       verify the results\n;\n;   The test passes if:\n;       - g_barcodecount.none >= 1\n;         and (((barcodemaxsearchpriorities.max > 1)  and (g_barcodecount.one >= 1) and (g_barcodecount.many >= 1))\n;         or   ((barcodemaxsearchpriorities.max == 1) and (g_barcodecount.one >= 2) and (g_barcodecount.many == 0)))\n;\n; Arguments\n;   arg:1 - TW_IDENTITY.ProductName of scanner to test\n;   arg:2 - test name for the image folder\n;\n; Globals\n;   g_barcodemaxsearchpriorities.max - maximum barcodes we can get\n;   g_barcodecount.none - increment if no barcodes are found\n;   g_barcodecount.one - increment if one barcodes is found\n;   g_barcodecount.many - increment if many barcodes are found\n;\n; Locals\n;   name - current test being done\n;   indent - indent the passfail text\n;   image.handle - native handle\n;   image.count - count of images from 1\n;   image.folder - folder to put the images in\n;\n; Returns\n;   pass/fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize...\n;\necho.titletest 'DAT_IMAGENATIVEXFER'\n;\nsetlocal indent ''\nsetlocal image.handle '0'\nsetlocal image.count '1'\nsetlocal image.folder '${folder:certimages}/${arg:2}/DAT_IMAGENATIVEXFER'\n;\nsetglobal g_barcodemaxsearchpriorities.max '0'\nsetglobal g_barcodecount.none '0'\nsetglobal g_barcodecount.one '0'\nsetglobal g_barcodecount.many '0'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Prompt the user...\n;\necho.prompt\necho.prompt \"Scanning will take place during this test.  There will be no\"\necho.prompt \"need to press any button on the TWAIN user interface to start\"\necho.prompt \"the scanner.  A progress indicator may appear during scanning.\"\necho.prompt\necho.prompt \"Place 3 sheets in the scanner's feeder in no particular order:\"\necho.prompt \"one sheet has no barcodes, one has a single barcode that the\"\necho.prompt \"scanner is known to recognize, and one has multiple barcodes\"\necho.prompt \"that scanner is known to recognize.  If the scanner is only\"\necho.prompt \"able to see one barcode at a time it can still pass the test.\"\necho.prompt\npause '(press the ENTER key when ready to continue)'\necho.prompt\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Clean the image folder for this test...\n;\nimage cleanfolderandmeta '${get:image.folder}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; SetCapabilities\n; This resets the driver and sets all the capabilities we need for the test.\n; If its return code is not 'pass', end with an error\n;\nrun SetCapabilities 'TWSX_NATIVE' '${get:indent}'\nif '${ret:}' != 'pass' goto MAIN.ERROR.FAIL\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Check for paper in the feeder, prompt the user if we don't find any...\n;\n:MAIN.FEEDERLOADED\ndsmentry src ds dg_control dat_capability msg_getcurrent 'CAP_FEEDERLOADED,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.FEEDERLOADED.DONE\nif '${ret:${get:TW_ONEVALUE.Item}}' ~~ 'TRUE' goto MAIN.FEEDERLOADED.DONE\necho.prompt\necho.prompt \"Place paper in the scanner's feeder.\"\npause '(press the ENTER key when ready to continue)'\n:MAIN.FEEDERLOADED.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Start scanning...\n;\nsetlocal indent '    '\nsetlocal name 'dg_control/dat_userinterface/msg_enableds'\nwait reset\ndsmentry src null dg_control dat_userinterface msg_enableds '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Wait for MSG_XFERREADY, if we don't see it then scoot...\n;\nsetlocal name 'wait ${get:sys_waittimeout} seconds for MSG_XFERREADY'\nwait '${get:sys_waittimeout}000'\nif '${ret:}' !~contains 'msg_xferready' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Do a native transfer...\n;\n:MAIN.IMAGENATIVEXFER.NEXT\nsetlocal indent '    '\nsetlocal name 'dg_control/dat_imagenativexfer/msg_get'\ndsmentry src ds dg_image dat_imagenativexfer msg_get '0'\nsetlocal image.handle '${ret:}'\nif '${sts:}' != 'XFERDONE' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nimage save image.handle native '${get:image.folder}/adf${format:D6|${get:image.count}}'\necho.passfail '${get:indent}image <${ret:}>' 'pass'\nfree handle image.handle\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DAT_EXTIMAGEINFO\n; Check the barcode metadata...\n;\nrun DAT_EXTIMAGEINFO '${get:indent}' '${get:image.folder}/adf${format:D6|${get:image.count}}'\nif '${ret:}' != 'pass' goto MAIN.ERROR.FAIL\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; End the transfer, see if we're done.  If not, go back\n; to MAIN.IMAGENATIVEXFER.NEXT for another image...\n;\n:MAIN.PENDINGXFERS\nsetlocal name 'dg_control/dat_pendingxfers/msg_endxfer'\ndsmentry src ds dg_control dat_pendingxfers msg_endxfer '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nincrement image.count '${get:image.count}' 1 ; count the image\nif '${ret:${get:TW_PENDINGXFERS.Count}}' != '0' goto MAIN.IMAGENATIVEXFER.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We're out of images, so disable...\n;\nsetlocal name 'dg_control/dat_userinterface/msg_disableds'\ndsmentry src ds dg_control dat_userinterface msg_disableds '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Check to see if we passed.  We need one sheet of paper with no barcodes.  Two or more sheets\n; with one barcode, and no sheets with multiple barecodes if the maximum value of\n; ICAP_BARCODEMAXSEARCHPRIORITIES is 1.  And one or more sheets with one barcode, and one or\n; more sheets with multiple barcodes of ICAP_BARCODEMAXSEARCHPRIORITIES is greater than 1.\n;\nsetlocal name 'Final Check: detected a sheet with 0 barcodes\nif '${get:g_barcodecount.none}' < '1' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nif '${get:g_barcodemaxsearchpriorities.max}' >= '2' goto MAIN.FINALCHECK.MANYBARCODES\nsetlocal name 'Final Check: detected multiple sheets with 1 barcode'\nif '${get:g_barcodecount.one}' < '1' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal name 'Final Check: detected 0 sheets with many barcodes (not supported)'\nif '${get:g_barcodecount.many}' > '0' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\ngoto MAIN.FINALCHECK.DONE\n;\n:MAIN.FINALCHECK.MANYBARCODES\nsetlocal name 'Final Check: detected a sheet with 1 barcode'\nif '${get:g_barcodecount.one}' < '1' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal name 'Final Check: detected a sheet with many barcodes'\nif '${get:g_barcodecount.many}' < '1' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n:MAIN.FINALCHECK.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Summary and cleanup...\n;\n; We passed...\n:MAIN.PASS\nfree handle image.handle\necho.passfail 'SUMMARY' 'pass'\nreturn 'pass'\n;\n; Ruh-roh...\n:MAIN.ERROR.ECHOPASSFAIL\nfree handle image.handle\necho.passfail '${get:indent}${get:name}' 'fail - ${sts:} ${ret:}'\necho.passfail 'SUMMARY' 'fail'\nreturn 'fail'\n;\n; Ruh-roh...\n:MAIN.ERROR.FAIL\nfree handle image.handle\necho.passfail 'SUMMARY' 'fail'\nreturn 'fail'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/130 - Barcode Badge/SetCapabilities.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; SetCapabilities\n;   Reset the driver's capabilites, and then set capabilities for this test.  Note that one can only\n;   get this badge for the ADF.  This is a production mode feature, so we're not testing the flatbed.\n;\n;   We follow the capability ordering:\n;   MSG_RESETALL\n;   set ICAP_XFERMECH.....................${arg:1}\n;   set CAP_FEEDERENABLED.................TRUE\n;   set CAP_XFERCOUNT.....................-1\n;   set ICAP_EXTIMAGEINFO.................TRUE\n;   set ICAP_BARCODETECTIONENABLED........TRUE\n;   set ICAP_BARCODESEARCHMODE............TWBD_HORZVERT, TWBD_VERTHORZ, TWBD_HORZ, or TWBD_VERT\n;   set ICAP_BARCODEMAXSEARCHPRIORITIES...set to its max value\n;   get ICAP_SUPPORTEDBARCODETYPES\n;   set ICAP_BARCODESEARCHPRIORITIES......set to first ICAP_BARCODEMAXSEARCHPRIORITIES of ICAP_SUPPORTEDBARCODETYPES\n;\n;   The test passes if all operations return TWRC_SUCCESS.\n;\n;   We are not testing ICAP_BARCODEMAXRETRIES or ICAP_BARCODETIMEOUT.  We're going to assume that the driver's\n;   default values offer the best user experience.  ICAP_BARCODETIMEOUT is especially problematic, since the\n;   spec doesn't tell use the units.  We're also not testing TWEI_BARCODETEXT, since it was replaced by the better\n;   defined TWEI_BARCODETEXT2.\n;\n; Arguments\n;   arg:1 - TWSX_* value for ICAP_XFERMECH\n;   arg:2 - value of caller's indent\n;\n; Globals\n;   g_barcodemaxsearchpriorities.max - maximum barcodes we can get (max of ICAP_BARCODEMAXSEARCHPRIORITIES)\n;\n; Locals\n;   barcodesearchpriorities.itemlist - first ICAP_BARCODEMAXSEARCHPRIORITIES of ICAP_SUPPORTEDBARCODETYPES\n;   comma - used to construct the value for ICAP_BARCODESEARCHPRIORITIES\n;   indent - indent the passfail text\n;   name - name of the current test\n;   supportedbarcodetypes.itemlist - return value from MSG_GET of ICAP_SUPPORTEDBARCODETYPES\n;   supportedbarcodetypes.index - index counter for ICAP_SUPPORTEDBARCODETYPES\n;   supportedbarcodetypes.lastindex - index of ICAP_BARCODEMAXSEARCHPRIORITIES item in ICAP_SUPPORTEDBARCODETYPES\n;   twsx - TWSX_* value for ICAP_XFERMECH\n;\n; Returns\n;   pass/fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize...\n;\nsetlocal twsx '${arg:1}'\nsetlocal indent '${arg:2}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; MSG_RESETALL\n; If return code is not TWRC_SUCCESS, end with an error\n;\nsetlocal name 'MSG_RESETALL'\ndsmentry src ds dg_control dat_capability msg_resetall '0,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set ICAP_XFERMECH...\n;\nsetlocal name 'ICAP_XFERMECH MSG_SET ${get:twsx}'\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_XFERMECH,TWON_ONEVALUE,TWTY_UINT16,${get:twsx}'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set CAP_FEEDERENABLED to TRUE\n;\nsetlocal name 'CAP_FEEDERENABLED MSG_SET TRUE'\ndsmentry src ds dg_control dat_capability msg_set 'CAP_FEEDERENABLED,TWON_ONEVALUE,TWTY_BOOL,TRUE'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set CAP_XFERCOUNT to -1\n;\nsetlocal name 'CAP_XFERCOUNT MSG_SET -1'\ndsmentry src ds dg_control dat_capability msg_set 'CAP_XFERCOUNT,TWON_ONEVALUE,TWTY_INT16,-1'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set ICAP_EXTIMAGEINFO to TRUE\n;\nsetlocal name 'ICAP_EXTIMAGEINFO MSG_SET TRUE'\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_EXTIMAGEINFO,TWON_ONEVALUE,TWTY_BOOL,TRUE'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set ICAP_BARCODEDETECTIONENABLED to TRUE\n;\nsetlocal name 'ICAP_BARCODEDETECTIONENABLED MSG_SET TRUE'\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_BARCODEDETECTIONENABLED,TWON_ONEVALUE,TWTY_BOOL,TRUE'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Try to set ICAP_BARCODESEARCHMODE to TWBD_HORZVERT, TWBD_VERTHORZ, TWBD_HORZ, or TWBD_VERT\n;\nsetlocal name 'ICAP_BARCODESEARCHMODE MSG_SET TWBD_HORZVERT, TWBD_VERTHORZ, TWBD_HORZ, or TWBD_VERT'\ndsmentry src ds dg_control dat_capability msg_get 'ICAP_BARCODESEARCHMODE'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\n;\nif '${ret:}' contains 'TWBD_HORZVERT' goto MAIN.ICAP_BARCODESEARCHMODE.TWBD_HORZVERT\nif '${ret:}' contains 'TWBD_VERTHORZ' goto MAIN.ICAP_BARCODESEARCHMODE.TWBD_VERTHORZ\nif '${ret:}' contains 'TWBD_VERT' goto MAIN.ICAP_BARCODESEARCHMODE.TWBD_VERT\n;\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_BARCODESEARCHMODE,TWON_ONEVALUE,TWTY_UINT16,TWBD_HORZ'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\ngoto MAIN.ICAP_BARCODESEARCHMODE.DONE\n;\n:MAIN.ICAP_BARCODESEARCHMODE.TWBD_HORZVERT\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_BARCODESEARCHMODE,TWON_ONEVALUE,TWTY_UINT16,TWBD_HORZVERT'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\ngoto MAIN.ICAP_BARCODESEARCHMODE.DONE\n;\n:MAIN.ICAP_BARCODESEARCHMODE.TWBD_VERTHORZ\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_BARCODESEARCHMODE,TWON_ONEVALUE,TWTY_UINT16,TWBD_VERTHORZ'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\ngoto MAIN.ICAP_BARCODESEARCHMODE.DONE\n;\n:MAIN.ICAP_BARCODESEARCHMODE.TWBD_VERT\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_BARCODESEARCHMODE,TWON_ONEVALUE,TWTY_UINT16,TWBD_VERT'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\ngoto MAIN.ICAP_BARCODESEARCHMODE.DONE\n;\n:MAIN.ICAP_BARCODESEARCHMODE.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Try to set ICAP_BARCODEMAXSEARCHPRIORITIES to its maximum value...\n;\nsetlocal name 'ICAP_BARCODEMAXSEARCHPRIORITIES MSG_SET max value'\ndsmentry src ds dg_control dat_capability msg_get 'ICAP_BARCODEMAXSEARCHPRIORITIES'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\nsetglobal g_barcodemaxsearchpriorities.max '${ret:${get:TW_RANGE.MaxValue}}'\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_BARCODEMAXSEARCHPRIORITIES,TWON_ONEVALUE,TWTY_UINT32,${get:g_barcodemaxsearchpriorities.max}'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get the ICAP_SUPPORTEDBARCODETYPES...\n;\nsetlocal name 'ICAP_SUPPORTEDBARCODETYPES MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'ICAP_SUPPORTEDBARCODETYPES'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\nsetlocal supportedbarcodetypes.itemlist '${ret:}'\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Pare the ICAP_SUPPORTEDBARCODETYPES list down to the first ICAP_BARCODEMAXSEARCHPRIORITIES items\n;\nsetlocal comma ''\nsetlocal name 'Get the first ${get:g_barcodemaxsearchpriorities.max} from ICAP_SUPPORTEDBARCODETYPES'\nsetlocal barcodesearchpriorities.itemlist ''\n;\nsetlocal supportedbarcodetypes.index '${get:TW_ARRAY.NumItems}' ; TW_ARRAY.ItemList - 1\nincrement supportedbarcodetypes.lastindex '${get:supportedbarcodetypes.index}' 1                              ; first index\nincrement supportedbarcodetypes.lastindex '${get:supportedbarcodetypes.lastindex}' ${get:g_barcodemaxsearchpriorities.max} ; + g_barcodemaxsearchpriorities.max\n;\n:MAIN.BARCODESEARCHPRIORITIES.NEXT\nincrement supportedbarcodetypes.index '${get:supportedbarcodetypes.index}' 1\nif '${get:supportedbarcodetypes.index}' > '${get:supportedbarcodetypes.lastindex}' goto MAIN.BARCODESEARCHPRIORITIES.DONE\nsetlocal barcodesearchpriorities.value '${getindex:supportedbarcodetypes.itemlist:${get:supportedbarcodetypes.index}}'\nif '${get:barcodesearchpriorities.value}' == '' goto MAIN.BARCODESEARCHPRIORITIES.DONE\nsetlocal barcodesearchpriorities.itemlist '${get:barcodesearchpriorities.itemlist}${get:comma}${get:barcodesearchpriorities.value}'\nsetlocal comma ','\ngoto MAIN.BARCODESEARCHPRIORITIES.NEXT\n;\n:MAIN.BARCODESEARCHPRIORITIES.DONE\necho.passfail '${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set ICAP_BARCODESEARCHPRIORITIES to first g_barcodemaxsearchpriorities.max of ICAP_SUPPORTEDBARCODETYPES...\n;\nsetlocal name 'ICAP_BARCODESEARCHPRIORITIES MSG_SET first ${get:g_barcodemaxsearchpriorities.max} of ICAP_SUPPORTEDBARCODETYPES'\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_BARCODESEARCHPRIORITIES,TWON_ARRAY,TWTY_UINT16,${get:g_barcodemaxsearchpriorities.max},${get:barcodesearchpriorities.itemlist}'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Summary and cleanup...\n;\n; We passed...\n:MAIN.PASS\nreturn 'pass'\n;\n; Ruh-roh...\n:MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'fail - ${sts:} ${ret:}'\nreturn 'fail'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/140 - Image Address Badge/Certification.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Image Address Badge\n;   Check if Image Addressing is supported by the driver.  This is a badge, failure does not\n;   invalidate scanner certification.  Instead, passage adds Image Address support to the cert.\n;\n;   The following are required:\n;     CAP_IAFIELDA_LEVEL, CAP_IAFIELDB_LEVEL, CAP_IAFIELDC_LEVEL, CAP_IAFIELDD_LEVEL\n;     CAP_IAFIELDA_PRINTFORMAT, CAP_IAFIELDB_PRINTFORMAT, CAP_IAFIELDC_PRINTFORMAT, CAP_IAFIELDD_PRINTFORMAT\n;     CAP_IAFIELDA_VALUE, CAP_IAFIELDB_VALUE, CAP_IAFIELDC_VALUE, CAP_IAFIELDD_VALUE\n;     TWEI_IALEVEL (values TWIA_FIXED, TWIA_LEVEL1, TWIA_LEVEL2, TWIA_LEVEL3)\n;     TWEI_IAFIELDA_VALUE, TWEI_IAFIELDA_VALUE, TWEI_IAFIELDA_VALUE, TWEI_IAFIELDA_VALUE\n;\n;   If the scanner supports printing, the following are required:\n;     CAP_PRINTERMODE (value TWPM_IMAGEADDRESSSTRING)\n;     TWEI_PRINTERTEXT\n;\n;   The following are optional, and only tested if present in the driver:\n;     CAP_IAFIELDE_LEVEL\n;     CAP_IAFIELDE_PRINTFORMAT\n;     CAP_IAFIELDE_VALUE\n;     TWEI_IALEVEL (value TWIA_LEVEL4)\n;     TWEI_IAFIELDE_VALUE\n;\n; Arguments\n;   arg:1 - TW_IDENTITY.ProductName of scanner to test\n;   arg:2 - global to set on fail\n;\n; Globals\n;   g_localcertifyresult - global to report to caller on fail\n;\n; Locals\n;   twidentity.productname - product name of scanner to test\n;   globaltosetonfail - name says it all\n;\n; Returns\n;   (none)\n;\n; History\n;   1.0 - initial release\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize stuff, load tables if not already done for us...\n;\necho.titlesuite 'Image Address Badge v1.0 17-Sep-2021'\necho.yellow '*************************************************************************************'\necho.yellow '*** This tests the Image Address Badge.  Skipping or failing means the driver     ***'\necho.yellow '*** does not support this functionality.  It does not prevent certification.      ***'\necho.yellow '*************************************************************************************'\n;\nsetlocal twidentity.productname '${arg:1}'\nsetlocal globaltosetonfail '${arg:2}'\nsetglobal g_localcertifyresult 'pass' ; assume success\n;\nif '${get:TW_ARRAY.ItemType}' != '' goto MAIN.LOADTABLES.SKIP\nrun '${folder:certification}/LoadTables'\n:MAIN.LOADTABLES.SKIP\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Open the scanner driver, run the tests, close the scanner driver...\n;\ncall CERTIFY '${folder:certification}/Opends'  '${get:twidentity.productname}' 'g_localcertifyresult' 'embedded'\nif '${get:g_localcertifyresult}' != 'pass' goto MAIN.CLOSEDS\n;\ncall CERTIFY 'Image Address Badge'             '${get:twidentity.productname}' 'g_localcertifyresult'\n;\n:MAIN.CLOSEDS\ncall CERTIFY '${folder:certification}/Closeds' '${get:twidentity.productname}' 'g_localcertifyresult' 'embedded'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Summary and cleanup...\n;\n; Did we pass? (do an extra check)\nif '${get:g_localcertifyresult}' == 'skip' goto MAIN.SKIP\nif '${get:g_localcertifyresult}' != 'pass' goto MAIN.ERROR\necho ''\necho.passfail 'BADGE SUMMARY' 'pass'\nreturn 'pass'\n;\n; Unsupported...\n:MAIN.SKIP\necho ''\necho.passfail 'BADGE SUMMARY' 'skip'\nsetglobal '${get:globaltosetonfail}' 'skip'\nreturn 'skip'\n;\n; Ruh-roh...\n:MAIN.ERROR\necho ''\necho.passfail 'BADGE SUMMARY' 'fail'\nsetglobal '${get:globaltosetonfail}' 'fail'\nreturn 'fail'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Function: Certify\n; arg:1 - script to run\n; arg:2 - TW_IDENTITY.ProductName of scanner to test\n; arg:3 - global value to update on fail\n; arg:4 - embeded flag for open/close, or folder for DAT_IMAGE*XFER calls\n; returns: (none)\n;\n:CERTIFY\n;\n; If a failure has occurred on a previous test, skip the rest of the tests,\n; except for closing, that would be bad...\nif '${arg:1}' ~contains 'Closeds' goto CERTIFY.RUN\nif '${get:${arg:3}}' == 'skip' goto CERTIFY.SKIP\nif '${get:${arg:3}}' == 'fail' goto CERTIFY.FAIL\n;\n; Run the test...\n:CERTIFY.RUN\nrun '${arg:1}' '${arg:2}' '${arg:4}'\nif '${ret:}' == 'skip' goto CERTIFY.SKIP\nif '${ret:}' != 'pass' goto CERTIFY.FAIL\nreturn 'pass'\n;\n; Handle skipping, set the global so we have a record...\n:CERTIFY.SKIP\nsetglobal '${arg:3}' 'skip'\nreturn 'skip'\n;\n; Handle failure, set the global so we have a record...\n:CERTIFY.FAIL\nsetglobal '${arg:3}' 'fail'\nreturn 'fail'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/140 - Image Address Badge/DAT_EXTIMAGEINFO.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DAT_EXTIMAGEINFO\n;   Check the return values from DAT_EXTIMAGEINFO to make sure the image address\n;   metadata is being properly reported.\n;\n;   Here's the basic flow:\n;       DAT_EXTIMAGEINFO\n;       confirm that we have the following TWEI_IA* items\n;           TWEI_IAFIELDA_VALUE\n;           TWEI_IAFIELDB_VALUE\n;           TWEI_IAFIELDC_VALUE\n;           TWEI_IAFIELDD_VALUE\n;           TWEI_IAFIELDE_VALUE (optional)\n;           TWEI_IALEVEL\n;\n; Arguments\n;   arg:1 - indent the passfail text\n;   arg:2 - base filename (no extension)\n;   arg:3 - TWEI_IAFIELD*_VALUE (can be empty is none)\n;   arg:4 - fixed field value, if any\n;   arg:5 - expected number of fields\n;\n; Locals\n;   imageaddressdata - the return value from DAT_EXTIMAGEINFO\n;   name - current test being done\n;   indent - indent the passfail text\n;   basefilename - used to store the extended image info into a file\n;   fieldfieldname - TWEI_IAFIELD*_VALUE (can be empty is none)\n;   fieldfieldvalue - fixed field value, if any\n;   totalfields - total fields we expect to see, all others must have no data\n;   twinfo.infoid.index - index to TW_INFO[n].infoid from the start of barcodedata\n;   twinfo.itemtype.index - index to TW_INFO[n].itemtype from the start of barcodedata\n;   twinfo.numitems.index - index to TW_INFO[n].numitems from the start of barcodedata\n;   twinfo.returncode.index - index to TW_INFO[n].returncode from the start of barcodedata\n;   twinfo.item.index - index to TW_INFO[n].item from the start of barcodedata\n;\n; Returns\n;   pass/fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Squirrel away the arguments...\n;\nsetlocal indent '${arg:1}    '\nsetlocal basefilename '${arg:2}'\nsetlocal fixedfieldname '${arg:3}'\nsetlocal fixedfieldvalue '${arg:4}'\nsetlocal totalfields '${arg:5}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get the extended image info, save the data to 'imageaddressdata'.\n;\nsetlocal name 'dg_image/dat_extimageinfo/msg_get TWEI_IA*'\ndsmentry src ds dg_image dat_extimageinfo msg_get '6,TWEI_IALEVEL,0,0,0,0,TWEI_IAFIELDA_VALUE,0,0,0,0,TWEI_IAFIELDB_VALUE,0,0,0,0,TWEI_IAFIELDC_VALUE,0,0,0,0,TWEI_IAFIELDD_VALUE,0,0,0,0,TWEI_IAFIELDE_VALUE,0,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal imageaddressdata '${ret:}'\nfilewrite '${arg:2}_extimageinfo.txt' '${get:imageaddressdata}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Confirm that we got back all the image address extimageinfo fields,\n; this doesn't mean they all have data, but they all must be present...\n;\nsetlocal name 'Found TWEI_IALEVEL'\nif '${get:imageaddressdata}' !contains ',TWEI_IALEVEL,' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal name 'Found TWEI_IAFIELDA_VALUE'\nif '${get:imageaddressdata}' !contains ',TWEI_IAFIELDA_VALUE,' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal name 'Found TWEI_IAFIELDB_VALUE'\nif '${get:imageaddressdata}' !contains ',TWEI_IAFIELDB_VALUE,' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal name 'Found TWEI_IAFIELDC_VALUE'\nif '${get:imageaddressdata}' !contains ',TWEI_IAFIELDC_VALUE,' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal name 'Found TWEI_IAFIELDD_VALUE'\nif '${get:imageaddressdata}' !contains ',TWEI_IAFIELDD_VALUE,' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nsetlocal name 'Found TWEI_IAFIELDE_VALUE'\nif '${get:imageaddressdata}' !contains ',TWEI_IAFIELDE_VALUE,' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Init our TWINFO indecies for TW_INFO[0]...\n;\nsetlocal twinfo.infoid.index '${get:TW_INFO.InfoID}'\nsetlocal twinfo.itemtype.index '${get:TW_INFO.ItemType}'\nsetlocal twinfo.numitems.index '${get:TW_INFO.NumItems}'\nsetlocal twinfo.returncode.index '${get:TW_INFO.ReturnCode}'\nsetlocal twinfo.item.index '${get:TW_INFO.Item}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Validate the contents of TWEI_IALEVEL, which is in TW_INFO[0]...\n;\nsetlocal name 'TW_INFO[0].InfoID is TWEI_IALEVEL'\nif '${getindex:imageaddressdata:${get:twinfo.infoid.index}}' != 'TWEI_IALEVEL' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'TW_INFO[0].ItemType is TWTY_UINT16'\nif '${getindex:imageaddressdata:${get:twinfo.itemtype.index}}' != 'TWTY_UINT16' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'TW_INFO[0].NumItems is 1'\nif '${getindex:imageaddressdata:${get:twinfo.numitems.index}}' != '1' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'TW_INFO[0].ReturnCode is TWRC_SUCCESS'\nif '${getindex:imageaddressdata:${get:twinfo.returncode.index}}' != 'TWRC_SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'TW_INFO[0].Item is one of the TWIA_LEVEL# values'\nif '${gettwei:TWEI_IALEVEL:${getindex:imageaddressdata:${get:twinfo.item.index}}}' == 'TWIA_LEVEL1' goto MAIN.TWEI_LEVEL.DONE\nif '${gettwei:TWEI_IALEVEL:${getindex:imageaddressdata:${get:twinfo.item.index}}}' == 'TWIA_LEVEL2' goto MAIN.TWEI_LEVEL.DONE\nif '${gettwei:TWEI_IALEVEL:${getindex:imageaddressdata:${get:twinfo.item.index}}}' == 'TWIA_LEVEL3' goto MAIN.TWEI_LEVEL.DONE\nif '${gettwei:TWEI_IALEVEL:${getindex:imageaddressdata:${get:twinfo.item.index}}}' == 'TWIA_LEVEL4' goto MAIN.TWEI_LEVEL.DONE\ngoto MAIN.ERROR.ECHOPASSFAIL\n:MAIN.TWEI_LEVEL.DONE\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize for the loop that'll go through the values.\n; iafieldindex is the index into iafieldvalue\n; iafieldvalue is the array of fields we'll be checking\n;\nsetlocal iafieldindex 0\nsetlocal iafieldvalue 'PLACEHOLDER,TWEI_IAFIELDA_VALUE,TWEI_IAFIELDB_VALUE,TWEI_IAFIELDC_VALUE,TWEI_IAFIELDD_VALUE,TWEI_IAFIELDE_VALUE'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Increment our TWINFO indecies for TW_INFO[n]...\n;\n:MAIN.TWINFO.NEXT\nincrement iafieldindex '${get:iafieldindex}' 1\nincrement twinfo.infoid.index '${get:twinfo.infoid.index}' 5 ; skip to the InfoID in the next TW_INFO\nincrement twinfo.itemtype.index '${get:twinfo.itemtype.index}' 5 ; skip to the InfoID in the next TW_INFO\nincrement twinfo.numitems.index '${get:twinfo.numitems.index}' 5 ; skip to the NumItems in the next TW_INFO\nincrement twinfo.returncode.index '${get:twinfo.returncode.index}' 5 ; skip to the ReturnCode in the next TW_INFO\nincrement twinfo.item.index '${get:twinfo.item.index}' 5 ; skip to the ReturnCode in the next TW_INFO\nif '${getindex:iafieldvalue:${get:iafieldindex}}' == '' goto MAIN.TWINFO.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Validate the contents of TWEI_IAFIELD*_VALUE, which is in TW_INFO[n]...\n; Anything less than or equal to the total number of fields must report\n; TWRC_SUCCESS, all others must report TWRC_DATANOTAVAILABLE...\n;\nsetlocal name 'TW_INFO[${get:iafieldindex}].InfoID is ${getindex:iafieldvalue:${get:iafieldindex}}'\nif '${getindex:imageaddressdata:${get:twinfo.infoid.index}}' != '${getindex:iafieldvalue:${get:iafieldindex}}' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n; totalfields indicates the number of iafields we negotiated with a level\n; other than TWIA_UNUSED, so we require a status of success from them.\nif '${get:iafieldindex}' <= '${get:totalfields}' goto MAIN.TWINFO.FIELDHASDATA\n;\n; TWEI_IAFIELDE_VALUE is a special case, jump there when we detect it.\n; For the other fields we require a status return of TWRC_DATANOTAVAILABLE\n; if the field is currently disabled.\nif '${getindex:iafieldvalue:${get:iafieldindex}}' == 'TWEI_IAFIELDE_VALUE' goto MAIN.TWINFO.TWEI_IAFIELDE_VALUE\nsetlocal name 'TW_INFO[${get:iafieldindex}].ReturnCode is TWRC_DATANOTAVAILABLE'\nif '${getindex:imageaddressdata:${get:twinfo.returncode.index}}' != 'TWRC_DATANOTAVAILABLE' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\ngoto MAIN.TWINFO.DONE\n;\n; Support for TWEI_IAFIELDE_VALUE is optional, so it's okay for it to\n; return a value of either TWRC_DATANOTAVAILABLE or TWRC_INFONOTSUPPORTED.\n:MAIN.TWINFO.TWEI_IAFIELDE_VALUE\nsetlocal name 'TW_INFO[${get:iafieldindex}].ReturnCode is TWRC_DATANOTAVAILABLE or TWRC_INFONOTSUPPORTED'\nif '${getindex:imageaddressdata:${get:twinfo.returncode.index}}' == 'TWRC_DATANOTAVAILABLE' goto MAIN.TWINFO.FIELDHASNODATA\nif '${getindex:imageaddressdata:${get:twinfo.returncode.index}}' == 'TWRC_INFONOTSUPPORTED' goto MAIN.TWINFO.FIELDHASNODATA\ngoto MAIN.ERROR.ECHOPASSFAIL\n:MAIN.TWINFO.FIELDHASNODATA\necho.passfail '${get:indent}${get:name}' 'pass'\ngoto MAIN.TWINFO.DONE\n;\n; If we got here we expect valid data, check each of the TW_INFO fields...\n:MAIN.TWINFO.FIELDHASDATA\nsetlocal name 'TW_INFO[${get:iafieldindex}].ReturnCode is TWRC_SUCCESS'\nif '${getindex:imageaddressdata:${get:twinfo.returncode.index}}' != 'TWRC_SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'TW_INFO[${get:iafieldindex}].ItemType is TWTY_STR32'\nif '${getindex:imageaddressdata:${get:twinfo.itemtype.index}}' != 'TWTY_STR32' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'TW_INFO[${get:iafieldindex}].NumItems is 1'\nif '${getindex:imageaddressdata:${get:twinfo.numitems.index}}' != '1' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n; The image address value text is behind a handle...\nsetlocal handle ${getindex:imageaddressdata:${get:twinfo.item.index}}\nsetlocal fieldavalue '${gethandle:${get:handle}:TWTY_STR32:0}'\n;\n; Do this test if the field we're working on matches fixedfieldname,\n; we want to make sure the string we set it to comes back to us...\nif '${getindex:imageaddressdata:${get:twinfo.itemtype.index}}' != '${get:fixedfieldname}' goto MAIN.TWINFO.NEXT\nsetlocal name 'TW_INFO[${get:iafieldindex}].Item contains \"${get:fixedfieldvalue}\" (${get:printertext})'\nif '${get:printertext}' !contains '${get:fixedfieldvalue}' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nfree handle handle\ngoto MAIN.TWINFO.NEXT\n:MAIN.TWINFO.DONE\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Summary and cleanup...\n;\n; We passed...\n:MAIN.PASS\nreturn 'pass'\n;\n; Ruh-roh...\n:MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'fail - ${sts:} ${ret:}'\nreturn 'fail'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/140 - Image Address Badge/DAT_IMAGEFILEXFER.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DAT_IMAGEFILEXFER\n;   This test scans one sheet of paper for the default pixeltype.  An ADF is required to pass this test,\n;   but that was already been confirmed before we got to this function.  We're going to set the driver,\n;   scan a sheet of paper, and check the TWEI_* values.\n;\n;   Here's the basic flow:\n;       SetCapabilities\n;       start scanning\n;       while images\n;           transfer image\n;           DAT_EXTIMAGEINFO\n;           end image\n;       end\n;       end scanning\n;       verify the results\n;\n;   The test passes if:\n;       - all of the CAP_IAFIELD*_* capabilities can be set\n;       - scanning is successful\n;       - the TWEI_IALEVEL and TWEI_IAFIELD*_VALUE field are correctly set\n;       - if printing is supported, CAP_PRINTERMODE can be set and\n;         CAP_PRINTERTEXT contains the correct value\n;\n; Arguments\n;   arg:1 - test name for the image folder\n;   arg:2 - TWEI_IAFIELD*_VALUE containing fixed field (can be empty if none)\n;   arg:3 - fielda image address settings 'twia,printformat,value'\n;   arg:4 - fieldb image address settings 'twia,printformat,value'\n;   arg:5 - fieldc image address settings 'twia,printformat,value'\n;   arg:6 - fieldd image address settings 'twia,printformat,value'\n;   arg:7 - fielde image address settings 'twia,printformat,value'\n;\n; Globals\n;   (none)\n;\n; Locals\n;   name - current test being done\n;   indent - indent the passfail text\n;   twimageinfo.compression - compression for current image\n;   image.count - count of images from 1\n;   image.folder - folder to put the images in\n;   totalfields - total value image address fields\n;\n; Returns\n;   pass/fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize...\n;\nsetlocal fixedfieldname   '${arg:2}'\nsetlocal fielda           '${arg:3}' ; check argindex down below\nsetlocal fieldb           '${arg:4}'\nsetlocal fieldc           '${arg:5}'\nsetlocal fieldd           '${arg:6}'\nsetlocal fielde           '${arg:7}'\n;\nsetlocal indent ''\nsetlocal image.count '1'\nsetlocal image.folder '${folder:certimages}/${arg:1}/DAT_IMAGEFILEXFER'\nsetlocal image.showname ''\n;\n; Figure out how many iafields have data, and get the fixed field value,\n; if any.  We're use them to check the TWEI_* values...\nsetlocal totalfields 0      ; assume no fields\nsetlocal argindex 2         ; first ia field argument - 1\nsetlocal fixedfieldvalue '' ; assume we don't have a value\n:MAIN.PARSE.NEXT\nincrement argindex ${get:argindex} 1\nif '${arg:${get:argindex}}' == '' goto MAIN.PARSE.DONE ; ran out of arguments\nif '${arg:${get:argindex}}' ~contains 'TWIA_UNUSED' goto MAIN.PARSE.NEXT ; skip unused fields\nif '${getindex:TWEI_IAFIELDA_VALUE,TWEI_IAFIELDB_VALUE,TWEI_IAFIELDC_VALUE,TWEI_IAFIELDD_VALUE,TWEI_IAFIELDE_VALUE:${get:argindex}}' != '${get:fixedfieldname}' goto MAIN.PARSE.NOTFIXED\nsetlocal fixedfieldvalue '${getindex:${arg:${get:argindex}}:2}'\n:MAIN.PARSE.NOTFIXED\nincrement totalfields ${get:totalfields} 1\ngoto MAIN.PARSE.NEXT\n:MAIN.PARSE.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Clean the image folder for this test...\n;\nimage cleanfolderandmeta '${get:image.folder}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; SetCapabilities\n; This resets the driver and sets all the capabilities we need for the test.\n; If its return code is not 'pass', end with an error\n;\nrun SetCapabilities 'TWSX_FILE' '${get:indent}' '${get:totalfields}' '${get:fielda}' '${get:fieldb}' '${get:fieldc}' '${get:fieldd}' '${get:fielde}'\nsetlocal returnvalue ${ret:}\nif '${ret:}' != 'skip' goto MAIN.SETCAPABILITES.CHECKPASS\ngoto MAIN.SETCAPABILITES.DONE\n;\n:MAIN.SETCAPABILITES.CHECKPASS\nif '${get:returnvalue}' != 'pass' goto MAIN.ERROR.FAIL\n:MAIN.SETCAPABILITES.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Check for paper in the feeder, prompt the user if we don't find any...\n;\ndsmentry src ds dg_control dat_capability msg_getcurrent 'CAP_FEEDERLOADED,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.FEEDERLOADED.DONE\nif '${ret:${get:TW_ONEVALUE.Item}}' ~~ 'TRUE' goto MAIN.FEEDERLOADED.DONE\necho.prompt\necho.prompt \"Place paper in the scanner's feeder.\"\npause '(press the ENTER key when ready to continue)'\n:MAIN.FEEDERLOADED.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Start scanning...\n;\nsetlocal name 'dg_control/dat_userinterface/msg_enableds'\nwait reset\ndsmentry src null dg_control dat_userinterface msg_enableds '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Wait for MSG_XFERREADY, if we don't see it then scoot...\n;\nsetlocal name 'wait ${get:sys_waittimeout} seconds for MSG_XFERREADY'\nwait '${get:sys_waittimeout}000'\nif '${ret:}' !~contains 'msg_xferready' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get information about the image...\n;\n:MAIN.IMAGEINFO.NEXT\nsetlocal name 'dg_image/dat_imageinfo/msg_get'\ndsmentry src ds dg_image dat_imageinfo msg_get '0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\nsetlocal twimageinfo.compression '${ret:${get:index.twimageinfo.compression}}'\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set up the file transfer...\n;\nincrement image.count '${get:image.count}' 1\nif '${get:twimageinfo.compression}' == 'JPEG' goto MAIN.SETUPFILEXFER.JPEG\nsetlocal image.showname 'DAT_IMAGEFILEXFER/adf${format:D6|${get:image.count}}.tif'\nsetlocal twsetupfilexfer.filename '${get:image.folder}/adf${format:D6|${get:image.count}}.tif'\nsetlocal twsetupfilexfer.format 'TWFF_TIFF'\ngoto MAIN.SETUPFILEXFER\n:MAIN.SETUPFILEXFER.JPEG\nsetlocal image.showname 'DAT_IMAGEFILEXFER/adf${format:D6|${get:image.count}}.jpg'\nsetlocal twsetupfilexfer.filename '${get:image.folder}/adf${format:D6|${get:image.count}}.jpg'\nsetlocal twsetupfilexfer.format 'TWFF_JFIF'\n:MAIN.SETUPFILEXFER\nsetlocal name 'dg_control/dat_setupfilexfer/msg_set'\ndsmentry src ds dg_control dat_setupfilexfer msg_set '\"${get:twsetupfilexfer.filename}\",${get:twsetupfilexfer.format},0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Transfer the image...\n;\nsetlocal name 'dg_image/dat_imagefilexfer/msg_get'\ndsmentry src ds dg_image dat_imagefilexfer msg_get null\nif '${sts:}' != 'XFERDONE' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\necho.passfail '${get:indent}image <${get:image.showname}>' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DAT_EXTIMAGEINFO\n; Check the printer metadata...\n;\nrun DAT_EXTIMAGEINFO '${get:indent}' '${get:image.folder}/adf${format:D6|${get:image.count}}' '${get:fixedfieldname}' '${get:fixedfieldvalue}' '${get:totalfields}'\nif '${ret:}' != 'pass' goto MAIN.ERROR.FAIL\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; End the transfer, see if we're done.  If not, go back\n; to MAIN.IMAGEINFO.NEXT for another image...\n;\nsetlocal name 'dg_control/dat_pendingxfers/msg_endxfer'\ndsmentry src ds dg_control dat_pendingxfers msg_endxfer '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nincrement image.count '${get:image.count}' 1 ; count the image\nif '${ret:${get:TW_PENDINGXFERS.Count}}' != '0' goto MAIN.IMAGEINFO.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We're out of images, so disable...\n;\nsetlocal name 'dg_control/dat_userinterface/msg_disableds'\ndsmentry src ds dg_control dat_userinterface msg_disableds '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Summary and cleanup...\n;\n; We passed...\n:MAIN.PASS\necho.passfail 'SUMMARY' 'pass'\nreturn 'pass'\n;\n; Skip is allowed for CAP_IAFIELDE_*...\n:MAIN.SKIP\necho.passfail 'SUMMARY' 'skip'\nreturn 'skip'\n;\n; Ruh-roh...\n:MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'fail - ${sts:} ${ret:}'\necho.passfail 'SUMMARY' 'fail'\nrollback state4\nreturn 'fail'\n;\n; Ruh-roh...\n:MAIN.ERROR.FAIL\necho.passfail 'SUMMARY' 'fail'\nrollback state4\nreturn 'fail'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/140 - Image Address Badge/DAT_IMAGEMEMFILEXFER.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DAT_IMAGEMEMFILEXFER\n;   This test scans one sheet of paper for the default pixeltype.  An ADF is required to pass this test,\n;   but that was already been confirmed before we got to this function.  We're going to set the driver,\n;   scan a sheet of paper, and check the TWEI_* values.\n;\n;   Here's the basic flow:\n;       SetCapabilities\n;       start scanning\n;       while images\n;           transfer image\n;           DAT_EXTIMAGEINFO\n;           end image\n;       end\n;       end scanning\n;       verify the results\n;\n;   The test passes if:\n;       - all of the CAP_IAFIELD*_* capabilities can be set\n;       - scanning is successful\n;       - the TWEI_IALEVEL and TWEI_IAFIELD*_VALUE field are correctly set\n;       - if printing is supported, CAP_PRINTERMODE can be set and\n;         CAP_PRINTERTEXT contains the correct value\n;\n; Arguments\n;   arg:1 - test name for the image folder\n;   arg:2 - TWEI_IAFIELD*_VALUE containing fixed field (can be empty if none)\n;   arg:3 - fielda image address settings 'twia,printformat,value'\n;   arg:4 - fieldb image address settings 'twia,printformat,value'\n;   arg:5 - fieldc image address settings 'twia,printformat,value'\n;   arg:6 - fieldd image address settings 'twia,printformat,value'\n;   arg:7 - fielde image address settings 'twia,printformat,value'\n;\n; Globals\n;   (none)\n;\n; Locals\n;   name - current test being done\n;   indent - indent the passfail text\n;   imagememxfer - result of DAT_IMAGEMEMXFER call\n;   setupmemxfer.preferred - preferred field from DAT_SETUPMEMXFER call\n;   image.count - count of images from 1\n;   image.folder - folder to put the images in\n;   totalfields - total value image address fields\n;\n; Returns\n;   pass/fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize...\n;\nsetlocal fixedfieldname   '${arg:2}'\nsetlocal fielda           '${arg:3}' ; check argindex down below\nsetlocal fieldb           '${arg:4}'\nsetlocal fieldc           '${arg:5}'\nsetlocal fieldd           '${arg:6}'\nsetlocal fielde           '${arg:7}'\n;\nsetlocal indent ''\nsetlocal image.pointer '0'\nsetlocal image.count '1'\nsetlocal image.folder '${folder:certimages}/${arg:1}/DAT_IMAGEMEMFILEXFER'\n;\n; Figure out how many iafields have data, and get the fixed field value,\n; if any.  We're use them to check the TWEI_* values...\nsetlocal totalfields 0      ; assume no fields\nsetlocal argindex 2         ; first ia field argument - 1\nsetlocal fixedfieldvalue '' ; assume we don't have a value\n:MAIN.PARSE.NEXT\nincrement argindex ${get:argindex} 1\nif '${arg:${get:argindex}}' == '' goto MAIN.PARSE.DONE ; ran out of arguments\nif '${arg:${get:argindex}}' ~contains 'TWIA_UNUSED' goto MAIN.PARSE.NEXT ; skip unused fields\nif '${getindex:TWEI_IAFIELDA_VALUE,TWEI_IAFIELDB_VALUE,TWEI_IAFIELDC_VALUE,TWEI_IAFIELDD_VALUE,TWEI_IAFIELDE_VALUE:${get:argindex}}' != '${get:fixedfieldname}' goto MAIN.PARSE.NOTFIXED\nsetlocal fixedfieldvalue '${getindex:${arg:${get:argindex}}:2}'\n:MAIN.PARSE.NOTFIXED\nincrement totalfields ${get:totalfields} 1\ngoto MAIN.PARSE.NEXT\n:MAIN.PARSE.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Clean the image folder for this test...\n;\nimage cleanfolderandmeta '${get:image.folder}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; SetCapabilities\n; This resets the driver and sets all the capabilities we need for the test.\n; If its return code is not 'pass', end with an error\n;\nrun SetCapabilities 'TWSX_MEMFILE' '${get:indent}' '${get:totalfields}' '${get:fielda}' '${get:fieldb}' '${get:fieldc}' '${get:fieldd}' '${get:fielde}'\nsetlocal returnvalue ${ret:}\nif '${ret:}' != 'skip' goto MAIN.SETCAPABILITES.CHECKPASS\ngoto MAIN.SETCAPABILITES.DONE\n;\n:MAIN.SETCAPABILITES.CHECKPASS\nif '${get:returnvalue}' != 'pass' goto MAIN.ERROR.FAIL\n:MAIN.SETCAPABILITES.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Check for paper in the feeder, prompt the user if we don't find any...\n;\ndsmentry src ds dg_control dat_capability msg_getcurrent 'CAP_FEEDERLOADED,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.FEEDERLOADED.DONE\nif '${ret:${get:TW_ONEVALUE.Item}}' ~~ 'TRUE' goto MAIN.FEEDERLOADED.DONE\necho.prompt\necho.prompt \"Place paper in the scanner's feeder.\"\npause '(press the ENTER key when ready to continue)'\n:MAIN.FEEDERLOADED.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get the preferred size for memory transfers, and allocate\n; a pointer for the memory transfers...\n;\nsetlocal indent '    '\nsetlocal name 'dg_control/dat_setupmemxfer/msg_get'\ndsmentry src ds dg_control dat_setupmemxfer msg_get '0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'TW_SETUPMEMXFER.Preferred > 0'\nsetlocal setupmemxfer.preferred '${ret:${get:TW_SETUPMEMXFER.Preferred}}'\nif '${get:setupmemxfer.preferred}' <= '0' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'allocate pointer for ${get:setupmemxfer.preferred} bytes'\nfree pointer image.pointer ; for the last loop\nallocate pointer image.pointer '${get:setupmemxfer.preferred}'\nif '${get:image.pointer}' == '0' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Start scanning...\n;\nsetlocal name 'dg_control/dat_userinterface/msg_enableds'\nwait reset\ndsmentry src null dg_control dat_userinterface msg_enableds '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Wait for MSG_XFERREADY, if we don't see it then scoot...\n;\nsetlocal name 'wait ${get:sys_waittimeout} seconds for MSG_XFERREADY'\nwait '${get:sys_waittimeout}000'\nif '${ret:}' !~contains 'msg_xferready' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get information about the image...\n;\n:MAIN.IMAGEINFO.NEXT\nsetlocal name 'dg_image/dat_imageinfo/msg_get'\ndsmentry src ds dg_image dat_imageinfo msg_get '0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\nsetlocal twimageinfo.compression '${ret:${get:index.twimageinfo.compression}}'\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set up the memory file transfer...\n;\nincrement image.count '${get:image.count}' 1\nif '${get:twimageinfo.compression}' == 'JPEG' goto MAIN.SETUPFILEXFER.JPEG\nsetlocal image.showname 'DAT_IMAGEFILEXFER/adf${format:D6|${get:image.count}}.tif'\nsetlocal twsetupfilexfer.filename '${get:image.folder}/adf${format:D6|${get:image.count}}.tif'\nsetlocal twsetupfilexfer.format 'TWFF_TIFF'\ngoto MAIN.SETUPFILEXFER\n:MAIN.SETUPFILEXFER.JPEG\nsetlocal image.showname 'DAT_IMAGEFILEXFER/adf${format:D6|${get:image.count}}.jpg'\nsetlocal twsetupfilexfer.filename '${get:image.folder}/adf${format:D6|${get:image.count}}.jpg'\nsetlocal twsetupfilexfer.format 'TWFF_JFIF'\n:MAIN.SETUPFILEXFER\nsetlocal name 'dg_control/dat_setupfilexfer/msg_set'\ndsmentry src ds dg_control dat_setupfilexfer msg_set '\"${get:twsetupfilexfer.filename}\",${get:twsetupfilexfer.format},0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Do a memory file transfer...\n; This little song and dance with the states is so that we can\n; start the transfer in state 6 with each new image, but switch\n; to state 7 if we need multiple calls to capture the current\n; image...\n;\n; The saved images will be in TIFF format, which includes TIFF\n; JPEG (the better form, where a simple TIFF header is added).\n;\nincrement image.count '${get:image.count}' 1\nimage free memfileimage\n;\n:MAIN.IMAGEMEMFILEXFER.NEXT\nsetlocal name 'dg_image/dat_imagememxfer/msg_get'\ndsmentry src ds dg_image dat_imagememfilexfer msg_get '0,0,0,0,0,0,0,9,${get:setupmemxfer.preferred},${get:image.pointer}'\nsetlocal imagememxfer '${ret:}'\nif '${sts:}' == 'XFERDONE' goto MAIN.IMAGEMEMFILEXFER.XFERDONE\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\n;\necho.passfail '${get:indent}${get:name} SUCCESS' 'pass'\nimage append memfileimage '${get:imagememxfer}'\ngoto MAIN.IMAGEMEMFILEXFER.NEXT\n;\n:MAIN.IMAGEMEMFILEXFER.XFERDONE\necho.passfail '${get:indent}${get:name} XFERDONE' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Append the last strip transferred, and save the image...\n;\nimage append memfileimage '${get:imagememxfer}'\nimage save memfileimage memfile '${get:twsetupfilexfer.filename}'\necho.passfail '${get:indent}image <${ret:}>' 'pass'\nimage free memfileimage\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DAT_EXTIMAGEINFO\n; Check the printer metadata...\n;\nrun DAT_EXTIMAGEINFO '${get:indent}' '${get:image.folder}/adf${format:D6|${get:image.count}}' '${get:fixedfieldname}' '${get:fixedfieldvalue}' '${get:totalfields}'\nif '${ret:}' != 'pass' goto MAIN.ERROR.FAIL\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; End the transfer, see if we're done...\n;\nsetlocal name 'dg_control/dat_pendingxfers/msg_endxfer'\ndsmentry src ds dg_control dat_pendingxfers msg_endxfer '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nincrement image.count '${get:image.count}' 1\nif '${ret:${get:TW_PENDINGXFERS.Count}}' != '0' goto MAIN.IMAGEMEMFILEXFER.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We're out of images, so disable...\n;\nsetlocal name 'dg_control/dat_userinterface/msg_disableds'\ndsmentry src ds dg_control dat_userinterface msg_disableds '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Summary and cleanup...\n;\n; We passed...\n:MAIN.PASS\nimage free memfileimage\necho.passfail 'SUMMARY' 'pass'\nreturn 'pass'\n;\n; Skip is allowed for CAP_IAFIELDE_*...\n:MAIN.SKIP\nimage free memfileimage\necho.passfail 'SUMMARY' 'skip'\nreturn 'skip'\n;\n; Ruh-roh...\n:MAIN.ERROR.ECHOPASSFAIL\nimage free memfileimage\necho.passfail '${get:indent}${get:name}' 'fail - ${sts:} ${ret:}'\necho.passfail 'SUMMARY' 'fail'\nrollback state4\nreturn 'fail'\n;\n; Ruh-roh...\n:MAIN.ERROR.FAIL\nimage free memfileimage\necho.passfail 'SUMMARY' 'fail'\nrollback state4\nreturn 'fail'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/140 - Image Address Badge/DAT_IMAGEMEMXFER.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DAT_IMAGEMEMXFER\n;   This test scans one sheet of paper for the default pixeltype.  An ADF is required to pass this test,\n;   but that was already been confirmed before we got to this function.  We're going to set the driver,\n;   scan a sheet of paper, and check the TWEI_* values.\n;\n;   Here's the basic flow:\n;       SetCapabilities\n;       start scanning\n;       while images\n;           transfer image\n;           DAT_EXTIMAGEINFO\n;           end image\n;       end\n;       end scanning\n;       verify the results\n;\n;   The test passes if:\n;       - all of the CAP_IAFIELD*_* capabilities can be set\n;       - scanning is successful\n;       - the TWEI_IALEVEL and TWEI_IAFIELD*_VALUE field are correctly set\n;       - if printing is supported, CAP_PRINTERMODE can be set and\n;         CAP_PRINTERTEXT contains the correct value\n;\n; Arguments\n;   arg:1 - test name for the image folder\n;   arg:2 - TWEI_IAFIELD*_VALUE containing fixed field (can be empty if none)\n;   arg:3 - fielda image address settings 'twia,printformat,value'\n;   arg:4 - fieldb image address settings 'twia,printformat,value'\n;   arg:5 - fieldc image address settings 'twia,printformat,value'\n;   arg:6 - fieldd image address settings 'twia,printformat,value'\n;   arg:7 - fielde image address settings 'twia,printformat,value'\n;\n; Globals\n;   (none)\n;\n; Locals\n;   name - current test being done\n;   indent - indent the passfail text\n;   imageinfo - metadata for the current image\n;   imagememxfer - result of DAT_IMAGEMEMXFER call\n;   setupmemxfer.preferred - preferred field from DAT_SETUPMEMXFER call\n;   image.count - count of images from 1\n;   image.folder - folder to put the images in\n;   totalfields - total value image address fields\n;\n; Returns\n;   pass/fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize...\n;\nsetlocal fixedfieldname   '${arg:2}'\nsetlocal fielda           '${arg:3}' ; check argindex down below\nsetlocal fieldb           '${arg:4}'\nsetlocal fieldc           '${arg:5}'\nsetlocal fieldd           '${arg:6}'\nsetlocal fielde           '${arg:7}'\n;\nsetlocal indent ''\nsetlocal image.pointer '0'\nsetlocal image.count '0'\nsetlocal image.folder '${folder:certimages}/${arg:1}/DAT_IMAGEMEMXFER'\n;\n; Figure out how many iafields have data, and get the fixed field value,\n; if any.  We're use them to check the TWEI_* values...\nsetlocal totalfields 0      ; assume no fields\nsetlocal argindex 2         ; first ia field argument - 1\nsetlocal fixedfieldvalue '' ; assume we don't have a value\n:MAIN.PARSE.NEXT\nincrement argindex ${get:argindex} 1\nif '${arg:${get:argindex}}' == '' goto MAIN.PARSE.DONE ; ran out of arguments\nif '${arg:${get:argindex}}' ~contains 'TWIA_UNUSED' goto MAIN.PARSE.NEXT ; skip unused fields\nif '${getindex:TWEI_IAFIELDA_VALUE,TWEI_IAFIELDB_VALUE,TWEI_IAFIELDC_VALUE,TWEI_IAFIELDD_VALUE,TWEI_IAFIELDE_VALUE:${get:argindex}}' != '${get:fixedfieldname}' goto MAIN.PARSE.NOTFIXED\nsetlocal fixedfieldvalue '${getindex:${arg:${get:argindex}}:2}'\n:MAIN.PARSE.NOTFIXED\nincrement totalfields ${get:totalfields} 1\ngoto MAIN.PARSE.NEXT\n:MAIN.PARSE.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Clean the image folder for this test...\n;\nimage cleanfolderandmeta '${get:image.folder}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; SetCapabilities\n; This resets the driver and sets all the capabilities we need for the test.\n; If its return code is not 'pass', end with an error\n;\nrun SetCapabilities 'TWSX_MEMORY' '${get:indent}' '${get:totalfields}' '${get:fielda}' '${get:fieldb}' '${get:fieldc}' '${get:fieldd}' '${get:fielde}'\nsetlocal returnvalue ${ret:}\nif '${ret:}' != 'skip' goto MAIN.SETCAPABILITES.CHECKPASS\ngoto MAIN.SETCAPABILITES.DONE\n;\n:MAIN.SETCAPABILITES.CHECKPASS\nif '${get:returnvalue}' != 'pass' goto MAIN.ERROR.FAIL\n:MAIN.SETCAPABILITES.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Check for paper in the feeder, prompt the user if we don't find any...\n;\ndsmentry src ds dg_control dat_capability msg_getcurrent 'CAP_FEEDERLOADED,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.FEEDERLOADED.DONE\nif '${ret:${get:TW_ONEVALUE.Item}}' ~~ 'TRUE' goto MAIN.FEEDERLOADED.DONE\necho.prompt\necho.prompt \"Place paper in the scanner's feeder.\"\npause '(press the ENTER key when ready to continue)'\n:MAIN.FEEDERLOADED.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get the preferred size for memory transfers, and allocate\n; a pointer for the memory transfers...\n;\nsetlocal indent '    '\nsetlocal name 'dg_control/dat_setupmemxfer/msg_get'\ndsmentry src ds dg_control dat_setupmemxfer msg_get '0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'TW_SETUPMEMXFER.Preferred > 0'\nsetlocal setupmemxfer.preferred '${ret:${get:TW_SETUPMEMXFER.Preferred}}'\nif '${get:setupmemxfer.preferred}' <= '0' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'allocate pointer for ${get:setupmemxfer.preferred} bytes'\nfree pointer image.pointer ; for the last loop\nallocate pointer image.pointer '${get:setupmemxfer.preferred}'\nif '${get:image.pointer}' == '0' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Start scanning...\n;\nsetlocal name 'dg_control/dat_userinterface/msg_enableds'\nwait reset\ndsmentry src null dg_control dat_userinterface msg_enableds '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Wait for MSG_XFERREADY, if we don't see it then scoot...\n;\nsetlocal name 'wait ${get:sys_waittimeout} seconds for MSG_XFERREADY'\nwait '${get:sys_waittimeout}000'\nif '${ret:}' !~contains 'msg_xferready' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Do a memory transfer...\n; This little song and dance with the states is so that we can\n; start the transfer in state 6 with each new image, but switch\n; to state 7 if we need multiple calls to capture the current\n; image...\n;\n; The saved images will be in TIFF format, which includes TIFF\n; JPEG (the better form, where a simple TIFF header is added).\n;\nincrement image.count '${get:image.count}' 1\nimage free memimage\n;\n:MAIN.IMAGEMEMXFER.NEXT\nsetlocal name 'dg_image/dat_imagememxfer/msg_get'\ndsmentry src ds dg_image dat_imagememxfer msg_get '0,0,0,0,0,0,0,9,${get:setupmemxfer.preferred},${get:image.pointer}'\nsetlocal imagememxfer '${ret:}'\nif '${sts:}' == 'XFERDONE' goto MAIN.IMAGEMEMXFER.XFERDONE\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\n;\necho.passfail '${get:indent}${get:name} SUCCESS' 'pass'\nimage append memimage '${get:imagememxfer}'\ngoto MAIN.IMAGEMEMXFER.NEXT\n;\n:MAIN.IMAGEMEMXFER.XFERDONE\necho.passfail '${get:indent}${get:name} XFERDONE' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We need image info to make sense of this data...\n;\nsetlocal name 'dg_image/dat_imageinfo/msg_get'\ndsmentry src ds dg_image dat_imageinfo msg_get '0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0'\nsetlocal imageinfo '${ret:}'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Append the last strip transferred, and save the image...\n;\nimage append memimage '${get:imagememxfer}'\nimage addheader memimage '${get:imageinfo}'\nimage save memimage memory '${get:image.folder}/adf${format:D6|${get:image.count}}'\necho.passfail '${get:indent}image <${ret:}>' 'pass'\nimage free memimage\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DAT_EXTIMAGEINFO\n; Check the printer metadata...\n;\nrun DAT_EXTIMAGEINFO '${get:indent}' '${get:image.folder}/adf${format:D6|${get:image.count}}' '${get:fixedfieldname}' '${get:fixedfieldvalue}' '${get:totalfields}'\nif '${ret:}' != 'pass' goto MAIN.ERROR.FAIL\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; End the transfer, see if we're done.  If not, go back\n; to MAIN.IMAGENATIVEXFER.NEXT for another image...\n;\nsetlocal name 'dg_control/dat_pendingxfers/msg_endxfer'\ndsmentry src ds dg_control dat_pendingxfers msg_endxfer '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nincrement image.count '${get:image.count}' 1\nif '${ret:${get:TW_PENDINGXFERS.Count}}' != '0' goto MAIN.IMAGEMEMXFER.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We're out of images, so disable...\n;\nsetlocal name 'dg_control/dat_userinterface/msg_disableds'\ndsmentry src ds dg_control dat_userinterface msg_disableds '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Summary and cleanup...\n;\n; We passed...\n:MAIN.PASS\nimage free memimage\necho.passfail 'SUMMARY' 'pass'\nreturn 'pass'\n;\n; Skip is allowed for CAP_IAFIELDE_*...\n:MAIN.SKIP\nimage free memimage\necho.passfail 'SUMMARY' 'skip'\nreturn 'skip'\n;\n; Ruh-roh...\n:MAIN.ERROR.ECHOPASSFAIL\nimage free memimage\necho.passfail '${get:indent}${get:name}' 'fail - ${sts:} ${ret:}'\necho.passfail 'SUMMARY' 'fail'\nrollback state4\nreturn 'fail'\n;\n; Ruh-roh...\n:MAIN.ERROR.FAIL\nimage free memimage\necho.passfail 'SUMMARY' 'fail'\nrollback state4\nreturn 'fail'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/140 - Image Address Badge/DAT_IMAGENATIVEXFER.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DAT_IMAGENATIVEXFER\n;   This test scans one sheet of paper for the default pixeltype.  An ADF is required to pass this test,\n;   but that was already been confirmed before we got to this function.  We're going to set the driver,\n;   scan a sheet of paper, and check the TWEI_* values.\n;\n;   Here's the basic flow:\n;       SetCapabilities\n;       start scanning\n;       while images\n;           transfer image\n;           DAT_EXTIMAGEINFO\n;           end image\n;       end\n;       end scanning\n;\n;   The test passes if:\n;       - all of the CAP_IAFIELD*_* capabilities can be set\n;       - scanning is successful\n;       - the TWEI_IALEVEL and TWEI_IAFIELD*_VALUE field are correctly set\n;       - if printing is supported, CAP_PRINTERMODE can be set and\n;         CAP_PRINTERTEXT contains the correct value\n;\n; Arguments\n;   arg:1 - test name for the image folder\n;   arg:2 - TWEI_IAFIELD*_VALUE containing fixed field (can be empty if none)\n;   arg:3 - fielda image address settings 'twia,printformat,value'\n;   arg:4 - fieldb image address settings 'twia,printformat,value'\n;   arg:5 - fieldc image address settings 'twia,printformat,value'\n;   arg:6 - fieldd image address settings 'twia,printformat,value'\n;   arg:7 - fielde image address settings 'twia,printformat,value'\n;\n; Globals\n;   (none)\n;\n; Locals\n;   name - current test being done\n;   indent - indent the passfail text\n;   image.handle - native handle\n;   image.count - count of images from 1\n;   image.folder - folder to put the images in\n;   totalfields - total value image address fields\n;\n; Returns\n;   pass/fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize...\n;\nsetlocal fixedfieldname   '${arg:2}'\nsetlocal fielda           '${arg:3}' ; check argindex down below\nsetlocal fieldb           '${arg:4}'\nsetlocal fieldc           '${arg:5}'\nsetlocal fieldd           '${arg:6}'\nsetlocal fielde           '${arg:7}'\n;\nsetlocal indent ''\nsetlocal image.handle '0'\nsetlocal image.count '1'\nsetlocal image.folder '${folder:certimages}/${arg:1}/DAT_IMAGENATIVEXFER'\n;\n; Figure out how many iafields have data, and get the fixed field value,\n; if any.  We're use them to check the TWEI_* values...\nsetlocal totalfields 0      ; assume no fields\nsetlocal argindex 2         ; first ia field argument - 1\nsetlocal fixedfieldvalue '' ; assume we don't have a value\n:MAIN.PARSE.NEXT\nincrement argindex ${get:argindex} 1\nif '${arg:${get:argindex}}' == '' goto MAIN.PARSE.DONE ; ran out of arguments\nif '${arg:${get:argindex}}' ~contains 'TWIA_UNUSED' goto MAIN.PARSE.NEXT ; skip unused fields\nif '${getindex:TWEI_IAFIELDA_VALUE,TWEI_IAFIELDB_VALUE,TWEI_IAFIELDC_VALUE,TWEI_IAFIELDD_VALUE,TWEI_IAFIELDE_VALUE:${get:argindex}}' != '${get:fixedfieldname}' goto MAIN.PARSE.NOTFIXED\nsetlocal fixedfieldvalue '${getindex:${arg:${get:argindex}}:2}'\n:MAIN.PARSE.NOTFIXED\nincrement totalfields ${get:totalfields} 1\ngoto MAIN.PARSE.NEXT\n:MAIN.PARSE.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Clean the image folder for this test...\n;\nimage cleanfolderandmeta '${get:image.folder}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; SetCapabilities\n; This resets the driver and sets all the capabilities we need for the test.\n; If its return code is not 'pass', end with an error\n;\nrun SetCapabilities 'TWSX_NATIVE' '${get:indent}' '${get:totalfields}' '${get:fielda}' '${get:fieldb}' '${get:fieldc}' '${get:fieldd}' '${get:fielde}'\nsetlocal returnvalue ${ret:}\nif '${ret:}' != 'skip' goto MAIN.SETCAPABILITES.CHECKPASS\ngoto MAIN.SETCAPABILITES.DONE\n;\n:MAIN.SETCAPABILITES.CHECKPASS\nif '${get:returnvalue}' != 'pass' goto MAIN.ERROR.FAIL\n:MAIN.SETCAPABILITES.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Check for paper in the feeder, prompt the user if we don't find any...\n;\ndsmentry src ds dg_control dat_capability msg_getcurrent 'CAP_FEEDERLOADED,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.FEEDERLOADED.DONE\nif '${ret:${get:TW_ONEVALUE.Item}}' ~~ 'TRUE' goto MAIN.FEEDERLOADED.DONE\necho.prompt\necho.prompt \"Place paper in the scanner's feeder.\"\npause '(press the ENTER key when ready to continue)'\n:MAIN.FEEDERLOADED.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Start scanning...\n;\nsetlocal indent '    '\nsetlocal name 'dg_control/dat_userinterface/msg_enableds'\nwait reset\ndsmentry src null dg_control dat_userinterface msg_enableds '${get:showui},0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Wait for MSG_XFERREADY, if we don't see it then scoot...\n;\nsetlocal name 'wait ${get:sys_waittimeout} seconds for MSG_XFERREADY'\nwait '${get:sys_waittimeout}000'\nif '${ret:}' !~contains 'msg_xferready' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Do a native transfer...\n;\n:MAIN.IMAGENATIVEXFER.NEXT\nsetlocal indent '    '\nsetlocal name 'dg_control/dat_imagenativexfer/msg_get'\ndsmentry src ds dg_image dat_imagenativexfer msg_get '0'\nsetlocal image.handle '${ret:}'\nif '${sts:}' != 'XFERDONE' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Save the image...\n;\nimage save image.handle native '${get:image.folder}/adf${format:D6|${get:image.count}}'\necho.passfail '${get:indent}image <${ret:}>' 'pass'\nfree handle image.handle\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; DAT_EXTIMAGEINFO\n; Check the printer metadata...\n;\nrun DAT_EXTIMAGEINFO '${get:indent}' '${get:image.folder}/adf${format:D6|${get:image.count}}' '${get:fixedfieldname}' '${get:fixedfieldvalue}' '${get:totalfields}'\nif '${ret:}' != 'pass' goto MAIN.ERROR.FAIL\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; End the transfer, see if we're done.  If not, go back\n; to MAIN.IMAGENATIVEXFER.NEXT for another image...\n;\nsetlocal name 'dg_control/dat_pendingxfers/msg_endxfer'\ndsmentry src ds dg_control dat_pendingxfers msg_endxfer '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\nincrement image.count '${get:image.count}' 1 ; count the image\nif '${ret:${get:TW_PENDINGXFERS.Count}}' != '0' goto MAIN.IMAGENATIVEXFER.NEXT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We're out of images, so disable...\n;\nsetlocal name 'dg_control/dat_userinterface/msg_disableds'\ndsmentry src ds dg_control dat_userinterface msg_disableds '0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Summary and cleanup...\n;\n; We passed...\n:MAIN.PASS\nfree handle image.handle\necho.passfail 'SUMMARY' 'pass'\nreturn 'pass'\n;\n; Skip is allowed for CAP_IAFIELDE_*...\n:MAIN.SKIP\nfree handle image.handle\necho.passfail 'SUMMARY' 'skip'\nreturn 'skip'\n;\n; Ruh-roh...\n:MAIN.ERROR.ECHOPASSFAIL\nfree handle image.handle\necho.passfail '${get:indent}${get:name}' 'fail - ${sts:} ${ret:}'\necho.passfail 'SUMMARY' 'fail'\nrollback state4\nreturn 'fail'\n;\n; Ruh-roh...\n:MAIN.ERROR.FAIL\nfree handle image.handle\necho.passfail 'SUMMARY' 'fail'\nrollback state4\nreturn 'fail'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/140 - Image Address Badge/Image Address Badge.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Image Address Badge\n;   This script tests the minimum requirements for a TWAIN driver to support image addressing.\n;\n; Arguments\n;   arg:1 - TW_IDENTITY.ProductName of scanner to test\n;\n; Globals\n;   g_supportedcaps - return from MSG_GET CAP_SUPPORTEDCAPS\n;\n; Locals\n;   certifyresult - track if we fail\n;\n; Returns\n;   pass/fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize...\n;\nsetlocal certifyresult 'pass' ; assume we'll pass\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Reset to a known state...\n;\nsetlocal name 'MSG_RESETALL'\ndsmentry src ds dg_control dat_capability msg_resetall '0,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.MSGRESETALL.FAIL\necho.passfail '${get:name}' 'pass'\ngoto MAIN.MSGRESETALL.DONE\n;\n:MAIN.MSGRESETALL.FAIL\necho.passfail '${get:name}' 'skip - ${sts:} ${ret:}'\nsetlocal certifyresult 'fail'\ngoto MAIN.DONE\n:MAIN.MSGRESETALL.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; CAP_IMAGEADDRESSENABLED must be supported, and must offer both TRUE\n; and FALSE, and must currently be FALSE, otherwise skip it all\n;\nsetlocal name 'CAP_IMAGEADDRESSENABLED is supported'\ndsmentry src ds dg_control dat_capability msg_get 'CAP_IMAGEADDRESSENABLED,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.CAP_IMAGEADDRESSENABLEDSUPPORTED.SKIP\nif ',${ret:},' !~contains ',TRUE,' goto MAIN.CAP_IMAGEADDRESSENABLEDSUPPORTED.SKIP\nif ',${ret:},' !~contains ',FALSE,' goto MAIN.CAP_IMAGEADDRESSENABLEDSUPPORTED.SKIP\necho.passfail '${get:name}' 'pass'\ngoto MAIN.CAP_IMAGEADDRESSENABLEDSUPPORTED.DONE\n;\n:MAIN.CAP_IMAGEADDRESSENABLEDSUPPORTED.SKIP\necho.passfail '${get:name}' 'skip - ${sts:} ${ret:}'\nsetlocal certifyresult 'skip'\ngoto MAIN.DONE\n:MAIN.CAP_IMAGEADDRESSENABLEDSUPPORTED.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; CAP_SUPPORTEDCAPS: check that all required capabilities are reported, we're\n; not looking for CAP_IAFIELDE_* capabilities, since they're not required...\n;\nsetlocal name 'CAP_SUPPORTEDCAPS MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'CAP_SUPPORTEDCAPS,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.CAP_SUPPORTEDCAPS.FAIL\nsetglobal g_supportedcaps '${ret:}'\necho.passfail '${get:name}' 'pass'\n;\nsetlocal name 'CAP_SUPPORTEDCAPS CAP_IMAGEADDRESSENABLED found'\nif ',${get:g_supportedcaps},' !~contains ',CAP_IMAGEADDRESSENABLED,' goto MAIN.CAP_SUPPORTEDCAPS.FAIL\necho.passfail '${get:name}' 'pass'\n;\nsetlocal name 'CAP_SUPPORTEDCAPS CAP_IAFIELDA_LASTPAGE found'\nif ',${get:g_supportedcaps},' !~contains ',CAP_IAFIELDA_LASTPAGE,' goto MAIN.CAP_SUPPORTEDCAPS.FAIL\necho.passfail '${get:name}' 'pass'\nsetlocal name 'CAP_SUPPORTEDCAPS CAP_IAFIELDB_LASTPAGE found'\nif ',${get:g_supportedcaps},' !~contains ',CAP_IAFIELDB_LASTPAGE,' goto MAIN.CAP_SUPPORTEDCAPS.FAIL\necho.passfail '${get:name}' 'pass'\nsetlocal name 'CAP_SUPPORTEDCAPS CAP_IAFIELDC_LASTPAGE found'\nif ',${get:g_supportedcaps},' !~contains ',CAP_IAFIELDC_LASTPAGE,' goto MAIN.CAP_SUPPORTEDCAPS.FAIL\necho.passfail '${get:name}' 'pass'\nsetlocal name 'CAP_SUPPORTEDCAPS CAP_IAFIELDD_LASTPAGE found'\nif ',${get:g_supportedcaps},' !~contains ',CAP_IAFIELDD_LASTPAGE,' goto MAIN.CAP_SUPPORTEDCAPS.FAIL\necho.passfail '${get:name}' 'pass'\n;\nsetlocal name 'CAP_SUPPORTEDCAPS CAP_IAFIELDA_LEVEL found'\nif ',${get:g_supportedcaps},' !~contains ',CAP_IAFIELDA_LEVEL,' goto MAIN.CAP_SUPPORTEDCAPS.FAIL\necho.passfail '${get:name}' 'pass'\nsetlocal name 'CAP_SUPPORTEDCAPS CAP_IAFIELDB_LEVEL found'\nif ',${get:g_supportedcaps},' !~contains ',CAP_IAFIELDB_LEVEL,' goto MAIN.CAP_SUPPORTEDCAPS.FAIL\necho.passfail '${get:name}' 'pass'\nsetlocal name 'CAP_SUPPORTEDCAPS CAP_IAFIELDC_LEVEL found'\nif ',${get:g_supportedcaps},' !~contains ',CAP_IAFIELDC_LEVEL,' goto MAIN.CAP_SUPPORTEDCAPS.FAIL\necho.passfail '${get:name}' 'pass'\nsetlocal name 'CAP_SUPPORTEDCAPS CAP_IAFIELDD_LEVEL found'\nif ',${get:g_supportedcaps},' !~contains ',CAP_IAFIELDD_LEVEL,' goto MAIN.CAP_SUPPORTEDCAPS.FAIL\necho.passfail '${get:name}' 'pass'\n;\nsetlocal name 'CAP_SUPPORTEDCAPS CAP_IAFIELDA_PRINTFORMAT found'\nif ',${get:g_supportedcaps},' !~contains ',CAP_IAFIELDA_PRINTFORMAT,' goto MAIN.CAP_SUPPORTEDCAPS.FAIL\necho.passfail '${get:name}' 'pass'\nsetlocal name 'CAP_SUPPORTEDCAPS CAP_IAFIELDB_PRINTFORMAT found'\nif ',${get:g_supportedcaps},' !~contains ',CAP_IAFIELDB_PRINTFORMAT,' goto MAIN.CAP_SUPPORTEDCAPS.FAIL\necho.passfail '${get:name}' 'pass'\nsetlocal name 'CAP_SUPPORTEDCAPS CAP_IAFIELDC_PRINTFORMAT found'\nif ',${get:g_supportedcaps},' !~contains ',CAP_IAFIELDC_PRINTFORMAT,' goto MAIN.CAP_SUPPORTEDCAPS.FAIL\necho.passfail '${get:name}' 'pass'\nsetlocal name 'CAP_SUPPORTEDCAPS CAP_IAFIELDD_PRINTFORMAT found'\nif ',${get:g_supportedcaps},' !~contains ',CAP_IAFIELDD_PRINTFORMAT,' goto MAIN.CAP_SUPPORTEDCAPS.FAIL\necho.passfail '${get:name}' 'pass'\n;\nsetlocal name 'CAP_SUPPORTEDCAPS CAP_IAFIELDA_VALUE found'\nif ',${get:g_supportedcaps},' !~contains ',CAP_IAFIELDA_VALUE,' goto MAIN.CAP_SUPPORTEDCAPS.FAIL\necho.passfail '${get:name}' 'pass'\nsetlocal name 'CAP_SUPPORTEDCAPS CAP_IAFIELDB_VALUE found'\nif ',${get:g_supportedcaps},' !~contains ',CAP_IAFIELDB_VALUE,' goto MAIN.CAP_SUPPORTEDCAPS.FAIL\necho.passfail '${get:name}' 'pass'\nsetlocal name 'CAP_SUPPORTEDCAPS CAP_IAFIELDC_VALUE found'\nif ',${get:g_supportedcaps},' !~contains ',CAP_IAFIELDC_VALUE,' goto MAIN.CAP_SUPPORTEDCAPS.FAIL\necho.passfail '${get:name}' 'pass'\nsetlocal name 'CAP_SUPPORTEDCAPS CAP_IAFIELDD_VALUE found'\nif ',${get:g_supportedcaps},' !~contains ',CAP_IAFIELDD_VALUE,' goto MAIN.CAP_SUPPORTEDCAPS.FAIL\necho.passfail '${get:name}' 'pass'\n;\ngoto MAIN.CAP_SUPPORTEDCAPS.DONE\n:MAIN.CAP_SUPPORTEDCAPS.FAIL\necho.passfail '${get:name}' 'fail - ${sts:} ${ret:}'\nsetlocal certifyresult 'fail'\ngoto MAIN.DONE\n:MAIN.CAP_SUPPORTEDCAPS.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; ICAP_SUPPORTEDEXTIMAGEINFO: check that all metadata is supported.  We're not\n; checking for TWEI_IAFIELDE_VALUE, since it's not required...\n;\nsetlocal name 'ICAP_SUPPORTEDEXTIMAGEINFO MSG_GET'\ndsmentry src ds dg_control dat_capability msg_get 'ICAP_SUPPORTEDEXTIMAGEINFO,0,0,0'\nsetlocal icapsupportedextimageinfo '${ret:}'\nif '${sts:}' != 'SUCCESS' goto MAIN.ICAP_SUPPORTEDEXTIMAGEINFO.FAIL\necho.passfail '${get:name}' 'pass'\n;\nsetlocal name 'ICAP_SUPPORTEDEXTIMAGEINFO TWEI_IALEVEL found'\nif ',${get:icapsupportedextimageinfo},' !~contains ',TWEI_IALEVEL,' goto MAIN.ICAP_SUPPORTEDEXTIMAGEINFO.FAIL\necho.passfail '${get:name}' 'pass'\n;\nsetlocal name 'ICAP_SUPPORTEDEXTIMAGEINFO TWEI_IAFIELDA_VALUE found'\nif ',${get:icapsupportedextimageinfo},' !~contains ',TWEI_IAFIELDA_VALUE,' goto MAIN.ICAP_SUPPORTEDEXTIMAGEINFO.FAIL\necho.passfail '${get:name}' 'pass'\nsetlocal name 'ICAP_SUPPORTEDEXTIMAGEINFO TWEI_IAFIELDB_VALUE found'\nif ',${get:icapsupportedextimageinfo},' !~contains ',TWEI_IAFIELDB_VALUE,' goto MAIN.ICAP_SUPPORTEDEXTIMAGEINFO.FAIL\necho.passfail '${get:name}' 'pass'\nsetlocal name 'ICAP_SUPPORTEDEXTIMAGEINFO TWEI_IAFIELDC_VALUE found'\nif ',${get:icapsupportedextimageinfo},' !~contains ',TWEI_IAFIELDC_VALUE,' goto MAIN.ICAP_SUPPORTEDEXTIMAGEINFO.FAIL\necho.passfail '${get:name}' 'pass'\nsetlocal name 'ICAP_SUPPORTEDEXTIMAGEINFO TWEI_IAFIELDD_VALUE found'\nif ',${get:icapsupportedextimageinfo},' !~contains ',TWEI_IAFIELDD_VALUE,' goto MAIN.ICAP_SUPPORTEDEXTIMAGEINFO.FAIL\necho.passfail '${get:name}' 'pass'\ngoto MAIN.ICAP_SUPPORTEDEXTIMAGEINFO.DONE\n;\n:MAIN.ICAP_SUPPORTEDEXTIMAGEINFO.FAIL\necho.passfail '${get:name}' 'fail - ${sts:} ${ret:}'\nsetlocal certifyresult 'fail'\n:MAIN.ICAP_SUPPORTEDEXTIMAGEINFO.DONE\n\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; CAP_IMAGEADDRESSENABLED resets to FALSE...\n;\nsetlocal name 'CAP_IMAGEADDRESSENABLED resets to FALSE'\ndsmentry src ds dg_control dat_capability msg_reset 'CAP_IMAGEADDRESSENABLED,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.CAP_IMAGEADDRESSENABLEDFALSE.SKIP\nif ',${ret:},' !~contains ',FALSE,' goto MAIN.CAP_IMAGEADDRESSENABLEDFALSE.SKIP\necho.passfail '${get:name}' 'pass'\n;\ngoto MAIN.CAP_IMAGEADDRESSENABLEDFALSE.DONE\n:MAIN.CAP_IMAGEADDRESSENABLEDFALSE.SKIP\necho.passfail '${get:name}' 'skip - ${sts:} ${ret:}'\nsetlocal certifyresult 'fail'\ngoto MAIN.DONE\n:MAIN.CAP_IMAGEADDRESSENABLEDFALSE.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; CAP_IMAGEADDRESSENABLED set to TRUE...\n;\nsetlocal name 'CAP_IMAGEADDRESSENABLED set to TRUE'\ndsmentry src ds dg_control dat_capability msg_set 'CAP_IMAGEADDRESSENABLED,TWON_ONEVALUE,TWTY_BOOL,TRUE'\nif '${sts:}' != 'SUCCESS' goto MAIN.CAP_IMAGEADDRESSENABLEDTRUE.FAIL\ndsmentry src ds dg_control dat_capability msg_getcurrent 'CAP_IMAGEADDRESSENABLED,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.CAP_IMAGEADDRESSENABLEDTRUE.FAIL\nif ',${ret:},' !~contains ',TRUE,' goto MAIN.CAP_IMAGEADDRESSENABLEDTRUE.FAIL\necho.passfail '${get:name}' 'pass'\n;\ngoto MAIN.CAP_IMAGEADDRESSENABLEDTRUE.DONE\n:MAIN.CAP_IMAGEADDRESSENABLEDTRUE.FAIL\necho.passfail '${get:name}' 'skip - ${sts:} ${ret:}'\nsetlocal certifyresult 'fail'\ngoto MAIN.DONE\n:MAIN.CAP_IMAGEADDRESSENABLEDTRUE.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Figure out which transfers we're checking...\n;\nsetlocal name 'get ICAP_XFERMECH'\ndsmentry src ds dg_control dat_capability msg_get 'ICAP_XFERMECH,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR\necho.passfail '${get:name}' 'pass'\nsetlocal xfermech.enum '${ret:}'\n;\nsetlocal xfermech.total 0 ; total supported transfers\n;\n; Turn twsx_* values into dat_image*xfer values...\nif ',${get:xfermech.enum},' !~contains ',TWSX_NATIVE,' goto MAIN.ERROR ; mandatory\nsetlocal xfermech.list 'DAT_IMAGENATIVEXFER'\nincrement xfermech.total ${get:xfermech.total} 1\n;\nif ',${get:xfermech.enum},' !~contains ',TWSX_MEMORY,' goto MAIN.ERROR ; mandatory\nsetlocal xfermech.list '${get:xfermech.list},DAT_IMAGEMEMXFER'\nincrement xfermech.total ${get:xfermech.total} 1\n;\nif ',${get:xfermech.enum},' !~contains ',TWSX_FILE,' goto MAIN.XFERMECH.SKIPFILE\nsetlocal xfermech.list '${get:xfermech.list},DAT_IMAGEFILEXFER'\nincrement xfermech.total ${get:xfermech.total} 1\n:MAIN.XFERMECH.SKIPFILE\n;\nif ',${get:xfermech.enum},' !~contains ',TWSX_MEMFILE,' goto MAIN.XFERMECH.SKIPMEMFILE\nsetlocal xfermech.list '${get:xfermech.list},DAT_IMAGEMEMFILEXFER'\nincrement xfermech.total ${get:xfermech.total} 1\n:MAIN.XFERMECH.SKIPMEMFILE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We need at least 8 sheets of paper, 10 if the driver supports CAP_IAFIELDE_LEVEL.\n; Multiply that by the number of transfers we'll be doing.\n;\nsetlocal sheets.onexfer 8\nif ',${get:g_supportedcaps},' !~contains ',CAP_IAFIELDE_LEVEL,' goto MAIN.8SHEETSONLY\nincrement sheets.onexfer ${get:sheets.onexfer} 2\n:MAIN.8SHEETSONLY\nmultiply sheets ${get:sheets.onexfer} ${get:xfermech.total}\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Prompt the user...\n;\necho.prompt\necho.prompt \"Scanning will take place now.  A progress indicator may appear, but no other\necho.prompt \"interaction should be needed.\"\necho.prompt\necho.prompt \"Place ${get:sheets} sheets in the scanner's feeder.  The scanner may print text\"\necho.prompt \"on them.  If the feeder cannot accept ${get:sheets} sheets, put in as many\"\necho.prompt \"multiples of ${get:sheets.onexfer} sheets that it can handle.  The script will prompt\"\necho.prompt \"for more if needed.\"\necho.prompt\npause '(press the ENTER key when ready to continue)'\necho.prompt\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We'll loop here over each of the transfers...\n;\nsetlocal xfermech.index -1 ; one less than the first index for xfermech.list\n:MAIN.XFERMECH.NEXT\nincrement xfermech.index ${get:xfermech.index} 1\nsetlocal xfermech.value '${getindex:xfermech.list:${get:xfermech.index}}'\nif '${get:xfermech.value}' == '' goto MAIN.XFERMECH.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Test image address level 1 with fixed field, confirm support for 0 and no padding...\n;\necho.titletest '${get:xfermech.value} Set IA: FIXED.0001' 1\ncall CERTIFY '${get:xfermech.value}' '${folder:parent}' 'TWEI_IAFIELDA_VALUE' 'TWIA_FIXED,#####,FIXED' 'TWIA_LEVEL1,0000,1' 'TWIA_UNUSED,,' 'TWIA_UNUSED,,' 'TWIA_UNUSED,,'\nif '${ret:}' != 'pass' goto MAIN.ERROR\n;\necho.titletest '${get:xfermech.value} Set IA: FIXED.1' 1\ncall CERTIFY '${get:xfermech.value}' '${folder:parent}' 'TWEI_IAFIELDA_VALUE' 'TWIA_FIXED,#####,FIXED' 'TWIA_LEVEL1,####,1' 'TWIA_UNUSED,,' 'TWIA_UNUSED,,' 'TWIA_UNUSED,,'\nif '${ret:}' != 'pass' goto MAIN.ERROR\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Test image address level 2 with fixed field, confirm support for 0 and no padding...\n;\necho.titletest '${get:xfermech.value} Set IA: FIXED.0020.0001' 1\ncall CERTIFY '${get:xfermech.value}' '${folder:parent}' 'TWEI_IAFIELDA_VALUE' 'TWIA_FIXED,#####,FIXED' 'TWIA_LEVEL2,0000,20' 'TWIA_LEVEL1,0000,1' 'TWIA_UNUSED,,' 'TWIA_UNUSED,,'\nif '${ret:}' != 'pass' goto MAIN.ERROR\n;\necho.titletest '${get:xfermech.value} Set IA: FIXED.20.1' 1\ncall CERTIFY '${get:xfermech.value}' '${folder:parent}' 'TWEI_IAFIELDA_VALUE' 'TWIA_FIXED,#####,FIXED' 'TWIA_LEVEL2,####,20' 'TWIA_LEVEL1,####,1' 'TWIA_UNUSED,,' 'TWIA_UNUSED,,'\nif '${ret:}' != 'pass' goto MAIN.ERROR\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Test image address level 3 with fixed field, confirm support for 0 and no padding...\n;\necho.titletest '${get:xfermech.value} Set IA: FIXED.0300.0020.0001' 1\ncall CERTIFY '${get:xfermech.value}' '${folder:parent}' 'TWEI_IAFIELDA_VALUE' 'TWIA_FIXED,#####,FIXED' 'TWIA_LEVEL3,0000,300' 'TWIA_LEVEL2,0000,20' 'TWIA_LEVEL1,0000,1' 'TWIA_UNUSED,,'\nif '${ret:}' != 'pass' goto MAIN.ERROR\n;\necho.titletest '${get:xfermech.value} Set IA: FIXED.300.20.1' 1\ncall CERTIFY '${get:xfermech.value}' '${folder:parent}' 'TWEI_IAFIELDA_VALUE' 'TWIA_FIXED,#####,FIXED' 'TWIA_LEVEL3,####,300' 'TWIA_LEVEL2,####,20' 'TWIA_LEVEL1,####,1' 'TWIA_UNUSED,,'\nif '${ret:}' != 'pass' goto MAIN.ERROR\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Test image address level 4 with fixed field (skip if TWIA_LEVEL4 is not supported),\n; confirm support for 0 and no padding...\n;\nif ',${get:icapsupportedextimageinfo},' !~contains 'TWIA_LEVEL4' goto MAIN.LEVEL4.SKIP\necho.titletest '${get:xfermech.value} Set IA: FIXED.4000.0300.0020.0001' 1\ncall CERTIFY '${get:xfermech.value}' '${folder:parent}' 'TWEI_IAFIELDA_VALUE' 'TWIA_FIXED,#####,FIXED' 'TWIA_LEVEL4,0000,4000' 'TWIA_LEVEL3,0000,300' 'TWIA_LEVEL2,0000,20' 'TWIA_LEVEL1,0000,1'\nif '${ret:}' != 'pass' goto MAIN.ERROR\n;\necho.titletest '${get:xfermech.value} Set IA: FIXED.4000.300.20.1' 1\ncall CERTIFY '${get:xfermech.value}' '${folder:parent}' 'TWEI_IAFIELDA_VALUE' 'TWIA_FIXED,#####,FIXED' 'TWIA_LEVEL4,####,4000' 'TWIA_LEVEL3,####,300' 'TWIA_LEVEL2,####,20' 'TWIA_LEVEL1,####,1'\nif '${ret:}' != 'pass' goto MAIN.ERROR\n:MAIN.LEVEL4.SKIP\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Next transfer mechanism...\n;\ngoto MAIN.XFERMECH.NEXT\n:MAIN.XFERMECH.DONE\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; All done...\n;\n:MAIN.DONE\necho \" \"\nreturn '${get:certifyresult}'\n;\n:MAIN.ERROR\necho.passfail '${get:name}' 'fail'\necho \" \"\nreturn '${get:certifyresult}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Function: Certify\n;\n; Arguments\n;   arg:1 - name of the script to run\n;   arg:2 - name of test (used for files)\n;   arg:3 - TWEI_IAFIELD*_VALUE containing the fixed field (can be empty if none)\n;   arg:4 - fielda settings (level,printformat,value)\n;   arg:5 - fieldb settings (level,printformat,value)\n;   arg:6 - fieldc settings (level,printformat,value)\n;   arg:7 - fieldd settings (level,printformat,value)\n;   arg:8 - fielde settings (level,printformat,value)\n;\n; Returns\n;   pass/fail\n;\n:CERTIFY\n;\nrun '${arg:1}' '${arg:2}' '${arg:3}' '${arg:4}' '${arg:5}' '${arg:6}' '${arg:7}' '${arg:8}'\nif '${ret:}' != 'pass' goto CERTIFY.FAIL\nreturn 'pass'\n;\n:CERTIFY.FAIL\nsetlocal certifyresult 'fail'\nreturn 'fail'"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/140 - Image Address Badge/SetCapabilities.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; SetCapabilities\n;   Reset the driver's capabilites, and then set capabilities for this test.  Note that one can only\n;   get this badge for the ADF.  This is a production mode feature, so we're not testing the flatbed.\n;   Image Addressing allows us to track and catagorize images in a batch.\n;\n;   We follow the capability ordering:\n;   MSG_RESETALL\n;   set ICAP_XFERMECH.....................${arg:1}\n;   set CAP_FEEDERENABLED.................TRUE\n;   set CAP_XFERCOUNT.....................1\n;   set ICAP_EXTIMAGEINFO.................TRUE\n;   set CAP_IMAGEADDRESSENABLED...........TRUE\n;   set CAP_IAFIELD*_LEVEL................TWIA_*\n;   set CAP_IAFIELD*_PRINTFORMAT..........0's or #'s\n;   set CAP_IAFIELD*_VALUE................'IA-' for fixed field or numbers\n;   if CAP_PRINTERENABLED is supported\n;      set CAP_PRINTERENABLED.............TRUE\n;      set CAP_PRINTERMODE................TWPM_IMAGEADDRESSSTRING\n;      set CAP_PRINTERSTRING..............'PRINT'\n;      set CAP_PRINTERSUFFIX..............'TEST'\n;   end\n;\n;   The test passes if all operations return TWRC_SUCCESS.\n;\n; Arguments\n;   arg:1 - TWSX_* value for ICAP_XFERMECH\n;   arg:2 - value of caller's indent\n;   arg:3 - total fields in use (detects if field e is active)\n;   arg:4 - field A level,printformat,value (ex: 'twia_fixed,###,IA-')\n;   arg:5 - field B level,printformat,value (ex: 'twia_level4,000,1')\n;   arg:6 - field C level,printformat,value (ex: 'twia_level3,000,1')\n;   arg:7 - field D level,printformat,value (ex: 'twia_level2,000,1')\n;   arg:8 - field E level,printformat,value (ex: 'twia_level1,000,1')\n;\n; Locals\n;   indent - indent the passfail text\n;   name - name of the current test\n;   twsx - TWSX_* value for ICAP_XFERMECH\n;   totalfields - total fields in use (0 - 5)\n;   fielda - field A\n;   fieldb - field B\n;   fieldc - field C\n;   fieldd - field D\n;   fielde - field E\n;\n; Returns\n;   pass/fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize...\n;\nsetlocal twsx '${arg:1}'\nsetlocal indent '${arg:2}'\nsetlocal totalfields '${arg:3}'\nsetlocal fielda '${arg:4}'\nsetlocal fieldb '${arg:5}'\nsetlocal fieldc '${arg:6}'\nsetlocal fieldd '${arg:7}'\nsetlocal fielde '${arg:8}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; MSG_RESETALL\n; If return code is not TWRC_SUCCESS, end with an error\n;\nsetlocal name 'MSG_RESETALL'\ndsmentry src ds dg_control dat_capability msg_resetall '0,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set ICAP_XFERMECH...\n;\nsetlocal name 'ICAP_XFERMECH MSG_SET ${get:twsx}'\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_XFERMECH,TWON_ONEVALUE,TWTY_UINT16,${get:twsx}'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set CAP_FEEDERENABLED to TRUE\n;\nsetlocal name 'CAP_FEEDERENABLED MSG_SET TRUE'\ndsmentry src ds dg_control dat_capability msg_set 'CAP_FEEDERENABLED,TWON_ONEVALUE,TWTY_BOOL,TRUE'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set CAP_XFERCOUNT to 1\n;\nsetlocal name 'CAP_XFERCOUNT MSG_SET 1'\ndsmentry src ds dg_control dat_capability msg_set 'CAP_XFERCOUNT,TWON_ONEVALUE,TWTY_INT16,1'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set ICAP_EXTIMAGEINFO to TRUE\n;\nsetlocal name 'ICAP_EXTIMAGEINFO MSG_SET TRUE'\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_EXTIMAGEINFO,TWON_ONEVALUE,TWTY_BOOL,TRUE'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; CAP_IMAGEADDRESSENABLED resets to FALSE\n;\nsetlocal name 'CAP_IMAGEADDRESSENABLED resets to FALSE'\ndsmentry src ds dg_control dat_capability msg_reset 'CAP_IMAGEADDRESSENABLED,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\nif ',${ret:},' !~contains ',FALSE,' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; CAP_IMAGEADDRESSENABLED set to TRUE\n;\nsetlocal name 'CAP_IMAGEADDRESSENABLED set to TRUE'\ndsmentry src ds dg_control dat_capability msg_set 'CAP_IMAGEADDRESSENABLED,TWON_ONEVALUE,TWTY_BOOL,TRUE'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\ndsmentry src ds dg_control dat_capability msg_getcurrent 'CAP_IMAGEADDRESSENABLED,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\nif ',${ret:},' !~contains ',TRUE,' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set the image address capabilities...\n;\ncall SET_IMAGEADDRESS_LEVEL '${get:indent}' '${getindex:fielda:0}' '${getindex:fieldb:0}' '${getindex:fieldc:0}' '${getindex:fieldd:0}' '${getindex:fielde:0}'\nif '${ret:}' == 'skip' goto MAIN.SKIP\nif '${ret:}' != 'pass' goto MAIN.ERROR\ncall SET_IMAGEADDRESS_PRINTFORMAT '${get:indent}' '${getindex:fielda:1}' '${getindex:fieldb:1}' '${getindex:fieldc:1}' '${getindex:fieldd:1}' '${getindex:fielde:1}'\nif '${ret:}' == 'skip' goto MAIN.SKIP\nif '${ret:}' != 'pass' goto MAIN.ERROR\ncall SET_IMAGEADDRESS_VALUE '${get:indent}' '${getindex:fielda:2}' '${getindex:fieldb:2}' '${getindex:fieldc:2}' '${getindex:fieldd:2}' '${getindex:fielde:2}'\nif '${ret:}' == 'skip' goto MAIN.SKIP\nif '${ret:}' != 'pass' goto MAIN.ERROR\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set the printer capabilites, if supported...\n;\nif ',${get:g_supportedcaps},' !~contains ',CAP_PRINTERENABLED,' goto MAIN.CAP_PRINTERENABLED.SKIP\n;\nsetlocal name 'CAP_PRINTERENABLED MSG_SET TRUE'\ndsmentry src ds dg_control dat_capability msg_set 'CAP_PRINTERENABLED,TWON_ONEVALUE,TWTY_BOOL,TRUE'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'CAP_PRINTERMODE MSG_SET TWPM_IMAGEADDRESSSTRING'\ndsmentry src ds dg_control dat_capability msg_set 'CAP_PRINTERMODE,TWON_ONEVALUE,TWTY_UINT16,TWPM_IMAGEADDRESSSTRING'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'CAP_PRINTERSTRING MSG_SET \"PRINT\"'\ndsmentry src ds dg_control dat_capability msg_set 'CAP_PRINTERSTRING,TWON_ONEVALUE,TWTY_STR255,PRINT'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\nsetlocal name 'CAP_PRINTERSUFFIX MSG_SET \"TEST\"'\ndsmentry src ds dg_control dat_capability msg_set 'CAP_PRINTERSUFFIX,TWON_ONEVALUE,TWTY_STR255,TEST'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n:MAIN.CAP_PRINTERENABLED.SKIP\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Summary and cleanup...\n;\n; We passed...\n:MAIN.PASS\nreturn 'pass'\n;\n; Skip this item...\n:MAIN.SKIP\nreturn 'skip'\n;\n; Ruh-roh...\n:MAIN.ERROR.ECHOPASSFAIL\necho.passfail '${get:indent}${get:name}' 'fail - ${sts:} ${ret:}'\n:MAIN.ERROR\nreturn 'fail'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Function: SET_IMAGEADDRESS_LEVEL\n; Set the image address levels based on the arguments passed in.  Return 'skip' if a field isn't\n; supported (not tested for fields A, B, C and D).  Otherwise it's pass or fail.  Arguments are\n; TWIA_LEVEL_* values.\n;\n; Arguments\n;   arg:1 - indent\n;   arg:2 - field A\n;   arg:3 - field B\n;   arg:4 - field C\n;   arg:5 - field D\n;   arg:6 - field E\n;\n; Globals\n;   g_supportedcaps - return from MSG_GET CAP_SUPPORTEDCAPS in 'Image Address Badge.tc'\n;\n; Locals\n;   indent - offset the output\n;   name - name of the test\n;   fielda - level for fielda\n;   fieldb - level for fieldb\n;   fieldc - level for fieldc\n;   fieldd - level for fieldd\n;   fielde - level for fielde\n;\n; Returns\n;   pass/fail\n;\n:SET_IMAGEADDRESS_LEVEL\n;\n; Init stuff...\nsetlocal indent '${arg:1}'\nsetlocal fielda '${arg:2}'\nsetlocal fieldb '${arg:3}'\nsetlocal fieldc '${arg:4}'\nsetlocal fieldd '${arg:5}'\nsetlocal fielde '${arg:6}'\n;\n; Set FIELD A (must have this)\nsetlocal name 'Set CAP_IAFIELDA_LEVEL to <${get:fielda}>'\nif '${get:fielda}' == '' goto SET_IMAGEADDRESS_LEVEL.FAIL ; have to have this argument\nif ',${get:g_supportedcaps},' !~contains ',CAP_IAFIELDA_LEVEL,' goto SET_IMAGEADDRESS_LEVEL.FAIL\ndsmentry src ds dg_control dat_capability msg_set 'CAP_IAFIELDA_LEVEL,TWON_ONEVALUE,TWTY_UINT16,${get:fielda}'\nif '${sts:}' == 'BADVALUE' goto SET_IMAGEADDRESS_LEVEL.FAIL\nif '${sts:}' != 'SUCCESS' goto SET_IMAGEADDRESS_LEVEL.FAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n; Set FIELD B (must have this)\nsetlocal name 'Set CAP_IAFIELDB_LEVEL to <${get:fieldb}>'\nif '${get:fieldb}' == '' goto SET_IMAGEADDRESS_LEVEL.PASS ; optional argument\nif ',${get:g_supportedcaps},' !~contains ',CAP_IAFIELDB_LEVEL,' goto SET_IMAGEADDRESS_LEVEL.FAIL\ndsmentry src ds dg_control dat_capability msg_set 'CAP_IAFIELDB_LEVEL,TWON_ONEVALUE,TWTY_UINT16,${get:fieldb}'\nif '${sts:}' == 'BADVALUE' goto SET_IMAGEADDRESS_LEVEL.FAIL\nif '${sts:}' != 'SUCCESS' goto SET_IMAGEADDRESS_LEVEL.FAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n; Set FIELD C (must have this)\nsetlocal name 'Set CAP_IAFIELDC_LEVEL to <${get:fieldc}>'\nif '${get:fieldc}' == '' goto SET_IMAGEADDRESS_LEVEL.PASS ; optional argument\nif ',${get:g_supportedcaps},' !~contains ',CAP_IAFIELDC_LEVEL,' goto SET_IMAGEADDRESS_LEVEL.FAIL\ndsmentry src ds dg_control dat_capability msg_set 'CAP_IAFIELDC_LEVEL,TWON_ONEVALUE,TWTY_UINT16,${get:fieldc}'\nif '${sts:}' == 'BADVALUE' goto SET_IMAGEADDRESS_LEVEL.FAIL\nif '${sts:}' != 'SUCCESS' goto SET_IMAGEADDRESS_LEVEL.FAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n; Set FIELD D (must have this)\nsetlocal name 'Set CAP_IAFIELDD_LEVEL to <${get:fieldd}>'\nif '${get:fieldd}' == '' goto SET_IMAGEADDRESS_LEVEL.PASS ; optional argument\nif ',${get:g_supportedcaps},' !~contains ',CAP_IAFIELDD_LEVEL,' goto SET_IMAGEADDRESS_LEVEL.FAIL\ndsmentry src ds dg_control dat_capability msg_set 'CAP_IAFIELDD_LEVEL,TWON_ONEVALUE,TWTY_UINT16,${get:fieldd}'\nif '${sts:}' == 'BADVALUE' goto SET_IMAGEADDRESS_LEVEL.FAIL\nif '${sts:}' != 'SUCCESS' goto SET_IMAGEADDRESS_LEVEL.FAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n; Set FIELD E (optional)\nsetlocal name 'Set CAP_IAFIELDE_LEVEL to <${get:fielde}>'\nif '${get:fielde}' == '' goto SET_IMAGEADDRESS_LEVEL.PASS ; optional argument\nif ',${get:g_supportedcaps},' !~contains ',CAP_IAFIELDE_LEVEL,' goto SET_IMAGEADDRESS_LEVEL.PASS\ndsmentry src ds dg_control dat_capability msg_set 'CAP_IAFIELDE_LEVEL,TWON_ONEVALUE,TWTY_UINT16,${get:fielde}'\nif '${sts:}' == 'BADVALUE' goto SET_IMAGEADDRESS_LEVEL.FAIL\nif '${sts:}' != 'SUCCESS' goto SET_IMAGEADDRESS_LEVEL.FAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n:SET_IMAGEADDRESS_LEVEL.PASS\nreturn 'pass'\n;\n:SET_IMAGEADDRESS_LEVEL.FAIL\nsetglobal '${arg:3}' 'fail'\necho.passfail '${get:indent}${get:name}' 'fail'\nreturn 'fail'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Function: SET_IMAGEADDRESS_PRINTFORMAT\n; Set the image address print format based on the arguments passed in.  Return 'skip' if a field isn't\n; supported (not tested for fields A, B, C and D).  Otherwise it's pass or fail.  Arguments are strings\n; of either #'s or 0's...\n;\n; Arguments\n;   arg:1 - indent\n;   arg:2 - field A\n;   arg:3 - field B\n;   arg:4 - field C\n;   arg:5 - field D\n;   arg:6 - field E\n;\n; Globals\n;   g_supportedcaps - return from MSG_GET CAP_SUPPORTEDCAPS in 'Image Address Badge.tc'\n;\n; Locals\n;   indent - offset the output\n;   name - name of the test\n;   fielda - printformat for fielda\n;   fieldb - printformat for fieldb\n;   fieldc - printformat for fieldc\n;   fieldd - printformat for fieldd\n;   fielde - printformat for fielde\n;\n; Returns\n;   pass/fail/skip\n;\n:SET_IMAGEADDRESS_PRINTFORMAT\n;\n; Init stuff...\nsetlocal indent '${arg:1}'\nsetlocal fielda '${arg:2}'\nsetlocal fieldb '${arg:3}'\nsetlocal fieldc '${arg:4}'\nsetlocal fieldd '${arg:5}'\nsetlocal fielde '${arg:6}'\n;\n; Set FIELD A (must have this)\nsetlocal name 'Set CAP_IAFIELDA_PRINTFORMAT to <${get:fielda}>'\nif '${get:fielda}' == '' goto SET_IMAGEADDRESS_PRINTFORMAT.FAIL ; have to have this argument\nif ',${get:g_supportedcaps},' !~contains ',CAP_IAFIELDA_PRINTFORMAT,' goto SET_IMAGEADDRESS_PRINTFORMAT.FAIL\ndsmentry src ds dg_control dat_capability msg_set 'CAP_IAFIELDA_PRINTFORMAT,TWON_ONEVALUE,TWTY_STR32,${get:fielda}'\nif '${sts:}' != 'SUCCESS' goto SET_IMAGEADDRESS_PRINTFORMAT.FAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n; Set FIELD B (must have this)\nsetlocal name 'Set CAP_IAFIELDB_PRINTFORMAT to <${get:fieldb}>'\nif '${get:fieldb}' == '' goto SET_IMAGEADDRESS_PRINTFORMAT.PASS ; optional argument\nif ',${get:g_supportedcaps},' !~contains ',CAP_IAFIELDB_PRINTFORMAT,' goto SET_IMAGEADDRESS_PRINTFORMAT.FAIL\ndsmentry src ds dg_control dat_capability msg_set 'CAP_IAFIELDB_PRINTFORMAT,TWON_ONEVALUE,TWTY_STR32,${get:fieldb}'\nif '${sts:}' != 'SUCCESS' goto SET_IMAGEADDRESS_PRINTFORMAT.FAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n; Set FIELD C (must have this)\nsetlocal name 'Set CAP_IAFIELDC_PRINTFORMAT to <${get:fieldc}>'\nif '${get:fieldc}' == '' goto SET_IMAGEADDRESS_PRINTFORMAT.PASS ; optional argument\nif ',${get:g_supportedcaps},' !~contains ',CAP_IAFIELDC_PRINTFORMAT,' goto SET_IMAGEADDRESS_PRINTFORMAT.FAIL\ndsmentry src ds dg_control dat_capability msg_set 'CAP_IAFIELDC_PRINTFORMAT,TWON_ONEVALUE,TWTY_STR32,${get:fieldc}'\nif '${sts:}' != 'SUCCESS' goto SET_IMAGEADDRESS_PRINTFORMAT.FAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n; Set FIELD D (must have this)\nsetlocal name 'Set CAP_IAFIELDD_PRINTFORMAT to <${get:fieldd}>'\nif '${get:fieldd}' == '' goto SET_IMAGEADDRESS_PRINTFORMAT.PASS ; optional argument\nif ',${get:g_supportedcaps},' !~contains ',CAP_IAFIELDD_PRINTFORMAT,' goto SET_IMAGEADDRESS_PRINTFORMAT.FAIL\ndsmentry src ds dg_control dat_capability msg_set 'CAP_IAFIELDD_PRINTFORMAT,TWON_ONEVALUE,TWTY_STR32,${get:fieldd}'\nif '${sts:}' != 'SUCCESS' goto SET_IMAGEADDRESS_PRINTFORMAT.FAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n; Set FIELD E (optional)\nsetlocal name 'Set CAP_IAFIELDE_PRINTFORMAT to <${get:fielde}>'\nif '${get:fielde}' == '' goto SET_IMAGEADDRESS_PRINTFORMAT.PASS ; optional argument\nif ',${get:g_supportedcaps},' !~contains ',CAP_IAFIELDE_PRINTFORMAT,' goto SET_IMAGEADDRESS_PRINTFORMAT.PASS\ndsmentry src ds dg_control dat_capability msg_set 'CAP_IAFIELDE_PRINTFORMAT,TWON_ONEVALUE,TWTY_STR32,${get:fielde}'\nif '${sts:}' != 'SUCCESS' goto SET_IMAGEADDRESS_PRINTFORMAT.FAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n:SET_IMAGEADDRESS_PRINTFORMAT.PASS\nreturn 'pass'\n;\n:SET_IMAGEADDRESS_PRINTFORMAT.FAIL\nsetglobal '${arg:3}' 'fail'\necho.passfail '${get:indent}${get:name}' 'fail'\nreturn 'fail'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Function: SET_IMAGEADDRESS_VALUE\n; Set the image address value based on the arguments passed in.  Return 'skip' if a field isn't\n; supported (not tested for fields A, B, C and D).  Otherwise it's pass or fail.  Arguments are\n; strings...\n;\n; Arguments\n;   arg:1 - indent\n;   arg:2 - field A\n;   arg:3 - field B\n;   arg:4 - field C\n;   arg:5 - field D\n;   arg:6 - field E\n;\n; Globals\n;   g_supportedcaps - return from MSG_GET CAP_SUPPORTEDCAPS in 'Image Address Badge.tc'\n;\n; Locals\n;   indent - offset the output\n;   name - name of the test\n;   fielda - value for fielda\n;   fieldb - value for fieldb\n;   fieldc - value for fieldc\n;   fieldd - value for fieldd\n;   fielde - value for fielde\n;\n; Returns\n;   pass/fail/skip\n;\n:SET_IMAGEADDRESS_VALUE\n;\n; Init stuff...\nsetlocal indent '${arg:1}'\nsetlocal fielda '${arg:2}'\nsetlocal fieldb '${arg:3}'\nsetlocal fieldc '${arg:4}'\nsetlocal fieldd '${arg:5}'\nsetlocal fielde '${arg:6}'\n;\n; Set FIELD A (must have this)\nsetlocal name 'Set CAP_IAFIELDA_VALUE to <${get:fielda}>'\nif '${get:fielda}' == '' goto SET_IMAGEADDRESS_VALUE.FAIL ; have to have this argument\nif ',${get:g_supportedcaps},' !~contains ',CAP_IAFIELDA_VALUE,' goto SET_IMAGEADDRESS_VALUE.FAIL\ndsmentry src ds dg_control dat_capability msg_set 'CAP_IAFIELDA_VALUE,TWON_ONEVALUE,TWTY_STR32,${get:fielda}'\nif '${sts:}' != 'SUCCESS' goto SET_IMAGEADDRESS_VALUE.FAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n; Set FIELD B (must have this)\nsetlocal name 'Set CAP_IAFIELDB_VALUE to <${get:fieldb}>'\nif '${get:fieldb}' == '' goto SET_IMAGEADDRESS_VALUE.PASS ; optional argument\nif ',${get:g_supportedcaps},' !~contains ',CAP_IAFIELDB_VALUE,' goto SET_IMAGEADDRESS_VALUE.FAIL\ndsmentry src ds dg_control dat_capability msg_set 'CAP_IAFIELDB_VALUE,TWON_ONEVALUE,TWTY_STR32,${get:fieldb}'\nif '${sts:}' != 'SUCCESS' goto SET_IMAGEADDRESS_VALUE.FAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n; Set FIELD C (must have this)\nsetlocal name 'Set CAP_IAFIELDC_VALUE to <${get:fieldc}>'\nif '${get:fieldc}' == '' goto SET_IMAGEADDRESS_VALUE.PASS ; optional argument\nif ',${get:g_supportedcaps},' !~contains ',CAP_IAFIELDC_VALUE,' goto SET_IMAGEADDRESS_VALUE.FAIL\ndsmentry src ds dg_control dat_capability msg_set 'CAP_IAFIELDC_VALUE,TWON_ONEVALUE,TWTY_STR32,${get:fieldc}'\nif '${sts:}' != 'SUCCESS' goto SET_IMAGEADDRESS_VALUE.FAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n; Set FIELD D (must have this)\nsetlocal name 'Set CAP_IAFIELDD_VALUE to <${get:fieldd}>'\nif '${get:fieldd}' == '' goto SET_IMAGEADDRESS_VALUE.PASS ; optional argument\nif ',${get:g_supportedcaps},' !~contains ',CAP_IAFIELDD_VALUE,' goto SET_IMAGEADDRESS_VALUE.FAIL\ndsmentry src ds dg_control dat_capability msg_set 'CAP_IAFIELDD_VALUE,TWON_ONEVALUE,TWTY_STR32,${get:fieldd}'\nif '${sts:}' != 'SUCCESS' goto SET_IMAGEADDRESS_VALUE.FAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n; Set FIELD E (optional)\nsetlocal name 'Set CAP_IAFIELDE_VALUE to <${get:fielde}>'\nif '${get:fielde}' == '' goto SET_IMAGEADDRESS_VALUE.PASS ; optional argument\nif ',${get:g_supportedcaps},' !~contains ',CAP_IAFIELDE_VALUE,' goto SET_IMAGEADDRESS_VALUE.PASS\ndsmentry src ds dg_control dat_capability msg_set 'CAP_IAFIELDE_VALUE,TWON_ONEVALUE,TWTY_UINT16,${get:fielde}'\nif '${sts:}' != 'SUCCESS' goto SET_IMAGEADDRESS_VALUE.FAIL\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n:SET_IMAGEADDRESS_VALUE.PASS\nreturn 'pass'\n;\n:SET_IMAGEADDRESS_VALUE.FAIL\nsetglobal '${arg:3}' 'fail'\necho.passfail '${get:indent}${get:name}' 'fail'\nreturn 'fail'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/Certification.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; TWAIN Certification Script\n;   Run all tests needed to pass TWAIN self-certification.\n;\n; Arguments\n;   arg:1 - TW_IDENTITY.ProductName of scanner to test\n;   arg:2 - TW_IDENTITY.Version.Major + '.' + TW_IDENTITY.Version.Minor\n;   arg:3 - comma separated list of: all, barcode, imageaddress, patcode, or imagsaddress\n;\n; Globals\n;   g_certifyresult - pass/fail result of all standard tests\n;   g_certifytwaindirect - pass/fail result of twain direct badge\n;   g_certifyprinting - pass/fail result of printing badge\n;   g_certifypatchcode - pass/fail result of patch code badge\n;   g_certifybarcode - pass/fail result of barcode badge\n;   g_certifyimageaddress - pass/fail result of image address badge\n;\n; Locals\n;   badges - badges to check\n;   title - script info\n;   twidentity.productname - product name of scanner to test\n;\n; Returns\n;   pass or fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize stuff...\n;\nsetlocal title 'TWAIN Certification Script v1.1 02-Sep-2021'\nsetlocal twidentity.productname '${arg:1}'\nsetlocal twidentity.version '${arg:2}'\nsetlocal badges '${arg:3}'\nsetglobal g_certifyresult 'pass'\nsetglobal g_certifytwaindirect ''\nsetglobal g_certifyprinting ''\nsetglobal g_certifypatchcode ''\nsetglobal g_certifybarcode ''\nsetglobal g_certifyimageaddress ''\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize our report...\n;\nreport initialize '${get:twidentity.productname}'\ncall ECHOANDLOG info '${get:title}'\ncall ECHOANDLOG info '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'\ncall ECHOANDLOG info 'operating system is ${platform:}'\ncall ECHOANDLOG info 'program is ${program:}'\ncall ECHOANDLOG info 'started at ${localtime:yyyy-MM-dd/hh:mm:ss}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Load our global tables...\n;\nrun '${folder:certification}/LoadTables'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Run all the mains tests...\n;\ncall RUNCERTIFICATION '010 - TWAIN Standard Capability Tests' '${get:twidentity.productname}' g_certifyresult\ncall RUNCERTIFICATION '020 - Vendor Custom Capability Tests'  '${get:twidentity.productname}' g_certifyresult\ncall RUNCERTIFICATION '030 - Status Return Tests'             '${get:twidentity.productname}' g_certifyresult\ncall RUNCERTIFICATION '040 - Stress Tests'                    '${get:twidentity.productname}' g_certifyresult\ncall RUNCERTIFICATION '050 - Non-UI Image Transfer Tests'     '${get:twidentity.productname}' g_certifyresult\ncall RUNCERTIFICATION '060 - UI Image Transfer Tests'         '${get:twidentity.productname}' g_certifyresult\ncall RUNCERTIFICATION '070 - CAP_XFERCOUNT Tests'             '${get:twidentity.productname}' g_certifyresult\ncall RUNCERTIFICATION '080 - Version Tests'                   '${get:twidentity.productname}' g_certifyresult\ncall RUNCERTIFICATION '090 - Verify Values for MSG_OPENDS, MSG_RESET, and MSG_RESETALL' '${get:twidentity.productname}' g_certifyresult\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Do the badges...\n;\n; TWAIN Direct...\nif ',${get:badges},' ~contains ',all,' goto MAIN.BADGE.TWAINDIRECT\nif ',${get:badges},' ~contains ',twaindirect,' goto MAIN.BADGE.TWAINDIRECT\ngoto MAIN.BADGE.TWAINDIRECT.SKIP\n:MAIN.BADGE.TWAINDIRECT\ncall RUNCERTIFICATION '100 - TWAIN Direct Badge'               '${get:twidentity.productname}' g_certifytwaindirect\n:MAIN.BADGE.TWAINDIRECT.SKIP\n;\n; Printing...\nif ',${get:badges},' ~contains ',all,' goto MAIN.BADGE.PRINTING\nif ',${get:badges},' ~contains ',printing,' goto MAIN.BADGE.PRINTING\ngoto MAIN.BADGE.PRINTING.SKIP\n:MAIN.BADGE.PRINTING\ncall RUNCERTIFICATION '110 - Printing Badge'                   '${get:twidentity.productname}' g_certifyprinting\n:MAIN.BADGE.PRINTING.SKIP\n;\n; Patch Code...\nif ',${get:badges},' ~contains ',all,' goto MAIN.BADGE.PATCHCODE\nif ',${get:badges},' ~contains ',patchcode,' goto MAIN.BADGE.PATCHCODE\ngoto MAIN.BADGE.PATCHCODE.SKIP\n:MAIN.BADGE.PATCHCODE\ncall RUNCERTIFICATION '120 - Patch Code Badge'                 '${get:twidentity.productname}' g_certifypatchcode\n:MAIN.BADGE.PATCHCODE.SKIP\n;\n; Barcode...\nif ',${get:badges},' ~contains ',all,' goto MAIN.BADGE.BARCODE\nif ',${get:badges},' ~contains ',barcode,' goto MAIN.BADGE.BARCODE\ngoto MAIN.BADGE.BARCODE.SKIP\n:MAIN.BADGE.BARCODE\ncall RUNCERTIFICATION '130 - Barcode Badge'                   '${get:twidentity.productname}' g_certifybarcode\n:MAIN.BADGE.BARCODE.SKIP\n;\n; Image Address...\nif ',${get:badges},' ~contains ',all,' goto MAIN.BADGE.IMAGEADDRESS\nif ',${get:badges},' ~contains ',imageaddress,' goto MAIN.BADGE.IMAGEADDRESS\ngoto MAIN.BADGE.IMAGEADDRESS.SKIP\n:MAIN.BADGE.IMAGEADDRESS\ncall RUNCERTIFICATION '140 - Image Address Badge'             '${get:twidentity.productname}' g_certifyimageaddress\n:MAIN.BADGE.IMAGEADDRESS.SKIP\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; How did we do?\n;\nif '${get:g_certifyresult}' != 'pass' goto MAIN.FAIL\ncall ECHOANDLOG info\ncall ECHOANDLOG info\ncall ECHOANDLOG info\ncall ECHOANDLOG info 'ended at ${localtime:yyyy-MM-dd/hh:mm:ss}'\ncall ECHOANDLOG info '**************************************'\ncall ECHOANDLOG info 'The scanner passed TWAIN Certification'\n;\nif '${get:g_certifytwaindirect}' != 'pass' goto MAIN.TWAINDIRECT.CERTIFY.SKIP\ncall ECHOANDLOG info 'Badge: TWAIN Direct'\n:MAIN.TWAINDIRECT.CERTIFY.SKIP\n;\nif '${get:g_certifyprinting}' != 'pass' goto MAIN.PRINTING.CERTIFY.SKIP\ncall ECHOANDLOG info 'Badge: Printing'\n:MAIN.PRINTING.CERTIFY.SKIP\n;\nif '${get:g_certifypatchcode}' != 'pass' goto MAIN.PATCHCODE.CERTIFY.SKIP\ncall ECHOANDLOG info 'Badge: Patch Code'\n:MAIN.PATCHCODE.CERTIFY.SKIP\n;\nif '${get:g_certifybarcode}' != 'pass' goto MAIN.BARCODE.CERTIFY.SKIP\ncall ECHOANDLOG info 'Badge: Barcode'\n:MAIN.BARCODE.CERTIFY.SKIP\n;\nif '${get:g_certifyimageaddress}' != 'pass' goto MAIN.IMAGEADDRESS.CERTIFY.SKIP\ncall ECHOANDLOG info 'Badge: Image Address'\n:MAIN.IMAGEADDRESS.CERTIFY.SKIP\n;\ncall ECHOANDLOG info '**************************************'\nreport save\necho 'report saved to ${report:}'\nreturn 'pass'\n;\n:MAIN.FAIL\ncall ECHOANDLOG error\ncall ECHOANDLOG error\ncall ECHOANDLOG error\ncall ECHOANDLOG error 'ended at ${localtime:yyyy-MM-dd/hh:mm:ss}'\ncall ECHOANDLOG error '********************************************'\ncall ECHOANDLOG error 'The scanner did not pass TWAIN Certification'\ncall ECHOANDLOG error '********************************************'\nreport save\necho 'report saved to ${report:}'\nreturn 'fail'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Function: RunCertification\n; arg:1 - folder to run in\n; arg:2 - TW_IDENTITY.ProductName of scanner to test\n; arg:3 - global value to update on fail\n; returns: (none)\n;\n:RUNCERTIFICATION\n;\nsetglobal ${arg:3} 'pass' ; assume pass\ncd '${folder:certification}/${arg:1}'\nrun Certification '${arg:2}' '${arg:3}'\ncd '${folder:certification}'\nreturn 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Function: Certify\n; arg:1 - script to run\n; arg:2 - TW_IDENTITY.ProductName of scanner to test\n; arg:3 - global value to update on fail\n; returns: (none)\n;\n:CERTIFY\n;\nrun '${arg:1}' '${arg:2}'\nif '${ret:}' != 'pass' goto CERTIFY.FAIL\nreturn 'pass'\n;\n:CERTIFY.FAIL\nsetglobal '${arg:3}' 'fail'\nreturn 'fail'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Function: EchoAndLog\n; arg:1 - severity (normal, info, error)\n; arg:2 - text\n; returns: (none)\n;\n:ECHOANDLOG\n;\nif '${arg:1}' == 'info' goto ECHOANDLOG.INFO\necho.red '${arg:2}'\nlog error '#${arg:2}'\nreturn\n:ECHOANDLOG.INFO\necho.green '${arg:2}'\nlog info '#${arg:2}'\n:ECHOANDLOG.ERROR\nreturn\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/Closeds.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Closeds\n;   Open the requested TWAIN driver...\n;\n; Arguments\n;   arg:1 - TW_IDENTITY.ProductName of scanner to test\n;   arg:2 - set to 'embedded', to limit messages\n;   arg:3 - indent padding for embedded\n;\n; Globals\n;   (none)\n;\n; Locals\n;   closedsresult - pass/fail for the close\n;   embedded - try to fit into the flow of other echo.passfail stuff\n;   indent - indenting for echo.passfail\n;\n; Returns\n;   pass or fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize...\n;\nif '${arg:2}' == 'embedded' goto MAIN.TITLE.SKIP\necho.titletest 'Closeds'\n:MAIN.TITLE.SKIP\nsetlocal closedsresult 'pass'\nsetlocal indent ''\nsetlocal embedded '${arg:2}'\nif '${get:embedded}' != 'embedded' goto MAIN.SKIP.INDENT\nsetlocal indent '${arg:3}'\n:MAIN.SKIP.INDENT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Rewind the driver, close and unload the DSM...\n;\nsetlocal name 'dg_control/dat_pendingxfers/msg_endxfer'\nif '${state:}' < '7' goto REWIND.6\ndsmentry src ds dg_control dat_pendingxfers msg_endxfer '0,0'\nif '${sts:}' == 'SUCCESS' goto REWIND.7.SUCCESS\necho.passfail '${get:indent}${get:name}' 'fail'\nsetlocal closedsresult 'fail'\ngoto REWIND.6\n:REWIND.7.SUCCESS\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n:REWIND.6\nsetlocal name 'dg_control/dat_pendingxfers/msg_reset'\nif '${state:}' < '6' goto REWIND.5\ndsmentry src ds dg_control dat_pendingxfers msg_reset '0,0'\nif '${sts:}' == 'SUCCESS' goto REWIND.6.SUCCESS\necho.passfail '${get:indent}${get:name}' 'fail'\nsetlocal closedsresult 'fail'\ngoto REWIND.5\n:REWIND.6.SUCCESS\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n:REWIND.5\nsetlocal name 'dg_control/dat_userinterface/msg_disableds'\nif '${state:}' < '5' goto REWIND.4\ndsmentry src null dg_control dat_userinterface msg_disableds '0,0'\nif '${sts:}' == 'SUCCESS' goto REWIND.5.SUCCESS\necho.passfail '${get:indent}${get:name}' 'fail'\nsetlocal closedsresult 'fail'\ngoto REWIND.4\n:REWIND.5.SUCCESS\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n:REWIND.4\nsetlocal name 'dg_control/dat_identity/msg_closeds'\nif '${state:}' < '4' goto REWIND.3\ndsmentry src null dg_control dat_identity msg_closeds '${ds:}'\nif '${sts:}' == 'SUCCESS' goto REWIND.4.SUCCESS\necho.passfail '${get:indent}${get:name}' 'fail'\nsetlocal closedsresult 'fail'\ngoto REWIND.3\n:REWIND.4.SUCCESS\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n:REWIND.3\nsetlocal name 'dg_control/dat_parent/msg_closedsm'\nif '${state:}' < '3' goto REWIND.2\ndsmentry src null dg_control dat_parent msg_closedsm hwnd\nif '${sts:}' == 'SUCCESS' goto REWIND.3.SUCCESS\necho.passfail '${get:indent}${get:name}' 'fail'\nsetlocal closedsresult 'fail'\ngoto REWIND.2\n:REWIND.3.SUCCESS\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n:REWIND.2\nsetlocal name 'dsmunload'\nif '${state:}' < '2' goto REWIND.1\ndsmunload\necho.passfail '${get:indent}${get:name}' 'pass'\n;\n:REWIND.1\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Summary and cleanup...\n;\nif '${get:closedsresult}' == 'pass' goto MAIN.PASS\nif '${get:embedded}' == 'embedded' goto MAIN.ERROR.SKIPSUMMARY\necho.passfail 'SUMMARY' 'fail'\n:MAIN.ERROR.SKIPSUMMARY\nreturn 'fail'\n;\n:MAIN.PASS\nif '${get:embedded}' == 'embedded' goto MAIN.PASS.SKIPSUMMARY\necho.passfail 'SUMMARY' 'pass'\n:MAIN.PASS.SKIPSUMMARY\nreturn 'pass'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/LoadTables.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Tables\n;   Load common values used globally\n;\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Stuff to load...\n;\ncall LOADCAPABILITYTABLE\ncall LOADTWSTRUCTTABLE\nreturn\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Function: LOADTWSTRUCTTABLE\n; Loads indecies we use to look into TW_* structures...\n;\n:LOADTWSTRUCTTABLE\n;\n; These index off TW_CAPABILITY, which is why they don't start at 0...\nsetglobal TW_ARRAY.ItemType                       2\nsetglobal TW_ARRAY.NumItems                       3\nsetglobal TW_ARRAY.ItemList                       4\n;\nsetglobal TW_CAPABILITY.Cap                       0\nsetglobal TW_CAPABILITY.ConType                   1\n;\nsetglobal TW_CUSTOMDSDATA.InfoLength              0\nsetglobal TW_CUSTOMDSDATA.hData                   1\n;\nsetglobal TW_DEVICEEVENT.Event                    0\nsetglobal TW_DEVICEEVENT.DeviceName               1\nsetglobal TW_DEVICEEVENT.BatteryMinutes           2\nsetglobal TW_DEVICEEVENT.BatteryPercentage        3\nsetglobal TW_DEVICEEVENT.PowerSupply              4\nsetglobal TW_DEVICEEVENT.XResolution              5\nsetglobal TW_DEVICEEVENT.YResolution              6\nsetglobal TW_DEVICEEVENT.FlashUsed2               7\nsetglobal TW_DEVICEEVENT.AutomaticCapture         8\nsetglobal TW_DEVICEEVENT.TimeBeforeFirstCapture   9\nsetglobal TW_DEVICEEVENT.TimeBetweenCaptures      10\n;\n; These index off TW_CAPABILITY, which is why they don't start at 0...\nsetglobal TW_ENUMERATION.ItemType                 2\nsetglobal TW_ENUMERATION.NumItems                 3\nsetglobal TW_ENUMERATION.CurrentIndex             4\nsetglobal TW_ENUMERATION.DefaultIndex             5\nsetglobal TW_ENUMERATION.ItemList                 6\n;\nsetglobal TW_EXTIMAGEINFO.NumInfos                0\nsetglobal TW_EXTIMAGEINFO.Info                    1\n;\nsetglobal TW_FILESYSTEM.InputName                 0\nsetglobal TW_FILESYSTEM.OutputName                1\nsetglobal TW_FILESYSTEM.Context                   2\nsetglobal TW_FILESYSTEM.Recursive                 3 ; union #1\nsetglobal TW_FILESYSTEM.Subdirectories            3 ; union #1\nsetglobal TW_FILESYSTEM.FileType                  4 ; union #2\nsetglobal TW_FILESYSTEM.FileSystemType            4 ; union #2\nsetglobal TW_FILESYSTEM.Size                      5\nsetglobal TW_FILESYSTEM.CreateTimeDate            6\nsetglobal TW_FILESYSTEM.ModifiedTimeDate          7\nsetglobal TW_FILESYSTEM.FreeSpace                 8\nsetglobal TW_FILESYSTEM.NewImageSize              9\nsetglobal TW_FILESYSTEM.NumberOfFiles             10\nsetglobal TW_FILESYSTEM.NumberOfSnippets          11\nsetglobal TW_FILESYSTEM.DeviceGroupMask           12\nsetglobal TW_FILESYSTEM.Reserved                  13\n;\nsetglobal TW_IDENTITY.Id                          0\nsetglobal TW_IDENTITY.Version.MajorNum            1\nsetglobal TW_IDENTITY.Version.MinorNum            2\nsetglobal TW_IDENTITY.Version.Language            3\nsetglobal TW_IDENTITY.Version.Country             4\nsetglobal TW_IDENTITY.Version.Info                5\nsetglobal TW_IDENTITY.ProtocolMajor               6\nsetglobal TW_IDENTITY.ProtocolMinor               7\nsetglobal TW_IDENTITY.SupportedGroups             8\nsetglobal TW_IDENTITY.Manufacturer                9\nsetglobal TW_IDENTITY.ProductFamily               10\nsetglobal TW_IDENTITY.ProductName                 11\n;\nsetglobal TW_IMAGEINFO.XResolution                0\nsetglobal TW_IMAGEINFO.YResolution                1\nsetglobal TW_IMAGEINFO.ImageWidth                 2\nsetglobal TW_IMAGEINFO.ImageHeight                3\nsetglobal TW_IMAGEINFO.SamplesPerPixel            4\nsetglobal TW_IMAGEINFO.BitsPerSample              5 ; 8 elements in this one\nsetglobal TW_IMAGEINFO.BitsPerPixel               13\nsetglobal TW_IMAGEINFO.Planar                     14\nsetglobal TW_IMAGEINFO.PixelType                  15\nsetglobal TW_IMAGEINFO.Compression                16\n;\nsetglobal TW_IMAGELAYOUT.Frame.Left               0\nsetglobal TW_IMAGELAYOUT.Frame.Top                1\nsetglobal TW_IMAGELAYOUT.Frame.Right              2\nsetglobal TW_IMAGELAYOUT.Frame.Bottom             3\nsetglobal TW_IMAGELAYOUT.Frame.DocumentNumber     4\nsetglobal TW_IMAGELAYOUT.Frame.PageNumber         5\nsetglobal TW_IMAGELAYOUT.Frame.FrameNumber        6\n;\n; These index off TW_EXTIMAGEINFO, which is why they don't start at 0...\nsetglobal TW_INFO.InfoID                          1\nsetglobal TW_INFO.ItemType                        2\nsetglobal TW_INFO.NumItems                        3\nsetglobal TW_INFO.ReturnCode                      4\nsetglobal TW_INFO.Item                            5\n;\nsetglobal TW_METRICS.SizeOf                       0\nsetglobal TW_METRICS.ImageCount                   1\nsetglobal TW_METRICS.SheetCount                   2\n;\n; These index off TW_CAPABILITY, which is why they don't start at 0...\nsetglobal TW_ONEVALUE.ItemType        \t          2\nsetglobal TW_ONEVALUE.Item                        3\n;\nsetglobal TW_PENDINGXFERS.Count                   0\nsetglobal TW_PENDINGXFERS.Reserved                1\nsetglobal TW_PENDINGXFERS.TW_JOBCONTROL.EOJ       2 ; macOS only\n;\n; These index off TW_CAPABILITY, which is why they don't start at 0...\nsetglobal TW_RANGE.ItemType                       2\nsetglobal TW_RANGE.MinValue                       3\nsetglobal TW_RANGE.MaxValue                       4\nsetglobal TW_RANGE.StepSize                       5\nsetglobal TW_RANGE.DefaultValue                   6\nsetglobal TW_RANGE.CurrentValue                   7\n;\nsetglobal TW_SETUPFILEXFER.FileName               0\nsetglobal TW_SETUPFILEXFER.Format                 1\nsetglobal TW_SETUPFILEXFER.VRefNum                2\n;\nsetglobal TW_SETUPMEMXFER.MinBufSize              0\nsetglobal TW_SETUPMEMXFER.MaxBufSize              1\nsetglobal TW_SETUPMEMXFER.Preferred               2\n;\nsetglobal TW_STATUS.ConditionCode                 0\nsetglobal TW_STATUS.Data                          1\nsetglobal TW_STATUS.Reserved                      1 ; whatever >.<\n;\nsetglobal TW_STATUSUTF8.Status.ConditionCode      0\nsetglobal TW_STATUSUTF8.Status.Data               1\nsetglobal TW_STATUSUTF8.Status.Reserved           1 ; see above\nsetglobal TW_STATUSUTF8.Size                      2\nsetglobal TW_STATUSUTF8.UTF8string                3\n;\nsetglobal TW_TWAINDIRECT.SizeOf                   0\nsetglobal TW_TWAINDIRECT.CommunicationManager     1\nsetglobal TW_TWAINDIRECT.Send                     2\nsetglobal TW_TWAINDIRECT.SendSize                 3\nsetglobal TW_TWAINDIRECT.Receive                  4\nsetglobal TW_TWAINDIRECT.ReceiveSize              5\n;\nsetglobal TW_USERINTERFACE.ShowUI                 0\nsetglobal TW_USERINTERFACE.ModalUI                1\nsetglobal TW_USERINTERFACE.hParent                2\n;\nreturn\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Function: LOADCAPABILITYTABLE\n; Loads stuff we need to confirm about each known capability, we'll skip the\n; g_ prefix for these items.  Note the use of sys_capabilitytable, this will\n; record the names of all the capabilities for us, so we can access them in\n; any script...\n;\n:LOADCAPABILITYTABLE\n;\nsetrecord on 'sys_capabilitytable' '.Flags' '.Flags'\n;\nsetglobal ACAP_XFERMECH.ConType                              TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ACAP_XFERMECH.ItemType                             TWTY_UINT16\nsetglobal ACAP_XFERMECH.ValueAfterOpen                       TWSX_NATIVE\nsetglobal ACAP_XFERMECH.ValueAfterReset                      TWSX_NATIVE\nsetglobal ACAP_XFERMECH.Flags                                ''\n;\nsetglobal CAP_ALARMS.ConType                                 TWON_ARRAY\nsetglobal CAP_ALARMS.ItemType                                TWTY_UINT16\nsetglobal CAP_ALARMS.ValueAfterOpen                          UNDEFINED\nsetglobal CAP_ALARMS.ValueAfterReset                         UNDEFINED\nsetglobal CAP_ALARMS.Flags                                   ''\n;\nsetglobal CAP_ALARMVOLUME.ConType                            TWON_RANGE,TWON_ONEVALUE\nsetglobal CAP_ALARMVOLUME.ItemType                           TWTY_INT32\nsetglobal CAP_ALARMVOLUME.ValueAfterOpen                     UNDEFINED\nsetglobal CAP_ALARMVOLUME.ValueAfterReset                    UNDEFINED\nsetglobal CAP_ALARMVOLUME.Flags                              ''\n;\nsetglobal CAP_AUTHOR.ConType                                 TWON_ONEVALUE\nsetglobal CAP_AUTHOR.ItemType                                TWTY_STR128\nsetglobal CAP_AUTHOR.ValueAfterOpen                          ''\nsetglobal CAP_AUTHOR.ValueAfterReset                         ''\nsetglobal CAP_AUTHOR.Flags                                   ''\n;\nsetglobal CAP_AUTOFEED.ConType                               TWON_ENUMERATION\nsetglobal CAP_AUTOFEED.ItemType                              TWTY_BOOL\nsetglobal CAP_AUTOFEED.ValueAfterOpen                        UNDEFINED\nsetglobal CAP_AUTOFEED.ValueAfterReset                       TRUE\nsetglobal CAP_AUTOFEED.Flags                                 ''\n;\nsetglobal CAP_AUTOMATICCAPTURE.ConType                       TWON_RANGE,TWON_ONEVALUE\nsetglobal CAP_AUTOMATICCAPTURE.ItemType                      TWTY_INT32\nsetglobal CAP_AUTOMATICCAPTURE.ValueAfterOpen                0\nsetglobal CAP_AUTOMATICCAPTURE.ValueAfterReset               0\nsetglobal CAP_AUTOMATICCAPTURE.Flags                         ''\n;\nsetglobal CAP_AUTOMATICSENSEMEDIUM.ConType                   TWON_ENUMERATION\nsetglobal CAP_AUTOMATICSENSEMEDIUM.ItemType                  TWTY_BOOL\nsetglobal CAP_AUTOMATICSENSEMEDIUM.ValueAfterOpen            UNDEFINED\nsetglobal CAP_AUTOMATICSENSEMEDIUM.ValueAfterReset           UNDEFINED\nsetglobal CAP_AUTOMATICSENSEMEDIUM.Flags                     ''\n;\nsetglobal CAP_AUTOSCAN.ConType                               TWON_ENUMERATION\nsetglobal CAP_AUTOSCAN.ItemType                              TWTY_BOOL\nsetglobal CAP_AUTOSCAN.ValueAfterOpen                        UNDEFINED\nsetglobal CAP_AUTOSCAN.ValueAfterReset                       TRUE\nsetglobal CAP_AUTOSCAN.Flags                                 ''\n;\nsetglobal CAP_BATTERYMINUTES.ConType                         TWON_ONEVALUE\nsetglobal CAP_BATTERYMINUTES.ItemType                        TWTY_INT32\nsetglobal CAP_BATTERYMINUTES.ValueAfterOpen                  UNEDFINED\nsetglobal CAP_BATTERYMINUTES.ValueAfterReset                 UNEDFINED\nsetglobal CAP_BATTERYMINUTES.Flags                           ''\n;\nsetglobal CAP_BATTERYPERCENTAGE.ConType                      TWON_ONEVALUE\nsetglobal CAP_BATTERYPERCENTAGE.ItemType                     TWTY_INT16\nsetglobal CAP_BATTERYPERCENTAGE.ValueAfterOpen               UNDEFINED\nsetglobal CAP_BATTERYPERCENTAGE.ValueAfterReset              UNDEFINED\nsetglobal CAP_BATTERYPERCENTAGE.Flags                        ''\n;\nsetglobal CAP_CAMERAENABLED.ConType                          TWON_ENUMERATION\nsetglobal CAP_CAMERAENABLED.ItemType                         TWTY_BOOL\nsetglobal CAP_CAMERAENABLED.ValueAfterOpen                   UNDEFINED\nsetglobal CAP_CAMERAENABLED.ValueAfterReset                  UNDEFINED\nsetglobal CAP_CAMERAENABLED.Flags                            ''\n;\nsetglobal CAP_CAMERAORDER.ConType                            TWON_ARRAY\nsetglobal CAP_CAMERAORDER.ItemType                           TWTY_UINT16\nsetglobal CAP_CAMERAORDER.ValueAfterOpen                     UNDEFINED\nsetglobal CAP_CAMERAORDER.ValueAfterReset                    UNDEFINED\nsetglobal CAP_CAMERAORDER.Flags                              ''\n;\nsetglobal CAP_CAMERAPREVIEWUI.ConType                        TWON_ENUMERATION\nsetglobal CAP_CAMERAPREVIEWUI.ItemType                       TWTY_BOOL\nsetglobal CAP_CAMERAPREVIEWUI.ValueAfterOpen                 UNDEFINED\nsetglobal CAP_CAMERAPREVIEWUI.ValueAfterReset                UNDEFINED\nsetglobal CAP_CAMERAPREVIEWUI.Flags                          ''\n;\nsetglobal CAP_CAMERASIDE.ConType                             TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal CAP_CAMERASIDE.ItemType                            TWTY_UINT16\nsetglobal CAP_CAMERASIDE.ValueAfterOpen                      UNDEFINED\nsetglobal CAP_CAMERASIDE.ValueAfterReset                     UNDEFINED ; should be TWCS_BOTH, but need a solution for ADF vs Flatbed\nsetglobal CAP_CAMERASIDE.Flags                               ''\n;\nsetglobal CAP_CAPTION.ConType                                TWON_ONEVALUE\nsetglobal CAP_CAPTION.ItemType                               TWTY_STR255\nsetglobal CAP_CAPTION.ValueAfterOpen                         ''\nsetglobal CAP_CAPTION.ValueAfterReset                        ''\nsetglobal CAP_CAPTION.Flags                                  ''\n;\nsetglobal CAP_CLEARBUFFERS.ConType                           TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal CAP_CLEARBUFFERS.ItemType                          TWTY_BOOL\nsetglobal CAP_CLEARBUFFERS.ValueAfterOpen                    UNDEFINED\nsetglobal CAP_CLEARBUFFERS.ValueAfterReset                   UNDEFINED\nsetglobal CAP_CLEARBUFFERS.Flags                             'deprecated'\n;\nsetglobal CAP_CLEARPAGE.ConType                              TWON_ENUMERATION\nsetglobal CAP_CLEARPAGE.ItemType                             TWTY_BOOL\nsetglobal CAP_CLEARPAGE.ValueAfterOpen                       FALSE\nsetglobal CAP_CLEARPAGE.ValueAfterReset                      FALSE\nsetglobal CAP_CLEARPAGE.Flags                                ''\n;\nsetglobal CAP_CUSTOMDSDATA.ConType                           TWON_ENUMERATION\nsetglobal CAP_CUSTOMDSDATA.ItemType                          TWTY_BOOL\nsetglobal CAP_CUSTOMDSDATA.ValueAfterOpen                    UNDEFINED\nsetglobal CAP_CUSTOMDSDATA.ValueAfterReset                   UNDEFINED\nsetglobal CAP_CUSTOMDSDATA.Flags                             ''\n;\nsetglobal CAP_CUSTOMINTERFACEGUID.ConType                    TWON_ONEVALUE\nsetglobal CAP_CUSTOMINTERFACEGUID.ItemType                   TWTY_STR255\nsetglobal CAP_CUSTOMINTERFACEGUID.ValueAfterOpen             UNDEFINED\nsetglobal CAP_CUSTOMINTERFACEGUID.ValueAfterReset            UNDEFINED\nsetglobal CAP_CUSTOMINTERFACEGUID.Flags                      ''\n;\nsetglobal CAP_DEVICEEVENT.ConType                            TWON_ARRAY\nsetglobal CAP_DEVICEEVENT.ItemType                           TWTY_UINT16\nsetglobal CAP_DEVICEEVENT.ValueAfterOpen                     UNDEFINED\nsetglobal CAP_DEVICEEVENT.ValueAfterReset                    ''\nsetglobal CAP_DEVICEEVENT.Flags                              ''\n;\nsetglobal CAP_DEVICEONLINE.ConType                           TWON_ENUMERATION\nsetglobal CAP_DEVICEONLINE.ItemType                          TWTY_BOOL\nsetglobal CAP_DEVICEONLINE.ValueAfterOpen                    UNDEFINED\nsetglobal CAP_DEVICEONLINE.ValueAfterReset                   UNDEFINED\nsetglobal CAP_DEVICEONLINE.Flags                             'mandatory'\n;\nsetglobal CAP_DEVICETIMEDATE.ConType                         TWON_ONEVALUE\nsetglobal CAP_DEVICETIMEDATE.ItemType                        TWTY_STR32\nsetglobal CAP_DEVICETIMEDATE.ValueAfterOpen                  UNDEFINED\nsetglobal CAP_DEVICETIMEDATE.ValueAfterReset                 UNDEFINED\nsetglobal CAP_DEVICETIMEDATE.Flags                           ''\n;\nsetglobal CAP_DOUBLEFEEDDETECTION.ConType                    TWON_ARRAY\nsetglobal CAP_DOUBLEFEEDDETECTION.ItemType                   TWTY_UINT16\nsetglobal CAP_DOUBLEFEEDDETECTION.ValueAfterOpen             UNDEFINED\nsetglobal CAP_DOUBLEFEEDDETECTION.ValueAfterReset            ''\nsetglobal CAP_DOUBLEFEEDDETECTION.Flags                      ''\n;\nsetglobal CAP_DOUBLEFEEDDETECTIONLENGTH.ConType              TWON_RANGE\nsetglobal CAP_DOUBLEFEEDDETECTIONLENGTH.ItemType             TWTY_FIX32\nsetglobal CAP_DOUBLEFEEDDETECTIONLENGTH.ValueAfterOpen       UNDEFINED\nsetglobal CAP_DOUBLEFEEDDETECTIONLENGTH.ValueAfterReset      UNDEFINED\nsetglobal CAP_DOUBLEFEEDDETECTIONLENGTH.Flags                ''\n;\nsetglobal CAP_DOUBLEFEEDDETECTIONRESPONSE.ConType            TWON_ARRAY\nsetglobal CAP_DOUBLEFEEDDETECTIONRESPONSE.ItemType           TWTY_UINT16\nsetglobal CAP_DOUBLEFEEDDETECTIONRESPONSE.ValueAfterOpen     UNDEFINED\nsetglobal CAP_DOUBLEFEEDDETECTIONRESPONSE.ValueAfterReset    UNDEFINED\nsetglobal CAP_DOUBLEFEEDDETECTIONRESPONSE.Flags              ''\n;\nsetglobal CAP_DOUBLEFEEDDETECTIONSENSITIVITY.ConType         TWON_ENUMERATION\nsetglobal CAP_DOUBLEFEEDDETECTIONSENSITIVITY.ItemType        TWTY_UINT16\nsetglobal CAP_DOUBLEFEEDDETECTIONSENSITIVITY.ValueAfterOpen  UNDEFINED\nsetglobal CAP_DOUBLEFEEDDETECTIONSENSITIVITY.ValueAfterReset UNDEFINED\nsetglobal CAP_DOUBLEFEEDDETECTIONSENSITIVITY.Flags           ''\n;\nsetglobal CAP_DUPLEX.ConType                                 TWON_ONEVALUE\nsetglobal CAP_DUPLEX.ItemType                                TWTY_UINT16\nsetglobal CAP_DUPLEX.ValueAfterOpen                          UNDEFINED\nsetglobal CAP_DUPLEX.ValueAfterReset                         UNDEFINED\nsetglobal CAP_DUPLEX.Flags                                   ''\n;\nsetglobal CAP_DUPLEXENABLED.ConType                          TWON_ENUMERATION\nsetglobal CAP_DUPLEXENABLED.ItemType                         TWTY_BOOL\nsetglobal CAP_DUPLEXENABLED.ValueAfterOpen                   UNDEFINED\nsetglobal CAP_DUPLEXENABLED.ValueAfterReset                  UNDEFINED\nsetglobal CAP_DUPLEXENABLED.Flags                            ''\n;\nsetglobal CAP_ENABLEDSUIONLY.ConType                         TWON_ENUMERATION\nsetglobal CAP_ENABLEDSUIONLY.ItemType                        TWTY_BOOL\nsetglobal CAP_ENABLEDSUIONLY.ValueAfterOpen                  UNDEFINED\nsetglobal CAP_ENABLEDSUIONLY.ValueAfterReset                 UNDEFINED\nsetglobal CAP_ENABLEDSUIONLY.Flags                           ''\n;\nsetglobal CAP_ENDORSER.ConType                               TWON_RANGE\nsetglobal CAP_ENDORSER.ItemType                              TWTY_UINT32\nsetglobal CAP_ENDORSER.ValueAfterOpen                        UNDEFINED\nsetglobal CAP_ENDORSER.ValueAfterReset                       1\nsetglobal CAP_ENDORSER.Flags                                 ''\n;\nsetglobal CAP_EXTENDEDCAPS.ConType                           TWON_ARRAY\nsetglobal CAP_EXTENDEDCAPS.ItemType                          TWTY_UINT16\nsetglobal CAP_EXTENDEDCAPS.ValueAfterOpen                    UNDEFINED\nsetglobal CAP_EXTENDEDCAPS.ValueAfterReset                   UNDEFINED\nsetglobal CAP_EXTENDEDCAPS.Flags                             ''\n;\nsetglobal CAP_FEEDERALIGNMENT.ConType                        TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal CAP_FEEDERALIGNMENT.ItemType                       TWTY_UINT16\nsetglobal CAP_FEEDERALIGNMENT.ValueAfterOpen                 UNDEFINED\nsetglobal CAP_FEEDERALIGNMENT.ValueAfterReset                UNDEFINED\nsetglobal CAP_FEEDERALIGNMENT.Flags                          ''\n;\nsetglobal CAP_FEEDERENABLED.ConType                          TWON_ENUMERATION\nsetglobal CAP_FEEDERENABLED.ItemType                         TWTY_BOOL\nsetglobal CAP_FEEDERENABLED.ValueAfterOpen                   UNDEFINED\nsetglobal CAP_FEEDERENABLED.ValueAfterReset                  UNDEFINED\nsetglobal CAP_FEEDERENABLED.Flags                            ''\n;\nsetglobal CAP_FEEDERLOADED.ConType                           TWON_ENUMERATION\nsetglobal CAP_FEEDERLOADED.ItemType                          TWTY_BOOL\nsetglobal CAP_FEEDERLOADED.ValueAfterOpen                    UNDEFINED\nsetglobal CAP_FEEDERLOADED.ValueAfterReset                   UNDEFINED\nsetglobal CAP_FEEDERLOADED.Flags                             ''\n;\nsetglobal CAP_FEEDERORDER.ConType                            TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal CAP_FEEDERORDER.ItemType                           TWTY_UINT16\nsetglobal CAP_FEEDERORDER.ValueAfterOpen                     UNDEFINED\nsetglobal CAP_FEEDERORDER.ValueAfterReset                    UNDEFINED\nsetglobal CAP_FEEDERORDER.Flags                              ''\n;\nsetglobal CAP_FEEDERPOCKET.ConType                           TWON_ARRAY\nsetglobal CAP_FEEDERPOCKET.ItemType                          TWTY_UINT16\nsetglobal CAP_FEEDERPOCKET.ValueAfterOpen                    UNDEFINED\nsetglobal CAP_FEEDERPOCKET.ValueAfterReset                   UNDEFINED\nsetglobal CAP_FEEDERPOCKET.Flags                             ''\n;\nsetglobal CAP_FEEDERPREP.ConType                             TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal CAP_FEEDERPREP.ItemType                            TWTY_BOOL\nsetglobal CAP_FEEDERPREP.ValueAfterOpen                      UNDEFINED\nsetglobal CAP_FEEDERPREP.ValueAfterReset                     FALSE\nsetglobal CAP_FEEDERPREP.Flags                               ''\n;\nsetglobal CAP_FEEDPAGE.ConType                               TWON_ENUMERATION\nsetglobal CAP_FEEDPAGE.ItemType                              TWTY_BOOL\nsetglobal CAP_FEEDPAGE.ValueAfterOpen                        UNDEFINED\nsetglobal CAP_FEEDPAGE.ValueAfterReset                       UNDEFINED\nsetglobal CAP_FEEDPAGE.Flags                                 ''\n;\nsetglobal CAP_IAFIELDA_LASTPAGE.ConType                      TWON_ONEVALUE\nsetglobal CAP_IAFIELDA_LASTPAGE.ItemType                     TWTY_STR32\nsetglobal CAP_IAFIELDA_LASTPAGE.ValueAfterOpen               UNDEFINED\nsetglobal CAP_IAFIELDA_LASTPAGE.ValueAfterReset              UNDEFINED\nsetglobal CAP_IAFIELDA_LASTPAGE.Flags                        ''\n;\nsetglobal CAP_IAFIELDB_LASTPAGE.ConType                      TWON_ONEVALUE\nsetglobal CAP_IAFIELDB_LASTPAGE.ItemType                     TWTY_STR32\nsetglobal CAP_IAFIELDB_LASTPAGE.ValueAfterOpen               UNDEFINED\nsetglobal CAP_IAFIELDB_LASTPAGE.ValueAfterReset              UNDEFINED\nsetglobal CAP_IAFIELDB_LASTPAGE.Flags                        ''\n;\nsetglobal CAP_IAFIELDC_LASTPAGE.ConType                      TWON_ONEVALUE\nsetglobal CAP_IAFIELDC_LASTPAGE.ItemType                     TWTY_STR32\nsetglobal CAP_IAFIELDC_LASTPAGE.ValueAfterOpen               UNDEFINED\nsetglobal CAP_IAFIELDC_LASTPAGE.ValueAfterReset              UNDEFINED\nsetglobal CAP_IAFIELDC_LASTPAGE.Flags                        ''\n;\nsetglobal CAP_IAFIELDD_LASTPAGE.ConType                      TWON_ONEVALUE\nsetglobal CAP_IAFIELDD_LASTPAGE.ItemType                     TWTY_STR32\nsetglobal CAP_IAFIELDD_LASTPAGE.ValueAfterOpen               UNDEFINED\nsetglobal CAP_IAFIELDD_LASTPAGE.ValueAfterReset              UNDEFINED\nsetglobal CAP_IAFIELDD_LASTPAGE.Flags                        ''\n;\nsetglobal CAP_IAFIELDE_LASTPAGE.ConType                      TWON_ONEVALUE\nsetglobal CAP_IAFIELDE_LASTPAGE.ItemType                     TWTY_STR32\nsetglobal CAP_IAFIELDE_LASTPAGE.ValueAfterOpen               UNDEFINED\nsetglobal CAP_IAFIELDE_LASTPAGE.ValueAfterReset              UNDEFINED\nsetglobal CAP_IAFIELDE_LASTPAGE.Flags                        ''\n;\nsetglobal CAP_IAFIELDA_LEVEL.ConType                         TWON_ENUMERATION\nsetglobal CAP_IAFIELDA_LEVEL.ItemType                        TWTY_UINT16\nsetglobal CAP_IAFIELDA_LEVEL.ValueAfterOpen                  UNDEFINED\nsetglobal CAP_IAFIELDA_LEVEL.ValueAfterReset                 TWIA_UNUSED\nsetglobal CAP_IAFIELDA_LEVEL.Flags                           ''\n;\nsetglobal CAP_IAFIELDB_LEVEL.ConType                         TWON_ENUMERATION\nsetglobal CAP_IAFIELDB_LEVEL.ItemType                        TWTY_UINT16\nsetglobal CAP_IAFIELDB_LEVEL.ValueAfterOpen                  UNDEFINED\nsetglobal CAP_IAFIELDB_LEVEL.ValueAfterReset                 TWIA_UNUSED\nsetglobal CAP_IAFIELDB_LEVEL.Flags                           ''\n;\nsetglobal CAP_IAFIELDC_LEVEL.ConType                         TWON_ENUMERATION\nsetglobal CAP_IAFIELDC_LEVEL.ItemType                        TWTY_UINT16\nsetglobal CAP_IAFIELDC_LEVEL.ValueAfterOpen                  UNDEFINED\nsetglobal CAP_IAFIELDC_LEVEL.ValueAfterReset                 TWIA_UNUSED\nsetglobal CAP_IAFIELDC_LEVEL.Flags                           ''\n;\nsetglobal CAP_IAFIELDD_LEVEL.ConType                         TWON_ENUMERATION\nsetglobal CAP_IAFIELDD_LEVEL.ItemType                        TWTY_UINT16\nsetglobal CAP_IAFIELDD_LEVEL.ValueAfterOpen                  UNDEFINED\nsetglobal CAP_IAFIELDD_LEVEL.ValueAfterReset                 TWIA_UNUSED\nsetglobal CAP_IAFIELDD_LEVEL.Flags                           ''\n;\nsetglobal CAP_IAFIELDE_LEVEL.ConType                         TWON_ENUMERATION\nsetglobal CAP_IAFIELDE_LEVEL.ItemType                        TWTY_UINT16\nsetglobal CAP_IAFIELDE_LEVEL.ValueAfterOpen                  UNDEFINED\nsetglobal CAP_IAFIELDE_LEVEL.ValueAfterReset                 TWIA_UNUSED\nsetglobal CAP_IAFIELDE_LEVEL.Flags                           ''\n;\nsetglobal CAP_IAFIELDA_PRINTFORMAT.ConType                   TWON_ONEVALUE\nsetglobal CAP_IAFIELDA_PRINTFORMAT.ItemType                  TWTY_STR32\nsetglobal CAP_IAFIELDA_PRINTFORMAT.ValueAfterOpen            UNDEFINED\nsetglobal CAP_IAFIELDA_PRINTFORMAT.ValueAfterReset           UNDEFINED\nsetglobal CAP_IAFIELDA_PRINTFORMAT.Flags                     ''\n;\nsetglobal CAP_IAFIELDB_PRINTFORMAT.ConType                   TWON_ONEVALUE\nsetglobal CAP_IAFIELDB_PRINTFORMAT.ItemType                  TWTY_STR32\nsetglobal CAP_IAFIELDB_PRINTFORMAT.ValueAfterOpen            UNDEFINED\nsetglobal CAP_IAFIELDB_PRINTFORMAT.ValueAfterReset           UNDEFINED\nsetglobal CAP_IAFIELDB_PRINTFORMAT.Flags                     ''\n;\nsetglobal CAP_IAFIELDC_PRINTFORMAT.ConType                   TWON_ONEVALUE\nsetglobal CAP_IAFIELDC_PRINTFORMAT.ItemType                  TWTY_STR32\nsetglobal CAP_IAFIELDC_PRINTFORMAT.ValueAfterOpen            UNDEFINED\nsetglobal CAP_IAFIELDC_PRINTFORMAT.ValueAfterReset           UNDEFINED\nsetglobal CAP_IAFIELDC_PRINTFORMAT.Flags                     ''\n;\nsetglobal CAP_IAFIELDD_PRINTFORMAT.ConType                   TWON_ONEVALUE\nsetglobal CAP_IAFIELDD_PRINTFORMAT.ItemType                  TWTY_STR32\nsetglobal CAP_IAFIELDD_PRINTFORMAT.ValueAfterOpen            UNDEFINED\nsetglobal CAP_IAFIELDD_PRINTFORMAT.ValueAfterReset           UNDEFINED\nsetglobal CAP_IAFIELDD_PRINTFORMAT.Flags                     ''\n;\nsetglobal CAP_IAFIELDE_PRINTFORMAT.ConType                   TWON_ONEVALUE\nsetglobal CAP_IAFIELDE_PRINTFORMAT.ItemType                  TWTY_STR32\nsetglobal CAP_IAFIELDE_PRINTFORMAT.ValueAfterOpen            UNDEFINED\nsetglobal CAP_IAFIELDE_PRINTFORMAT.ValueAfterReset           UNDEFINED\nsetglobal CAP_IAFIELDE_PRINTFORMAT.Flags                     ''\n;\nsetglobal CAP_IAFIELDA_VALUE.ConType                         TWON_ONEVALUE\nsetglobal CAP_IAFIELDA_VALUE.ItemType                        TWTY_STR32\nsetglobal CAP_IAFIELDA_VALUE.ValueAfterOpen                  UNDEFINED\nsetglobal CAP_IAFIELDA_VALUE.ValueAfterReset                 UNDEFINED\nsetglobal CAP_IAFIELDA_VALUE.Flags                           ''\n;\nsetglobal CAP_IAFIELDB_VALUE.ConType                         TWON_ONEVALUE\nsetglobal CAP_IAFIELDB_VALUE.ItemType                        TWTY_STR32\nsetglobal CAP_IAFIELDB_VALUE.ValueAfterOpen                  UNDEFINED\nsetglobal CAP_IAFIELDB_VALUE.ValueAfterReset                 UNDEFINED\nsetglobal CAP_IAFIELDB_VALUE.Flags                           ''\n;\nsetglobal CAP_IAFIELDC_VALUE.ConType                         TWON_ONEVALUE\nsetglobal CAP_IAFIELDC_VALUE.ItemType                        TWTY_STR32\nsetglobal CAP_IAFIELDC_VALUE.ValueAfterOpen                  UNDEFINED\nsetglobal CAP_IAFIELDC_VALUE.ValueAfterReset                 UNDEFINED\nsetglobal CAP_IAFIELDC_VALUE.Flags                           ''\n;\nsetglobal CAP_IAFIELDD_VALUE.ConType                         TWON_ONEVALUE\nsetglobal CAP_IAFIELDD_VALUE.ItemType                        TWTY_STR32\nsetglobal CAP_IAFIELDD_VALUE.ValueAfterOpen                  UNDEFINED\nsetglobal CAP_IAFIELDD_VALUE.ValueAfterReset                 UNDEFINED\nsetglobal CAP_IAFIELDD_VALUE.Flags                           ''\n;\nsetglobal CAP_IAFIELDE_VALUE.ConType                         TWON_ONEVALUE\nsetglobal CAP_IAFIELDE_VALUE.ItemType                        TWTY_STR32\nsetglobal CAP_IAFIELDE_VALUE.ValueAfterOpen                  UNDEFINED\nsetglobal CAP_IAFIELDE_VALUE.ValueAfterReset                 UNDEFINED\nsetglobal CAP_IAFIELDE_VALUE.Flags                           ''\n;\nsetglobal CAP_IMAGEADDRESSENABLED.ConType                    TWON_ENUMERATION\nsetglobal CAP_IMAGEADDRESSENABLED.ItemType                   TWTY_BOOL\nsetglobal CAP_IMAGEADDRESSENABLED.ValueAfterOpen             UNDEFINED\nsetglobal CAP_IMAGEADDRESSENABLED.ValueAfterReset            FALSE\nsetglobal CAP_IMAGEADDRESSENABLED.Flags                      ''\n;\nsetglobal CAP_INDICATORS.ConType                             TWON_ENUMERATION\nsetglobal CAP_INDICATORS.ItemType                            TWTY_BOOL\nsetglobal CAP_INDICATORS.ValueAfterOpen                      TRUE\nsetglobal CAP_INDICATORS.ValueAfterReset                     TRUE\nsetglobal CAP_INDICATORS.Flags                               ''\n;\nsetglobal CAP_INDICATORSMODE.ConType                         TWON_ARRAY\nsetglobal CAP_INDICATORSMODE.ItemType                        TWTY_UINT16\nsetglobal CAP_INDICATORSMODE.ValueAfterOpen                  UNDEFINED\nsetglobal CAP_INDICATORSMODE.ValueAfterReset                 UNDEFINED\nsetglobal CAP_INDICATORSMODE.Flags                           ''\n;\nsetglobal CAP_JOBCONTROL.ConType                             TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal CAP_JOBCONTROL.ItemType                            TWTY_UINT16\nsetglobal CAP_JOBCONTROL.ValueAfterOpen                      UNDEFINED\nsetglobal CAP_JOBCONTROL.ValueAfterReset                     TWJC_NONE\nsetglobal CAP_JOBCONTROL.Flags                               ''\n;\nsetglobal CAP_LANGUAGE.ConType                               TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal CAP_LANGUAGE.ItemType                              TWTY_UINT16\nsetglobal CAP_LANGUAGE.ValueAfterOpen                        UNDEFINED\nsetglobal CAP_LANGUAGE.ValueAfterReset                       UNDEFINED\nsetglobal CAP_LANGUAGE.Flags                                 ''\n;\nsetglobal CAP_MAXBATCHBUFFERS.ConType                        TWON_RANGE,TWON_ONEVALUE\nsetglobal CAP_MAXBATCHBUFFERS.ItemType                       TWTY_UINT32\nsetglobal CAP_MAXBATCHBUFFERS.ValueAfterOpen                 UNDEFINED\nsetglobal CAP_MAXBATCHBUFFERS.ValueAfterReset                UNDEFINED\nsetglobal CAP_MAXBATCHBUFFERS.Flags                          ''\n;\nsetglobal CAP_MICRENABLED.ConType                            TWON_ENUMERATION\nsetglobal CAP_MICRENABLED.ItemType                           TWTY_BOOL\nsetglobal CAP_MICRENABLED.ValueAfterOpen                     UNDEFINED\nsetglobal CAP_MICRENABLED.ValueAfterReset                    FALSE\nsetglobal CAP_MICRENABLED.Flags                              ''\n;\nsetglobal CAP_PAGEMULTIREACQUIRE.ConType                     TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal CAP_PAGEMULTIREACQUIRE.ItemType                    TWTY_BOOL\nsetglobal CAP_PAGEMULTIREACQUIRE.ValueAfterOpen              UNDEFINED\nsetglobal CAP_PAGEMULTIREACQUIRE.ValueAfterReset             UNDEFINED\nsetglobal CAP_PAGEMULTIREACQUIRE.Flags                       'deprecated'\n;\nsetglobal CAP_PAPERBINDING.ConType                           TWON_ENUMERATION\nsetglobal CAP_PAPERBINDING.ItemType                          TWTY_UINT16\nsetglobal CAP_PAPERBINDING.ValueAfterOpen                    UNDEFINED\nsetglobal CAP_PAPERBINDING.ValueAfterReset                   UNDEFINED\nsetglobal CAP_PAPERBINDING.Flags                             'deprecated'\n;\nsetglobal CAP_PAPERDETECTABLE.ConType                        TWON_ENUMERATION\nsetglobal CAP_PAPERDETECTABLE.ItemType                       TWTY_BOOL\nsetglobal CAP_PAPERDETECTABLE.ValueAfterOpen                 UNDEFINED\nsetglobal CAP_PAPERDETECTABLE.ValueAfterReset                UNDEFINED\nsetglobal CAP_PAPERDETECTABLE.Flags                          ''\n;\nsetglobal CAP_PAPERHANDLING.ConType                          TWON_ARRAY\nsetglobal CAP_PAPERHANDLING.ItemType                         TWTY_UINT16\nsetglobal CAP_PAPERHANDLING.ValueAfterOpen                   UNDEFINED\nsetglobal CAP_PAPERHANDLING.ValueAfterReset                  TWPH_NORMAL\nsetglobal CAP_PAPERHANDLING.Flags                            ''\n;\nsetglobal CAP_PASSTHRU.ConType                               TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal CAP_PASSTHRU.ItemType                              TWTY_BOOL\nsetglobal CAP_PASSTHRU.ValueAfterOpen                        UNDEFINED\nsetglobal CAP_PASSTHRU.ValueAfterReset                       UNDEFINED\nsetglobal CAP_PASSTHRU.Flags                                 'deprecated'\n;\nsetglobal CAP_POWERSAVETIME.ConType                          TWON_RANGE\nsetglobal CAP_POWERSAVETIME.ItemType                         TWTY_INT32\nsetglobal CAP_POWERSAVETIME.ValueAfterOpen                   UNDEFINED\nsetglobal CAP_POWERSAVETIME.ValueAfterReset                  UNDEFINED\nsetglobal CAP_POWERSAVETIME.Flags                            ''\n;\nsetglobal CAP_POWERSUPPLY.ConType                            TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal CAP_POWERSUPPLY.ItemType                           TWTY_UINT16\nsetglobal CAP_POWERSUPPLY.ValueAfterOpen                     UNDEFINED\nsetglobal CAP_POWERSUPPLY.ValueAfterReset                    UNDEFINED\nsetglobal CAP_POWERSUPPLY.Flags                              ''\n;\nsetglobal CAP_PRINTER.ConType                                TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal CAP_PRINTER.ItemType                               TWTY_UINT16\nsetglobal CAP_PRINTER.ValueAfterOpen                         UNDEFINED\nsetglobal CAP_PRINTER.ValueAfterReset                        UNDEFINED\nsetglobal CAP_PRINTER.Flags                                  ''\n;\nsetglobal CAP_PRINTERENABLED.ConType                         TWON_ENUMERATION\nsetglobal CAP_PRINTERENABLED.ItemType                        TWTY_BOOL\nsetglobal CAP_PRINTERENABLED.ValueAfterOpen                  UNDEFINED\nsetglobal CAP_PRINTERENABLED.ValueAfterReset                 FALSE\nsetglobal CAP_PRINTERENABLED.Flags                           ''\n;\nsetglobal CAP_PRINTERCHARROTATION.ConType                    TWON_ENUMERATION,TWON_RANGE,TWON_ONEVALUE\nsetglobal CAP_PRINTERCHARROTATION.ItemType                   TWTY_UINT32\nsetglobal CAP_PRINTERCHARROTATION.ValueAfterOpen             UNDEFINED\nsetglobal CAP_PRINTERCHARROTATION.ValueAfterReset            0\nsetglobal CAP_PRINTERCHARROTATION.Flags                      ''\n;\nsetglobal CAP_PRINTERFONTSTYLE.ConType                       TWON_ARRAY\nsetglobal CAP_PRINTERFONTSTYLE.ItemType                      TWTY_UINT16\nsetglobal CAP_PRINTERFONTSTYLE.ValueAfterOpen                UNDEFINED\nsetglobal CAP_PRINTERFONTSTYLE.ValueAfterReset               TWPF_NORMAL\nsetglobal CAP_PRINTERFONTSTYLE.Flags                         ''\n;\nsetglobal CAP_PRINTERINDEX.ConType                           TWON_RANGE,TWON_ONEVALUE\nsetglobal CAP_PRINTERINDEX.ItemType                          TWTY_UINT32\nsetglobal CAP_PRINTERINDEX.ValueAfterOpen                    UNDEFINED\nsetglobal CAP_PRINTERINDEX.ValueAfterReset                   UNDEFINED\nsetglobal CAP_PRINTERINDEX.Flags                             ''\n;\nsetglobal CAP_PRINTERINDEXLEADCHAR.ConType                   TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal CAP_PRINTERINDEXLEADCHAR.ItemType                  TWTY_STR32\nsetglobal CAP_PRINTERINDEXLEADCHAR.ValueAfterOpen            UNDEFINED\nsetglobal CAP_PRINTERINDEXLEADCHAR.ValueAfterReset           UNDEFINED\nsetglobal CAP_PRINTERINDEXLEADCHAR.Flags                     ''\n;\nsetglobal CAP_PRINTERINDEXMAXVALUE.ConType                   TWON_ENUMERATION,TWON_RANGE,TWON_ONEVALUE\nsetglobal CAP_PRINTERINDEXMAXVALUE.ItemType                  TWTY_UINT32\nsetglobal CAP_PRINTERINDEXMAXVALUE.ValueAfterOpen            UNDEFINED\nsetglobal CAP_PRINTERINDEXMAXVALUE.ValueAfterReset           0\nsetglobal CAP_PRINTERINDEXMAXVALUE.Flags                     ''\n;\nsetglobal CAP_PRINTERINDEXNUMDIGITS.ConType                  TWON_ENUMERATION,TWON_RANGE,TWON_ONEVALUE\nsetglobal CAP_PRINTERINDEXNUMDIGITS.ItemType                 TWTY_UINT32\nsetglobal CAP_PRINTERINDEXNUMDIGITS.ValueAfterOpen           UNDEFINED\nsetglobal CAP_PRINTERINDEXNUMDIGITS.ValueAfterReset          0\nsetglobal CAP_PRINTERINDEXNUMDIGITS.Flags                    ''\n;\nsetglobal CAP_PRINTERINDEXSTEP.ConType                       TWON_ENUMERATION,TWON_RANGE,TWON_ONEVALUE\nsetglobal CAP_PRINTERINDEXSTEP.ItemType                      TWTY_UINT32\nsetglobal CAP_PRINTERINDEXSTEP.ValueAfterOpen                UNDEFINED\nsetglobal CAP_PRINTERINDEXSTEP.ValueAfterReset               1\nsetglobal CAP_PRINTERINDEXSTEP.Flags                         ''\n;\nsetglobal CAP_PRINTERINDEXTRIGGER.ConType                    TWON_ARRAY\nsetglobal CAP_PRINTERINDEXTRIGGER.ItemType                   TWTY_UINT16\nsetglobal CAP_PRINTERINDEXTRIGGER.ValueAfterOpen             UNDEFINED\nsetglobal CAP_PRINTERINDEXTRIGGER.ValueAfterReset            TWCT_PAGE\nsetglobal CAP_PRINTERINDEXTRIGGER.Flags                      ''\n;\nsetglobal CAP_PRINTERMODE.ConType                            TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal CAP_PRINTERMODE.ItemType                           TWTY_UINT16\nsetglobal CAP_PRINTERMODE.ValueAfterOpen                     UNDEFINED\nsetglobal CAP_PRINTERMODE.ValueAfterReset                    UNDEFINED\nsetglobal CAP_PRINTERMODE.Flags                              ''\n;\nsetglobal CAP_PRINTERSTRING.ConType                          TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal CAP_PRINTERSTRING.ItemType                         TWTY_STR255\nsetglobal CAP_PRINTERSTRING.ValueAfterOpen                   UNDEFINED\nsetglobal CAP_PRINTERSTRING.ValueAfterReset                  UNDEFINED\nsetglobal CAP_PRINTERSTRING.Flags                            ''\n;\nsetglobal CAP_PRINTERSTRINGPREVIEW.ConType                   TWON_ARRAY\nsetglobal CAP_PRINTERSTRINGPREVIEW.ItemType                  TWTY_STR255\nsetglobal CAP_PRINTERSTRINGPREVIEW.ValueAfterOpen            UNDEFINED\nsetglobal CAP_PRINTERSTRINGPREVIEW.ValueAfterReset           UNDEFINED\nsetglobal CAP_PRINTERSTRINGPREVIEW.Flags                     ''\n;\nsetglobal CAP_PRINTERSUFFIX.ConType                          TWON_ONEVALUE\nsetglobal CAP_PRINTERSUFFIX.ItemType                         TWTY_STR255\nsetglobal CAP_PRINTERSUFFIX.ValueAfterOpen                   UNDEFINED\nsetglobal CAP_PRINTERSUFFIX.ValueAfterReset                  UNDEFINED\nsetglobal CAP_PRINTERSUFFIX.Flags                            ''\n;\nsetglobal CAP_PRINTERVERTICALOFFSET.ConType                  TWON_RANGE,TWON_ONEVALUE\nsetglobal CAP_PRINTERVERTICALOFFSET.ItemType                 TWTY_FIX32\nsetglobal CAP_PRINTERVERTICALOFFSET.ValueAfterOpen           UNDEFINED\nsetglobal CAP_PRINTERVERTICALOFFSET.ValueAfterReset          UNDEFINED\nsetglobal CAP_PRINTERVERTICALOFFSET.Flags                    ''\n;\nsetglobal CAP_REACQUIREALLOWED.ConType                       TWON_ENUMERATION\nsetglobal CAP_REACQUIREALLOWED.ItemType                      TWTY_BOOL\nsetglobal CAP_REACQUIREALLOWED.ValueAfterOpen                UNDEFINED\nsetglobal CAP_REACQUIREALLOWED.ValueAfterReset               UNDEFINED\nsetglobal CAP_REACQUIREALLOWED.Flags                         ''\n;\nsetglobal CAP_REWINDPAGE.ConType                             TWON_ENUMERATION\nsetglobal CAP_REWINDPAGE.ItemType                            TWTY_BOOL\nsetglobal CAP_REWINDPAGE.ValueAfterOpen                      FALSE\nsetglobal CAP_REWINDPAGE.ValueAfterReset                     FALSE\nsetglobal CAP_REWINDPAGE.Flags                               ''\n;\nsetglobal CAP_SEGMENTED.ConType                              TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal CAP_SEGMENTED.ItemType                             TWTY_UINT16\nsetglobal CAP_SEGMENTED.ValueAfterOpen                       UNDEFINED\nsetglobal CAP_SEGMENTED.ValueAfterReset                      FALSE\nsetglobal CAP_SEGMENTED.Flags                                ''\n;\nsetglobal CAP_SERIALNUMBER.ConType                           TWON_ONEVALUE\nsetglobal CAP_SERIALNUMBER.ItemType                          TWTY_STR255\nsetglobal CAP_SERIALNUMBER.ValueAfterOpen                    UNDEFINED\nsetglobal CAP_SERIALNUMBER.ValueAfterReset                   UNDEFINED\nsetglobal CAP_SERIALNUMBER.Flags                             ''\n;\nsetglobal CAP_SHEETCOUNT.ConType                             TWON_RANGE,TWON_ONEVALUE\nsetglobal CAP_SHEETCOUNT.ItemType                            TWTY_UINT32\nsetglobal CAP_SHEETCOUNT.ValueAfterOpen                      0\nsetglobal CAP_SHEETCOUNT.ValueAfterReset                     0\nsetglobal CAP_SHEETCOUNT.Flags                               ''\n;\nsetglobal CAP_SUPPORTEDCAPS.ConType                          TWON_ARRAY\nsetglobal CAP_SUPPORTEDCAPS.ItemType                         TWTY_UINT16\nsetglobal CAP_SUPPORTEDCAPS.ValueAfterOpen                   UNDEFINED\nsetglobal CAP_SUPPORTEDCAPS.ValueAfterReset                  UNDEFINED\nsetglobal CAP_SUPPORTEDCAPS.Flags                            'mandatory'\n;\nsetglobal CAP_SUPPORTEDCAPSEXT.ConType                       TWON_ARRAY\nsetglobal CAP_SUPPORTEDCAPSEXT.ItemType                      TWTY_UINT16\nsetglobal CAP_SUPPORTEDCAPSEXT.ValueAfterOpen                UNDEFINED\nsetglobal CAP_SUPPORTEDCAPSEXT.ValueAfterReset               UNDEFINED\nsetglobal CAP_SUPPORTEDCAPSEXT.Flags                         'deprecated'\n;\nsetglobal CAP_SUPPORTEDCAPSSEGMENTUNIQUE.ConType             TWON_ARRAY\nsetglobal CAP_SUPPORTEDCAPSSEGMENTUNIQUE.ItemType            TWTY_UINT16\nsetglobal CAP_SUPPORTEDCAPSSEGMENTUNIQUE.ValueAfterOpen      UNDEFINED\nsetglobal CAP_SUPPORTEDCAPSSEGMENTUNIQUE.ValueAfterReset     UNDEFINED\nsetglobal CAP_SUPPORTEDCAPSSEGMENTUNIQUE.Flags               ''\n;\nsetglobal CAP_SUPPORTEDDATS.ConType                          TWON_ARRAY\nsetglobal CAP_SUPPORTEDDATS.ItemType                         TWTY_UINT32\nsetglobal CAP_SUPPORTEDDATS.ValueAfterOpen                   UNDEFINED\nsetglobal CAP_SUPPORTEDDATS.ValueAfterReset                  UNDEFINED\nsetglobal CAP_SUPPORTEDDATS.Flags                            'mandatory'\n;\nsetglobal CAP_TIMEBEFOREFIRSTCAPTURE.ConType                 TWON_RANGE,TWON_ONEVALUE\nsetglobal CAP_TIMEBEFOREFIRSTCAPTURE.ItemType                TWTY_INT32\nsetglobal CAP_TIMEBEFOREFIRSTCAPTURE.ValueAfterOpen          0\nsetglobal CAP_TIMEBEFOREFIRSTCAPTURE.ValueAfterReset         0\nsetglobal CAP_TIMEBEFOREFIRSTCAPTURE.Flags                   ''\n;\nsetglobal CAP_TIMEBETWEENCAPTURES.ConType                    TWON_RANGE,TWON_ONEVALUE\nsetglobal CAP_TIMEBETWEENCAPTURES.ItemType                   TWTY_INT32\nsetglobal CAP_TIMEBETWEENCAPTURES.ValueAfterOpen             0\nsetglobal CAP_TIMEBETWEENCAPTURES.ValueAfterReset            0\nsetglobal CAP_TIMEBETWEENCAPTURES.Flags                      ''\n;\nsetglobal CAP_TIMEDATE.ConType                               TWON_ONEVALUE\nsetglobal CAP_TIMEDATE.ItemType                              TWTY_STR32\nsetglobal CAP_TIMEDATE.ValueAfterOpen                        UNDEFINED\nsetglobal CAP_TIMEDATE.ValueAfterReset                       UNDEFINED\nsetglobal CAP_TIMEDATE.Flags                                 'notstate4'\n;\nsetglobal CAP_THUMBNAILSENABLED.ConType                      TWON_ENUMERATION\nsetglobal CAP_THUMBNAILSENABLED.ItemType                     TWTY_BOOL\nsetglobal CAP_THUMBNAILSENABLED.ValueAfterOpen               FALSE\nsetglobal CAP_THUMBNAILSENABLED.ValueAfterReset              FALSE\nsetglobal CAP_THUMBNAILSENABLED.Flags                        ''\n;\nsetglobal CAP_UICONTROLLABLE.ConType                         TWON_ENUMERATION\nsetglobal CAP_UICONTROLLABLE.ItemType                        TWTY_BOOL\nsetglobal CAP_UICONTROLLABLE.ValueAfterOpen                  TRUE ; mandatory for all sources\nsetglobal CAP_UICONTROLLABLE.ValueAfterReset                 UNDEFINED\nsetglobal CAP_UICONTROLLABLE.Flags                           'mandatory'\n;\nsetglobal CAP_XFERCOUNT.ConType                              TWON_RANGE,TWON_ONEVALUE\nsetglobal CAP_XFERCOUNT.ItemType                             TWTY_INT16\nsetglobal CAP_XFERCOUNT.ValueAfterOpen                       -1\nsetglobal CAP_XFERCOUNT.ValueAfterReset                      -1\nsetglobal CAP_XFERCOUNT.Flags                                'mandatory'\n;\nsetglobal ICAP_AUTOBRIGHT.ConType                            TWON_ENUMERATION\nsetglobal ICAP_AUTOBRIGHT.ItemType                           TWTY_BOOL\nsetglobal ICAP_AUTOBRIGHT.ValueAfterOpen                     UNDEFINED\nsetglobal ICAP_AUTOBRIGHT.ValueAfterReset                    FALSE\nsetglobal ICAP_AUTOBRIGHT.Flags                              ''\n;\nsetglobal ICAP_AUTODISCARDBLANKPAGES.ConType                 TWON_RANGE,TWON_ONEVALUE\nsetglobal ICAP_AUTODISCARDBLANKPAGES.ItemType                TWTY_INT32\nsetglobal ICAP_AUTODISCARDBLANKPAGES.ValueAfterOpen          UNDEFINED\nsetglobal ICAP_AUTODISCARDBLANKPAGES.ValueAfterReset         -2 ; TWBP_DISABLE\nsetglobal ICAP_AUTODISCARDBLANKPAGES.Flags                   ''\n;\nsetglobal ICAP_AUTOMATICBORDERDETECTION.ConType              TWON_ENUMERATION\nsetglobal ICAP_AUTOMATICBORDERDETECTION.ItemType             TWTY_BOOL\nsetglobal ICAP_AUTOMATICBORDERDETECTION.ValueAfterOpen       UNDEFINED\nsetglobal ICAP_AUTOMATICBORDERDETECTION.ValueAfterReset      UNDEFINED\nsetglobal ICAP_AUTOMATICBORDERDETECTION.Flags                ''\n;\nsetglobal ICAP_AUTOMATICCOLORENABLED.ConType                 TWON_ENUMERATION\nsetglobal ICAP_AUTOMATICCOLORENABLED.ItemType                TWTY_BOOL\nsetglobal ICAP_AUTOMATICCOLORENABLED.ValueAfterOpen          UNDEFINED\nsetglobal ICAP_AUTOMATICCOLORENABLED.ValueAfterReset         FALSE\nsetglobal ICAP_AUTOMATICCOLORENABLED.Flags                   ''\n;\nsetglobal ICAP_AUTOMATICCOLORNONCOLORPIXELTYPE.ConType             TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_AUTOMATICCOLORNONCOLORPIXELTYPE.ItemType            TWTY_UINT16\nsetglobal ICAP_AUTOMATICCOLORNONCOLORPIXELTYPE.ValueAfterOpen      UNDEFINED\nsetglobal ICAP_AUTOMATICCOLORNONCOLORPIXELTYPE.ValueAfterReset     TWPT_BW\nsetglobal ICAP_AUTOMATICCOLORNONCOLORPIXELTYPE.Flags               ''\n;\nsetglobal ICAP_AUTOMATICCROPUSESFRAME.ConType                TWON_ENUMERATION\nsetglobal ICAP_AUTOMATICCROPUSESFRAME.ItemType               TWTY_BOOL\nsetglobal ICAP_AUTOMATICCROPUSESFRAME.ValueAfterOpen         UNDEFINED\nsetglobal ICAP_AUTOMATICCROPUSESFRAME.ValueAfterReset        UNDEFINED\nsetglobal ICAP_AUTOMATICCROPUSESFRAME.Flags                  ''\n;\nsetglobal ICAP_AUTOMATICDESKEW.ConType                       TWON_ENUMERATION\nsetglobal ICAP_AUTOMATICDESKEW.ItemType                      TWTY_BOOL\nsetglobal ICAP_AUTOMATICDESKEW.ValueAfterOpen                UNDEFINED\nsetglobal ICAP_AUTOMATICDESKEW.ValueAfterReset               UNDEFINED\nsetglobal ICAP_AUTOMATICDESKEW.Flags                         ''\n;\nsetglobal ICAP_AUTOMATICLENGTHDETECTION.ConType              TWON_ENUMERATION\nsetglobal ICAP_AUTOMATICLENGTHDETECTION.ItemType             TWTY_BOOL\nsetglobal ICAP_AUTOMATICLENGTHDETECTION.ValueAfterOpen       UNDEFINED\nsetglobal ICAP_AUTOMATICLENGTHDETECTION.ValueAfterReset      UNDEFINED\nsetglobal ICAP_AUTOMATICLENGTHDETECTION.Flags                ''\n;\nsetglobal ICAP_AUTOMATICROTATE.ConType                       TWON_ENUMERATION\nsetglobal ICAP_AUTOMATICROTATE.ItemType                      TWTY_BOOL\nsetglobal ICAP_AUTOMATICROTATE.ValueAfterOpen                UNDEFINED\nsetglobal ICAP_AUTOMATICROTATE.ValueAfterReset               FALSE\nsetglobal ICAP_AUTOMATICROTATE.Flags                         ''\n;\nsetglobal ICAP_AUTOSIZE.ConType                              TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_AUTOSIZE.ItemType                             TWTY_UINT16\nsetglobal ICAP_AUTOSIZE.ValueAfterOpen                       UNDEFINED\nsetglobal ICAP_AUTOSIZE.ValueAfterReset                      TWAS_NONE\nsetglobal ICAP_AUTOSIZE.Flags                                ''\n;\nsetglobal ICAP_BARCODEDETECTIONENABLED.ConType               TWON_ENUMERATION\nsetglobal ICAP_BARCODEDETECTIONENABLED.ItemType              TWTY_BOOL\nsetglobal ICAP_BARCODEDETECTIONENABLED.ValueAfterOpen        UNDEFINED\nsetglobal ICAP_BARCODEDETECTIONENABLED.ValueAfterReset       FALSE\nsetglobal ICAP_BARCODEDETECTIONENABLED.Flags                 ''\n;\nsetglobal ICAP_BARCODEMAXRETRIES.ConType                     TWON_ENUMERATION,TWON_RANGE,TWON_ONEVALUE\nsetglobal ICAP_BARCODEMAXRETRIES.ItemType                    TWTY_UINT32\nsetglobal ICAP_BARCODEMAXRETRIES.ValueAfterOpen              UNDEFINED\nsetglobal ICAP_BARCODEMAXRETRIES.ValueAfterReset             UNDEFINED\nsetglobal ICAP_BARCODEMAXRETRIES.Flags                       ''\n;\nsetglobal ICAP_BARCODEMAXSEARCHPRIORITIES.ConType            TWON_ENUMERATION,TWON_RANGE,TWON_ONEVALUE\nsetglobal ICAP_BARCODEMAXSEARCHPRIORITIES.ItemType           TWTY_UINT32\nsetglobal ICAP_BARCODEMAXSEARCHPRIORITIES.ValueAfterOpen     UNDEFINED\nsetglobal ICAP_BARCODEMAXSEARCHPRIORITIES.ValueAfterOpen     UNDEFINED\nsetglobal ICAP_BARCODEMAXSEARCHPRIORITIES.Flags              ''\n;\nsetglobal ICAP_BARCODESEARCHMODE.ConType                     TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_BARCODESEARCHMODE.ItemType                    TWTY_UINT16\nsetglobal ICAP_BARCODESEARCHMODE.ValueAfterOpen              UNDEFINED\nsetglobal ICAP_BARCODESEARCHMODE.ValueAfterReset             UNDEFINED\nsetglobal ICAP_BARCODESEARCHMODE.Flags                       ''\n;\nsetglobal ICAP_BARCODESEARCHPRIORITIES.ConType               TWON_ARRAY\nsetglobal ICAP_BARCODESEARCHPRIORITIES.ItemType              TWTY_UINT16\nsetglobal ICAP_BARCODESEARCHPRIORITIES.ValueAfterOpen        UNDEFINED\nsetglobal ICAP_BARCODESEARCHPRIORITIES.ValueAfterReset       UNDEFINED\nsetglobal ICAP_BARCODESEARCHPRIORITIES.Flags                 ''\n;\nsetglobal ICAP_BARCODETIMEOUT.ConType                        TWON_ENUMERATION,TWON_RANGE,TWON_ONEVALUE\nsetglobal ICAP_BARCODETIMEOUT.ItemType                       TWTY_UINT32\nsetglobal ICAP_BARCODETIMEOUT.ValueAfterOpen                 UNDEFINED\nsetglobal ICAP_BARCODETIMEOUT.ValueAfterReset                UNDEFINED\nsetglobal ICAP_BARCODETIMEOUT.Flags                          ''\n;\nsetglobal ICAP_BITDEPTH.ConType                              TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_BITDEPTH.ItemType                             TWTY_UINT16\nsetglobal ICAP_BITDEPTH.ValueAfterOpen                       UNDEFINED\nsetglobal ICAP_BITDEPTH.ValueAfterReset                      UNDEFINED\nsetglobal ICAP_BITDEPTH.Flags                                'mandatory'\n;\nsetglobal ICAP_BITDEPTHREDUCTION.ConType                     TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_BITDEPTHREDUCTION.ItemType                    TWTY_UINT16\nsetglobal ICAP_BITDEPTHREDUCTION.ValueAfterOpen              UNDEFINED\nsetglobal ICAP_BITDEPTHREDUCTION.ValueAfterReset             UNDEFINED\nsetglobal ICAP_BITDEPTHREDUCTION.Flags                       ''\n;\nsetglobal ICAP_BITORDER.ConType                              TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_BITORDER.ItemType                             TWTY_UINT16\nsetglobal ICAP_BITORDER.ValueAfterOpen                       UNDEFINED ; spec says TWBO_LSBFIRST, but who ever used this?\nsetglobal ICAP_BITORDER.ValueAfterReset                      UNDEFINED ; spec says TWBO_LSBFIRST, but who ever used this?\nsetglobal ICAP_BITORDER.Flags                                'mandatory'\n;\nsetglobal ICAP_BITORDERCODES.ConType                         TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_BITORDERCODES.ItemType                        TWTY_UINT16\nsetglobal ICAP_BITORDERCODES.ValueAfterOpen                  UNDEFINED\nsetglobal ICAP_BITORDERCODES.ValueAfterReset                 UNDEFINED\nsetglobal ICAP_BITORDERCODES.Flags                           ''\n;\nsetglobal ICAP_BRIGHTNESS.ConType                            TWON_ENUMERATION,TWON_RANGE,TWON_ONEVALUE\nsetglobal ICAP_BRIGHTNESS.ItemType                           TWTY_FIX32\nsetglobal ICAP_BRIGHTNESS.ValueAfterOpen                     UNDEFINED\nsetglobal ICAP_BRIGHTNESS.ValueAfterReset                    0\nsetglobal ICAP_BRIGHTNESS.Flags                              ''\n;\nsetglobal ICAP_CCITTKFACTOR.ConType                          TWON_RANGE,TWON_ONEVALUE\nsetglobal ICAP_CCITTKFACTOR.ItemType                         TWTY_UINT16\nsetglobal ICAP_CCITTKFACTOR.ValueAfterOpen                   UNDEFINED\nsetglobal ICAP_CCITTKFACTOR.ValueAfterReset                  4\nsetglobal ICAP_CCITTKFACTOR.Flags                            ''\n;\nsetglobal ICAP_COLORMANAGEMENTENABLED.ConType                TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_COLORMANAGEMENTENABLED.ItemType               TWTY_UINT16\nsetglobal ICAP_COLORMANAGEMENTENABLED.ValueAfterOpen         TRUE\nsetglobal ICAP_COLORMANAGEMENTENABLED.ValueAfterReset        TRUE\nsetglobal ICAP_COLORMANAGEMENTENABLED.Flags                  ''\n;\nsetglobal ICAP_COMPRESSION.ConType                           TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_COMPRESSION.ItemType                          TWTY_UINT16\nsetglobal ICAP_COMPRESSION.ValueAfterOpen                    UNDEFINED\nsetglobal ICAP_COMPRESSION.ValueAfterReset                   TWCP_NONE\nsetglobal ICAP_COMPRESSION.Flags                             'mandatory'\n;\nsetglobal ICAP_CONTRAST.ConType                              TWON_ENUMERATION,TWON_RANGE,TWON_ONEVALUE\nsetglobal ICAP_CONTRAST.ItemType                             TWTY_FIX32\nsetglobal ICAP_CONTRAST.ValueAfterOpen                       UNDEFINED\nsetglobal ICAP_CONTRAST.ValueAfterReset                      0\nsetglobal ICAP_CONTRAST.Flags                                ''\n;\nsetglobal ICAP_CUSTHALFTONE.ConType                          TWON_ARRAY\nsetglobal ICAP_CUSTHALFTONE.ItemType                         TWTY_UINT8\nsetglobal ICAP_CUSTHALFTONE.ValueAfterOpen                   UNDEFINED\nsetglobal ICAP_CUSTHALFTONE.ValueAfterReset                  UNDEFINED\nsetglobal ICAP_CUSTHALFTONE.Flags                            ''\n;\nsetglobal ICAP_EXPOSURETIME.ConType                          TWON_ENUMERATION,TWON_RANGE,TWON_ONEVALUE\nsetglobal ICAP_EXPOSURETIME.ItemType                         TWTY_FIX32\nsetglobal ICAP_EXPOSURETIME.ValueAfterOpen                   UNDEFINED\nsetglobal ICAP_EXPOSURETIME.ValueAfterReset                  UNDEFINED\nsetglobal ICAP_EXPOSURETIME.Flags                            ''\n;\nsetglobal ICAP_EXTIMAGEINFO.ConType                          TWON_ENUMERATION\nsetglobal ICAP_EXTIMAGEINFO.ItemType                         TWTY_BOOL\nsetglobal ICAP_EXTIMAGEINFO.ValueAfterOpen                   UNDEFINED\nsetglobal ICAP_EXTIMAGEINFO.ValueAfterReset                  TRUE\nsetglobal ICAP_EXTIMAGEINFO.Flags                            ''\n;\nsetglobal ICAP_FEEDERTYPE.ConType                            TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_FEEDERTYPE.ItemType                           TWTY_UINT16\nsetglobal ICAP_FEEDERTYPE.ValueAfterOpen                     UNDEFINED\nsetglobal ICAP_FEEDERTYPE.ValueAfterReset                    UNDEFINED\nsetglobal ICAP_FEEDERTYPE.Flags                              ''\n;\nsetglobal ICAP_FILMTYPE.ConType                              TWON_ENUMERATION\nsetglobal ICAP_FILMTYPE.ItemType                             TWTY_UINT16\nsetglobal ICAP_FILMTYPE.ValueAfterOpen                       UNDEFINED\nsetglobal ICAP_FILMTYPE.ValueAfterReset                      UNDEFINED\nsetglobal ICAP_FILMTYPE.Flags                                ''\n;\nsetglobal ICAP_FILTER.ConType                                TWON_ARRAY,TWON_ONEVALUE\nsetglobal ICAP_FILTER.ItemType                               TWTY_UINT16\nsetglobal ICAP_FILTER.ValueAfterOpen                         UNDEFINED\nsetglobal ICAP_FILTER.ValueAfterReset                        ''\nsetglobal ICAP_FILTER.Flags                                  ''\n;\nsetglobal ICAP_FLASHUSED2.ConType                            TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_FLASHUSED2.ItemType                           TWTY_UINT16\nsetglobal ICAP_FLASHUSED2.ValueAfterOpen                     UNDEFINED\nsetglobal ICAP_FLASHUSED2.ValueAfterReset                    UNDEFINED\nsetglobal ICAP_FLASHUSED2.Flags                              ''\n;\nsetglobal ICAP_FLIPROTATION.ConType                          TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_FLIPROTATION.ItemType                         TWTY_UINT16\nsetglobal ICAP_FLIPROTATION.ValueAfterOpen                   UNDEFINED\nsetglobal ICAP_FLIPROTATION.ValueAfterReset                  TWFR_BOOK\nsetglobal ICAP_FLIPROTATION.Flags                            ''\n;\nsetglobal ICAP_FRAMES.ConType                                TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_FRAMES.ItemType                               TWTY_FRAME\nsetglobal ICAP_FRAMES.ValueAfterOpen                         UNDEFINED\nsetglobal ICAP_FRAMES.ValueAfterReset                        UNDEFINED\nsetglobal ICAP_FRAMES.Flags                                  ''\n;\nsetglobal ICAP_GAMMA.ConType                                 TWON_RANGE,TWON_ONEVALUE\nsetglobal ICAP_GAMMA.ItemType                                TWTY_FIX32\nsetglobal ICAP_GAMMA.ValueAfterOpen                          UNDEFINED\nsetglobal ICAP_GAMMA.ValueAfterReset                         UNDEFINED\nsetglobal ICAP_GAMMA.Flags                                   ''\n;\nsetglobal ICAP_HALFTONES.ConType                             TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_HALFTONES.ItemType                            TWTY_STR32\nsetglobal ICAP_HALFTONES.ValueAfterOpen                      UNDEFINED\nsetglobal ICAP_HALFTONES.ValueAfterReset                     UNDEFINED\nsetglobal ICAP_HALFTONES.Flags                               ''\n;\nsetglobal ICAP_HIGHLIGHT.ConType                             TWON_ENUMERATION,TWON_RANGE,TWON_ONEVALUE\nsetglobal ICAP_HIGHLIGHT.ItemType                            TWTY_FIX32\nsetglobal ICAP_HIGHLIGHT.ValueAfterOpen                      UNDEFINED\nsetglobal ICAP_HIGHLIGHT.ValueAfterReset                     255\nsetglobal ICAP_HIGHLIGHT.Flags                               ''\n;\nsetglobal ICAP_ICCPROFILE.ConType                            TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_ICCPROFILE.ItemType                           TWTY_UINT16\nsetglobal ICAP_ICCPROFILE.ValueAfterOpen                     UNDEFINED\nsetglobal ICAP_ICCPROFILE.ValueAfterReset                    UNDEFINED\nsetglobal ICAP_ICCPROFILE.Flags                              ''\n;\nsetglobal ICAP_IMAGEDATASET.ConType                          TWON_ENUMERATION,TWON_RANGE,TWON_ONEVALUE\nsetglobal ICAP_IMAGEDATASET.ItemType                         TWTY_UINT32\nsetglobal ICAP_IMAGEDATASET.ValueAfterOpen                   UNDEFINED\nsetglobal ICAP_IMAGEDATASET.ValueAfterReset                  UNDEFINED\nsetglobal ICAP_IMAGEDATASET.Flags                            ''\n;\nsetglobal ICAP_IMAGEFILEFORMAT.ConType                       TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_IMAGEFILEFORMAT.ItemType                      TWTY_UINT16\nsetglobal ICAP_IMAGEFILEFORMAT.ValueAfterOpen                UNDEFINED\nsetglobal ICAP_IMAGEFILEFORMAT.ValueAfterReset               UNDEFINED\nsetglobal ICAP_IMAGEFILEFORMAT.Flags                         ''\n;\nsetglobal ICAP_IMAGEFILTER.ConType                           TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_IMAGEFILTER.ItemType                          TWTY_UINT16\nsetglobal ICAP_IMAGEFILTER.ValueAfterOpen                    UNDEFINED\nsetglobal ICAP_IMAGEFILTER.ValueAfterReset                   UNDEFINED\nsetglobal ICAP_IMAGEFILTER.Flags                             ''\n;\nsetglobal ICAP_IMAGEMERGE.ConType                            TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_IMAGEMERGE.ItemType                           TWTY_UINT16\nsetglobal ICAP_IMAGEMERGE.ValueAfterOpen                     UNDEFINED\nsetglobal ICAP_IMAGEMERGE.ValueAfterReset                    TWIM_NONE\nsetglobal ICAP_IMAGEMERGE.Flags                              ''\n;\nsetglobal ICAP_IMAGEMERGEHEIGHTTHRESHOLD.ConType             TWON_RANGE,TWON_ONEVALUE\nsetglobal ICAP_IMAGEMERGEHEIGHTTHRESHOLD.ItemType            TWTY_FIX32\nsetglobal ICAP_IMAGEMERGEHEIGHTTHRESHOLD.ValueAfterOpen      UNDEFINED\nsetglobal ICAP_IMAGEMERGEHEIGHTTHRESHOLD.ValueAfterReset     0\nsetglobal ICAP_IMAGEMERGEHEIGHTTHRESHOLD.Flags               ''\n;\nsetglobal ICAP_JPEGPIXELTYPE.ConType                         TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_JPEGPIXELTYPE.ItemType                        TWTY_UINT16\nsetglobal ICAP_JPEGPIXELTYPE.ValueAfterOpen                  UNDEFINED\nsetglobal ICAP_JPEGPIXELTYPE.ValueAfterReset                 UNDEFINED\nsetglobal ICAP_JPEGPIXELTYPE.Flags                           ''\n;\nsetglobal ICAP_JPEGQUALITY.ConType                           TWON_ENUMERATION,TWON_RANGE,TWON_ONEVALUE\nsetglobal ICAP_JPEGQUALITY.ItemType                          TWTY_INT16\nsetglobal ICAP_JPEGQUALITY.ValueAfterOpen                    UNDEFINED\nsetglobal ICAP_JPEGQUALITY.ValueAfterReset                   UNDEFINED\nsetglobal ICAP_JPEGQUALITY.Flags                             ''\n;\nsetglobal ICAP_JPEGSUBSAMPLING.ConType                       TWON_ENUMERATION\nsetglobal ICAP_JPEGSUBSAMPLING.ItemType                      TWTY_UINT16\nsetglobal ICAP_JPEGSUBSAMPLING.ValueAfterOpen                UNDEFINED\nsetglobal ICAP_JPEGSUBSAMPLING.ValueAfterReset               UNDEFINED\nsetglobal ICAP_JPEGSUBSAMPLING.Flags                         ''\n;\nsetglobal ICAP_LAMPSTATE.ConType                             TWON_ENUMERATION\nsetglobal ICAP_LAMPSTATE.ItemType                            TWTY_BOOL\nsetglobal ICAP_LAMPSTATE.ValueAfterOpen                      UNDEFINED\nsetglobal ICAP_LAMPSTATE.ValueAfterReset                     UNDEFINED\nsetglobal ICAP_LAMPSTATE.Flags                               ''\n;\nsetglobal ICAP_LIGHTPATH.ConType                             TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_LIGHTPATH.ItemType                            TWTY_UINT16\nsetglobal ICAP_LIGHTPATH.ValueAfterOpen                      UNDEFINED\nsetglobal ICAP_LIGHTPATH.ValueAfterReset                     UNDEFINED\nsetglobal ICAP_LIGHTPATH.Flags                               ''\n;\nsetglobal ICAP_LIGHTSOURCE.ConType                           TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_LIGHTSOURCE.ItemType                          TWTY_UINT16\nsetglobal ICAP_LIGHTSOURCE.ValueAfterOpen                    UNDEFINED\nsetglobal ICAP_LIGHTSOURCE.ValueAfterReset                   UNDEFINED\nsetglobal ICAP_LIGHTSOURCE.Flags                             ''\n;\nsetglobal ICAP_MAXFRAMES.ConType                             TWON_RANGE,TWON_ONEVALUE\nsetglobal ICAP_MAXFRAMES.ItemType                            TWTY_UINT16\nsetglobal ICAP_MAXFRAMES.ValueAfterOpen                      UNDEFINED\nsetglobal ICAP_MAXFRAMES.ValueAfterReset                     UNDEFINED\nsetglobal ICAP_MAXFRAMES.Flags                               ''\n;\nsetglobal ICAP_MINIMUMHEIGHT.ConType                         TWON_ONEVALUE\nsetglobal ICAP_MINIMUMHEIGHT.ItemType                        TWTY_FIX32\nsetglobal ICAP_MINIMUMHEIGHT.ValueAfterOpen                  UNDEFINED\nsetglobal ICAP_MINIMUMHEIGHT.ValueAfterReset                 UNDEFINED\nsetglobal ICAP_MINIMUMHEIGHT.Flags                           ''\n;\nsetglobal ICAP_MINIMUMWIDTH.ConType                          TWON_ONEVALUE\nsetglobal ICAP_MINIMUMWIDTH.ItemType                         TWTY_FIX32\nsetglobal ICAP_MINIMUMWIDTH.ValueAfterOpen                   UNDEFINED\nsetglobal ICAP_MINIMUMWIDTH.ValueAfterReset                  UNDEFINED\nsetglobal ICAP_MINIMUMWIDTH.Flags                            ''\n;\nsetglobal ICAP_MIRROR.ConType                                TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_MIRROR.ItemType                               TWTY_UINT16\nsetglobal ICAP_MIRROR.ValueAfterOpen                         UNDEFINED\nsetglobal ICAP_MIRROR.ValueAfterReset                        TWMR_NONE\nsetglobal ICAP_MIRROR.Flags                                  ''\n;\nsetglobal ICAP_NOISEFILTER.ConType                           TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_NOISEFILTER.ItemType                          TWTY_UINT16\nsetglobal ICAP_NOISEFILTER.ValueAfterOpen                    UNDEFINED\nsetglobal ICAP_NOISEFILTER.ValueAfterReset                   UNDEFINED\nsetglobal ICAP_NOISEFILTER.Flags                             ''\n;\nsetglobal ICAP_ORIENTATION.ConType                           TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_ORIENTATION.ItemType                          TWTY_UINT16\nsetglobal ICAP_ORIENTATION.ValueAfterOpen                    UNDEFINED\nsetglobal ICAP_ORIENTATION.ValueAfterReset                   TWOR_ROT0|TWOR_PORTRAIT\nsetglobal ICAP_ORIENTATION.Flags                             ''\n;\nsetglobal ICAP_OVERSCAN.ConType                              TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_OVERSCAN.ItemType                             TWTY_UINT16\nsetglobal ICAP_OVERSCAN.ValueAfterOpen                       UNDEFINED\nsetglobal ICAP_OVERSCAN.ValueAfterReset                      TWOV_NONE\nsetglobal ICAP_OVERSCAN.Flags                                ''\n;\nsetglobal ICAP_PATCHCODEDETECTIONENABLED.ConType             TWON_ENUMERATION\nsetglobal ICAP_PATCHCODEDETECTIONENABLED.ItemType            TWTY_BOOL\nsetglobal ICAP_PATCHCODEDETECTIONENABLED.ValueAfterOpen      UNDEFINED\nsetglobal ICAP_PATCHCODEDETECTIONENABLED.ValueAfterReset     FALSE\nsetglobal ICAP_PATCHCODEDETECTIONENABLED.Flags               ''\n;\nsetglobal ICAP_PATCHCODEMAXRETRIES.ConType                   TWON_ENUMERATION,TWON_RANGE,TWON_ONEVALUE\nsetglobal ICAP_PATCHCODEMAXRETRIES.ItemType                  TWTY_UINT32\nsetglobal ICAP_PATCHCODEMAXRETRIES.ValueAfterOpen            UNDEFINED\nsetglobal ICAP_PATCHCODEMAXRETRIES.ValueAfterReset           UNDEFINED\nsetglobal ICAP_PATCHCODEMAXRETRIES.Flags                     ''\n;\nsetglobal ICAP_PATCHCODEMAXSEARCHPRIORITIES.ConType          TWON_ENUMERATION,TWON_RANGE,TWON_ONEVALUE\nsetglobal ICAP_PATCHCODEMAXSEARCHPRIORITIES.ItemType         TWTY_UINT32\nsetglobal ICAP_PATCHCODEMAXSEARCHPRIORITIES.ValueAfterOpen   UNDEFINED\nsetglobal ICAP_PATCHCODEMAXSEARCHPRIORITIES.ValueAfterReset  UNDEFINED\nsetglobal ICAP_PATCHCODEMAXSEARCHPRIORITIES.Flags            ''\n;\nsetglobal ICAP_PATCHCODESEARCHMODE.ConType                   TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_PATCHCODESEARCHMODE.ItemType                  TWTY_UINT16\nsetglobal ICAP_PATCHCODESEARCHMODE.ValueAfterOpen            UNDEFINED\nsetglobal ICAP_PATCHCODESEARCHMODE.ValueAfterReset           UNDEFINED\nsetglobal ICAP_PATCHCODESEARCHMODE.Flags                     ''\n;\nsetglobal ICAP_PATCHCODESEARCHPRIORITIES.ConType             TWON_ARRAY\nsetglobal ICAP_PATCHCODESEARCHPRIORITIES.ItemType            TWTY_UINT16\nsetglobal ICAP_PATCHCODESEARCHPRIORITIES.ValueAfterOpen      UNDEFINED\nsetglobal ICAP_PATCHCODESEARCHPRIORITIES.ValueAfterReset     UNDEFINED\nsetglobal ICAP_PATCHCODESEARCHPRIORITIES.Flags               ''\n;\nsetglobal ICAP_PATCHCODETIMEOUT.ConType                      TWON_ENUMERATION,TWON_RANGE,TWON_ONEVALUE\nsetglobal ICAP_PATCHCODETIMEOUT.ItemType                     TWTY_UINT32\nsetglobal ICAP_PATCHCODETIMEOUT.ValueAfterOpen               UNDEFINED\nsetglobal ICAP_PATCHCODETIMEOUT.ValueAfterReset              UNDEFINED\nsetglobal ICAP_PATCHCODETIMEOUT.Flags                        ''\n;\nsetglobal ICAP_PHYSICALHEIGHT.ConType                        TWON_ONEVALUE\nsetglobal ICAP_PHYSICALHEIGHT.ItemType                       TWTY_FIX32\nsetglobal ICAP_PHYSICALHEIGHT.ValueAfterOpen                 UNDEFINED\nsetglobal ICAP_PHYSICALHEIGHT.ValueAfterReset                UNDEFINED\nsetglobal ICAP_PHYSICALHEIGHT.Flags                          'mandatory'\n;\nsetglobal ICAP_PHYSICALWIDTH.ConType                         TWON_ONEVALUE\nsetglobal ICAP_PHYSICALWIDTH.ItemType                        TWTY_FIX32\nsetglobal ICAP_PHYSICALWIDTH.ValueAfterOpen                  UNDEFINED\nsetglobal ICAP_PHYSICALWIDTH.ValueAfterReset                 UNDEFINED\nsetglobal ICAP_PHYSICALWIDTH.Flags                           'mandatory'\n;\nsetglobal ICAP_PIXELFLAVOR.ConType                           TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_PIXELFLAVOR.ItemType                          TWTY_UINT16\nsetglobal ICAP_PIXELFLAVOR.ValueAfterOpen                    UNDEFINED\nsetglobal ICAP_PIXELFLAVOR.ValueAfterReset                   TWPF_CHOCOLATE\nsetglobal ICAP_PIXELFLAVOR.Flags                             'mandatory'\n;\nsetglobal ICAP_PIXELFLAVORCODES.ConType                      TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_PIXELFLAVORCODES.ItemType                     TWTY_UINT16\nsetglobal ICAP_PIXELFLAVORCODES.ValueAfterOpen               UNDEFINED\nsetglobal ICAP_PIXELFLAVORCODES.ValueAfterReset              TWPF_CHOCOLATE\nsetglobal ICAP_PIXELFLAVORCODES.Flags                        ''\n;\nsetglobal ICAP_PIXELTYPE.ConType                             TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_PIXELTYPE.ItemType                            TWTY_UINT16\nsetglobal ICAP_PIXELTYPE.ValueAfterOpen                      UNDEFINED\nsetglobal ICAP_PIXELTYPE.ValueAfterReset                     UNDEFINED\nsetglobal ICAP_PIXELTYPE.Flags                               'mandatory'\n;\nsetglobal ICAP_PLANARCHUNKY.ConType                          TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_PLANARCHUNKY.ItemType                         TWTY_UINT16\nsetglobal ICAP_PLANARCHUNKY.ValueAfterOpen                   UNDEFINED\nsetglobal ICAP_PLANARCHUNKY.ValueAfterReset                  UNDEFINED\nsetglobal ICAP_PLANARCHUNKY.Flags                            'mandatory'\n;\nsetglobal ICAP_ROTATION.ConType                              TWON_ENUMERATION,TWON_RANGE,TWON_ONEVALUE\nsetglobal ICAP_ROTATION.ItemType                             TWTY_FIX32\nsetglobal ICAP_ROTATION.ValueAfterOpen                       UNDEFINED\nsetglobal ICAP_ROTATION.ValueAfterReset                      0\nsetglobal ICAP_ROTATION.Flags                                ''\n;\nsetglobal ICAP_SHADOW.ConType                                TWON_ENUMERATION,TWON_RANGE,TWON_ONEVALUE\nsetglobal ICAP_SHADOW.ItemType                               TWTY_FIX32\nsetglobal ICAP_SHADOW.ValueAfterOpen                         UNDEFINED\nsetglobal ICAP_SHADOW.ValueAfterReset                        0\nsetglobal ICAP_SHADOW.Flags                                  ''\n;\nsetglobal ICAP_SUPPORTEDBARCODETYPES.ConType                 TWON_ARRAY\nsetglobal ICAP_SUPPORTEDBARCODETYPES.ItemType                TWTY_UINT16\nsetglobal ICAP_SUPPORTEDBARCODETYPES.ValueAfterOpen          UNDEFINED\nsetglobal ICAP_SUPPORTEDBARCODETYPES.ValueAfterReset         UNDEFINED\nsetglobal ICAP_SUPPORTEDBARCODETYPES.Flags                   ''\n;\nsetglobal ICAP_SUPPORTEDEXTIMAGEINFO.ConType                 TWON_ARRAY\nsetglobal ICAP_SUPPORTEDEXTIMAGEINFO.ItemType                TWTY_UINT16\nsetglobal ICAP_SUPPORTEDEXTIMAGEINFO.ValueAfterOpen          UNDEFINED\nsetglobal ICAP_SUPPORTEDEXTIMAGEINFO.ValueAfterReset         UNDEFINED\nsetglobal ICAP_SUPPORTEDEXTIMAGEINFO.Flags                   ''\n;\nsetglobal ICAP_SUPPORTEDPATCHCODETYPES.ConType               TWON_ARRAY\nsetglobal ICAP_SUPPORTEDPATCHCODETYPES.ItemType              TWTY_UINT16\nsetglobal ICAP_SUPPORTEDPATCHCODETYPES.ValueAfterOpen        UNDEFINED\nsetglobal ICAP_SUPPORTEDPATCHCODETYPES.ValueAfterReset       UNDEFINED\nsetglobal ICAP_SUPPORTEDPATCHCODETYPES.Flags                 ''\n;\nsetglobal ICAP_SUPPORTEDSIZES.ConType                        TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_SUPPORTEDSIZES.ItemType                       TWTY_UINT16\nsetglobal ICAP_SUPPORTEDSIZES.ValueAfterOpen                 UNDEFINED\nsetglobal ICAP_SUPPORTEDSIZES.ValueAfterReset                UNDEFINED\nsetglobal ICAP_SUPPORTEDSIZES.Flags                          ''\n;\nsetglobal ICAP_THRESHOLD.ConType                             TWON_ENUMERATION,TWON_RANGE,TWON_ONEVALUE\nsetglobal ICAP_THRESHOLD.ItemType                            TWTY_FIX32\nsetglobal ICAP_THRESHOLD.ValueAfterOpen                      UNDEFINED\nsetglobal ICAP_THRESHOLD.ValueAfterReset                     128\nsetglobal ICAP_THRESHOLD.Flags                               ''\n;\nsetglobal ICAP_TILES.ConType                                 TWON_ENUMERATION\nsetglobal ICAP_TILES.ItemType                                TWTY_BOOL\nsetglobal ICAP_TILES.ValueAfterOpen                          FALSE\nsetglobal ICAP_TILES.ValueAfterReset                         FALSE\nsetglobal ICAP_TILES.Flags                                   ''\n;\nsetglobal ICAP_TIMEFILL.ConType                              TWON_RANGE,TWON_ONEVALUE\nsetglobal ICAP_TIMEFILL.ItemType                             TWTY_UINT16\nsetglobal ICAP_TIMEFILL.ValueAfterOpen                       UNDEFINED\nsetglobal ICAP_TIMEFILL.ValueAfterReset                      1\nsetglobal ICAP_TIMEFILL.Flags                                ''\n;\nsetglobal ICAP_UNDEFINEDIMAGESIZE.ConType                    TWON_ENUMERATION\nsetglobal ICAP_UNDEFINEDIMAGESIZE.ItemType                   TWTY_BOOL\nsetglobal ICAP_UNDEFINEDIMAGESIZE.ValueAfterOpen             FALSE\nsetglobal ICAP_UNDEFINEDIMAGESIZE.ValueAfterReset            FALSE\nsetglobal ICAP_UNDEFINEDIMAGESIZE.Flags                      ''\n;\nsetglobal ICAP_UNITS.ConType                                 TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_UNITS.ItemType                                TWTY_UINT16\nsetglobal ICAP_UNITS.ValueAfterOpen                          TWUN_INCHES\nsetglobal ICAP_UNITS.ValueAfterReset                         TWUN_INCHES\nsetglobal ICAP_UNITS.Flags                                   'mandatory'\n;\nsetglobal ICAP_XFERMECH.ConType                              TWON_ENUMERATION\nsetglobal ICAP_XFERMECH.ItemType                             TWTY_UINT16\nsetglobal ICAP_XFERMECH.ValueAfterOpen                       TWSX_NATIVE\nsetglobal ICAP_XFERMECH.ValueAfterReset                      TWSX_NATIVE\nsetglobal ICAP_XFERMECH.Flags                                'mandatory'\n;\nsetglobal ICAP_XNATIVERESOLUTION.ConType                     TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_XNATIVERESOLUTION.ItemType                    TWTY_FIX32\nsetglobal ICAP_XNATIVERESOLUTION.ValueAfterOpen              UNDEFINED\nsetglobal ICAP_XNATIVERESOLUTION.ValueAfterReset             UNDEFINED\nsetglobal ICAP_XNATIVERESOLUTION.Flags                       'mandatory'\n;\nsetglobal ICAP_XRESOLUTION.ConType                           TWON_ENUMERATION,TWON_RANGE,TWON_ONEVALUE\nsetglobal ICAP_XRESOLUTION.ItemType                          TWTY_FIX32\nsetglobal ICAP_XRESOLUTION.ValueAfterOpen                    UNDEFINED\nsetglobal ICAP_XRESOLUTION.ValueAfterReset                   UNDEFINED\nsetglobal ICAP_XRESOLUTION.Flags                             'mandatory'\n;\nsetglobal ICAP_XSCALING.ConType                              TWON_ENUMERATION,TWON_RANGE,TWON_ONEVALUE\nsetglobal ICAP_XSCALING.ItemType                             TWTY_FIX32\nsetglobal ICAP_XSCALING.ValueAfterOpen                       UNDEFINED\nsetglobal ICAP_XSCALING.ValueAfterReset                      1\nsetglobal ICAP_XSCALING.Flags                                ''\n;\nsetglobal ICAP_YNATIVERESOLUTION.ConType                     TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_YNATIVERESOLUTION.ItemType                    TWTY_FIX32\nsetglobal ICAP_YNATIVERESOLUTION.ValueAfterOpen              UNDEFINED\nsetglobal ICAP_YNATIVERESOLUTION.ValueAfterReset             UNDEFINED\nsetglobal ICAP_YNATIVERESOLUTION.Flags                       'mandatory'\n;\nsetglobal ICAP_YRESOLUTION.ConType                           TWON_ENUMERATION,TWON_RANGE,TWON_ONEVALUE\nsetglobal ICAP_YRESOLUTION.ItemType                          TWTY_FIX32\nsetglobal ICAP_YRESOLUTION.ValueAfterOpen                    UNDEFINED\nsetglobal ICAP_YRESOLUTION.ValueAfterReset                   UNDEFINED\nsetglobal ICAP_YRESOLUTION.Flags                             'mandatory'\n;\nsetglobal ICAP_YSCALING.ConType                              TWON_ENUMERATION,TWON_RANGE,TWON_ONEVALUE\nsetglobal ICAP_YSCALING.ItemType                             TWTY_FIX32\nsetglobal ICAP_YSCALING.ValueAfterOpen                       UNDEFINED\nsetglobal ICAP_YSCALING.ValueAfterReset                      1\nsetglobal ICAP_YSCALING.Flags                                ''\n;\nsetglobal ICAP_ZOOMFACTOR.ConType                            TWON_ENUMERATION,TWON_RANGE,TWON_ONEVALUE\nsetglobal ICAP_ZOOMFACTOR.ItemType                           TWTY_INT16\nsetglobal ICAP_ZOOMFACTOR.ValueAfterOpen                     UNDEFINED\nsetglobal ICAP_ZOOMFACTOR.ValueAfterReset                    0\nsetglobal ICAP_ZOOMFACTOR.Flags                              ''\n;\nsetrecord off\n;\nreturn\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/Opends.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Opends\n;   Open the requested TWAIN driver, with additional dsmload options\n;\n; Arguments\n;   arg:1 - TW_IDENTITY.ProductName of scanner to test\n;   arg:2 - set to 'embedded', to limit messages\n;   arg:3 - indent padding for embedded\n;   arg:4 - dsmoption #1\n;   arg:5 - dsmoption #2\n;   arg:6 - dsmoption #3\n;   arg:7 - dsmoption #4\n;   arg:8 - dsmoption #5\n;   arg:9 - dsmoption #6\n;   arg:10 - dsmoption #7\n;   arg:11 - dsmoption #8\n;   arg:12 - dsmoption #9\n;   arg:13 - dsmoption #10\n;   arg:14 - dsmoption #11\n;   arg:15 - dsmoption #12\n;   arg:16 - dsmoption #13\n;\n; Globals\n;   (none)\n;\n; Locals\n;   embedded - try to fit into the flow of other echo.passfail stuff\n;   indent - indenting for echo.passfail\n;\n; Returns\n;   pass or fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Initialize...\n;\nif '${arg:2}' == 'embedded' goto MAIN.TITLE.SKIP\necho.titletest 'Opends'\n:MAIN.TITLE.SKIP\nsetlocal embedded '${arg:2}'\nsetlocal indent '${arg:3}'\nif '${get:TW_ARRAY.ItemType}' != '' goto MAIN.LOADTABLES.SKIP\nrun '${folder:certification}/LoadTables'\n:MAIN.LOADTABLES.SKIP\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Load and open the DSM...\n;\nsetlocal name 'dsmload ${arg:4} ${arg:5} ${arg:6} ${arg:7} ${arg:8} ${arg:9} ${arg:10} ${arg:11} ${arg:12} ${arg:13} ${arg:14} ${arg:15} ${arg:16}'\ndsmload '${arg:4}' '${arg:5}' '${arg:6}' '${arg:7}' '${arg:8}' '${arg:9}' '${arg:10}' '${arg:11}' '${arg:12}' '${arg:13}' '${arg:14}' '${arg:15}' '${arg:16}'\ndsmentry src null dg_control dat_parent msg_opendsm hwnd\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR\necho.passfail '${get:indent}${get:name}' 'pass'\necho.passfail '${get:indent}using ${dsm:}' 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; If the DF_APP2|DF_DSM2 flag is set, then call DAT_ENTRYPOINT...\n;\nif '${app:${get:TW_IDENTITY.SupportedGroups}}' & '0x30000000' != '0x30000000' goto MAIN.ENTRYPOINT.SKIP\nsetlocal name 'dg_control/dat_entrypoint/msg_get'\ndsmentry src null dg_control dat_entrypoint msg_get '0,0,0,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR\necho.passfail '${get:indent}${get:name}' 'pass'\n:MAIN.ENTRYPOINT.SKIP\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Open the driver...\n;\nsetlocal name 'dg_control/dat_identity/msg_opends <${arg:1}>'\ndsmentry src null dg_control dat_identity msg_opends '0,0,0,0,0,,0,0,0x0,,,${arg:1}'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Summary and cleanup...\n;\nif '${get:embedded}' == 'embedded' goto MAIN.PASS.EMBEDDED\necho.passfail '${get:name}' 'pass'\necho.passfail 'SUMMARY' 'pass'\nreturn 'pass'\n;\n; Ruh-roh...\n:MAIN.ERROR\nif '${get:embedded}' == 'embedded' goto MAIN.ERROR.EMBEDDED\necho.passfail '${get:name}' 'fail - ${sts:} '${ret:}'\necho.passfail 'SUMMARY' 'fail'\nreturn 'fail'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Enbedded summary and cleanup...\n;\n:MAIN.PASS.EMBEDDED\necho.passfail '${get:indent}${get:name}' 'pass'\nreturn 'pass'\n;\n; Ruh-roh...\n:MAIN.ERROR.EMBEDDED\necho.passfail '${get:indent}${get:name}' 'fail - ${sts:} '${ret:}'\nreturn 'fail'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/certification/__README.md",
    "content": "These are the scripts for doing the certification tests.  This folder will\nbe deleted and rewritten by the certify command, so don't put anything in\nhere you care about.\n\nThese have been designed such that it's possible to use the run command\non any \"Certification.tc\" file.\n\nIf doing diagnostic work, bear in mind that it may be helpful to go into\nthe \"Certification.tc\" files to comment out tests you're not interested\nin running, or use a goto to skip over tests.\n\nThe 'echo' command is your friend.  You can learn a lot from it.  Or you\ncan use the 'verbose' option to get the program to hork out everything\ngoing on.  The 'runv' command will show all of the TWAIN commands that\nare issued during the test.\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/scripts/LoadTables.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Tables\n;   Load common values used globally\n;\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Stuff to load...\n;\ncall LOADCAPABILITYTABLE\ncall LOADTWSTRUCTTABLE\nreturn\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Function: LOADTWSTRUCTTABLE\n; Loads indecies we use to look into TW_* structures...\n;\n:LOADTWSTRUCTTABLE\n;\n; These index off TW_CAPABILITY, which is why they don't start at 0...\nsetglobal TW_ARRAY.ItemType                       2\nsetglobal TW_ARRAY.NumItems                       3\nsetglobal TW_ARRAY.ItemList                       4\n;\nsetglobal TW_CAPABILITY.Cap                       0\nsetglobal TW_CAPABILITY.ConType                   1\n;\nsetglobal TW_CUSTOMDSDATA.InfoLength              0\nsetglobal TW_CUSTOMDSDATA.hData                   1\n;\nsetglobal TW_DEVICEEVENT.Event                    0\nsetglobal TW_DEVICEEVENT.DeviceName               1\nsetglobal TW_DEVICEEVENT.BatteryMinutes           2\nsetglobal TW_DEVICEEVENT.BatteryPercentage        3\nsetglobal TW_DEVICEEVENT.PowerSupply              4\nsetglobal TW_DEVICEEVENT.XResolution              5\nsetglobal TW_DEVICEEVENT.YResolution              6\nsetglobal TW_DEVICEEVENT.FlashUsed2               7\nsetglobal TW_DEVICEEVENT.AutomaticCapture         8\nsetglobal TW_DEVICEEVENT.TimeBeforeFirstCapture   9\nsetglobal TW_DEVICEEVENT.TimeBetweenCaptures      10\n;\n; These index off TW_CAPABILITY, which is why they don't start at 0...\nsetglobal TW_ENUMERATION.ItemType                 2\nsetglobal TW_ENUMERATION.NumItems                 3\nsetglobal TW_ENUMERATION.CurrentIndex             4\nsetglobal TW_ENUMERATION.DefaultIndex             5\nsetglobal TW_ENUMERATION.ItemList                 6\n;\nsetglobal TW_EXTIMAGEINFO.NumInfos                0\nsetglobal TW_EXTIMAGEINFO.Info                    1\n;\nsetglobal TW_FILESYSTEM.InputName                 0\nsetglobal TW_FILESYSTEM.OutputName                1\nsetglobal TW_FILESYSTEM.Context                   2\nsetglobal TW_FILESYSTEM.Recursive                 3 ; union #1\nsetglobal TW_FILESYSTEM.Subdirectories            3 ; union #1\nsetglobal TW_FILESYSTEM.FileType                  4 ; union #2\nsetglobal TW_FILESYSTEM.FileSystemType            4 ; union #2\nsetglobal TW_FILESYSTEM.Size                      5\nsetglobal TW_FILESYSTEM.CreateTimeDate            6\nsetglobal TW_FILESYSTEM.ModifiedTimeDate          7\nsetglobal TW_FILESYSTEM.FreeSpace                 8\nsetglobal TW_FILESYSTEM.NewImageSize              9\nsetglobal TW_FILESYSTEM.NumberOfFiles             10\nsetglobal TW_FILESYSTEM.NumberOfSnippets          11\nsetglobal TW_FILESYSTEM.DeviceGroupMask           12\nsetglobal TW_FILESYSTEM.Reserved                  13\n;\nsetglobal TW_IDENTITY.Id                          0\nsetglobal TW_IDENTITY.Version.MajorNum            1\nsetglobal TW_IDENTITY.Version.MinorNum            2\nsetglobal TW_IDENTITY.Version.Language            3\nsetglobal TW_IDENTITY.Version.Country             4\nsetglobal TW_IDENTITY.Version.Info                5\nsetglobal TW_IDENTITY.ProtocolMajor               6\nsetglobal TW_IDENTITY.ProtocolMinor               7\nsetglobal TW_IDENTITY.SupportedGroups             8\nsetglobal TW_IDENTITY.Manufacturer                9\nsetglobal TW_IDENTITY.ProductFamily               10\nsetglobal TW_IDENTITY.ProductName                 11\n;\nsetglobal TW_IMAGEINFO.XResolution                0\nsetglobal TW_IMAGEINFO.YResolution                1\nsetglobal TW_IMAGEINFO.ImageWidth                 2\nsetglobal TW_IMAGEINFO.ImageHeight                3\nsetglobal TW_IMAGEINFO.SamplesPerPixel            4\nsetglobal TW_IMAGEINFO.BitsPerSample              5 ; 8 elements in this one\nsetglobal TW_IMAGEINFO.BitsPerPixel               13\nsetglobal TW_IMAGEINFO.Planar                     14\nsetglobal TW_IMAGEINFO.PixelType                  15\nsetglobal TW_IMAGEINFO.Compression                16\n;\nsetglobal TW_IMAGELAYOUT.Frame.Left               0\nsetglobal TW_IMAGELAYOUT.Frame.Top                1\nsetglobal TW_IMAGELAYOUT.Frame.Right              2\nsetglobal TW_IMAGELAYOUT.Frame.Bottom             3\nsetglobal TW_IMAGELAYOUT.Frame.DocumentNumber     4\nsetglobal TW_IMAGELAYOUT.Frame.PageNumber         5\nsetglobal TW_IMAGELAYOUT.Frame.FrameNumber        6\n;\n; These index off TW_EXTIMAGEINFO, which is why they don't start at 0...\nsetglobal TW_INFO.InfoID                          1\nsetglobal TW_INFO.ItemType                        2\nsetglobal TW_INFO.NumItems                        3\nsetglobal TW_INFO.ReturnCode                      4\nsetglobal TW_INFO.Item                            5\n;\nsetglobal TW_METRICS.SizeOf                       0\nsetglobal TW_METRICS.ImageCount                   1\nsetglobal TW_METRICS.SheetCount                   2\n;\n; These index off TW_CAPABILITY, which is why they don't start at 0...\nsetglobal TW_ONEVALUE.ItemType        \t          2\nsetglobal TW_ONEVALUE.Item                        3\n;\nsetglobal TW_PENDINGXFERS.Count                   0\nsetglobal TW_PENDINGXFERS.Reserved                1\nsetglobal TW_PENDINGXFERS.TW_JOBCONTROL.EOJ       2 ; macOS only\n;\n; These index off TW_CAPABILITY, which is why they don't start at 0...\nsetglobal TW_RANGE.ItemType                       2\nsetglobal TW_RANGE.MinValue                       3\nsetglobal TW_RANGE.MaxValue                       4\nsetglobal TW_RANGE.StepSize                       5\nsetglobal TW_RANGE.DefaultValue                   6\nsetglobal TW_RANGE.CurrentValue                   7\n;\nsetglobal TW_SETUPFILEXFER.FileName               0\nsetglobal TW_SETUPFILEXFER.Format                 1\nsetglobal TW_SETUPFILEXFER.VRefNum                2\n;\nsetglobal TW_SETUPMEMXFER.MinBufSize              0\nsetglobal TW_SETUPMEMXFER.MaxBufSize              1\nsetglobal TW_SETUPMEMXFER.Preferred               2\n;\nsetglobal TW_STATUS.ConditionCode                 0\nsetglobal TW_STATUS.Data                          1\nsetglobal TW_STATUS.Reserved                      1 ; whatever >.<\n;\nsetglobal TW_STATUSUTF8.Status.ConditionCode      0\nsetglobal TW_STATUSUTF8.Status.Data               1\nsetglobal TW_STATUSUTF8.Status.Reserved           1 ; see above\nsetglobal TW_STATUSUTF8.Size                      2\nsetglobal TW_STATUSUTF8.UTF8string                3\n;\nsetglobal TW_TWAINDIRECT.SizeOf                   0\nsetglobal TW_TWAINDIRECT.CommunicationManager     1\nsetglobal TW_TWAINDIRECT.Send                     2\nsetglobal TW_TWAINDIRECT.SendSize                 3\nsetglobal TW_TWAINDIRECT.Receive                  4\nsetglobal TW_TWAINDIRECT.ReceiveSize              5\n;\nsetglobal TW_USERINTERFACE.ShowUI                 0\nsetglobal TW_USERINTERFACE.ModalUI                1\nsetglobal TW_USERINTERFACE.hParent                2\n;\nreturn\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Function: LOADCAPABILITYTABLE\n; Loads stuff we need to confirm about each known capability, we'll skip the\n; g_ prefix for these items.  Note the use of sys_capabilitytable, this will\n; record the names of all the capabilities for us, so we can access them in\n; any script...\n;\n:LOADCAPABILITYTABLE\n;\nsetrecord on 'sys_capabilitytable' '.Flags' '.Flags'\n;\nsetglobal ACAP_XFERMECH.ConType                              TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ACAP_XFERMECH.ItemType                             TWTY_UINT16\nsetglobal ACAP_XFERMECH.ValueAfterOpen                       TWSX_NATIVE\nsetglobal ACAP_XFERMECH.ValueAfterReset                      TWSX_NATIVE\nsetglobal ACAP_XFERMECH.Flags                                ''\n;\nsetglobal CAP_ALARMS.ConType                                 TWON_ARRAY\nsetglobal CAP_ALARMS.ItemType                                TWTY_UINT16\nsetglobal CAP_ALARMS.ValueAfterOpen                          UNDEFINED\nsetglobal CAP_ALARMS.ValueAfterReset                         UNDEFINED\nsetglobal CAP_ALARMS.Flags                                   ''\n;\nsetglobal CAP_ALARMVOLUME.ConType                            TWON_RANGE,TWON_ONEVALUE\nsetglobal CAP_ALARMVOLUME.ItemType                           TWTY_INT32\nsetglobal CAP_ALARMVOLUME.ValueAfterOpen                     UNDEFINED\nsetglobal CAP_ALARMVOLUME.ValueAfterReset                    UNDEFINED\nsetglobal CAP_ALARMVOLUME.Flags                              ''\n;\nsetglobal CAP_AUTHOR.ConType                                 TWON_ONEVALUE\nsetglobal CAP_AUTHOR.ItemType                                TWTY_STR128\nsetglobal CAP_AUTHOR.ValueAfterOpen                          ''\nsetglobal CAP_AUTHOR.ValueAfterReset                         ''\nsetglobal CAP_AUTHOR.Flags                                   ''\n;\nsetglobal CAP_AUTOFEED.ConType                               TWON_ENUMERATION\nsetglobal CAP_AUTOFEED.ItemType                              TWTY_BOOL\nsetglobal CAP_AUTOFEED.ValueAfterOpen                        UNDEFINED\nsetglobal CAP_AUTOFEED.ValueAfterReset                       TRUE\nsetglobal CAP_AUTOFEED.Flags                                 ''\n;\nsetglobal CAP_AUTOMATICCAPTURE.ConType                       TWON_RANGE,TWON_ONEVALUE\nsetglobal CAP_AUTOMATICCAPTURE.ItemType                      TWTY_INT32\nsetglobal CAP_AUTOMATICCAPTURE.ValueAfterOpen                0\nsetglobal CAP_AUTOMATICCAPTURE.ValueAfterReset               0\nsetglobal CAP_AUTOMATICCAPTURE.Flags                         ''\n;\nsetglobal CAP_AUTOMATICSENSEMEDIUM.ConType                   TWON_ENUMERATION\nsetglobal CAP_AUTOMATICSENSEMEDIUM.ItemType                  TWTY_BOOL\nsetglobal CAP_AUTOMATICSENSEMEDIUM.ValueAfterOpen            UNDEFINED\nsetglobal CAP_AUTOMATICSENSEMEDIUM.ValueAfterReset           UNDEFINED\nsetglobal CAP_AUTOMATICSENSEMEDIUM.Flags                     ''\n;\nsetglobal CAP_AUTOSCAN.ConType                               TWON_ENUMERATION\nsetglobal CAP_AUTOSCAN.ItemType                              TWTY_BOOL\nsetglobal CAP_AUTOSCAN.ValueAfterOpen                        UNDEFINED\nsetglobal CAP_AUTOSCAN.ValueAfterReset                       TRUE\nsetglobal CAP_AUTOSCAN.Flags                                 ''\n;\nsetglobal CAP_BATTERYMINUTES.ConType                         TWON_ONEVALUE\nsetglobal CAP_BATTERYMINUTES.ItemType                        TWTY_INT32\nsetglobal CAP_BATTERYMINUTES.ValueAfterOpen                  UNEDFINED\nsetglobal CAP_BATTERYMINUTES.ValueAfterReset                 UNEDFINED\nsetglobal CAP_BATTERYMINUTES.Flags                           ''\n;\nsetglobal CAP_BATTERYPERCENTAGE.ConType                      TWON_ONEVALUE\nsetglobal CAP_BATTERYPERCENTAGE.ItemType                     TWTY_INT16\nsetglobal CAP_BATTERYPERCENTAGE.ValueAfterOpen               UNDEFINED\nsetglobal CAP_BATTERYPERCENTAGE.ValueAfterReset              UNDEFINED\nsetglobal CAP_BATTERYPERCENTAGE.Flags                        ''\n;\nsetglobal CAP_CAMERAENABLED.ConType                          TWON_ENUMERATION\nsetglobal CAP_CAMERAENABLED.ItemType                         TWTY_BOOL\nsetglobal CAP_CAMERAENABLED.ValueAfterOpen                   UNDEFINED\nsetglobal CAP_CAMERAENABLED.ValueAfterReset                  UNDEFINED\nsetglobal CAP_CAMERAENABLED.Flags                            ''\n;\nsetglobal CAP_CAMERAORDER.ConType                            TWON_ARRAY\nsetglobal CAP_CAMERAORDER.ItemType                           TWTY_UINT16\nsetglobal CAP_CAMERAORDER.ValueAfterOpen                     UNDEFINED\nsetglobal CAP_CAMERAORDER.ValueAfterReset                    UNDEFINED\nsetglobal CAP_CAMERAORDER.Flags                              ''\n;\nsetglobal CAP_CAMERAPREVIEWUI.ConType                        TWON_ENUMERATION\nsetglobal CAP_CAMERAPREVIEWUI.ItemType                       TWTY_BOOL\nsetglobal CAP_CAMERAPREVIEWUI.ValueAfterOpen                 UNDEFINED\nsetglobal CAP_CAMERAPREVIEWUI.ValueAfterReset                UNDEFINED\nsetglobal CAP_CAMERAPREVIEWUI.Flags                          ''\n;\nsetglobal CAP_CAMERASIDE.ConType                             TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal CAP_CAMERASIDE.ItemType                            TWTY_UINT16\nsetglobal CAP_CAMERASIDE.ValueAfterOpen                      UNDEFINED\nsetglobal CAP_CAMERASIDE.ValueAfterReset                     UNDEFINED ; should be TWCS_BOTH, but need a solution for ADF vs Flatbed\nsetglobal CAP_CAMERASIDE.Flags                               ''\n;\nsetglobal CAP_CAPTION.ConType                                TWON_ONEVALUE\nsetglobal CAP_CAPTION.ItemType                               TWTY_STR255\nsetglobal CAP_CAPTION.ValueAfterOpen                         ''\nsetglobal CAP_CAPTION.ValueAfterReset                        ''\nsetglobal CAP_CAPTION.Flags                                  ''\n;\nsetglobal CAP_CLEARBUFFERS.ConType                           TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal CAP_CLEARBUFFERS.ItemType                          TWTY_BOOL\nsetglobal CAP_CLEARBUFFERS.ValueAfterOpen                    UNDEFINED\nsetglobal CAP_CLEARBUFFERS.ValueAfterReset                   UNDEFINED\nsetglobal CAP_CLEARBUFFERS.Flags                             'deprecated'\n;\nsetglobal CAP_CLEARPAGE.ConType                              TWON_ENUMERATION\nsetglobal CAP_CLEARPAGE.ItemType                             TWTY_BOOL\nsetglobal CAP_CLEARPAGE.ValueAfterOpen                       FALSE\nsetglobal CAP_CLEARPAGE.ValueAfterReset                      FALSE\nsetglobal CAP_CLEARPAGE.Flags                                ''\n;\nsetglobal CAP_CUSTOMDSDATA.ConType                           TWON_ENUMERATION\nsetglobal CAP_CUSTOMDSDATA.ItemType                          TWTY_BOOL\nsetglobal CAP_CUSTOMDSDATA.ValueAfterOpen                    UNDEFINED\nsetglobal CAP_CUSTOMDSDATA.ValueAfterReset                   UNDEFINED\nsetglobal CAP_CUSTOMDSDATA.Flags                             ''\n;\nsetglobal CAP_CUSTOMINTERFACEGUID.ConType                    TWON_ONEVALUE\nsetglobal CAP_CUSTOMINTERFACEGUID.ItemType                   TWTY_STR255\nsetglobal CAP_CUSTOMINTERFACEGUID.ValueAfterOpen             UNDEFINED\nsetglobal CAP_CUSTOMINTERFACEGUID.ValueAfterReset            UNDEFINED\nsetglobal CAP_CUSTOMINTERFACEGUID.Flags                      ''\n;\nsetglobal CAP_DEVICEEVENT.ConType                            TWON_ARRAY\nsetglobal CAP_DEVICEEVENT.ItemType                           TWTY_UINT16\nsetglobal CAP_DEVICEEVENT.ValueAfterOpen                     UNDEFINED\nsetglobal CAP_DEVICEEVENT.ValueAfterReset                    ''\nsetglobal CAP_DEVICEEVENT.Flags                              ''\n;\nsetglobal CAP_DEVICEONLINE.ConType                           TWON_ENUMERATION\nsetglobal CAP_DEVICEONLINE.ItemType                          TWTY_BOOL\nsetglobal CAP_DEVICEONLINE.ValueAfterOpen                    UNDEFINED\nsetglobal CAP_DEVICEONLINE.ValueAfterReset                   UNDEFINED\nsetglobal CAP_DEVICEONLINE.Flags                             'mandatory'\n;\nsetglobal CAP_DEVICETIMEDATE.ConType                         TWON_ONEVALUE\nsetglobal CAP_DEVICETIMEDATE.ItemType                        TWTY_STR32\nsetglobal CAP_DEVICETIMEDATE.ValueAfterOpen                  UNDEFINED\nsetglobal CAP_DEVICETIMEDATE.ValueAfterReset                 UNDEFINED\nsetglobal CAP_DEVICETIMEDATE.Flags                           ''\n;\nsetglobal CAP_DOUBLEFEEDDETECTION.ConType                    TWON_ARRAY\nsetglobal CAP_DOUBLEFEEDDETECTION.ItemType                   TWTY_UINT16\nsetglobal CAP_DOUBLEFEEDDETECTION.ValueAfterOpen             UNDEFINED\nsetglobal CAP_DOUBLEFEEDDETECTION.ValueAfterReset            ''\nsetglobal CAP_DOUBLEFEEDDETECTION.Flags                      ''\n;\nsetglobal CAP_DOUBLEFEEDDETECTIONLENGTH.ConType              TWON_RANGE\nsetglobal CAP_DOUBLEFEEDDETECTIONLENGTH.ItemType             TWTY_FIX32\nsetglobal CAP_DOUBLEFEEDDETECTIONLENGTH.ValueAfterOpen       UNDEFINED\nsetglobal CAP_DOUBLEFEEDDETECTIONLENGTH.ValueAfterReset      UNDEFINED\nsetglobal CAP_DOUBLEFEEDDETECTIONLENGTH.Flags                ''\n;\nsetglobal CAP_DOUBLEFEEDDETECTIONRESPONSE.ConType            TWON_ARRAY\nsetglobal CAP_DOUBLEFEEDDETECTIONRESPONSE.ItemType           TWTY_UINT16\nsetglobal CAP_DOUBLEFEEDDETECTIONRESPONSE.ValueAfterOpen     UNDEFINED\nsetglobal CAP_DOUBLEFEEDDETECTIONRESPONSE.ValueAfterReset    UNDEFINED\nsetglobal CAP_DOUBLEFEEDDETECTIONRESPONSE.Flags              ''\n;\nsetglobal CAP_DOUBLEFEEDDETECTIONSENSITIVITY.ConType         TWON_ENUMERATION\nsetglobal CAP_DOUBLEFEEDDETECTIONSENSITIVITY.ItemType        TWTY_UINT16\nsetglobal CAP_DOUBLEFEEDDETECTIONSENSITIVITY.ValueAfterOpen  UNDEFINED\nsetglobal CAP_DOUBLEFEEDDETECTIONSENSITIVITY.ValueAfterReset UNDEFINED\nsetglobal CAP_DOUBLEFEEDDETECTIONSENSITIVITY.Flags           ''\n;\nsetglobal CAP_DUPLEX.ConType                                 TWON_ONEVALUE\nsetglobal CAP_DUPLEX.ItemType                                TWTY_UINT16\nsetglobal CAP_DUPLEX.ValueAfterOpen                          UNDEFINED\nsetglobal CAP_DUPLEX.ValueAfterReset                         UNDEFINED\nsetglobal CAP_DUPLEX.Flags                                   ''\n;\nsetglobal CAP_DUPLEXENABLED.ConType                          TWON_ENUMERATION\nsetglobal CAP_DUPLEXENABLED.ItemType                         TWTY_BOOL\nsetglobal CAP_DUPLEXENABLED.ValueAfterOpen                   UNDEFINED\nsetglobal CAP_DUPLEXENABLED.ValueAfterReset                  UNDEFINED\nsetglobal CAP_DUPLEXENABLED.Flags                            ''\n;\nsetglobal CAP_ENABLEDSUIONLY.ConType                         TWON_ENUMERATION\nsetglobal CAP_ENABLEDSUIONLY.ItemType                        TWTY_BOOL\nsetglobal CAP_ENABLEDSUIONLY.ValueAfterOpen                  UNDEFINED\nsetglobal CAP_ENABLEDSUIONLY.ValueAfterReset                 UNDEFINED\nsetglobal CAP_ENABLEDSUIONLY.Flags                           ''\n;\nsetglobal CAP_ENDORSER.ConType                               TWON_RANGE\nsetglobal CAP_ENDORSER.ItemType                              TWTY_UINT32\nsetglobal CAP_ENDORSER.ValueAfterOpen                        UNDEFINED\nsetglobal CAP_ENDORSER.ValueAfterReset                       1\nsetglobal CAP_ENDORSER.Flags                                 ''\n;\nsetglobal CAP_EXTENDEDCAPS.ConType                           TWON_ARRAY\nsetglobal CAP_EXTENDEDCAPS.ItemType                          TWTY_UINT16\nsetglobal CAP_EXTENDEDCAPS.ValueAfterOpen                    UNDEFINED\nsetglobal CAP_EXTENDEDCAPS.ValueAfterReset                   UNDEFINED\nsetglobal CAP_EXTENDEDCAPS.Flags                             ''\n;\nsetglobal CAP_FEEDERALIGNMENT.ConType                        TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal CAP_FEEDERALIGNMENT.ItemType                       TWTY_UINT16\nsetglobal CAP_FEEDERALIGNMENT.ValueAfterOpen                 UNDEFINED\nsetglobal CAP_FEEDERALIGNMENT.ValueAfterReset                UNDEFINED\nsetglobal CAP_FEEDERALIGNMENT.Flags                          ''\n;\nsetglobal CAP_FEEDERENABLED.ConType                          TWON_ENUMERATION\nsetglobal CAP_FEEDERENABLED.ItemType                         TWTY_BOOL\nsetglobal CAP_FEEDERENABLED.ValueAfterOpen                   UNDEFINED\nsetglobal CAP_FEEDERENABLED.ValueAfterReset                  UNDEFINED\nsetglobal CAP_FEEDERENABLED.Flags                            ''\n;\nsetglobal CAP_FEEDERLOADED.ConType                           TWON_ENUMERATION\nsetglobal CAP_FEEDERLOADED.ItemType                          TWTY_BOOL\nsetglobal CAP_FEEDERLOADED.ValueAfterOpen                    UNDEFINED\nsetglobal CAP_FEEDERLOADED.ValueAfterReset                   UNDEFINED\nsetglobal CAP_FEEDERLOADED.Flags                             ''\n;\nsetglobal CAP_FEEDERORDER.ConType                            TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal CAP_FEEDERORDER.ItemType                           TWTY_UINT16\nsetglobal CAP_FEEDERORDER.ValueAfterOpen                     UNDEFINED\nsetglobal CAP_FEEDERORDER.ValueAfterReset                    UNDEFINED\nsetglobal CAP_FEEDERORDER.Flags                              ''\n;\nsetglobal CAP_FEEDERPOCKET.ConType                           TWON_ARRAY\nsetglobal CAP_FEEDERPOCKET.ItemType                          TWTY_UINT16\nsetglobal CAP_FEEDERPOCKET.ValueAfterOpen                    UNDEFINED\nsetglobal CAP_FEEDERPOCKET.ValueAfterReset                   UNDEFINED\nsetglobal CAP_FEEDERPOCKET.Flags                             ''\n;\nsetglobal CAP_FEEDERPREP.ConType                             TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal CAP_FEEDERPREP.ItemType                            TWTY_BOOL\nsetglobal CAP_FEEDERPREP.ValueAfterOpen                      UNDEFINED\nsetglobal CAP_FEEDERPREP.ValueAfterReset                     FALSE\nsetglobal CAP_FEEDERPREP.Flags                               ''\n;\nsetglobal CAP_FEEDPAGE.ConType                               TWON_ENUMERATION\nsetglobal CAP_FEEDPAGE.ItemType                              TWTY_BOOL\nsetglobal CAP_FEEDPAGE.ValueAfterOpen                        UNDEFINED\nsetglobal CAP_FEEDPAGE.ValueAfterReset                       UNDEFINED\nsetglobal CAP_FEEDPAGE.Flags                                 ''\n;\nsetglobal CAP_IAFIELDA_LASTPAGE.ConType                      TWON_ONEVALUE\nsetglobal CAP_IAFIELDA_LASTPAGE.ItemType                     TWTY_STR32\nsetglobal CAP_IAFIELDA_LASTPAGE.ValueAfterOpen               UNDEFINED\nsetglobal CAP_IAFIELDA_LASTPAGE.ValueAfterReset              UNDEFINED\nsetglobal CAP_IAFIELDA_LASTPAGE.Flags                        ''\n;\nsetglobal CAP_IAFIELDB_LASTPAGE.ConType                      TWON_ONEVALUE\nsetglobal CAP_IAFIELDB_LASTPAGE.ItemType                     TWTY_STR32\nsetglobal CAP_IAFIELDB_LASTPAGE.ValueAfterOpen               UNDEFINED\nsetglobal CAP_IAFIELDB_LASTPAGE.ValueAfterReset              UNDEFINED\nsetglobal CAP_IAFIELDB_LASTPAGE.Flags                        ''\n;\nsetglobal CAP_IAFIELDC_LASTPAGE.ConType                      TWON_ONEVALUE\nsetglobal CAP_IAFIELDC_LASTPAGE.ItemType                     TWTY_STR32\nsetglobal CAP_IAFIELDC_LASTPAGE.ValueAfterOpen               UNDEFINED\nsetglobal CAP_IAFIELDC_LASTPAGE.ValueAfterReset              UNDEFINED\nsetglobal CAP_IAFIELDC_LASTPAGE.Flags                        ''\n;\nsetglobal CAP_IAFIELDD_LASTPAGE.ConType                      TWON_ONEVALUE\nsetglobal CAP_IAFIELDD_LASTPAGE.ItemType                     TWTY_STR32\nsetglobal CAP_IAFIELDD_LASTPAGE.ValueAfterOpen               UNDEFINED\nsetglobal CAP_IAFIELDD_LASTPAGE.ValueAfterReset              UNDEFINED\nsetglobal CAP_IAFIELDD_LASTPAGE.Flags                        ''\n;\nsetglobal CAP_IAFIELDE_LASTPAGE.ConType                      TWON_ONEVALUE\nsetglobal CAP_IAFIELDE_LASTPAGE.ItemType                     TWTY_STR32\nsetglobal CAP_IAFIELDE_LASTPAGE.ValueAfterOpen               UNDEFINED\nsetglobal CAP_IAFIELDE_LASTPAGE.ValueAfterReset              UNDEFINED\nsetglobal CAP_IAFIELDE_LASTPAGE.Flags                        ''\n;\nsetglobal CAP_IAFIELDA_LEVEL.ConType                         TWON_ENUMERATION\nsetglobal CAP_IAFIELDA_LEVEL.ItemType                        TWTY_UINT16\nsetglobal CAP_IAFIELDA_LEVEL.ValueAfterOpen                  UNDEFINED\nsetglobal CAP_IAFIELDA_LEVEL.ValueAfterReset                 TWIA_UNUSED\nsetglobal CAP_IAFIELDA_LEVEL.Flags                           ''\n;\nsetglobal CAP_IAFIELDB_LEVEL.ConType                         TWON_ENUMERATION\nsetglobal CAP_IAFIELDB_LEVEL.ItemType                        TWTY_UINT16\nsetglobal CAP_IAFIELDB_LEVEL.ValueAfterOpen                  UNDEFINED\nsetglobal CAP_IAFIELDB_LEVEL.ValueAfterReset                 TWIA_UNUSED\nsetglobal CAP_IAFIELDB_LEVEL.Flags                           ''\n;\nsetglobal CAP_IAFIELDC_LEVEL.ConType                         TWON_ENUMERATION\nsetglobal CAP_IAFIELDC_LEVEL.ItemType                        TWTY_UINT16\nsetglobal CAP_IAFIELDC_LEVEL.ValueAfterOpen                  UNDEFINED\nsetglobal CAP_IAFIELDC_LEVEL.ValueAfterReset                 TWIA_UNUSED\nsetglobal CAP_IAFIELDC_LEVEL.Flags                           ''\n;\nsetglobal CAP_IAFIELDD_LEVEL.ConType                         TWON_ENUMERATION\nsetglobal CAP_IAFIELDD_LEVEL.ItemType                        TWTY_UINT16\nsetglobal CAP_IAFIELDD_LEVEL.ValueAfterOpen                  UNDEFINED\nsetglobal CAP_IAFIELDD_LEVEL.ValueAfterReset                 TWIA_UNUSED\nsetglobal CAP_IAFIELDD_LEVEL.Flags                           ''\n;\nsetglobal CAP_IAFIELDE_LEVEL.ConType                         TWON_ENUMERATION\nsetglobal CAP_IAFIELDE_LEVEL.ItemType                        TWTY_UINT16\nsetglobal CAP_IAFIELDE_LEVEL.ValueAfterOpen                  UNDEFINED\nsetglobal CAP_IAFIELDE_LEVEL.ValueAfterReset                 TWIA_UNUSED\nsetglobal CAP_IAFIELDE_LEVEL.Flags                           ''\n;\nsetglobal CAP_IAFIELDA_PRINTFORMAT.ConType                   TWON_ONEVALUE\nsetglobal CAP_IAFIELDA_PRINTFORMAT.ItemType                  TWTY_STR32\nsetglobal CAP_IAFIELDA_PRINTFORMAT.ValueAfterOpen            UNDEFINED\nsetglobal CAP_IAFIELDA_PRINTFORMAT.ValueAfterReset           UNDEFINED\nsetglobal CAP_IAFIELDA_PRINTFORMAT.Flags                     ''\n;\nsetglobal CAP_IAFIELDB_PRINTFORMAT.ConType                   TWON_ONEVALUE\nsetglobal CAP_IAFIELDB_PRINTFORMAT.ItemType                  TWTY_STR32\nsetglobal CAP_IAFIELDB_PRINTFORMAT.ValueAfterOpen            UNDEFINED\nsetglobal CAP_IAFIELDB_PRINTFORMAT.ValueAfterReset           UNDEFINED\nsetglobal CAP_IAFIELDB_PRINTFORMAT.Flags                     ''\n;\nsetglobal CAP_IAFIELDC_PRINTFORMAT.ConType                   TWON_ONEVALUE\nsetglobal CAP_IAFIELDC_PRINTFORMAT.ItemType                  TWTY_STR32\nsetglobal CAP_IAFIELDC_PRINTFORMAT.ValueAfterOpen            UNDEFINED\nsetglobal CAP_IAFIELDC_PRINTFORMAT.ValueAfterReset           UNDEFINED\nsetglobal CAP_IAFIELDC_PRINTFORMAT.Flags                     ''\n;\nsetglobal CAP_IAFIELDD_PRINTFORMAT.ConType                   TWON_ONEVALUE\nsetglobal CAP_IAFIELDD_PRINTFORMAT.ItemType                  TWTY_STR32\nsetglobal CAP_IAFIELDD_PRINTFORMAT.ValueAfterOpen            UNDEFINED\nsetglobal CAP_IAFIELDD_PRINTFORMAT.ValueAfterReset           UNDEFINED\nsetglobal CAP_IAFIELDD_PRINTFORMAT.Flags                     ''\n;\nsetglobal CAP_IAFIELDE_PRINTFORMAT.ConType                   TWON_ONEVALUE\nsetglobal CAP_IAFIELDE_PRINTFORMAT.ItemType                  TWTY_STR32\nsetglobal CAP_IAFIELDE_PRINTFORMAT.ValueAfterOpen            UNDEFINED\nsetglobal CAP_IAFIELDE_PRINTFORMAT.ValueAfterReset           UNDEFINED\nsetglobal CAP_IAFIELDE_PRINTFORMAT.Flags                     ''\n;\nsetglobal CAP_IAFIELDA_VALUE.ConType                         TWON_ONEVALUE\nsetglobal CAP_IAFIELDA_VALUE.ItemType                        TWTY_STR32\nsetglobal CAP_IAFIELDA_VALUE.ValueAfterOpen                  UNDEFINED\nsetglobal CAP_IAFIELDA_VALUE.ValueAfterReset                 UNDEFINED\nsetglobal CAP_IAFIELDA_VALUE.Flags                           ''\n;\nsetglobal CAP_IAFIELDB_VALUE.ConType                         TWON_ONEVALUE\nsetglobal CAP_IAFIELDB_VALUE.ItemType                        TWTY_STR32\nsetglobal CAP_IAFIELDB_VALUE.ValueAfterOpen                  UNDEFINED\nsetglobal CAP_IAFIELDB_VALUE.ValueAfterReset                 UNDEFINED\nsetglobal CAP_IAFIELDB_VALUE.Flags                           ''\n;\nsetglobal CAP_IAFIELDC_VALUE.ConType                         TWON_ONEVALUE\nsetglobal CAP_IAFIELDC_VALUE.ItemType                        TWTY_STR32\nsetglobal CAP_IAFIELDC_VALUE.ValueAfterOpen                  UNDEFINED\nsetglobal CAP_IAFIELDC_VALUE.ValueAfterReset                 UNDEFINED\nsetglobal CAP_IAFIELDC_VALUE.Flags                           ''\n;\nsetglobal CAP_IAFIELDD_VALUE.ConType                         TWON_ONEVALUE\nsetglobal CAP_IAFIELDD_VALUE.ItemType                        TWTY_STR32\nsetglobal CAP_IAFIELDD_VALUE.ValueAfterOpen                  UNDEFINED\nsetglobal CAP_IAFIELDD_VALUE.ValueAfterReset                 UNDEFINED\nsetglobal CAP_IAFIELDD_VALUE.Flags                           ''\n;\nsetglobal CAP_IAFIELDE_VALUE.ConType                         TWON_ONEVALUE\nsetglobal CAP_IAFIELDE_VALUE.ItemType                        TWTY_STR32\nsetglobal CAP_IAFIELDE_VALUE.ValueAfterOpen                  UNDEFINED\nsetglobal CAP_IAFIELDE_VALUE.ValueAfterReset                 UNDEFINED\nsetglobal CAP_IAFIELDE_VALUE.Flags                           ''\n;\nsetglobal CAP_IMAGEADDRESSENABLED.ConType                    TWON_ENUMERATION\nsetglobal CAP_IMAGEADDRESSENABLED.ItemType                   TWTY_BOOL\nsetglobal CAP_IMAGEADDRESSENABLED.ValueAfterOpen             UNDEFINED\nsetglobal CAP_IMAGEADDRESSENABLED.ValueAfterReset            FALSE\nsetglobal CAP_IMAGEADDRESSENABLED.Flags                      ''\n;\nsetglobal CAP_INDICATORS.ConType                             TWON_ENUMERATION\nsetglobal CAP_INDICATORS.ItemType                            TWTY_BOOL\nsetglobal CAP_INDICATORS.ValueAfterOpen                      TRUE\nsetglobal CAP_INDICATORS.ValueAfterReset                     TRUE\nsetglobal CAP_INDICATORS.Flags                               ''\n;\nsetglobal CAP_INDICATORSMODE.ConType                         TWON_ARRAY\nsetglobal CAP_INDICATORSMODE.ItemType                        TWTY_UINT16\nsetglobal CAP_INDICATORSMODE.ValueAfterOpen                  UNDEFINED\nsetglobal CAP_INDICATORSMODE.ValueAfterReset                 UNDEFINED\nsetglobal CAP_INDICATORSMODE.Flags                           ''\n;\nsetglobal CAP_JOBCONTROL.ConType                             TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal CAP_JOBCONTROL.ItemType                            TWTY_UINT16\nsetglobal CAP_JOBCONTROL.ValueAfterOpen                      UNDEFINED\nsetglobal CAP_JOBCONTROL.ValueAfterReset                     TWJC_NONE\nsetglobal CAP_JOBCONTROL.Flags                               ''\n;\nsetglobal CAP_LANGUAGE.ConType                               TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal CAP_LANGUAGE.ItemType                              TWTY_UINT16\nsetglobal CAP_LANGUAGE.ValueAfterOpen                        UNDEFINED\nsetglobal CAP_LANGUAGE.ValueAfterReset                       UNDEFINED\nsetglobal CAP_LANGUAGE.Flags                                 ''\n;\nsetglobal CAP_MAXBATCHBUFFERS.ConType                        TWON_RANGE,TWON_ONEVALUE\nsetglobal CAP_MAXBATCHBUFFERS.ItemType                       TWTY_UINT32\nsetglobal CAP_MAXBATCHBUFFERS.ValueAfterOpen                 UNDEFINED\nsetglobal CAP_MAXBATCHBUFFERS.ValueAfterReset                UNDEFINED\nsetglobal CAP_MAXBATCHBUFFERS.Flags                          ''\n;\nsetglobal CAP_MICRENABLED.ConType                            TWON_ENUMERATION\nsetglobal CAP_MICRENABLED.ItemType                           TWTY_BOOL\nsetglobal CAP_MICRENABLED.ValueAfterOpen                     UNDEFINED\nsetglobal CAP_MICRENABLED.ValueAfterReset                    FALSE\nsetglobal CAP_MICRENABLED.Flags                              ''\n;\nsetglobal CAP_PAGEMULTIREACQUIRE.ConType                     TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal CAP_PAGEMULTIREACQUIRE.ItemType                    TWTY_BOOL\nsetglobal CAP_PAGEMULTIREACQUIRE.ValueAfterOpen              UNDEFINED\nsetglobal CAP_PAGEMULTIREACQUIRE.ValueAfterReset             UNDEFINED\nsetglobal CAP_PAGEMULTIREACQUIRE.Flags                       'deprecated'\n;\nsetglobal CAP_PAPERBINDING.ConType                           TWON_ENUMERATION\nsetglobal CAP_PAPERBINDING.ItemType                          TWTY_UINT16\nsetglobal CAP_PAPERBINDING.ValueAfterOpen                    UNDEFINED\nsetglobal CAP_PAPERBINDING.ValueAfterReset                   UNDEFINED\nsetglobal CAP_PAPERBINDING.Flags                             'deprecated'\n;\nsetglobal CAP_PAPERDETECTABLE.ConType                        TWON_ENUMERATION\nsetglobal CAP_PAPERDETECTABLE.ItemType                       TWTY_BOOL\nsetglobal CAP_PAPERDETECTABLE.ValueAfterOpen                 UNDEFINED\nsetglobal CAP_PAPERDETECTABLE.ValueAfterReset                UNDEFINED\nsetglobal CAP_PAPERDETECTABLE.Flags                          ''\n;\nsetglobal CAP_PAPERHANDLING.ConType                          TWON_ARRAY\nsetglobal CAP_PAPERHANDLING.ItemType                         TWTY_UINT16\nsetglobal CAP_PAPERHANDLING.ValueAfterOpen                   UNDEFINED\nsetglobal CAP_PAPERHANDLING.ValueAfterReset                  TWPH_NORMAL\nsetglobal CAP_PAPERHANDLING.Flags                            ''\n;\nsetglobal CAP_PASSTHRU.ConType                               TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal CAP_PASSTHRU.ItemType                              TWTY_BOOL\nsetglobal CAP_PASSTHRU.ValueAfterOpen                        UNDEFINED\nsetglobal CAP_PASSTHRU.ValueAfterReset                       UNDEFINED\nsetglobal CAP_PASSTHRU.Flags                                 'deprecated'\n;\nsetglobal CAP_POWERSAVETIME.ConType                          TWON_RANGE\nsetglobal CAP_POWERSAVETIME.ItemType                         TWTY_INT32\nsetglobal CAP_POWERSAVETIME.ValueAfterOpen                   UNDEFINED\nsetglobal CAP_POWERSAVETIME.ValueAfterReset                  UNDEFINED\nsetglobal CAP_POWERSAVETIME.Flags                            ''\n;\nsetglobal CAP_POWERSUPPLY.ConType                            TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal CAP_POWERSUPPLY.ItemType                           TWTY_UINT16\nsetglobal CAP_POWERSUPPLY.ValueAfterOpen                     UNDEFINED\nsetglobal CAP_POWERSUPPLY.ValueAfterReset                    UNDEFINED\nsetglobal CAP_POWERSUPPLY.Flags                              ''\n;\nsetglobal CAP_PRINTER.ConType                                TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal CAP_PRINTER.ItemType                               TWTY_UINT16\nsetglobal CAP_PRINTER.ValueAfterOpen                         UNDEFINED\nsetglobal CAP_PRINTER.ValueAfterReset                        UNDEFINED\nsetglobal CAP_PRINTER.Flags                                  ''\n;\nsetglobal CAP_PRINTERENABLED.ConType                         TWON_ENUMERATION\nsetglobal CAP_PRINTERENABLED.ItemType                        TWTY_BOOL\nsetglobal CAP_PRINTERENABLED.ValueAfterOpen                  UNDEFINED\nsetglobal CAP_PRINTERENABLED.ValueAfterReset                 FALSE\nsetglobal CAP_PRINTERENABLED.Flags                           ''\n;\nsetglobal CAP_PRINTERCHARROTATION.ConType                    TWON_ENUMERATION,TWON_RANGE,TWON_ONEVALUE\nsetglobal CAP_PRINTERCHARROTATION.ItemType                   TWTY_UINT32\nsetglobal CAP_PRINTERCHARROTATION.ValueAfterOpen             UNDEFINED\nsetglobal CAP_PRINTERCHARROTATION.ValueAfterReset            0\nsetglobal CAP_PRINTERCHARROTATION.Flags                      ''\n;\nsetglobal CAP_PRINTERFONTSTYLE.ConType                       TWON_ARRAY\nsetglobal CAP_PRINTERFONTSTYLE.ItemType                      TWTY_UINT16\nsetglobal CAP_PRINTERFONTSTYLE.ValueAfterOpen                UNDEFINED\nsetglobal CAP_PRINTERFONTSTYLE.ValueAfterReset               TWPF_NORMAL\nsetglobal CAP_PRINTERFONTSTYLE.Flags                         ''\n;\nsetglobal CAP_PRINTERINDEX.ConType                           TWON_RANGE,TWON_ONEVALUE\nsetglobal CAP_PRINTERINDEX.ItemType                          TWTY_UINT32\nsetglobal CAP_PRINTERINDEX.ValueAfterOpen                    UNDEFINED\nsetglobal CAP_PRINTERINDEX.ValueAfterReset                   UNDEFINED\nsetglobal CAP_PRINTERINDEX.Flags                             ''\n;\nsetglobal CAP_PRINTERINDEXLEADCHAR.ConType                   TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal CAP_PRINTERINDEXLEADCHAR.ItemType                  TWTY_STR32\nsetglobal CAP_PRINTERINDEXLEADCHAR.ValueAfterOpen            UNDEFINED\nsetglobal CAP_PRINTERINDEXLEADCHAR.ValueAfterReset           UNDEFINED\nsetglobal CAP_PRINTERINDEXLEADCHAR.Flags                     ''\n;\nsetglobal CAP_PRINTERINDEXMAXVALUE.ConType                   TWON_ENUMERATION,TWON_RANGE,TWON_ONEVALUE\nsetglobal CAP_PRINTERINDEXMAXVALUE.ItemType                  TWTY_UINT32\nsetglobal CAP_PRINTERINDEXMAXVALUE.ValueAfterOpen            UNDEFINED\nsetglobal CAP_PRINTERINDEXMAXVALUE.ValueAfterReset           0\nsetglobal CAP_PRINTERINDEXMAXVALUE.Flags                     ''\n;\nsetglobal CAP_PRINTERINDEXNUMDIGITS.ConType                  TWON_ENUMERATION,TWON_RANGE,TWON_ONEVALUE\nsetglobal CAP_PRINTERINDEXNUMDIGITS.ItemType                 TWTY_UINT32\nsetglobal CAP_PRINTERINDEXNUMDIGITS.ValueAfterOpen           UNDEFINED\nsetglobal CAP_PRINTERINDEXNUMDIGITS.ValueAfterReset          0\nsetglobal CAP_PRINTERINDEXNUMDIGITS.Flags                    ''\n;\nsetglobal CAP_PRINTERINDEXSTEP.ConType                       TWON_ENUMERATION,TWON_RANGE,TWON_ONEVALUE\nsetglobal CAP_PRINTERINDEXSTEP.ItemType                      TWTY_UINT32\nsetglobal CAP_PRINTERINDEXSTEP.ValueAfterOpen                UNDEFINED\nsetglobal CAP_PRINTERINDEXSTEP.ValueAfterReset               1\nsetglobal CAP_PRINTERINDEXSTEP.Flags                         ''\n;\nsetglobal CAP_PRINTERINDEXTRIGGER.ConType                    TWON_ARRAY\nsetglobal CAP_PRINTERINDEXTRIGGER.ItemType                   TWTY_UINT16\nsetglobal CAP_PRINTERINDEXTRIGGER.ValueAfterOpen             UNDEFINED\nsetglobal CAP_PRINTERINDEXTRIGGER.ValueAfterReset            TWCT_PAGE\nsetglobal CAP_PRINTERINDEXTRIGGER.Flags                      ''\n;\nsetglobal CAP_PRINTERMODE.ConType                            TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal CAP_PRINTERMODE.ItemType                           TWTY_UINT16\nsetglobal CAP_PRINTERMODE.ValueAfterOpen                     UNDEFINED\nsetglobal CAP_PRINTERMODE.ValueAfterReset                    UNDEFINED\nsetglobal CAP_PRINTERMODE.Flags                              ''\n;\nsetglobal CAP_PRINTERSTRING.ConType                          TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal CAP_PRINTERSTRING.ItemType                         TWTY_STR255\nsetglobal CAP_PRINTERSTRING.ValueAfterOpen                   UNDEFINED\nsetglobal CAP_PRINTERSTRING.ValueAfterReset                  UNDEFINED\nsetglobal CAP_PRINTERSTRING.Flags                            ''\n;\nsetglobal CAP_PRINTERSTRINGPREVIEW.ConType                   TWON_ARRAY\nsetglobal CAP_PRINTERSTRINGPREVIEW.ItemType                  TWTY_STR255\nsetglobal CAP_PRINTERSTRINGPREVIEW.ValueAfterOpen            UNDEFINED\nsetglobal CAP_PRINTERSTRINGPREVIEW.ValueAfterReset           UNDEFINED\nsetglobal CAP_PRINTERSTRINGPREVIEW.Flags                     ''\n;\nsetglobal CAP_PRINTERSUFFIX.ConType                          TWON_ONEVALUE\nsetglobal CAP_PRINTERSUFFIX.ItemType                         TWTY_STR255\nsetglobal CAP_PRINTERSUFFIX.ValueAfterOpen                   UNDEFINED\nsetglobal CAP_PRINTERSUFFIX.ValueAfterReset                  UNDEFINED\nsetglobal CAP_PRINTERSUFFIX.Flags                            ''\n;\nsetglobal CAP_PRINTERVERTICALOFFSET.ConType                  TWON_RANGE,TWON_ONEVALUE\nsetglobal CAP_PRINTERVERTICALOFFSET.ItemType                 TWTY_FIX32\nsetglobal CAP_PRINTERVERTICALOFFSET.ValueAfterOpen           UNDEFINED\nsetglobal CAP_PRINTERVERTICALOFFSET.ValueAfterReset          UNDEFINED\nsetglobal CAP_PRINTERVERTICALOFFSET.Flags                    ''\n;\nsetglobal CAP_REACQUIREALLOWED.ConType                       TWON_ENUMERATION\nsetglobal CAP_REACQUIREALLOWED.ItemType                      TWTY_BOOL\nsetglobal CAP_REACQUIREALLOWED.ValueAfterOpen                UNDEFINED\nsetglobal CAP_REACQUIREALLOWED.ValueAfterReset               UNDEFINED\nsetglobal CAP_REACQUIREALLOWED.Flags                         ''\n;\nsetglobal CAP_REWINDPAGE.ConType                             TWON_ENUMERATION\nsetglobal CAP_REWINDPAGE.ItemType                            TWTY_BOOL\nsetglobal CAP_REWINDPAGE.ValueAfterOpen                      FALSE\nsetglobal CAP_REWINDPAGE.ValueAfterReset                     FALSE\nsetglobal CAP_REWINDPAGE.Flags                               ''\n;\nsetglobal CAP_SEGMENTED.ConType                              TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal CAP_SEGMENTED.ItemType                             TWTY_UINT16\nsetglobal CAP_SEGMENTED.ValueAfterOpen                       UNDEFINED\nsetglobal CAP_SEGMENTED.ValueAfterReset                      FALSE\nsetglobal CAP_SEGMENTED.Flags                                ''\n;\nsetglobal CAP_SERIALNUMBER.ConType                           TWON_ONEVALUE\nsetglobal CAP_SERIALNUMBER.ItemType                          TWTY_STR255\nsetglobal CAP_SERIALNUMBER.ValueAfterOpen                    UNDEFINED\nsetglobal CAP_SERIALNUMBER.ValueAfterReset                   UNDEFINED\nsetglobal CAP_SERIALNUMBER.Flags                             ''\n;\nsetglobal CAP_SHEETCOUNT.ConType                             TWON_RANGE,TWON_ONEVALUE\nsetglobal CAP_SHEETCOUNT.ItemType                            TWTY_UINT32\nsetglobal CAP_SHEETCOUNT.ValueAfterOpen                      0\nsetglobal CAP_SHEETCOUNT.ValueAfterReset                     0\nsetglobal CAP_SHEETCOUNT.Flags                               ''\n;\nsetglobal CAP_SUPPORTEDCAPS.ConType                          TWON_ARRAY\nsetglobal CAP_SUPPORTEDCAPS.ItemType                         TWTY_UINT16\nsetglobal CAP_SUPPORTEDCAPS.ValueAfterOpen                   UNDEFINED\nsetglobal CAP_SUPPORTEDCAPS.ValueAfterReset                  UNDEFINED\nsetglobal CAP_SUPPORTEDCAPS.Flags                            'mandatory'\n;\nsetglobal CAP_SUPPORTEDCAPSEXT.ConType                       TWON_ARRAY\nsetglobal CAP_SUPPORTEDCAPSEXT.ItemType                      TWTY_UINT16\nsetglobal CAP_SUPPORTEDCAPSEXT.ValueAfterOpen                UNDEFINED\nsetglobal CAP_SUPPORTEDCAPSEXT.ValueAfterReset               UNDEFINED\nsetglobal CAP_SUPPORTEDCAPSEXT.Flags                         'deprecated'\n;\nsetglobal CAP_SUPPORTEDCAPSSEGMENTUNIQUE.ConType             TWON_ARRAY\nsetglobal CAP_SUPPORTEDCAPSSEGMENTUNIQUE.ItemType            TWTY_UINT16\nsetglobal CAP_SUPPORTEDCAPSSEGMENTUNIQUE.ValueAfterOpen      UNDEFINED\nsetglobal CAP_SUPPORTEDCAPSSEGMENTUNIQUE.ValueAfterReset     UNDEFINED\nsetglobal CAP_SUPPORTEDCAPSSEGMENTUNIQUE.Flags               ''\n;\nsetglobal CAP_SUPPORTEDDATS.ConType                          TWON_ARRAY\nsetglobal CAP_SUPPORTEDDATS.ItemType                         TWTY_UINT32\nsetglobal CAP_SUPPORTEDDATS.ValueAfterOpen                   UNDEFINED\nsetglobal CAP_SUPPORTEDDATS.ValueAfterReset                  UNDEFINED\nsetglobal CAP_SUPPORTEDDATS.Flags                            'mandatory'\n;\nsetglobal CAP_TIMEBEFOREFIRSTCAPTURE.ConType                 TWON_RANGE,TWON_ONEVALUE\nsetglobal CAP_TIMEBEFOREFIRSTCAPTURE.ItemType                TWTY_INT32\nsetglobal CAP_TIMEBEFOREFIRSTCAPTURE.ValueAfterOpen          0\nsetglobal CAP_TIMEBEFOREFIRSTCAPTURE.ValueAfterReset         0\nsetglobal CAP_TIMEBEFOREFIRSTCAPTURE.Flags                   ''\n;\nsetglobal CAP_TIMEBETWEENCAPTURES.ConType                    TWON_RANGE,TWON_ONEVALUE\nsetglobal CAP_TIMEBETWEENCAPTURES.ItemType                   TWTY_INT32\nsetglobal CAP_TIMEBETWEENCAPTURES.ValueAfterOpen             0\nsetglobal CAP_TIMEBETWEENCAPTURES.ValueAfterReset            0\nsetglobal CAP_TIMEBETWEENCAPTURES.Flags                      ''\n;\nsetglobal CAP_TIMEDATE.ConType                               TWON_ONEVALUE\nsetglobal CAP_TIMEDATE.ItemType                              TWTY_STR32\nsetglobal CAP_TIMEDATE.ValueAfterOpen                        UNDEFINED\nsetglobal CAP_TIMEDATE.ValueAfterReset                       UNDEFINED\nsetglobal CAP_TIMEDATE.Flags                                 'notstate4'\n;\nsetglobal CAP_THUMBNAILSENABLED.ConType                      TWON_ENUMERATION\nsetglobal CAP_THUMBNAILSENABLED.ItemType                     TWTY_BOOL\nsetglobal CAP_THUMBNAILSENABLED.ValueAfterOpen               FALSE\nsetglobal CAP_THUMBNAILSENABLED.ValueAfterReset              FALSE\nsetglobal CAP_THUMBNAILSENABLED.Flags                        ''\n;\nsetglobal CAP_UICONTROLLABLE.ConType                         TWON_ENUMERATION\nsetglobal CAP_UICONTROLLABLE.ItemType                        TWTY_BOOL\nsetglobal CAP_UICONTROLLABLE.ValueAfterOpen                  TRUE ; mandatory for all sources\nsetglobal CAP_UICONTROLLABLE.ValueAfterReset                 UNDEFINED\nsetglobal CAP_UICONTROLLABLE.Flags                           'mandatory'\n;\nsetglobal CAP_XFERCOUNT.ConType                              TWON_RANGE,TWON_ONEVALUE\nsetglobal CAP_XFERCOUNT.ItemType                             TWTY_INT16\nsetglobal CAP_XFERCOUNT.ValueAfterOpen                       -1\nsetglobal CAP_XFERCOUNT.ValueAfterReset                      -1\nsetglobal CAP_XFERCOUNT.Flags                                'mandatory'\n;\nsetglobal ICAP_AUTOBRIGHT.ConType                            TWON_ENUMERATION\nsetglobal ICAP_AUTOBRIGHT.ItemType                           TWTY_BOOL\nsetglobal ICAP_AUTOBRIGHT.ValueAfterOpen                     UNDEFINED\nsetglobal ICAP_AUTOBRIGHT.ValueAfterReset                    FALSE\nsetglobal ICAP_AUTOBRIGHT.Flags                              ''\n;\nsetglobal ICAP_AUTODISCARDBLANKPAGES.ConType                 TWON_RANGE,TWON_ONEVALUE\nsetglobal ICAP_AUTODISCARDBLANKPAGES.ItemType                TWTY_INT32\nsetglobal ICAP_AUTODISCARDBLANKPAGES.ValueAfterOpen          UNDEFINED\nsetglobal ICAP_AUTODISCARDBLANKPAGES.ValueAfterReset         -2 ; TWBP_DISABLE\nsetglobal ICAP_AUTODISCARDBLANKPAGES.Flags                   ''\n;\nsetglobal ICAP_AUTOMATICBORDERDETECTION.ConType              TWON_ENUMERATION\nsetglobal ICAP_AUTOMATICBORDERDETECTION.ItemType             TWTY_BOOL\nsetglobal ICAP_AUTOMATICBORDERDETECTION.ValueAfterOpen       UNDEFINED\nsetglobal ICAP_AUTOMATICBORDERDETECTION.ValueAfterReset      UNDEFINED\nsetglobal ICAP_AUTOMATICBORDERDETECTION.Flags                ''\n;\nsetglobal ICAP_AUTOMATICCOLORENABLED.ConType                 TWON_ENUMERATION\nsetglobal ICAP_AUTOMATICCOLORENABLED.ItemType                TWTY_BOOL\nsetglobal ICAP_AUTOMATICCOLORENABLED.ValueAfterOpen          UNDEFINED\nsetglobal ICAP_AUTOMATICCOLORENABLED.ValueAfterReset         FALSE\nsetglobal ICAP_AUTOMATICCOLORENABLED.Flags                   ''\n;\nsetglobal ICAP_AUTOMATICCOLORNONCOLORPIXELTYPE.ConType             TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_AUTOMATICCOLORNONCOLORPIXELTYPE.ItemType            TWTY_UINT16\nsetglobal ICAP_AUTOMATICCOLORNONCOLORPIXELTYPE.ValueAfterOpen      UNDEFINED\nsetglobal ICAP_AUTOMATICCOLORNONCOLORPIXELTYPE.ValueAfterReset     TWPT_BW\nsetglobal ICAP_AUTOMATICCOLORNONCOLORPIXELTYPE.Flags               ''\n;\nsetglobal ICAP_AUTOMATICCROPUSESFRAME.ConType                TWON_ENUMERATION\nsetglobal ICAP_AUTOMATICCROPUSESFRAME.ItemType               TWTY_BOOL\nsetglobal ICAP_AUTOMATICCROPUSESFRAME.ValueAfterOpen         UNDEFINED\nsetglobal ICAP_AUTOMATICCROPUSESFRAME.ValueAfterReset        UNDEFINED\nsetglobal ICAP_AUTOMATICCROPUSESFRAME.Flags                  ''\n;\nsetglobal ICAP_AUTOMATICDESKEW.ConType                       TWON_ENUMERATION\nsetglobal ICAP_AUTOMATICDESKEW.ItemType                      TWTY_BOOL\nsetglobal ICAP_AUTOMATICDESKEW.ValueAfterOpen                UNDEFINED\nsetglobal ICAP_AUTOMATICDESKEW.ValueAfterReset               UNDEFINED\nsetglobal ICAP_AUTOMATICDESKEW.Flags                         ''\n;\nsetglobal ICAP_AUTOMATICLENGTHDETECTION.ConType              TWON_ENUMERATION\nsetglobal ICAP_AUTOMATICLENGTHDETECTION.ItemType             TWTY_BOOL\nsetglobal ICAP_AUTOMATICLENGTHDETECTION.ValueAfterOpen       UNDEFINED\nsetglobal ICAP_AUTOMATICLENGTHDETECTION.ValueAfterReset      UNDEFINED\nsetglobal ICAP_AUTOMATICLENGTHDETECTION.Flags                ''\n;\nsetglobal ICAP_AUTOMATICROTATE.ConType                       TWON_ENUMERATION\nsetglobal ICAP_AUTOMATICROTATE.ItemType                      TWTY_BOOL\nsetglobal ICAP_AUTOMATICROTATE.ValueAfterOpen                UNDEFINED\nsetglobal ICAP_AUTOMATICROTATE.ValueAfterReset               FALSE\nsetglobal ICAP_AUTOMATICROTATE.Flags                         ''\n;\nsetglobal ICAP_AUTOSIZE.ConType                              TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_AUTOSIZE.ItemType                             TWTY_UINT16\nsetglobal ICAP_AUTOSIZE.ValueAfterOpen                       UNDEFINED\nsetglobal ICAP_AUTOSIZE.ValueAfterReset                      TWAS_NONE\nsetglobal ICAP_AUTOSIZE.Flags                                ''\n;\nsetglobal ICAP_BARCODEDETECTIONENABLED.ConType               TWON_ENUMERATION\nsetglobal ICAP_BARCODEDETECTIONENABLED.ItemType              TWTY_BOOL\nsetglobal ICAP_BARCODEDETECTIONENABLED.ValueAfterOpen        UNDEFINED\nsetglobal ICAP_BARCODEDETECTIONENABLED.ValueAfterReset       FALSE\nsetglobal ICAP_BARCODEDETECTIONENABLED.Flags                 ''\n;\nsetglobal ICAP_BARCODEMAXRETRIES.ConType                     TWON_ENUMERATION,TWON_RANGE,TWON_ONEVALUE\nsetglobal ICAP_BARCODEMAXRETRIES.ItemType                    TWTY_UINT32\nsetglobal ICAP_BARCODEMAXRETRIES.ValueAfterOpen              UNDEFINED\nsetglobal ICAP_BARCODEMAXRETRIES.ValueAfterReset             UNDEFINED\nsetglobal ICAP_BARCODEMAXRETRIES.Flags                       ''\n;\nsetglobal ICAP_BARCODEMAXSEARCHPRIORITIES.ConType            TWON_ENUMERATION,TWON_RANGE,TWON_ONEVALUE\nsetglobal ICAP_BARCODEMAXSEARCHPRIORITIES.ItemType           TWTY_UINT32\nsetglobal ICAP_BARCODEMAXSEARCHPRIORITIES.ValueAfterOpen     UNDEFINED\nsetglobal ICAP_BARCODEMAXSEARCHPRIORITIES.ValueAfterOpen     UNDEFINED\nsetglobal ICAP_BARCODEMAXSEARCHPRIORITIES.Flags              ''\n;\nsetglobal ICAP_BARCODESEARCHMODE.ConType                     TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_BARCODESEARCHMODE.ItemType                    TWTY_UINT16\nsetglobal ICAP_BARCODESEARCHMODE.ValueAfterOpen              UNDEFINED\nsetglobal ICAP_BARCODESEARCHMODE.ValueAfterReset             UNDEFINED\nsetglobal ICAP_BARCODESEARCHMODE.Flags                       ''\n;\nsetglobal ICAP_BARCODESEARCHPRIORITIES.ConType               TWON_ARRAY\nsetglobal ICAP_BARCODESEARCHPRIORITIES.ItemType              TWTY_UINT16\nsetglobal ICAP_BARCODESEARCHPRIORITIES.ValueAfterOpen        UNDEFINED\nsetglobal ICAP_BARCODESEARCHPRIORITIES.ValueAfterReset       UNDEFINED\nsetglobal ICAP_BARCODESEARCHPRIORITIES.Flags                 ''\n;\nsetglobal ICAP_BARCODETIMEOUT.ConType                        TWON_ENUMERATION,TWON_RANGE,TWON_ONEVALUE\nsetglobal ICAP_BARCODETIMEOUT.ItemType                       TWTY_UINT32\nsetglobal ICAP_BARCODETIMEOUT.ValueAfterOpen                 UNDEFINED\nsetglobal ICAP_BARCODETIMEOUT.ValueAfterReset                UNDEFINED\nsetglobal ICAP_BARCODETIMEOUT.Flags                          ''\n;\nsetglobal ICAP_BITDEPTH.ConType                              TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_BITDEPTH.ItemType                             TWTY_UINT16\nsetglobal ICAP_BITDEPTH.ValueAfterOpen                       UNDEFINED\nsetglobal ICAP_BITDEPTH.ValueAfterReset                      UNDEFINED\nsetglobal ICAP_BITDEPTH.Flags                                'mandatory'\n;\nsetglobal ICAP_BITDEPTHREDUCTION.ConType                     TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_BITDEPTHREDUCTION.ItemType                    TWTY_UINT16\nsetglobal ICAP_BITDEPTHREDUCTION.ValueAfterOpen              UNDEFINED\nsetglobal ICAP_BITDEPTHREDUCTION.ValueAfterReset             UNDEFINED\nsetglobal ICAP_BITDEPTHREDUCTION.Flags                       ''\n;\nsetglobal ICAP_BITORDER.ConType                              TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_BITORDER.ItemType                             TWTY_UINT16\nsetglobal ICAP_BITORDER.ValueAfterOpen                       UNDEFINED ; spec says TWBO_LSBFIRST, but who ever used this?\nsetglobal ICAP_BITORDER.ValueAfterReset                      UNDEFINED ; spec says TWBO_LSBFIRST, but who ever used this?\nsetglobal ICAP_BITORDER.Flags                                'mandatory'\n;\nsetglobal ICAP_BITORDERCODES.ConType                         TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_BITORDERCODES.ItemType                        TWTY_UINT16\nsetglobal ICAP_BITORDERCODES.ValueAfterOpen                  UNDEFINED\nsetglobal ICAP_BITORDERCODES.ValueAfterReset                 UNDEFINED\nsetglobal ICAP_BITORDERCODES.Flags                           ''\n;\nsetglobal ICAP_BRIGHTNESS.ConType                            TWON_ENUMERATION,TWON_RANGE,TWON_ONEVALUE\nsetglobal ICAP_BRIGHTNESS.ItemType                           TWTY_FIX32\nsetglobal ICAP_BRIGHTNESS.ValueAfterOpen                     UNDEFINED\nsetglobal ICAP_BRIGHTNESS.ValueAfterReset                    0\nsetglobal ICAP_BRIGHTNESS.Flags                              ''\n;\nsetglobal ICAP_CCITTKFACTOR.ConType                          TWON_RANGE,TWON_ONEVALUE\nsetglobal ICAP_CCITTKFACTOR.ItemType                         TWTY_UINT16\nsetglobal ICAP_CCITTKFACTOR.ValueAfterOpen                   UNDEFINED\nsetglobal ICAP_CCITTKFACTOR.ValueAfterReset                  4\nsetglobal ICAP_CCITTKFACTOR.Flags                            ''\n;\nsetglobal ICAP_COLORMANAGEMENTENABLED.ConType                TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_COLORMANAGEMENTENABLED.ItemType               TWTY_UINT16\nsetglobal ICAP_COLORMANAGEMENTENABLED.ValueAfterOpen         TRUE\nsetglobal ICAP_COLORMANAGEMENTENABLED.ValueAfterReset        TRUE\nsetglobal ICAP_COLORMANAGEMENTENABLED.Flags                  ''\n;\nsetglobal ICAP_COMPRESSION.ConType                           TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_COMPRESSION.ItemType                          TWTY_UINT16\nsetglobal ICAP_COMPRESSION.ValueAfterOpen                    UNDEFINED\nsetglobal ICAP_COMPRESSION.ValueAfterReset                   TWCP_NONE\nsetglobal ICAP_COMPRESSION.Flags                             'mandatory'\n;\nsetglobal ICAP_CONTRAST.ConType                              TWON_ENUMERATION,TWON_RANGE,TWON_ONEVALUE\nsetglobal ICAP_CONTRAST.ItemType                             TWTY_FIX32\nsetglobal ICAP_CONTRAST.ValueAfterOpen                       UNDEFINED\nsetglobal ICAP_CONTRAST.ValueAfterReset                      0\nsetglobal ICAP_CONTRAST.Flags                                ''\n;\nsetglobal ICAP_CUSTHALFTONE.ConType                          TWON_ARRAY\nsetglobal ICAP_CUSTHALFTONE.ItemType                         TWTY_UINT8\nsetglobal ICAP_CUSTHALFTONE.ValueAfterOpen                   UNDEFINED\nsetglobal ICAP_CUSTHALFTONE.ValueAfterReset                  UNDEFINED\nsetglobal ICAP_CUSTHALFTONE.Flags                            ''\n;\nsetglobal ICAP_EXPOSURETIME.ConType                          TWON_ENUMERATION,TWON_RANGE,TWON_ONEVALUE\nsetglobal ICAP_EXPOSURETIME.ItemType                         TWTY_FIX32\nsetglobal ICAP_EXPOSURETIME.ValueAfterOpen                   UNDEFINED\nsetglobal ICAP_EXPOSURETIME.ValueAfterReset                  UNDEFINED\nsetglobal ICAP_EXPOSURETIME.Flags                            ''\n;\nsetglobal ICAP_EXTIMAGEINFO.ConType                          TWON_ENUMERATION\nsetglobal ICAP_EXTIMAGEINFO.ItemType                         TWTY_BOOL\nsetglobal ICAP_EXTIMAGEINFO.ValueAfterOpen                   UNDEFINED\nsetglobal ICAP_EXTIMAGEINFO.ValueAfterReset                  TRUE\nsetglobal ICAP_EXTIMAGEINFO.Flags                            ''\n;\nsetglobal ICAP_FEEDERTYPE.ConType                            TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_FEEDERTYPE.ItemType                           TWTY_UINT16\nsetglobal ICAP_FEEDERTYPE.ValueAfterOpen                     UNDEFINED\nsetglobal ICAP_FEEDERTYPE.ValueAfterReset                    UNDEFINED\nsetglobal ICAP_FEEDERTYPE.Flags                              ''\n;\nsetglobal ICAP_FILMTYPE.ConType                              TWON_ENUMERATION\nsetglobal ICAP_FILMTYPE.ItemType                             TWTY_UINT16\nsetglobal ICAP_FILMTYPE.ValueAfterOpen                       UNDEFINED\nsetglobal ICAP_FILMTYPE.ValueAfterReset                      UNDEFINED\nsetglobal ICAP_FILMTYPE.Flags                                ''\n;\nsetglobal ICAP_FILTER.ConType                                TWON_ARRAY,TWON_ONEVALUE\nsetglobal ICAP_FILTER.ItemType                               TWTY_UINT16\nsetglobal ICAP_FILTER.ValueAfterOpen                         UNDEFINED\nsetglobal ICAP_FILTER.ValueAfterReset                        ''\nsetglobal ICAP_FILTER.Flags                                  ''\n;\nsetglobal ICAP_FLASHUSED2.ConType                            TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_FLASHUSED2.ItemType                           TWTY_UINT16\nsetglobal ICAP_FLASHUSED2.ValueAfterOpen                     UNDEFINED\nsetglobal ICAP_FLASHUSED2.ValueAfterReset                    UNDEFINED\nsetglobal ICAP_FLASHUSED2.Flags                              ''\n;\nsetglobal ICAP_FLIPROTATION.ConType                          TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_FLIPROTATION.ItemType                         TWTY_UINT16\nsetglobal ICAP_FLIPROTATION.ValueAfterOpen                   UNDEFINED\nsetglobal ICAP_FLIPROTATION.ValueAfterReset                  TWFR_BOOK\nsetglobal ICAP_FLIPROTATION.Flags                            ''\n;\nsetglobal ICAP_FRAMES.ConType                                TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_FRAMES.ItemType                               TWTY_FRAME\nsetglobal ICAP_FRAMES.ValueAfterOpen                         UNDEFINED\nsetglobal ICAP_FRAMES.ValueAfterReset                        UNDEFINED\nsetglobal ICAP_FRAMES.Flags                                  ''\n;\nsetglobal ICAP_GAMMA.ConType                                 TWON_RANGE,TWON_ONEVALUE\nsetglobal ICAP_GAMMA.ItemType                                TWTY_FIX32\nsetglobal ICAP_GAMMA.ValueAfterOpen                          UNDEFINED\nsetglobal ICAP_GAMMA.ValueAfterReset                         UNDEFINED\nsetglobal ICAP_GAMMA.Flags                                   ''\n;\nsetglobal ICAP_HALFTONES.ConType                             TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_HALFTONES.ItemType                            TWTY_STR32\nsetglobal ICAP_HALFTONES.ValueAfterOpen                      UNDEFINED\nsetglobal ICAP_HALFTONES.ValueAfterReset                     UNDEFINED\nsetglobal ICAP_HALFTONES.Flags                               ''\n;\nsetglobal ICAP_HIGHLIGHT.ConType                             TWON_ENUMERATION,TWON_RANGE,TWON_ONEVALUE\nsetglobal ICAP_HIGHLIGHT.ItemType                            TWTY_FIX32\nsetglobal ICAP_HIGHLIGHT.ValueAfterOpen                      UNDEFINED\nsetglobal ICAP_HIGHLIGHT.ValueAfterReset                     255\nsetglobal ICAP_HIGHLIGHT.Flags                               ''\n;\nsetglobal ICAP_ICCPROFILE.ConType                            TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_ICCPROFILE.ItemType                           TWTY_UINT16\nsetglobal ICAP_ICCPROFILE.ValueAfterOpen                     UNDEFINED\nsetglobal ICAP_ICCPROFILE.ValueAfterReset                    UNDEFINED\nsetglobal ICAP_ICCPROFILE.Flags                              ''\n;\nsetglobal ICAP_IMAGEDATASET.ConType                          TWON_ENUMERATION,TWON_RANGE,TWON_ONEVALUE\nsetglobal ICAP_IMAGEDATASET.ItemType                         TWTY_UINT32\nsetglobal ICAP_IMAGEDATASET.ValueAfterOpen                   UNDEFINED\nsetglobal ICAP_IMAGEDATASET.ValueAfterReset                  UNDEFINED\nsetglobal ICAP_IMAGEDATASET.Flags                            ''\n;\nsetglobal ICAP_IMAGEFILEFORMAT.ConType                       TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_IMAGEFILEFORMAT.ItemType                      TWTY_UINT16\nsetglobal ICAP_IMAGEFILEFORMAT.ValueAfterOpen                UNDEFINED\nsetglobal ICAP_IMAGEFILEFORMAT.ValueAfterReset               UNDEFINED\nsetglobal ICAP_IMAGEFILEFORMAT.Flags                         ''\n;\nsetglobal ICAP_IMAGEFILTER.ConType                           TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_IMAGEFILTER.ItemType                          TWTY_UINT16\nsetglobal ICAP_IMAGEFILTER.ValueAfterOpen                    UNDEFINED\nsetglobal ICAP_IMAGEFILTER.ValueAfterReset                   UNDEFINED\nsetglobal ICAP_IMAGEFILTER.Flags                             ''\n;\nsetglobal ICAP_IMAGEMERGE.ConType                            TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_IMAGEMERGE.ItemType                           TWTY_UINT16\nsetglobal ICAP_IMAGEMERGE.ValueAfterOpen                     UNDEFINED\nsetglobal ICAP_IMAGEMERGE.ValueAfterReset                    TWIM_NONE\nsetglobal ICAP_IMAGEMERGE.Flags                              ''\n;\nsetglobal ICAP_IMAGEMERGEHEIGHTTHRESHOLD.ConType             TWON_RANGE,TWON_ONEVALUE\nsetglobal ICAP_IMAGEMERGEHEIGHTTHRESHOLD.ItemType            TWTY_FIX32\nsetglobal ICAP_IMAGEMERGEHEIGHTTHRESHOLD.ValueAfterOpen      UNDEFINED\nsetglobal ICAP_IMAGEMERGEHEIGHTTHRESHOLD.ValueAfterReset     0\nsetglobal ICAP_IMAGEMERGEHEIGHTTHRESHOLD.Flags               ''\n;\nsetglobal ICAP_JPEGPIXELTYPE.ConType                         TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_JPEGPIXELTYPE.ItemType                        TWTY_UINT16\nsetglobal ICAP_JPEGPIXELTYPE.ValueAfterOpen                  UNDEFINED\nsetglobal ICAP_JPEGPIXELTYPE.ValueAfterReset                 UNDEFINED\nsetglobal ICAP_JPEGPIXELTYPE.Flags                           ''\n;\nsetglobal ICAP_JPEGQUALITY.ConType                           TWON_ENUMERATION,TWON_RANGE,TWON_ONEVALUE\nsetglobal ICAP_JPEGQUALITY.ItemType                          TWTY_INT16\nsetglobal ICAP_JPEGQUALITY.ValueAfterOpen                    UNDEFINED\nsetglobal ICAP_JPEGQUALITY.ValueAfterReset                   UNDEFINED\nsetglobal ICAP_JPEGQUALITY.Flags                             ''\n;\nsetglobal ICAP_JPEGSUBSAMPLING.ConType                       TWON_ENUMERATION\nsetglobal ICAP_JPEGSUBSAMPLING.ItemType                      TWTY_UINT16\nsetglobal ICAP_JPEGSUBSAMPLING.ValueAfterOpen                UNDEFINED\nsetglobal ICAP_JPEGSUBSAMPLING.ValueAfterReset               UNDEFINED\nsetglobal ICAP_JPEGSUBSAMPLING.Flags                         ''\n;\nsetglobal ICAP_LAMPSTATE.ConType                             TWON_ENUMERATION\nsetglobal ICAP_LAMPSTATE.ItemType                            TWTY_BOOL\nsetglobal ICAP_LAMPSTATE.ValueAfterOpen                      UNDEFINED\nsetglobal ICAP_LAMPSTATE.ValueAfterReset                     UNDEFINED\nsetglobal ICAP_LAMPSTATE.Flags                               ''\n;\nsetglobal ICAP_LIGHTPATH.ConType                             TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_LIGHTPATH.ItemType                            TWTY_UINT16\nsetglobal ICAP_LIGHTPATH.ValueAfterOpen                      UNDEFINED\nsetglobal ICAP_LIGHTPATH.ValueAfterReset                     UNDEFINED\nsetglobal ICAP_LIGHTPATH.Flags                               ''\n;\nsetglobal ICAP_LIGHTSOURCE.ConType                           TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_LIGHTSOURCE.ItemType                          TWTY_UINT16\nsetglobal ICAP_LIGHTSOURCE.ValueAfterOpen                    UNDEFINED\nsetglobal ICAP_LIGHTSOURCE.ValueAfterReset                   UNDEFINED\nsetglobal ICAP_LIGHTSOURCE.Flags                             ''\n;\nsetglobal ICAP_MAXFRAMES.ConType                             TWON_RANGE,TWON_ONEVALUE\nsetglobal ICAP_MAXFRAMES.ItemType                            TWTY_UINT16\nsetglobal ICAP_MAXFRAMES.ValueAfterOpen                      UNDEFINED\nsetglobal ICAP_MAXFRAMES.ValueAfterReset                     UNDEFINED\nsetglobal ICAP_MAXFRAMES.Flags                               ''\n;\nsetglobal ICAP_MINIMUMHEIGHT.ConType                         TWON_ONEVALUE\nsetglobal ICAP_MINIMUMHEIGHT.ItemType                        TWTY_FIX32\nsetglobal ICAP_MINIMUMHEIGHT.ValueAfterOpen                  UNDEFINED\nsetglobal ICAP_MINIMUMHEIGHT.ValueAfterReset                 UNDEFINED\nsetglobal ICAP_MINIMUMHEIGHT.Flags                           ''\n;\nsetglobal ICAP_MINIMUMWIDTH.ConType                          TWON_ONEVALUE\nsetglobal ICAP_MINIMUMWIDTH.ItemType                         TWTY_FIX32\nsetglobal ICAP_MINIMUMWIDTH.ValueAfterOpen                   UNDEFINED\nsetglobal ICAP_MINIMUMWIDTH.ValueAfterReset                  UNDEFINED\nsetglobal ICAP_MINIMUMWIDTH.Flags                            ''\n;\nsetglobal ICAP_MIRROR.ConType                                TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_MIRROR.ItemType                               TWTY_UINT16\nsetglobal ICAP_MIRROR.ValueAfterOpen                         UNDEFINED\nsetglobal ICAP_MIRROR.ValueAfterReset                        TWMR_NONE\nsetglobal ICAP_MIRROR.Flags                                  ''\n;\nsetglobal ICAP_NOISEFILTER.ConType                           TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_NOISEFILTER.ItemType                          TWTY_UINT16\nsetglobal ICAP_NOISEFILTER.ValueAfterOpen                    UNDEFINED\nsetglobal ICAP_NOISEFILTER.ValueAfterReset                   UNDEFINED\nsetglobal ICAP_NOISEFILTER.Flags                             ''\n;\nsetglobal ICAP_ORIENTATION.ConType                           TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_ORIENTATION.ItemType                          TWTY_UINT16\nsetglobal ICAP_ORIENTATION.ValueAfterOpen                    UNDEFINED\nsetglobal ICAP_ORIENTATION.ValueAfterReset                   TWOR_ROT0|TWOR_PORTRAIT\nsetglobal ICAP_ORIENTATION.Flags                             ''\n;\nsetglobal ICAP_OVERSCAN.ConType                              TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_OVERSCAN.ItemType                             TWTY_UINT16\nsetglobal ICAP_OVERSCAN.ValueAfterOpen                       UNDEFINED\nsetglobal ICAP_OVERSCAN.ValueAfterReset                      TWOV_NONE\nsetglobal ICAP_OVERSCAN.Flags                                ''\n;\nsetglobal ICAP_PATCHCODEDETECTIONENABLED.ConType             TWON_ENUMERATION\nsetglobal ICAP_PATCHCODEDETECTIONENABLED.ItemType            TWTY_BOOL\nsetglobal ICAP_PATCHCODEDETECTIONENABLED.ValueAfterOpen      UNDEFINED\nsetglobal ICAP_PATCHCODEDETECTIONENABLED.ValueAfterReset     FALSE\nsetglobal ICAP_PATCHCODEDETECTIONENABLED.Flags               ''\n;\nsetglobal ICAP_PATCHCODEMAXRETRIES.ConType                   TWON_ENUMERATION,TWON_RANGE,TWON_ONEVALUE\nsetglobal ICAP_PATCHCODEMAXRETRIES.ItemType                  TWTY_UINT32\nsetglobal ICAP_PATCHCODEMAXRETRIES.ValueAfterOpen            UNDEFINED\nsetglobal ICAP_PATCHCODEMAXRETRIES.ValueAfterReset           UNDEFINED\nsetglobal ICAP_PATCHCODEMAXRETRIES.Flags                     ''\n;\nsetglobal ICAP_PATCHCODEMAXSEARCHPRIORITIES.ConType          TWON_ENUMERATION,TWON_RANGE,TWON_ONEVALUE\nsetglobal ICAP_PATCHCODEMAXSEARCHPRIORITIES.ItemType         TWTY_UINT32\nsetglobal ICAP_PATCHCODEMAXSEARCHPRIORITIES.ValueAfterOpen   UNDEFINED\nsetglobal ICAP_PATCHCODEMAXSEARCHPRIORITIES.ValueAfterReset  UNDEFINED\nsetglobal ICAP_PATCHCODEMAXSEARCHPRIORITIES.Flags            ''\n;\nsetglobal ICAP_PATCHCODESEARCHMODE.ConType                   TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_PATCHCODESEARCHMODE.ItemType                  TWTY_UINT16\nsetglobal ICAP_PATCHCODESEARCHMODE.ValueAfterOpen            UNDEFINED\nsetglobal ICAP_PATCHCODESEARCHMODE.ValueAfterReset           UNDEFINED\nsetglobal ICAP_PATCHCODESEARCHMODE.Flags                     ''\n;\nsetglobal ICAP_PATCHCODESEARCHPRIORITIES.ConType             TWON_ARRAY\nsetglobal ICAP_PATCHCODESEARCHPRIORITIES.ItemType            TWTY_UINT16\nsetglobal ICAP_PATCHCODESEARCHPRIORITIES.ValueAfterOpen      UNDEFINED\nsetglobal ICAP_PATCHCODESEARCHPRIORITIES.ValueAfterReset     UNDEFINED\nsetglobal ICAP_PATCHCODESEARCHPRIORITIES.Flags               ''\n;\nsetglobal ICAP_PATCHCODETIMEOUT.ConType                      TWON_ENUMERATION,TWON_RANGE,TWON_ONEVALUE\nsetglobal ICAP_PATCHCODETIMEOUT.ItemType                     TWTY_UINT32\nsetglobal ICAP_PATCHCODETIMEOUT.ValueAfterOpen               UNDEFINED\nsetglobal ICAP_PATCHCODETIMEOUT.ValueAfterReset              UNDEFINED\nsetglobal ICAP_PATCHCODETIMEOUT.Flags                        ''\n;\nsetglobal ICAP_PHYSICALHEIGHT.ConType                        TWON_ONEVALUE\nsetglobal ICAP_PHYSICALHEIGHT.ItemType                       TWTY_FIX32\nsetglobal ICAP_PHYSICALHEIGHT.ValueAfterOpen                 UNDEFINED\nsetglobal ICAP_PHYSICALHEIGHT.ValueAfterReset                UNDEFINED\nsetglobal ICAP_PHYSICALHEIGHT.Flags                          'mandatory'\n;\nsetglobal ICAP_PHYSICALWIDTH.ConType                         TWON_ONEVALUE\nsetglobal ICAP_PHYSICALWIDTH.ItemType                        TWTY_FIX32\nsetglobal ICAP_PHYSICALWIDTH.ValueAfterOpen                  UNDEFINED\nsetglobal ICAP_PHYSICALWIDTH.ValueAfterReset                 UNDEFINED\nsetglobal ICAP_PHYSICALWIDTH.Flags                           'mandatory'\n;\nsetglobal ICAP_PIXELFLAVOR.ConType                           TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_PIXELFLAVOR.ItemType                          TWTY_UINT16\nsetglobal ICAP_PIXELFLAVOR.ValueAfterOpen                    UNDEFINED\nsetglobal ICAP_PIXELFLAVOR.ValueAfterReset                   TWPF_CHOCOLATE\nsetglobal ICAP_PIXELFLAVOR.Flags                             'mandatory'\n;\nsetglobal ICAP_PIXELFLAVORCODES.ConType                      TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_PIXELFLAVORCODES.ItemType                     TWTY_UINT16\nsetglobal ICAP_PIXELFLAVORCODES.ValueAfterOpen               UNDEFINED\nsetglobal ICAP_PIXELFLAVORCODES.ValueAfterReset              TWPF_CHOCOLATE\nsetglobal ICAP_PIXELFLAVORCODES.Flags                        ''\n;\nsetglobal ICAP_PIXELTYPE.ConType                             TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_PIXELTYPE.ItemType                            TWTY_UINT16\nsetglobal ICAP_PIXELTYPE.ValueAfterOpen                      UNDEFINED\nsetglobal ICAP_PIXELTYPE.ValueAfterReset                     UNDEFINED\nsetglobal ICAP_PIXELTYPE.Flags                               'mandatory'\n;\nsetglobal ICAP_PLANARCHUNKY.ConType                          TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_PLANARCHUNKY.ItemType                         TWTY_UINT16\nsetglobal ICAP_PLANARCHUNKY.ValueAfterOpen                   UNDEFINED\nsetglobal ICAP_PLANARCHUNKY.ValueAfterReset                  UNDEFINED\nsetglobal ICAP_PLANARCHUNKY.Flags                            'mandatory'\n;\nsetglobal ICAP_ROTATION.ConType                              TWON_ENUMERATION,TWON_RANGE,TWON_ONEVALUE\nsetglobal ICAP_ROTATION.ItemType                             TWTY_FIX32\nsetglobal ICAP_ROTATION.ValueAfterOpen                       UNDEFINED\nsetglobal ICAP_ROTATION.ValueAfterReset                      0\nsetglobal ICAP_ROTATION.Flags                                ''\n;\nsetglobal ICAP_SHADOW.ConType                                TWON_ENUMERATION,TWON_RANGE,TWON_ONEVALUE\nsetglobal ICAP_SHADOW.ItemType                               TWTY_FIX32\nsetglobal ICAP_SHADOW.ValueAfterOpen                         UNDEFINED\nsetglobal ICAP_SHADOW.ValueAfterReset                        0\nsetglobal ICAP_SHADOW.Flags                                  ''\n;\nsetglobal ICAP_SUPPORTEDBARCODETYPES.ConType                 TWON_ARRAY\nsetglobal ICAP_SUPPORTEDBARCODETYPES.ItemType                TWTY_UINT16\nsetglobal ICAP_SUPPORTEDBARCODETYPES.ValueAfterOpen          UNDEFINED\nsetglobal ICAP_SUPPORTEDBARCODETYPES.ValueAfterReset         UNDEFINED\nsetglobal ICAP_SUPPORTEDBARCODETYPES.Flags                   ''\n;\nsetglobal ICAP_SUPPORTEDEXTIMAGEINFO.ConType                 TWON_ARRAY\nsetglobal ICAP_SUPPORTEDEXTIMAGEINFO.ItemType                TWTY_UINT16\nsetglobal ICAP_SUPPORTEDEXTIMAGEINFO.ValueAfterOpen          UNDEFINED\nsetglobal ICAP_SUPPORTEDEXTIMAGEINFO.ValueAfterReset         UNDEFINED\nsetglobal ICAP_SUPPORTEDEXTIMAGEINFO.Flags                   ''\n;\nsetglobal ICAP_SUPPORTEDPATCHCODETYPES.ConType               TWON_ARRAY\nsetglobal ICAP_SUPPORTEDPATCHCODETYPES.ItemType              TWTY_UINT16\nsetglobal ICAP_SUPPORTEDPATCHCODETYPES.ValueAfterOpen        UNDEFINED\nsetglobal ICAP_SUPPORTEDPATCHCODETYPES.ValueAfterReset       UNDEFINED\nsetglobal ICAP_SUPPORTEDPATCHCODETYPES.Flags                 ''\n;\nsetglobal ICAP_SUPPORTEDSIZES.ConType                        TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_SUPPORTEDSIZES.ItemType                       TWTY_UINT16\nsetglobal ICAP_SUPPORTEDSIZES.ValueAfterOpen                 UNDEFINED\nsetglobal ICAP_SUPPORTEDSIZES.ValueAfterReset                UNDEFINED\nsetglobal ICAP_SUPPORTEDSIZES.Flags                          ''\n;\nsetglobal ICAP_THRESHOLD.ConType                             TWON_ENUMERATION,TWON_RANGE,TWON_ONEVALUE\nsetglobal ICAP_THRESHOLD.ItemType                            TWTY_FIX32\nsetglobal ICAP_THRESHOLD.ValueAfterOpen                      UNDEFINED\nsetglobal ICAP_THRESHOLD.ValueAfterReset                     128\nsetglobal ICAP_THRESHOLD.Flags                               ''\n;\nsetglobal ICAP_TILES.ConType                                 TWON_ENUMERATION\nsetglobal ICAP_TILES.ItemType                                TWTY_BOOL\nsetglobal ICAP_TILES.ValueAfterOpen                          FALSE\nsetglobal ICAP_TILES.ValueAfterReset                         FALSE\nsetglobal ICAP_TILES.Flags                                   ''\n;\nsetglobal ICAP_TIMEFILL.ConType                              TWON_RANGE,TWON_ONEVALUE\nsetglobal ICAP_TIMEFILL.ItemType                             TWTY_UINT16\nsetglobal ICAP_TIMEFILL.ValueAfterOpen                       UNDEFINED\nsetglobal ICAP_TIMEFILL.ValueAfterReset                      1\nsetglobal ICAP_TIMEFILL.Flags                                ''\n;\nsetglobal ICAP_UNDEFINEDIMAGESIZE.ConType                    TWON_ENUMERATION\nsetglobal ICAP_UNDEFINEDIMAGESIZE.ItemType                   TWTY_BOOL\nsetglobal ICAP_UNDEFINEDIMAGESIZE.ValueAfterOpen             FALSE\nsetglobal ICAP_UNDEFINEDIMAGESIZE.ValueAfterReset            FALSE\nsetglobal ICAP_UNDEFINEDIMAGESIZE.Flags                      ''\n;\nsetglobal ICAP_UNITS.ConType                                 TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_UNITS.ItemType                                TWTY_UINT16\nsetglobal ICAP_UNITS.ValueAfterOpen                          TWUN_INCHES\nsetglobal ICAP_UNITS.ValueAfterReset                         TWUN_INCHES\nsetglobal ICAP_UNITS.Flags                                   'mandatory'\n;\nsetglobal ICAP_XFERMECH.ConType                              TWON_ENUMERATION\nsetglobal ICAP_XFERMECH.ItemType                             TWTY_UINT16\nsetglobal ICAP_XFERMECH.ValueAfterOpen                       TWSX_NATIVE\nsetglobal ICAP_XFERMECH.ValueAfterReset                      TWSX_NATIVE\nsetglobal ICAP_XFERMECH.Flags                                'mandatory'\n;\nsetglobal ICAP_XNATIVERESOLUTION.ConType                     TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_XNATIVERESOLUTION.ItemType                    TWTY_FIX32\nsetglobal ICAP_XNATIVERESOLUTION.ValueAfterOpen              UNDEFINED\nsetglobal ICAP_XNATIVERESOLUTION.ValueAfterReset             UNDEFINED\nsetglobal ICAP_XNATIVERESOLUTION.Flags                       'mandatory'\n;\nsetglobal ICAP_XRESOLUTION.ConType                           TWON_ENUMERATION,TWON_RANGE,TWON_ONEVALUE\nsetglobal ICAP_XRESOLUTION.ItemType                          TWTY_FIX32\nsetglobal ICAP_XRESOLUTION.ValueAfterOpen                    UNDEFINED\nsetglobal ICAP_XRESOLUTION.ValueAfterReset                   UNDEFINED\nsetglobal ICAP_XRESOLUTION.Flags                             'mandatory'\n;\nsetglobal ICAP_XSCALING.ConType                              TWON_ENUMERATION,TWON_RANGE,TWON_ONEVALUE\nsetglobal ICAP_XSCALING.ItemType                             TWTY_FIX32\nsetglobal ICAP_XSCALING.ValueAfterOpen                       UNDEFINED\nsetglobal ICAP_XSCALING.ValueAfterReset                      1\nsetglobal ICAP_XSCALING.Flags                                ''\n;\nsetglobal ICAP_YNATIVERESOLUTION.ConType                     TWON_ENUMERATION,TWON_ONEVALUE\nsetglobal ICAP_YNATIVERESOLUTION.ItemType                    TWTY_FIX32\nsetglobal ICAP_YNATIVERESOLUTION.ValueAfterOpen              UNDEFINED\nsetglobal ICAP_YNATIVERESOLUTION.ValueAfterReset             UNDEFINED\nsetglobal ICAP_YNATIVERESOLUTION.Flags                       'mandatory'\n;\nsetglobal ICAP_YRESOLUTION.ConType                           TWON_ENUMERATION,TWON_RANGE,TWON_ONEVALUE\nsetglobal ICAP_YRESOLUTION.ItemType                          TWTY_FIX32\nsetglobal ICAP_YRESOLUTION.ValueAfterOpen                    UNDEFINED\nsetglobal ICAP_YRESOLUTION.ValueAfterReset                   UNDEFINED\nsetglobal ICAP_YRESOLUTION.Flags                             'mandatory'\n;\nsetglobal ICAP_YSCALING.ConType                              TWON_ENUMERATION,TWON_RANGE,TWON_ONEVALUE\nsetglobal ICAP_YSCALING.ItemType                             TWTY_FIX32\nsetglobal ICAP_YSCALING.ValueAfterOpen                       UNDEFINED\nsetglobal ICAP_YSCALING.ValueAfterReset                      1\nsetglobal ICAP_YSCALING.Flags                                ''\n;\nsetglobal ICAP_ZOOMFACTOR.ConType                            TWON_ENUMERATION,TWON_RANGE,TWON_ONEVALUE\nsetglobal ICAP_ZOOMFACTOR.ItemType                           TWTY_INT16\nsetglobal ICAP_ZOOMFACTOR.ValueAfterOpen                     UNDEFINED\nsetglobal ICAP_ZOOMFACTOR.ValueAfterReset                    0\nsetglobal ICAP_ZOOMFACTOR.Flags                              ''\n;\nsetrecord off\n;\nreturn\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/scripts/__README.md",
    "content": "These are convenience scripts that can be used for interactively\nexploring data sources.  Files delivered by the tool may overwrite\nany changes made by the user.  So be careful.  Keep a backup copy\nof new or updated scripts someplace safe."
  },
  {
    "path": "twaincs/source/twaincscert/source/data/scripts/cap_supportedcaps.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; CAP_SUPPORTEDCAPS v1.0 14-Jan-2020\n; returns: pass or fail\n;\n; Test CAP_SUPPORTEDCAPS...\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get\n;\ndsmentry src ds dg_control dat_capability msg_get cap_supportedcaps\nif '${sts:}' != 'SUCCESS' goto MAIN.FAIL\necho '${ret:}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Bye-bye...\n;\nreturn pass\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Bye-bye...\n;\n:MAIN.FAIL\necho 'Fail...${sts:}'\nreturn fail\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/scripts/capget.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Capget v1.0 14-Jan-2020\n; ${arg:1} - capability to msg_get\n; ${arg:2} - (optional) override for msg_get\n; returns: pass or fail\n;\n; Do a MSG_GET on a capability...\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Figure out which msg to use...\n;\nsetlocal capget.msg 'msg_get'\nif '${arg:2}' == '' goto MAIN.GET\nsetlocal capget.msg '${arg:2}'\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get\n;\n:MAIN.GET\ndsmentry src ds dg_control dat_capability '${get:capget.msg}' '${arg:1}'\nif '${sts:}' != 'SUCCESS' goto MAIN.FAIL\necho '${ret:}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Bye-bye...\n;\nreturn pass\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Bye-bye...\n;\n:MAIN.FAIL\necho 'Fail...${sts:}'\nreturn fail\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/scripts/close.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Close v1.0 31-Jan-2020\n; returns: (none)\n;\n; Close and unload the DSM...\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Rewind the driver, close and unload the DSM...\n;\nif '${state:}' < '7' goto REWIND.6\ndsmentry src ds dg_control dat_pendingxfers msg_endxfer '0,0'\n;\n:REWIND.6\nif '${state:}' < '6' goto REWIND.5\ndsmentry src ds dg_control dat_pendingxfers msg_reset '0,0'\n;\n:REWIND.5\nif '${state:}' < '5' goto REWIND.4\ndsmentry src ds dg_control dat_userinterface msg_disableds '0,0'\n;\n:REWIND.4\nif '${state:}' < '4' goto REWIND.3\ndsmentry src null dg_control dat_identity msg_closeds '${ds:}'\n;\n:REWIND.3\nif '${state:}' < '3' goto REWIND.2\ndsmentry src null dg_control dat_parent msg_closedsm hwnd\n;\n:REWIND.2\nif '${state:}' < '2' goto REWIND.1\ndsmunload\n:REWIND.1\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Bye-bye...\n;\nreturn\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/scripts/copybytes.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; CopyBytes\n;   Test that copybytes is working...\n;\n; Arguments\n;   (non)\n;\n; Globals\n;   (none)\n;\n; Locals\n;   test.bytes - number of bytes in the handle\n;   test.handle - the allocated handle\n;   test.src - string we start with\n;   test.dst - string we end up with\n;\n; Returns\n;   pass/fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Allocate two handles, and create a test string...\n;\nsetlocal test.bytes 100\nallocate handle test.handle ${get:test.bytes}\nsetlocal test.src \"this is a bit of text we'll copy in and out of the handle...\"\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Copy from the src string into the handle...\n;\ncopybytes utf8handle test.src ${get:test.handle} ${get:test.bytes}\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Copy from the handle into the dst string...\n;\ncopybytes handleutf8 ${get:test.handle} ${get:test.bytes} test.dst\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Show the result...\n;\necho 'src=<${get:test.src}>'\necho 'dst=<${get:test.dst}>'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Bye-bye...\n;\nfree handle test.handle\nreturn pass\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/scripts/datget.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Datget v1.0 14-Jan-2020\n; ${arg:1} - dg to use\n; ${arg:2} - dat to use\n; ${arg:3} - (optional) override for msg_get\n; returns: pass or fail\n;\n; Do a MSG_GET on a capability...\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Usage (gotta have at least two arguments)\n;\nif '${arg:2}' != '' goto MAIN.GETARGS\necho 'datget dg dat [msg]'\ngoto MAIN.PASS\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Figure out which msg to use...\n;\n:MAIN.GETARGS\nsetlocal capget.msg 'msg_get'\nif '${arg:3}' == '' goto MAIN.GET\nsetlocal capget.msg '${arg:3}'\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get\n;\n:MAIN.GET\ndsmentry src ds '${arg:1}' '${arg:2}' '${get:capget.msg}' undefined\nif '${sts:}' != 'SUCCESS' goto MAIN.FAIL\necho '${ret:}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Bye-bye...\n;\n:MAIN.PASS\nreturn pass\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Bye-bye...\n;\n:MAIN.FAIL\necho 'Fail...${sts:}'\nreturn fail\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/scripts/extimageinfo.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Extimageinfo\n;   Get the TW_EXTIMAGEINFO for this image, must be called in state 7\n;\n; Arguments\n;   arg:1 - global variable to put the return data into\n;   arg:2 - CSV list of TWEI_* values to get\n;\n; Globals\n;   (none)\n;\n; Locals\n;   twextimageinfo - numinfos and array of structures\n;   twextimageinfo.numinfos - counter\n;   twextimageinfo.twinfo - array of tw_info structures\n;   comma - CSV seperator\n;   tweilist - CSV list of TWEI_* values to get\n;\n; Returns\n;   pass or fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Init stuff...\n;\nsetlocal twextimageinfo '0'\nsetlocal twextimageinfo.numinfos '0'\nsetlocal twextimageinfo.twinfo ''\nsetlocal comma ''\nsetlocal tweilist '${arg:2}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Walk the TWE_* values...\n;\nif '${arg:${get:twextimageinfo.numinfos}}' == '' goto MAIN.DATEXTIMAGEINGO\n:MAIN.NEXTTWINFO\nsetlocal twei '${getindex:tweilist:${get:twextimageinfo.numinfos}}' ; next item\nif '${get:twei}' == '' goto MAIN.SETTWEXTIMAGEINFO ; we've exhausted the list\nsetlocal twextimageinfo.twinfo '${get:twextimageinfo.twinfo}${get:comma}${get:twei},0,0,0,0' ; build the data\nincrement twextimageinfo.numinfos '${get:twextimageinfo.numinfos}' '1' ; increment for the next item\nsetlocal comma ',' ; turn on comma\ngoto MAIN.NEXTTWINFO ; next twei\n:MAIN.SETTWEXTIMAGEINFO\nsetlocal twextimageinfo '${get:twextimageinfo.numinfos},${get:twextimageinfo.twinfo}' ; build the final data\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Send the command...\n;\n:MAIN.DATEXTIMAGEINGO\ndsmentry src ds dg_image dat_extimageinfo msg_get '${get:twextimageinfo}'\necho.progress 'extimageinfo/get' '${sts:} - ${ret:}'\nif '${sts:}' != 'SUCCESS' goto MAIN.FAIL\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We've passed...\n;\n:MAIN.PASS\nsetglobal '${arg:1}' '${ret:}'\nreturn 'pass'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We've run into a problem...\n;\n:MAIN.FAIL\necho.progress 'ERROR' '${sts:}'\nreturn 'fail'\n\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We're run into a problem...\n;\n:MAIN.FAIL\nreturn 'fail'"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/scripts/list.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Opends\n;   List all of the TWAIN drivers on the system for the current machine word,\n;   returning just the ProductName's...\n;\n; Arguments\n;   arg:1 - if set to full, the entire TW_IDENTITY is displayed\n;\n; Globals\n;   (none)\n;\n; Locals\n;   TW_IDENTITY.ProductName - index of the product name\n;\n; Returns\n;   pass or fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; List v1.0 06-Mar-2020\n; returns: pass or fail\n;\n; List all of the TWAIN drivers on the system, returning just the ProductName's...\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Init stuff...\n;\nsetlocal TW_IDENTITY.ProductName 11\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Load and open the DSM...\n;\ndsmload\ndsmentry src null dg_control dat_parent msg_opendsm hwnd\nif '${sts:}' != 'SUCCESS' goto MAIN.FAIL\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get the first TWAIN driver...\n;\ndsmentry src null dg_control dat_identity msg_getfirst '0,0,0,ENGLISH_USA,USA,,0,0,0x0,,,'\nif '${sts:}' == 'ENDOFLIST' goto MAIN.CLOSE\nif '${sts:}' != 'SUCCESS' goto MAIN.FAIL\nif '${arg:1}' == 'full' goto MAIN.LISTFULL\necho '${ret:${get:TW_IDENTITY.ProductName}}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get the next TWAIN driver(s)...\n;\n:MAIN.GETNEXT\ndsmentry src null dg_control dat_identity msg_getnext '0,0,0,ENGLISH_USA,USA,,0,0,0x0,,,'\nif '${sts:}' == 'ENDOFLIST' goto MAIN.CLOSE\nif '${sts:}' != 'SUCCESS' goto MAIN.FAIL\nif '${arg:1}' == 'full' goto MAIN.LISTFULL\necho '${ret:${get:TW_IDENTITY.ProductName}}'\ngoto MAIN.GETNEXT\n;\n:MAIN.LISTFULL\necho '${ret:}'\ngoto MAIN.GETNEXT\n\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Close and unload the DSM...\n;\n:MAIN.CLOSE\ndsmentry src null dg_control dat_parent msg_closedsm hwnd\ndsmunload\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Bye-bye...\n;\necho 'Done...'\nreturn pass\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Bye-bye...\n;\n:MAIN.FAIL\nif '${state:}' < '2' goto MAIN.SKIPCLOSE\ndsmentry src null dg_control dat_parent msg_closedsm hwnd\ndsmunload\n:MAIN.SKIPCLOSE \necho 'Done...'\nreturn fail\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/scripts/open.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Open v1.0 14-Jan-2020\n; ${arg:1} - product name of scanner to open\n; ${arg:2} - dsmload argument\n; ${arg:3} - dsmload argument\n; ${arg:4} - dsmload argument\n; ${arg:5} - dsmload argument\n; ${arg:6} - dsmload argument\n; ${arg:7} - dsmload argument\n; ${arg:8} - dsmload argument\n; ${arg:9} - dsmload argument\n; ${arg:10} - dsmload argument\n; ${arg:11} - dsmload argument\n; ${arg:12} - dsmload argument\n; returns: pass or fail\n;\n; Open the specified driver...\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Load the tables...\n;\nif '${get:TW_ARRAY.ItemType}' != '' goto MAIN.LOADTABLES.SKIP\nrun 'LoadTables'\n:MAIN.LOADTABLES.SKIP\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Load and open the DSM...\n;\ndsmload '${arg:2}' '${arg:3}' '${arg:4}' '${arg:5}' '${arg:6}' '${arg:7}' '${arg:8}' '${arg:9}' '${arg:10}' '${arg:11}' '${arg:12}'\ndsmentry src null dg_control dat_parent msg_opendsm hwnd\nif '${sts:}' != 'SUCCESS' goto MAIN.FAIL\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; If the DF_APP2|DF_DSM2 flag is set, then call DAT_ENTRYPOINT...\n;\nif '${app:${get:TW_IDENTITY.SupportedGroups}}' & '0x30000000' != '0x30000000' goto MAIN.ENTRYPOINT.SKIP\ndsmentry src null dg_control dat_entrypoint msg_get '0,0,0,0,0,0'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR\n:MAIN.ENTRYPOINT.SKIP\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Open the driver...\n;\ndsmentry src null dg_control dat_identity msg_opends '0,0,0,0,0,0,0,0,0x0,,,${arg:1}'\nif '${sts:}' != 'SUCCESS' goto MAIN.FAIL\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Bye-bye...\n;\nreturn pass\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Bye-bye...\n;\n:MAIN.FAIL\necho 'Fail...${sts:}'\nreturn fail\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/scripts/scanfile.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Scanfile\n;   Scan with DAT_IMAGEFILEXFER...\n;\n; Arguments\n;   arg:1 - TW_IDENTITY.ProductName of scanner to test\n;   arg:2 - dsmload argument\n;   arg:3 - dsmload argument\n;   arg:4 - dsmload argument\n;   arg:5 - dsmload argument\n;   arg:6 - dsmload argument\n;   arg:7 - dsmload argument\n;   arg:8 - dsmload argument\n;   arg:9 - dsmload argument\n;   arg:10 - dsmload argument\n;   arg:11 - dsmload argument\n;   arg:12 - dsmload argument\n;\n; Globals\n;   g_twextimageinfo - extended image info\n;\n; Locals\n;   cap_supportedcaps - list of supported capabilities\n;   icap_supportedextimageinfo - list of supported extending image info values\n;   image.count - count of images, starting at 1\n;   image.folder - location of the images\n;   twainstate - pass/fail result of all tests\n;\n; Returns\n;   pass or fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Init stuff...\n;\nrun 'LoadTables'\nsetlocal cap_supportedcaps ''\nsetlocal icap_supportedextimageinfo ''\nsetlocal image.count '0'\nsetlocal twainstate '0'\nsetlocal image.folder '${folder:data}/images'\nsetglobal g_twextimageinfo ''\nimage cleanfolder '${get:image.folder}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Load and open the DSM...\n;\nsetlocal twainstate '1'\ndsmload '${arg:2}' '${arg:3}' '${arg:4}' '${arg:5}' '${arg:6}' '${arg:7}' '${arg:8}' '${arg:9}' '${arg:10}' '${arg:11}' '${arg:12}'\necho.progress 'dsmload ${arg:2} ${arg:3} ${arg:4} ${arg:5} ${arg:6} ${arg:7} ${arg:8} ${arg:9} ${arg:10} ${arg:11} ${arg:12}' '${sts:}'\nsetlocal twainstate '2'\ndsmentry src null dg_control dat_parent msg_opendsm hwnd\necho.progress 'parent/opendsm' '${sts:}'\nif '${sts:}' != 'SUCCESS' goto MAIN.FAIL\nsetlocal twainstate '3'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; If the DF_APP2|DF_DSM2 flag is set, then call DAT_ENTRYPOINT...\n;\nif '${app:${get:TW_IDENTITY.SupportedGroups}}' & '0x30000000' != '0x30000000' goto MAIN.ENTRYPOINT.SKIP\ndsmentry src null dg_control dat_entrypoint msg_get '0,0,0,0,0,0'\necho.progress 'entrypoint/get' '${sts:} - ${ret:}'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR\n:MAIN.ENTRYPOINT.SKIP\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Open the driver...\n;\ndsmentry src null dg_control dat_identity msg_opends '0,0,0,0,0,,0,0,0x0,,,${arg:1}'\nsetlocal twidentity '${ret:}'\necho.progress 'identity/opends' '${sts:} - ${get:twidentity}'\nif '${sts:}' != 'SUCCESS' goto MAIN.FAIL\nsetlocal twainstate '4'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get CAP_SUPPORTEDCAPS...\n;\ndsmentry src ds dg_control dat_capability msg_get 'CAP_SUPPORTEDCAPS'\necho.progress 'capability/get' '${sts:} - ${ret:}'\nif '${sts:}' != 'SUCCESS' goto MAIN.FAIL\nsetlocal cap_supportedcaps '${ret:}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set CAP_INDICATORS to TRUE...\n;\ndsmentry src ds dg_control dat_capability msg_set 'CAP_INDICATORS,TWON_ONEVALUE,TWTY_BOOL,TRUE'\necho.progress 'capability/set' '${sts:} - ${ret:}'\nif '${sts:}' != 'SUCCESS' goto MAIN.FAIL\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set ICAP_XFERMECH to TWSX_FILE...\n;\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_XFERMECH,TWON_ONEVALUE,TWTY_UINT16,TWSX_FILE'\necho.progress 'capability/set' '${sts:} - ${ret:}'\nif '${sts:}' != 'SUCCESS' goto MAIN.FAIL\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get ICAP_SUPPORTEDEXTIMAGEINFO (we just want the array portion)...\n;\nif '${get:cap_supportedcaps}' !~contains 'ICAP_SUPPORTEDEXTIMAGEINFO' goto MAIN.SKIPICAPSUPPORTEDEXTIMAGEINFO\ndsmentry src ds dg_control dat_capability msg_get 'ICAP_SUPPORTEDEXTIMAGEINFO'\necho.progress 'capability/get' '${sts:} - ${ret:}'\nif '${sts:}' != 'SUCCESS' goto MAIN.FAIL\nsetlocal ienum '4'\nsetlocal comma ''\n:MAIN.NEXTEXTIMAGEINFO\nif '${ret:${get:ienum}}' == '' goto MAIN.SKIPICAPSUPPORTEDEXTIMAGEINFO\nsetlocal icap_supportedextimageinfo '${get:icap_supportedextimageinfo}${get:comma}${ret:${get:ienum}}'\nincrement ienum '${get:ienum}' 1\nsetlocal comma ','\ngoto MAIN.NEXTEXTIMAGEINFO\n:MAIN.SKIPICAPSUPPORTEDEXTIMAGEINFO\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Start scanning...\n;\nwait reset\ndsmentry src ds dg_control dat_userinterface msg_enableds '0,0'\necho.progress 'userinterface/enableds' '${sts:} - ${ret:}'\nif '${sts:}' != 'SUCCESS' goto MAIN.FAIL\nsetlocal twainstate '5'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Wait for MSG_XFERREADY, if we don't see it then scoot...\n;\nwait 30000\necho.progress 'wait' '${ret:}'\nif '${ret:}' !~contains 'msg_xferready' goto MAIN.PASS\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get information about the image...\n;\n:MAIN.NEXTIMAGEINFO\nsetlocal twainstate '6'\ndsmentry src ds dg_image dat_imageinfo msg_get '0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0'\necho.progress 'imageinfo/get' '${sts:} - ${ret:}'\nif '${sts:}' != 'SUCCESS' goto MAIN.FAIL\nsetlocal twimageinfo.compression '${ret:${get:index.twimageinfo.compression}}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set up the file transfer...\n;\nincrement image.count '${get:image.count}' 1\nif '${get:twimageinfo.compression}' == 'JPEG' goto MAIN.JPEG\nsetlocal twsetupfilexfer.filename '${get:image.folder}/img${format:D6|${get:image.count}}.tif'\nsetlocal twsetupfilexfer.format 'TWFF_TIFF'\ngoto MAIN.SETUPFILEXFER\n:MAIN.JPEG\nsetlocal twsetupfilexfer.filename '${get:image.folder}/img${format:D6|${get:image.count}}.jpg'\nsetlocal twsetupfilexfer.format 'TWFF_JFIF'\n:MAIN.SETUPFILEXFER\ndsmentry src ds dg_control dat_setupfilexfer msg_set '\"${get:twsetupfilexfer.filename}\",${get:twsetupfilexfer.format},0'\necho.progress 'setupfilexfer/get' '${sts:} - ${ret:}'\nif '${sts:}' != 'SUCCESS' goto MAIN.FAIL\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Transfer the image...\n;\ndsmentry src ds dg_image dat_imagefilexfer msg_get null\necho.progress 'imagefilexfer/get' '${sts:}'\nif '${sts:}' != 'XFERDONE' goto MAIN.FAIL\nsetlocal twainstate '7'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get more info about the image (if we can)...\n;\nif '${get:icap_supportedextimageinfo}' == '' goto MAIN.SKIPEXTIMAGEINFO\nrun 'extimageinfo' 'g_twextimageinfo' '${get:icap_supportedextimageinfo}'\nif '${ret:}' != 'pass' goto MAIN.FAIL\n:MAIN.SKIPEXTIMAGEINFO\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; End the transfer, see if we're done...\n;\ndsmentry src ds dg_control dat_pendingxfers msg_endxfer '0,0'\necho.progress 'pendingxfers/endxfer' '${sts:} - ${ret:}'\nif '${sts:}' != 'SUCCESS' goto MAIN.FAIL\nif '${ret:${get:TW_PENDINGXFERS.Count}}' != '0' goto MAIN.NEXTIMAGEINFO\nsetlocal twainstate '5'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We've passed...\n;\n:MAIN.PASS\nsetlocal main.result pass\ngoto MAIN.EXIT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We've run into a problem...\n;\n:MAIN.FAIL\necho.progress 'ERROR' '${sts:}'\nsetlocal main.result fail\ngoto MAIN.EXIT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Rewind the driver, close and unload the DSM, return...\n;\n:MAIN.EXIT\ncall TWAIN.REWIND '${get:twainstate}' '${get:twidentity}'\nreturn '${get:main.result}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Function: Rewind from any TWAIN state...\n; arg:1 - twainstate\n; arg:2 - twidentity\n; returns: (nothing)\n;\n:TWAIN.REWIND\n;\nsetlocal twainstate '${arg:1}'\nif '${get:twainstate}' < '7' goto REWIND.6\ndsmentry src ds dg_control dat_pendingxfers msg_endxfer '0,0'\necho.progress 'pendingxfers/endxfer' '${sts:}'\nsetlocal twainstate '6'\n:REWIND.6\nif '${get:twainstate}' < '6' goto REWIND.5\ndsmentry src ds dg_control dat_pendingxfers msg_reset '0,0'\necho.progress 'pendingxfers/reset' '${sts:}'\nsetlocal twainstate '5'\n:REWIND.5\nif '${get:twainstate}' < '5' goto REWIND.4\ndsmentry src ds dg_control dat_userinterface msg_disableds '0,0'\necho.progress 'userinterface/disableds' '${sts:}'\nsetlocal twainstate '4'\n:REWIND.4\nif '${get:twainstate}' < '4' goto REWIND.3\ndsmentry src null dg_control dat_identity msg_closeds '${arg:2}'\necho.progress 'identity/closeds' '${sts:}'\nsetlocal twainstate '3'\n:REWIND.3\nif '${get:twainstate}' < '3' goto REWIND.2\ndsmentry src null dg_control dat_parent msg_closedsm hwnd\necho.progress 'parent/closedsm' '${sts:}'\nsetlocal twainstate '2'\n:REWIND.2\nif '${get:twainstate}' < '2' goto REWIND.1\ndsmunload\necho 'dsmunload'\nsetlocal twainstate '1'\n:REWIND.1\nreturn ${get:twainstate}'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/scripts/scanmemfile.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Scanfile\n;   Scan with DAT_IMAGEMEMFILEXFER...\n;\n; Arguments\n;   arg:1 - TW_IDENTITY.ProductName of scanner to test\n;   arg:2 - dsmload argument\n;   arg:3 - dsmload argument\n;   arg:4 - dsmload argument\n;   arg:5 - dsmload argument\n;   arg:6 - dsmload argument\n;   arg:7 - dsmload argument\n;   arg:8 - dsmload argument\n;   arg:9 - dsmload argument\n;   arg:10 - dsmload argument\n;   arg:11 - dsmload argument\n;   arg:12 - dsmload argument\n;\n; Globals\n;   (none)\n;\n; Locals\n;   image.pointer - pointer to memory allocated for transfers\n;   image.count - count of images, starting at 1\n;   image.folder - location of the images\n;   twidentity - the scanner we opened\n;   twainstate - pass/fail result of all tests\n;\n; Returns\n;   pass or fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Init stuff...\n;\nrun 'LoadTables'\nsetlocal image.pointer '0'\nsetlocal image.count '0'\nsetlocal image.folder '${folder:data}/images'\nsetlocal twidentity ''\nsetlocal twainstate '0'\nimage cleanfolder '${get:image.folder}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Load and open the DSM...\n;\nsetlocal twainstate '1'\ndsmload '${arg:2}' '${arg:3}' '${arg:4}' '${arg:5}' '${arg:6}' '${arg:7}' '${arg:8}' '${arg:9}' '${arg:10}' '${arg:11}' '${arg:12}'\necho.progress 'dsmload ${arg:2} ${arg:3} ${arg:4} ${arg:5} ${arg:6} ${arg:7} ${arg:8} ${arg:9} ${arg:10} ${arg:11} ${arg:12}' '${sts:}'\nsetlocal twainstate '2'\ndsmentry src null dg_control dat_parent msg_opendsm hwnd\necho.progress 'parent/opendsm' '${sts:}'\nif '${sts:}' != 'SUCCESS' goto MAIN.FAIL\nsetlocal twainstate '3'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; If the DF_APP2|DF_DSM2 flag is set, then call DAT_ENTRYPOINT...\n;\nif '${app:${get:TW_IDENTITY.SupportedGroups}}' & '0x30000000' != '0x30000000' goto MAIN.ENTRYPOINT.SKIP\ndsmentry src null dg_control dat_entrypoint msg_get '0,0,0,0,0,0'\necho.progress 'entrypoint/get' '${sts:} - ${ret:}'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR\n:MAIN.ENTRYPOINT.SKIP\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Open the driver...\n;\ndsmentry src null dg_control dat_identity msg_opends '0,0,0,0,0,,0,0,0x0,,,${arg:1}'\nsetlocal twidentity '${ret:}'\necho.progress 'identity/opends' '${sts:} - ${get:twidentity}'\nif '${sts:}' != 'SUCCESS' goto MAIN.FAIL\nsetlocal twainstate '4'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set CAP_INDICATORS to TRUE...\n;\ndsmentry src ds dg_control dat_capability msg_set 'CAP_INDICATORS,TWON_ONEVALUE,TWTY_BOOL,TRUE'\necho.progress 'capability/set' '${sts:} - ${ret:}'\nif '${sts:}' != 'SUCCESS' goto MAIN.FAIL\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set ICAP_XFERMECH to TWSX_MEMFILE...\n;\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_XFERMECH,TWON_ONEVALUE,TWTY_UINT16,TWSX_MEMFILE'\necho.progress 'capability/set' '${sts:} - ${ret:}'\nif '${sts:}' != 'SUCCESS' goto MAIN.FAIL\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set ICAP_PIXELTYPE to TWPT_RGB, if we can...\n;\ndsmentry src ds dg_control dat_capability msg_get 'ICAP_PIXELTYPE,0,0,0'\necho.progress 'capability/get' '${sts:} - ${ret:}'\nif '${sts:}' != 'SUCCESS' goto MAIN.FAIL\nif '${ret:}' !~contains 'TWPT_RGB' goto MAIN.PIXELTYPE.SKIP\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_PIXELTYPE,TWON_ONEVALUE,TWTY_UINT16,TWPT_RGB'\necho.progress 'capability/set' '${sts:} - ${ret:}'\nif '${sts:}' != 'SUCCESS' goto MAIN.FAIL\n:MAIN.PIXELTYPE.SKIP\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set ICAP_COMPRESSION to TWCP_JPEG\n;\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_COMPRESSION,TWON_ONEVALUE,TWTY_UINT16,TWCP_JPEG'\necho.progress 'capability/set' '${sts:} - ${ret:}'\nif '${sts:}' != 'SUCCESS' goto MAIN.FAIL\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get the preferred size for memory transfers, and allocate\n; a pointer for the memory transfers...\n;\ndsmentry src ds dg_control dat_setupmemxfer msg_get '0,0,0'\necho.progress 'setupmemxfer/get' '${sts:} - ${ret:}'\nif '${sts:}' != 'SUCCESS' goto MAIN.FAIL\nsetlocal twsetupmemxfer.preferred '${ret:${get:TW_SETUPMEMXFER.Preferred}}'\nif '${get:twsetupmemxfer.preferred}' <= '0' goto MAIN.FAIL\nallocate pointer image.pointer '${get:twsetupmemxfer.preferred}'\necho.progress 'allocate pointer' '${get:image.pointer} size=${get:twsetupmemxfer.preferred}'\nif '${get:image.pointer}' == '0' goto MAIN.FAIL\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set DAT_SETUPFILEXFER to TWFF_TIFF\n;\ndsmentry src null dg_control dat_setupfilexfer msg_set 'file,TWFF_TIFF,0'\necho.progress 'capability/set' '${sts:} - ${ret:}'\nif '${sts:}' != 'SUCCESS' goto MAIN.FAIL\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Start scanning...\n;\nwait reset\ndsmentry src ds dg_control dat_userinterface msg_enableds '0,0'\necho.progress 'userinterface/enableds' '${sts:} - ${ret:}'\nif '${sts:}' != 'SUCCESS' goto MAIN.FAIL\nsetlocal twainstate '5'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Wait for MSG_XFERREADY, if we don't see it then scoot...\n;\nwait 30000\necho.progress 'wait' '${ret:}'\nif '${ret:}' !~contains 'msg_xferready' goto MAIN.PASS\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Do a memory file transfer...\n; This little song and dance with the states is so that we can\n; start the transfer in state 6 with each new image, but switch\n; to state 7 if we need multiple calls to capture the current\n; image...\n;\n; The saved images will be in TIFF format, which includes TIFF\n; JPEG (the better form, where a simple TIFF header is added).\n;\n:MAIN.NEXTIMAGEMEMFILEXFER.STATE6\nsetlocal twainstate '6'\nincrement image.count '${get:image.count}' 1\nimage free memfileimage\ngoto MAIN.NEXTIMAGEMEMFILEXFER\n:MAIN.NEXTIMAGEMEMFILEXFER.STATE7\nsetlocal twainstate '7'\n;\n:MAIN.NEXTIMAGEMEMFILEXFER\ndsmentry src ds dg_image dat_imagememfilexfer msg_get '0,0,0,0,0,0,0,9,${get:twsetupmemxfer.preferred},${get:image.pointer}'\necho.progress 'imagememxfer/get' '${sts:} - ${ret:}'\nif '${sts:}' == 'XFERDONE' goto MAIN.NEXTIMAGEMEMFILEXFER.XFERDONE\nif '${sts:}' != 'SUCCESS' goto MAIN.FAIL\nimage append memfileimage '${ret:}'\ngoto MAIN.NEXTIMAGEMEMFILEXFER.STATE7\n:MAIN.NEXTIMAGEMEMFILEXFER.XFERDONE\nimage append memfileimage '${ret:}'\nimage save memfileimage memfile '${get:image.folder}/img${format:D6|${get:image.count}}'\nsetlocal twainstate '7'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; End the transfer, see if we're done...\n;\ndsmentry src ds dg_control dat_pendingxfers msg_endxfer '0,0'\necho.progress 'pendingxfers/endxfer' '${sts:} - ${ret:}'\nif '${sts:}' != 'SUCCESS' goto MAIN.FAIL\nif '${ret:${get:TW_PENDINGXFERS.Count}}' != '0' goto MAIN.NEXTIMAGEMEMFILEXFER.STATE6\nimage free memfileimage\nsetlocal twainstate '5'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We've passed...\n;\n:MAIN.PASS\nsetlocal main.result pass\ngoto MAIN.EXIT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We've run into a problem...\n;\n:MAIN.FAIL\necho.progress 'ERROR' '${sts:}'\nimage free memfileimage\nsetlocal main.result fail\ngoto MAIN.EXIT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Rewind the driver, close and unload the DSM, return...\n;\n:MAIN.EXIT\nfree pointer image.pointer\ncall TWAIN.REWIND '${get:twainstate}' '${get:twidentity}'\nreturn '${get:main.result}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Function: Rewind from any TWAIN state...\n; arg:1 - twainstate\n; arg:2 - twidentity\n; returns: (nothing)\n;\n:TWAIN.REWIND\n;\nsetlocal twainstate '${arg:1}'\nif '${get:twainstate}' < '7' goto REWIND.6\ndsmentry src ds dg_control dat_pendingxfers msg_endxfer '0,0'\necho.progress 'pendingxfers/endxfer' '${sts:}'\nsetlocal twainstate '6'\n:REWIND.6\nif '${get:twainstate}' < '6' goto REWIND.5\ndsmentry src ds dg_control dat_pendingxfers msg_reset '0,0'\necho.progress 'pendingxfers/reset' '${sts:}'\nsetlocal twainstate '5'\n:REWIND.5\nif '${get:twainstate}' < '5' goto REWIND.4\ndsmentry src ds dg_control dat_userinterface msg_disableds '0,0'\necho.progress 'userinterface/disableds' '${sts:}'\nsetlocal twainstate '4'\n:REWIND.4\nif '${get:twainstate}' < '4' goto REWIND.3\ndsmentry src null dg_control dat_identity msg_closeds '${arg:2}'\necho.progress 'identity/closeds' '${sts:}'\nsetlocal twainstate '3'\n:REWIND.3\nif '${get:twainstate}' < '3' goto REWIND.2\ndsmentry src null dg_control dat_parent msg_closedsm hwnd\necho.progress 'parent/closedsm' '${sts:}'\nsetlocal twainstate '2'\n:REWIND.2\nif '${get:twainstate}' < '2' goto REWIND.1\ndsmunload\necho 'dsmunload'\nsetlocal twainstate '1'\n:REWIND.1\nreturn ${get:twainstate}'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/scripts/scanmemory.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Scanfile\n;   Scan with DAT_IMAGEMEMXFER...\n;\n; Arguments\n;   arg:1 - TW_IDENTITY.ProductName of scanner to test\n;   arg:2 - dsmload argument\n;   arg:3 - dsmload argument\n;   arg:4 - dsmload argument\n;   arg:5 - dsmload argument\n;   arg:6 - dsmload argument\n;   arg:7 - dsmload argument\n;   arg:8 - dsmload argument\n;   arg:9 - dsmload argument\n;   arg:10 - dsmload argument\n;   arg:11 - dsmload argument\n;   arg:12 - dsmload argument\n;\n; Globals\n;   (none)\n;\n; Locals\n;   image.pointer - pointer to memory allocated for transfers\n;   image.count - count of images, starting at 1\n;   image.folder - location of the images\n;   twainstate - pass/fail result of all tests\n;\n; Returns\n;   pass or fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Init stuff...\n;\nrun 'LoadTables'\nsetlocal image.pointer '0'\nsetlocal image.count '0'\nsetlocal image.folder '${folder:data}/images'\nsetlocal twainstate '0'\nimage cleanfolder '${get:image.folder}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Load and open the DSM...\n;\nsetlocal twainstate '1'\ndsmload '${arg:2}' '${arg:3}' '${arg:4}' '${arg:5}' '${arg:6}' '${arg:7}' '${arg:8}' '${arg:9}' '${arg:10}' '${arg:11}' '${arg:12}'\necho.progress 'dsmload ${arg:2} ${arg:3} ${arg:4} ${arg:5} ${arg:6} ${arg:7} ${arg:8} ${arg:9} ${arg:10} ${arg:11} ${arg:12}' '${sts:}'\nsetlocal twainstate '2'\ndsmentry src null dg_control dat_parent msg_opendsm hwnd\necho.progress 'parent/opendsm' '${sts:}'\nif '${sts:}' != 'SUCCESS' goto MAIN.FAIL\nsetlocal twainstate '3'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; If the DF_APP2|DF_DSM2 flag is set, then call DAT_ENTRYPOINT...\n;\nif '${app:${get:TW_IDENTITY.SupportedGroups}}' & '0x30000000' != '0x30000000' goto MAIN.ENTRYPOINT.SKIP\ndsmentry src null dg_control dat_entrypoint msg_get '0,0,0,0,0,0'\necho.progress 'entrypoint/get' '${sts:} - ${ret:}'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR\n:MAIN.ENTRYPOINT.SKIP\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Open the driver...\n;\ndsmentry src null dg_control dat_identity msg_opends '0,0,0,0,0,,0,0,0x0,,,${arg:1}'\nsetlocal twidentity '${ret:}'\necho.progress 'identity/opends' '${sts:} - ${get:twidentity}'\nif '${sts:}' != 'SUCCESS' goto MAIN.FAIL\nsetlocal twainstate '4'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set CAP_INDICATORS to TRUE...\n;\ndsmentry src ds dg_control dat_capability msg_set 'CAP_INDICATORS,TWON_ONEVALUE,TWTY_BOOL,TRUE'\necho.progress 'capability/set' '${sts:} - ${ret:}'\nif '${sts:}' != 'SUCCESS' goto MAIN.FAIL\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set ICAP_XFERMECH to TWSX_MEMORY...\n;\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_XFERMECH,TWON_ONEVALUE,TWTY_UINT16,TWSX_MEMORY'\necho.progress 'capability/set' '${sts:} - ${ret:}'\nif '${sts:}' != 'SUCCESS' goto MAIN.FAIL\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set ICAP_PIXELTYPE to TWPT_RGB (if we can)\n;\ndsmentry src ds dg_control dat_capability msg_get 'ICAP_PIXELTYPE,0,0,0'\necho.progress 'capability/get' '${sts:} - ${ret:}'\nif '${sts:}' != 'SUCCESS' goto MAIN.FAIL\nif '${ret:}' !~contains 'TWPT_RGB' goto MAIN.PIXELTYPE.SKIP\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_PIXELTYPE,TWON_ONEVALUE,TWTY_UINT16,TWPT_RGB'\necho.progress 'capability/set' '${sts:} - ${ret:}'\nif '${sts:}' != 'SUCCESS' goto MAIN.FAIL\n:MAIN.PIXELTYPE.SKIP\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set ICAP_COMPRESSION to TWCP_JPEG\n;\ndsmentry src ds dg_control dat_capability msg_set 'ICAP_COMPRESSION,TWON_ONEVALUE,TWTY_UINT16,TWCP_NONE'\necho.progress 'capability/set' '${sts:} - ${ret:}'\nif '${sts:}' != 'SUCCESS' goto MAIN.FAIL\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Get the preferred size for memory transfers, and allocate\n; a pointer for the memory transfers...\n;\ndsmentry src ds dg_control dat_setupmemxfer msg_get '0,0,0'\necho.progress 'setupmemxfer/get' '${sts:} - ${ret:}'\nif '${sts:}' != 'SUCCESS' goto MAIN.FAIL\nsetlocal twsetupmemxfer.preferred '${ret:${get:TW_SETUPMEMXFER.Preferred}}'\nif '${get:twsetupmemxfer.preferred}' <= '0' goto MAIN.FAIL\nallocate pointer image.pointer '${get:twsetupmemxfer.preferred}'\necho.progress 'allocate pointer' '${get:image.pointer} size=${get:twsetupmemxfer.preferred}'\nif '${get:image.pointer}' == '0' goto MAIN.FAIL\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Start scanning...\n;\nwait reset\ndsmentry src ds dg_control dat_userinterface msg_enableds '0,0'\necho.progress 'userinterface/enableds' '${sts:} - ${ret:}'\nif '${sts:}' != 'SUCCESS' goto MAIN.FAIL\nsetlocal twainstate '5'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Wait for MSG_XFERREADY, if we don't see it then scoot...\n;\nwait 30000\necho.progress 'wait' '${ret:}'\nif '${ret:}' !~contains 'msg_xferready' goto MAIN.PASS\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Do a memory transfer...\n; This little song and dance with the states is so that we can\n; start the transfer in state 6 with each new image, but switch\n; to state 7 if we need multiple calls to capture the current\n; image...\n;\n:MAIN.NEXTIMAGEMEMXFER.STATE6\nsetlocal twainstate '6'\nincrement image.count '${get:image.count}' 1\nimage free memimage\ngoto MAIN.NEXTIMAGEMEMXFER\n:MAIN.NEXTIMAGEMEMXFER.STATE7\nsetlocal twainstate '7'\n;\n:MAIN.NEXTIMAGEMEMXFER\ndsmentry src ds dg_image dat_imagememxfer msg_get '0,0,0,0,0,0,0,9,${get:twsetupmemxfer.preferred},${get:image.pointer}'\necho.progress 'imagememxfer/get' '${sts:} - ${ret:}'\nif '${sts:}' == 'XFERDONE' goto MAIN.NEXTIMAGEMEMXFER.XFERDONE\nif '${sts:}' != 'SUCCESS' goto MAIN.FAIL\nimage append memimage '${ret:}'\ngoto MAIN.NEXTIMAGEMEMXFER.STATE7\n:MAIN.NEXTIMAGEMEMXFER.XFERDONE\nimage append memimage '${ret:}'\nsetlocal twainstate '7'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We need image info to make sense of this data...\n;\ndsmentry src ds dg_image dat_imageinfo msg_get '0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0'\necho.progress 'imagememxfer/get' '${sts:} - ${ret:}'\nif '${sts:}' != 'SUCCESS' goto MAIN.FAIL\nimage addheader memimage '${ret:}'\nimage save memimage memory '${get:image.folder}/img${format:D6|${get:image.count}}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; End the transfer, see if we're done...\n;\ndsmentry src ds dg_control dat_pendingxfers msg_endxfer '0,0'\necho.progress 'pendingxfers/endxfer' '${sts:} - ${ret:}'\nif '${sts:}' != 'SUCCESS' goto MAIN.FAIL\nif '${ret:${get:TW_PENDINGXFERS.Count}}' != '0' goto MAIN.NEXTIMAGEMEMXFER.STATE6\nimage free memimage\nsetlocal twainstate '5'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We've passed...\n;\n:MAIN.PASS\nsetlocal main.result pass\ngoto MAIN.EXIT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We've run into a problem...\n;\n:MAIN.FAIL\necho.progress 'ERROR' '${sts:}'\nimage free memimage\nsetlocal main.result fail\ngoto MAIN.EXIT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Rewind the driver, close and unload the DSM, return...\n;\n:MAIN.EXIT\nfree pointer image.pointer\ncall TWAIN.REWIND '${get:twainstate}' '${get:twidentity}'\nreturn '${get:main.result}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Function: Rewind from any TWAIN state...\n; arg:1 - twainstate\n; arg:2 - twidentity\n; returns: (nothing)\n;\n:TWAIN.REWIND\n;\nsetlocal twainstate '${arg:1}'\nif '${get:twainstate}' < '7' goto REWIND.6\ndsmentry src ds dg_control dat_pendingxfers msg_endxfer '0,0'\necho.progress 'pendingxfers/endxfer' '${sts:}'\nsetlocal twainstate '6'\n:REWIND.6\nif '${get:twainstate}' < '6' goto REWIND.5\ndsmentry src ds dg_control dat_pendingxfers msg_reset '0,0'\necho.progress 'pendingxfers/reset' '${sts:}'\nsetlocal twainstate '5'\n:REWIND.5\nif '${get:twainstate}' < '5' goto REWIND.4\ndsmentry src ds dg_control dat_userinterface msg_disableds '0,0'\necho.progress 'userinterface/disableds' '${sts:}'\nsetlocal twainstate '4'\n:REWIND.4\nif '${get:twainstate}' < '4' goto REWIND.3\ndsmentry src null dg_control dat_identity msg_closeds '${arg:2}'\necho.progress 'identity/closeds' '${sts:}'\nsetlocal twainstate '3'\n:REWIND.3\nif '${get:twainstate}' < '3' goto REWIND.2\ndsmentry src null dg_control dat_parent msg_closedsm hwnd\necho.progress 'parent/closedsm' '${sts:}'\nsetlocal twainstate '2'\n:REWIND.2\nif '${get:twainstate}' < '2' goto REWIND.1\ndsmunload\necho 'dsmunload'\nsetlocal twainstate '1'\n:REWIND.1\nreturn ${get:twainstate}'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/scripts/scannative.tc",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Scanfile\n;   Scan with DAT_IMAGENATIVEXFER...\n;\n; Arguments\n;   arg:1 - TW_IDENTITY.ProductName of scanner to test\n;   arg:2 - dsmload argument\n;   arg:3 - dsmload argument\n;   arg:4 - dsmload argument\n;   arg:5 - dsmload argument\n;   arg:6 - dsmload argument\n;   arg:7 - dsmload argument\n;   arg:8 - dsmload argument\n;   arg:9 - dsmload argument\n;   arg:10 - dsmload argument\n;   arg:11 - dsmload argument\n;   arg:12 - dsmload argument\n;\n; Globals\n;   (none)\n;\n; Locals\n;   image.handle - handle to native transfer\n;   image.count - count of images, starting at 1\n;   image.folder - location of the images\n;   twainstate - pass/fail result of all tests\n;\n; Returns\n;   pass or fail\n;\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Init stuff...\n;\nrun 'LoadTables'\nsetlocal image.handle '0'\nsetlocal image.count '0'\nsetlocal image.folder '${folder:data}/images'\nsetlocal twainstate '0'\nimage cleanfolder '${get:image.folder}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Load and open the DSM...\n;\nsetlocal twainstate '1'\ndsmload '${arg:2}' '${arg:3}' '${arg:4}' '${arg:5}' '${arg:6}' '${arg:7}' '${arg:8}' '${arg:9}' '${arg:10}' '${arg:11}' '${arg:12}'\necho.progress 'dsmload ${arg:2} ${arg:3} ${arg:4} ${arg:5} ${arg:6} ${arg:7} ${arg:8} ${arg:9} ${arg:10} ${arg:11} ${arg:12}' '${sts:}'\nsetlocal twainstate '2'\ndsmentry src null dg_control dat_parent msg_opendsm hwnd\necho.progress 'parent/opendsm' '${sts:}'\nif '${sts:}' != 'SUCCESS' goto MAIN.FAIL\nsetlocal twainstate '3'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; If the DF_APP2|DF_DSM2 flag is set, then call DAT_ENTRYPOINT...\n;\nif '${app:${get:TW_IDENTITY.SupportedGroups}}' & '0x30000000' != '0x30000000' goto MAIN.ENTRYPOINT.SKIP\ndsmentry src null dg_control dat_entrypoint msg_get '0,0,0,0,0,0'\necho.progress 'entrypoint/get' '${sts:} - ${ret:}'\nif '${sts:}' != 'SUCCESS' goto MAIN.ERROR\n:MAIN.ENTRYPOINT.SKIP\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Open the driver...\n;\ndsmentry src null dg_control dat_identity msg_opends '0,0,0,0,0,,0,0,0x0,,,${arg:1}'\nsetlocal twidentity '${ret:}'\necho.progress 'identity/opends' '${sts:} - ${get:twidentity}'\nif '${sts:}' != 'SUCCESS' goto MAIN.FAIL\nsetlocal twainstate '4'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set CAP_INDICATORS to TRUE...\n;\ndsmentry src ds dg_control dat_capability msg_set 'CAP_INDICATORS,TWON_ONEVALUE,TWTY_BOOL,TRUE'\necho.progress 'capability/set' '${sts:} - ${ret:}'\nif '${sts:}' != 'SUCCESS' goto MAIN.FAIL\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Set ICAP_XFERMECH to TWSX_NATIVE...\n;\ndsmentry src null dg_control dat_capability msg_set 'ICAP_XFERMECH,TWON_ONEVALUE,TWTY_UINT16,TWSX_NATIVE'\necho.progress 'capability/set' '${sts:} - ${ret:}'\nif '${sts:}' != 'SUCCESS' goto MAIN.FAIL\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Start scanning...\n;\nwait reset\ndsmentry src null dg_control dat_userinterface msg_enableds '0,0'\necho.progress 'userinterface/enableds' '${sts:} - ${ret:}'\nif '${sts:}' != 'SUCCESS' goto MAIN.FAIL\nsetlocal twainstate '5'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Wait for MSG_XFERREADY, if we don't see it then scoot...\n;\nwait 30000\necho.progress 'wait' '${ret:}'\nif '${ret:}' !~contains 'msg_xferready' goto MAIN.PASS\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Do a native transfer...\n;\n:MAIN.NEXTIMAGENATIVEXFER\nsetlocal twainstate '6'\nincrement image.count '${get:image.count}' 1\ndsmentry src ds dg_image dat_imagenativexfer msg_get '0'\nsetlocal image.handle '${ret:}'\necho.progress 'imagenativexfer/get' '${sts:} - ${ret:}'\nif '${sts:}' != 'XFERDONE' goto MAIN.FAIL\nimage save image.handle native '${get:image.folder}/img${format:D6|${get:image.count}}'\nfree handle image.handle\nsetlocal twainstate '7'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; End the transfer, see if we're done...\n;\ndsmentry src ds dg_control dat_pendingxfers msg_endxfer '0,0'\necho.progress 'pendingxfers/endxfer' '${sts:} - ${ret:}'\nif '${sts:}' != 'SUCCESS' goto MAIN.FAIL\nif '${ret:${get:TW_PENDINGXFERS.Count}}' != '0' goto MAIN.NEXTIMAGENATIVEXFER\nsetlocal twainstate '5'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We've passed...\n;\n:MAIN.PASS\nsetlocal main.result pass\ngoto MAIN.EXIT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We've run into a problem...\n;\n:MAIN.FAIL\necho.progress 'ERROR' '${sts:}'\nsetlocal main.result fail\ngoto MAIN.EXIT\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Rewind the driver, close and unload the DSM, return...\n;\n:MAIN.EXIT\nfree handle image.handle\ncall TWAIN.REWIND '${get:twainstate}' '${get:twidentity}'\nreturn '${get:main.result}'\n\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Function: Rewind from any TWAIN state...\n; arg:1 - twainstate\n; arg:2 - twidentity\n; returns: (nothing)\n;\n:TWAIN.REWIND\n;\nsetlocal twainstate '${arg:1}'\nif '${get:twainstate}' < '7' goto REWIND.6\ndsmentry src ds dg_control dat_pendingxfers msg_endxfer '0,0'\necho.progress 'pendingxfers/endxfer' '${sts:}'\nsetlocal twainstate '6'\n:REWIND.6\nif '${get:twainstate}' < '6' goto REWIND.5\ndsmentry src ds dg_control dat_pendingxfers msg_reset '0,0'\necho.progress 'pendingxfers/reset' '${sts:}'\nsetlocal twainstate '5'\n:REWIND.5\nif '${get:twainstate}' < '5' goto REWIND.4\ndsmentry src ds dg_control dat_userinterface msg_disableds '0,0'\necho.progress 'userinterface/disableds' '${sts:}'\nsetlocal twainstate '4'\n:REWIND.4\nif '${get:twainstate}' < '4' goto REWIND.3\ndsmentry src null dg_control dat_identity msg_closeds '${arg:2}'\necho.progress 'identity/closeds' '${sts:}'\nsetlocal twainstate '3'\n:REWIND.3\nif '${get:twainstate}' < '3' goto REWIND.2\ndsmentry src null dg_control dat_parent msg_closedsm hwnd\necho.progress 'parent/closedsm' '${sts:}'\nsetlocal twainstate '2'\n:REWIND.2\nif '${get:twainstate}' < '2' goto REWIND.1\ndsmunload\nsetlocal twainstate '1'\n:REWIND.1\nreturn ${get:twainstate}'\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/data/twaincscert.appdata.installed.txt",
    "content": "{\n    \"comment\": [\n        \"******************************************************************************\",\n        \"rename this file to twaincert.appdata.txt, and remove the leading X from any\",\n        \"values you want to use.\"\n    ],\n\n\n\n    \"commentLogLevel\": [\n        \"******************************************************************************\",\n        \"default: 0\",\n        \"0 - only errors are reported\",\n        \"these values are bits, add them together as needed, for instance, to get\",\n        \"all logging data flushed to disk, use a value of 7\",\n        \"1 - log informational messages\",\n        \"2 - log verbose stuff, like HTML headers\",\n        \"4 - flush to disk, use to help diagnose crashes\"\n    ],\n    \"XlogLevel\": 3\n}"
  },
  {
    "path": "twaincs/source/twaincscert/source/terminal.cs",
    "content": "﻿///////////////////////////////////////////////////////////////////////////////////////\n//\n//  twaincscert.Program\n//\n//  Our entry point.\n//\n///////////////////////////////////////////////////////////////////////////////////////\n//  Author          Date            Comment\n//  M.McLaughlin    01-Jan-2020     Initial Release\n///////////////////////////////////////////////////////////////////////////////////////\n//  Copyright (C) 2020-2021 Kodak Alaris Inc.\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a\n//  copy of this software and associated documentation files (the \"Software\"),\n//  to deal in the Software without restriction, including without limitation\n//  the rights to use, copy, modify, merge, publish, distribute, sublicense,\n//  and/or sell copies of the Software, and to permit persons to whom the\n//  Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\n//  THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n//  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n//  DEALINGS IN THE SOFTWARE.\n///////////////////////////////////////////////////////////////////////////////////////\n\n// Helpers...\nusing Microsoft.Win32.SafeHandles;\nusing System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Diagnostics.CodeAnalysis;\nusing System.Globalization;\nusing System.IO;\nusing System.IO.Compression;\nusing System.Reflection;\nusing System.Resources;\nusing System.Runtime.InteropServices;\nusing System.Security.Permissions;\nusing System.Text;\nusing System.Text.RegularExpressions;\nusing System.Threading;\nusing System.Windows.Forms;\nusing TWAINWorkingGroup;\n\nnamespace twaincscert\n{\n    /// <summary>\n    /// The certification object that we'll use to test and exercise functions\n    /// for TWAIN Direct.\n    /// </summary>\n    public sealed class Terminal : IDisposable\n    {\n        // Public Methods\n        #region Public Methods\n\n        /// <summary>\n        /// Initialize stuff...\n        /// </summary>\n        public Terminal(FormMain a_formmain)\n        {\n            // Pick some colors...\n            if ((TWAIN.GetProcessor() == TWAIN.Processor.MIPS64EL) || (TWAIN.GetPlatform() == TWAIN.Platform.MACOSX))\n            {\n                m_consolecolorDefault = ConsoleColor.Black;\n                m_consolecolorBlue = ConsoleColor.DarkBlue;\n                m_consolecolorGreen = ConsoleColor.DarkGreen;\n                m_consolecolorRed = ConsoleColor.Red;\n                m_consolecolorYellow = ConsoleColor.DarkYellow;\n            }\n            else\n            {\n                m_consolecolorDefault = ConsoleColor.Gray;\n                m_consolecolorBlue = ConsoleColor.Cyan;\n                m_consolecolorGreen = ConsoleColor.Green;\n                m_consolecolorRed = ConsoleColor.Red;\n                m_consolecolorYellow = ConsoleColor.Yellow;\n            }\n\n            // Make sure we have a console...\n            m_streamreaderConsole = Interpreter.CreateConsole();\n\n            // Init stuff...\n            m_blSilent = false;\n            m_blSilentEvents = false;\n            m_lkeyvalue = new List<KeyValue>();\n            m_objectKeyValue = new object();\n            m_lcallstack = new List<CallStack>();\n            m_formmain = null;\n            m_intptrHwnd = IntPtr.Zero;\n            m_szSetRecordVariable = \"\";\n            m_szSetRecordFilter = \"\";\n            m_szSetRecordRemove = \"\";\n            m_szSetRecordData = \"\";\n            m_szTwainSelfCertFolder = \"\";\n            m_szSelfCertDataCertFolder = Path.Combine(Path.GetDirectoryName(Application.ExecutablePath), Path.Combine(\"data\", \"Certification\"));\n            if (a_formmain != null)\n            {\n                m_formmain = a_formmain;\n                m_intptrHwnd = a_formmain.Handle;\n            }\n\n            // Set up the base stack with the program arguments, we know\n            // this is the base stack for two reasons: first, it has no\n            // script, and second, it's first... :)\n            CallStack callstack = default(CallStack);\n            callstack.functionarguments.aszCmd = Config.GetCommandLine();\n            m_lcallstack.Add(callstack);\n\n            // Build our command table...\n            m_ldispatchtable = new List<Interpreter.DispatchTable>();\n\n            // Discovery and Selection...\n            m_ldispatchtable.Add(new Interpreter.DispatchTable(CmdHelp,             new string[] { \"help\", \"?\" }));\n            m_ldispatchtable.Add(new Interpreter.DispatchTable(CmdCertify,          new string[] { \"certify\" }));\n            m_ldispatchtable.Add(new Interpreter.DispatchTable(CmdQuit,             new string[] { \"ex\", \"exit\", \"q\", \"quit\" }));\n            m_ldispatchtable.Add(new Interpreter.DispatchTable(CmdStatus,           new string[] { \"status\" }));\n\n            // Dsmentry (all DG/DAT/MSG stuff comes here)...\n            m_ldispatchtable.Add(new Interpreter.DispatchTable(CmdDsmEntry,         new string[] { \"dsmentry\" }));\n            m_ldispatchtable.Add(new Interpreter.DispatchTable(CmdDsmLoad,          new string[] { \"dsmload\" }));\n            m_ldispatchtable.Add(new Interpreter.DispatchTable(CmdDsmUnload,        new string[] { \"dsmunload\" }));\n\n            // Scripting...\n            m_ldispatchtable.Add(new Interpreter.DispatchTable(CmdAllocate,         new string[] { \"allocate\" }));\n            m_ldispatchtable.Add(new Interpreter.DispatchTable(CmdCall,             new string[] { \"call\" }));\n            m_ldispatchtable.Add(new Interpreter.DispatchTable(CmdCd,               new string[] { \"cd\", \"pwd\" }));\n            m_ldispatchtable.Add(new Interpreter.DispatchTable(CmdClean,            new string[] { \"clean\" }));\n            m_ldispatchtable.Add(new Interpreter.DispatchTable(CmdCopyBytes,        new string[] { \"copybytes\" }));\n            m_ldispatchtable.Add(new Interpreter.DispatchTable(CmdDir,              new string[] { \"dir\", \"ls\" }));\n            m_ldispatchtable.Add(new Interpreter.DispatchTable(CmdEcho,             new string[] { \"echo\" }));\n            m_ldispatchtable.Add(new Interpreter.DispatchTable(CmdEchoBlue,         new string[] { \"echo.blue\" }));\n            m_ldispatchtable.Add(new Interpreter.DispatchTable(CmdEchoGreen,        new string[] { \"echo.green\" }));\n            m_ldispatchtable.Add(new Interpreter.DispatchTable(CmdEchoPassfail,     new string[] { \"echo.passfail\" }));\n            m_ldispatchtable.Add(new Interpreter.DispatchTable(CmdEchoProgress,     new string[] { \"echo.progress\" }));\n            m_ldispatchtable.Add(new Interpreter.DispatchTable(CmdEchoPrompt,       new string[] { \"echo.prompt\" }));\n            m_ldispatchtable.Add(new Interpreter.DispatchTable(CmdEchoRed,          new string[] { \"echo.red\" }));\n            m_ldispatchtable.Add(new Interpreter.DispatchTable(CmdEchoTitlesuite,   new string[] { \"echo.titlesuite\" }));\n            m_ldispatchtable.Add(new Interpreter.DispatchTable(CmdEchoTitletest,    new string[] { \"echo.titletest\" }));\n            m_ldispatchtable.Add(new Interpreter.DispatchTable(CmdEchoYellow,       new string[] { \"echo.yellow\" }));\n            m_ldispatchtable.Add(new Interpreter.DispatchTable(CmdFileWrite,        new string[] { \"filewrite\" }));\n            m_ldispatchtable.Add(new Interpreter.DispatchTable(CmdFree,             new string[] { \"free\" }));\n            m_ldispatchtable.Add(new Interpreter.DispatchTable(CmdGc,               new string[] { \"gc\" }));\n            m_ldispatchtable.Add(new Interpreter.DispatchTable(CmdGoto,             new string[] { \"goto\" }));\n            m_ldispatchtable.Add(new Interpreter.DispatchTable(CmdIf,               new string[] { \"if\" }));\n            m_ldispatchtable.Add(new Interpreter.DispatchTable(CmdImage,            new string[] { \"image\" }));\n            m_ldispatchtable.Add(new Interpreter.DispatchTable(CmdIncrement,        new string[] { \"increment\" }));\n            m_ldispatchtable.Add(new Interpreter.DispatchTable(CmdInput,            new string[] { \"input\" }));\n            m_ldispatchtable.Add(new Interpreter.DispatchTable(CmdLog,              new string[] { \"log\" }));\n            m_ldispatchtable.Add(new Interpreter.DispatchTable(CmdMultiply,         new string[] { \"multiply\" }));\n            m_ldispatchtable.Add(new Interpreter.DispatchTable(CmdPause,            new string[] { \"pause\" }));\n            m_ldispatchtable.Add(new Interpreter.DispatchTable(CmdReport,           new string[] { \"report\" }));\n            m_ldispatchtable.Add(new Interpreter.DispatchTable(CmdReturn,           new string[] { \"return\" }));\n            m_ldispatchtable.Add(new Interpreter.DispatchTable(CmdRollback,         new string[] { \"rollback\" }));\n            m_ldispatchtable.Add(new Interpreter.DispatchTable(CmdRun,              new string[] { \"run\" }));\n            m_ldispatchtable.Add(new Interpreter.DispatchTable(CmdRunv,             new string[] { \"runv\" }));\n            m_ldispatchtable.Add(new Interpreter.DispatchTable(CmdSaveImage,        new string[] { \"saveimage\" }));\n            m_ldispatchtable.Add(new Interpreter.DispatchTable(CmdSetGlobal,        new string[] { \"setglobal\" }));\n            m_ldispatchtable.Add(new Interpreter.DispatchTable(CmdSetLocal,         new string[] { \"setlocal\" }));\n            m_ldispatchtable.Add(new Interpreter.DispatchTable(CmdSetRecord,        new string[] { \"setrecord\" }));\n            m_ldispatchtable.Add(new Interpreter.DispatchTable(CmdSizes,            new string[] { \"sizes\" }));\n            m_ldispatchtable.Add(new Interpreter.DispatchTable(CmdSleep,            new string[] { \"sleep\" }));\n            m_ldispatchtable.Add(new Interpreter.DispatchTable(CmdVerbose,          new string[] { \"verbose\" }));\n            m_ldispatchtable.Add(new Interpreter.DispatchTable(CmdWait,             new string[] { \"wait\" }));\n\n            // Create our certification folder...\n            if (!CreateTwainSelfCertDataFolder(false))\n            {\n                DisplayRed(\"Couldn't create the data folder...\");\n                Log.Error(\"Couldn't create the data folder...\");\n            }\n\n            // If we see a data folder in our working directory, we'll use that for\n            // everything except certification...\n            if (Directory.Exists(\"data\"))\n            {\n                Directory.SetCurrentDirectory(\"data\");\n            }\n\n            // Otherwise, try for the \"TWAIN Self Certification\" folder...\n            else\n            {\n                string szDataFolder = Path.Combine(m_szTwainSelfCertFolder, \"data\");\n                if (Directory.Exists(szDataFolder))\n                {\n                    Directory.SetCurrentDirectory(szDataFolder);\n                }\n            }\n\n            // Give ourselves a convenient variable...\n            SetVariable(\"sys_waittimeout\", \"60\", 0, VariableScope.Global);\n\n            // Say hi...\n            Assembly assembly = typeof(Terminal).Assembly;\n            AssemblyName assemblyname = assembly.GetName();\n            Version version = assemblyname.Version;\n            DateTime datetime = new DateTime(2000, 1, 1).AddDays(version.Build).AddSeconds(version.MinorRevision * 2);\n            string szSystem = \"(\";\n            switch (TWAIN.GetPlatform())\n            {\n                default: szSystem += \"UNKNOWN-OS\"; break;\n                case TWAIN.Platform.WINDOWS: szSystem += \"Windows\"; break;\n                case TWAIN.Platform.LINUX: szSystem += \"Linux\"; break;\n                case TWAIN.Platform.MACOSX: szSystem += \"macOS\"; break;\n            }\n            switch (TWAIN.GetProcessor())\n            {\n                default: szSystem += \" UNKNOWN-PROCESSOR\"; break;\n                case TWAIN.Processor.X86:\n                case TWAIN.Processor.X86_64: szSystem += \" Intel\"; break;\n                case TWAIN.Processor.MIPS64EL: szSystem += \" MIPSEL\"; break;\n            }\n            switch (TWAIN.GetMachineWordBitSize())\n            {\n                default: szSystem += \" UNKNOWN-BITSIZE\"; break;\n                case 32: szSystem += \" 32-bit\"; break;\n                case 64: szSystem += \" 64-bit\"; break;\n            }\n            szSystem += \")\";\n            m_szBanner = \"TWAIN Certification v\" + version.Major + \".\" + version.Minor + \" \" + datetime.Day + \"-\" + datetime.ToString(\"MMM\") + \"-\" + datetime.Year + \" \" + szSystem;\n            Display(m_szBanner);\n            Display(\"Enter \\\"certify\\\" to certify a scanner.\");\n            Display(\"Enter \\\"help\\\" for more info.\");\n        }\n\n        /// <summary>\n        /// Destructor...\n        /// </summary>\n        ~Terminal()\n        {\n            Dispose(false);\n        }\n\n        /// <summary>\n        /// Cleanup...\n        /// </summary>\n        public void Dispose()\n        {\n            Dispose(true);\n            GC.SuppressFinalize(this);\n        }\n\n        /// <summary>\n        /// Get our TWAIN object...\n        /// </summary>\n        /// <returns></returns>\n        public TWAIN GetTwain()\n        {\n            return (m_twain);\n        }\n\n        /// <summary>\n        /// Run the certification tool...\n        /// </summary>\n        public void Run()\n        {\n            string szPrompt = \"tc\";\n            Interpreter interpreter = new Interpreter(szPrompt + \">>> \", m_consolecolorDefault, m_consolecolorGreen);\n\n            // If not windows we have to turn on echo...\n            if (TWAINWorkingGroup.TWAIN.GetPlatform() != TWAIN.Platform.WINDOWS)\n            {\n                var typeSystemConsoleDriver = System.Type.GetType(\"System.ConsoleDriver\");\n                if (typeSystemConsoleDriver != null)\n                {\n                    var setecho = typeSystemConsoleDriver.GetMethod(\"SetEcho\", BindingFlags.Static | BindingFlags.NonPublic);\n                    if (setecho != null)\n                    {\n                        setecho.Invoke(System.Console.In, new object[] { false });\n                        setecho.Invoke(System.Console.In, new object[] { true });\n                    }\n                }\n            }\n\n            // Run until told to stop...\n            while (true)\n            {\n                bool blDone;\n                string szCmd;\n                string[] aszCmd;\n\n                // Prompt...\n                szCmd = interpreter.Prompt(m_streamreaderConsole, ((m_twain == null) ? 1 : (int)m_twain.GetState()));\n\n                // Tokenize...\n                aszCmd = interpreter.Tokenize(szCmd);\n\n                // Expansion of symbols...\n                Expansion(default(Interpreter.FunctionArguments), ref aszCmd);\n\n                // Dispatch...\n                Interpreter.FunctionArguments functionarguments = default(Interpreter.FunctionArguments);\n                functionarguments.aszCmd = aszCmd;\n                blDone = interpreter.Dispatch(ref functionarguments, m_ldispatchtable);\n                if (blDone)\n                {\n                    return;\n                }\n            }\n       }\n\n        /// <summary>\n        /// Monitor for DG_CONTROL / DAT_NULL / MSG_* stuff.  Actually, we're\n        /// just passing this down into TWAIN.CS, so it can keep track of\n        /// things for us...\n        /// </summary>\n        /// <param name=\"a_intptrHwnd\">Handle of window we're monitoring</param>\n        /// <param name=\"a_iMsg\">Message received</param>\n        /// <param name=\"a_intptrWparam\">Argument to message</param>\n        /// <param name=\"a_intptrLparam\">Another argument to message</param>\n        /// <returns></returns>\n        [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]\n        public bool PreFilterMessage\n        (\n            IntPtr a_intptrHwnd,\n            int a_iMsg,\n            IntPtr a_intptrWparam,\n            IntPtr a_intptrLparam\n        )\n        {\n            if (m_twain != null)\n            {\n                return (m_twain.PreFilterMessage(a_intptrHwnd, a_iMsg, a_intptrWparam, a_intptrLparam));\n            }\n            return (true);\n        }\n\n        #endregion\n\n\n        // Public Definitions\n        #region Public Definitions\n\n        /// <summary>\n        /// The scope of a variable...\n        /// </summary>\n        public enum VariableScope\n        {\n            Auto = 0,\n            Local = 1,\n            Global = 2\n        }\n\n        #endregion\n\n\n        // Private Methods (DsmEntry)\n        #region Private Methods (DsmEntry)\n\n        /// <summary>\n        /// Send a command to the currently loaded DSM...\n        /// </summary>\n        /// <param name=\"a_functionarguments\">tokenized command and anything needed</param>\n        /// <returns>true to quit</returns>\n        private bool CmdDsmEntry(ref Interpreter.FunctionArguments a_functionarguments)\n        {\n            TWAIN.DG dg = TWAIN.DG.MASK;\n            TWAIN.DAT dat = TWAIN.DAT.NULL;\n            TWAIN.MSG msg = TWAIN.MSG.NULL;\n            CallStack callstack = m_lcallstack[m_lcallstack.Count - 1];\n\n            // Init stuff...\n            a_functionarguments.iDg = 0;\n            a_functionarguments.iDat = 0;\n            a_functionarguments.iMsg = 0;\n            a_functionarguments.sts = TWAIN.STS.BADPROTOCOL;\n            a_functionarguments.szReturnValue = \"\";\n\n            // Validate at the top level...\n            if (m_twain == null)\n            {\n                DisplayRed(\"***ERROR*** - dsmload wasn't run, so we is having no braims\");\n                a_functionarguments.sts = TWAIN.STS.SEQERROR;\n                return (false);\n            }\n            if (a_functionarguments.aszCmd.Length != 7)\n            {\n                DisplayRed(\"***ERROR*** - command needs 7 arguments: dsmentry src dst dg dat msg memref\");\n                return (false);\n            }\n\n            // Look for Source...\n            if (a_functionarguments.aszCmd[1] == \"src\")\n            {\n            }\n            else\n            {\n                DisplayRed(\"Unrecognized src - <\" + a_functionarguments.aszCmd[1] + \">\");\n                return (false);\n            }\n\n            // Look for Destination...\n            if (a_functionarguments.aszCmd[2] == \"ds\")\n            {\n            }\n            else if (a_functionarguments.aszCmd[2] == \"null\")\n            {\n            }\n            else\n            {\n                DisplayRed(\"Unrecognized dst - <\" + a_functionarguments.aszCmd[2] + \">\");\n                return (false);\n            }\n\n            // Look for DG...\n            if (!a_functionarguments.aszCmd[3].ToLowerInvariant().StartsWith(\"dg_\"))\n            {\n                DisplayRed(\"Unrecognized dg - <\" + a_functionarguments.aszCmd[3] + \">\");\n                return (false);\n            }\n            else\n            {\n                // Look for hex number (take anything)...\n                if (a_functionarguments.aszCmd[3].ToLowerInvariant().StartsWith(\"dg_0x\"))\n                {\n                    if (!int.TryParse(a_functionarguments.aszCmd[3].ToLowerInvariant().Substring(3), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out a_functionarguments.iDg))\n                    {\n                        DisplayRed(\"Badly constructed dg - <\" + a_functionarguments.aszCmd[3] + \">\");\n                        return (false);\n                    }\n                }\n                else\n                {\n                    if (!Enum.TryParse(a_functionarguments.aszCmd[3].ToUpperInvariant().Substring(3), out dg))\n                    {\n                        DisplayRed(\"Unrecognized dg - <\" + a_functionarguments.aszCmd[3] + \">\");\n                        return (false);\n                    }\n                    a_functionarguments.iDg = (int)dg;\n                }\n            }\n\n            // Look for DAT...\n            if (!a_functionarguments.aszCmd[4].ToLowerInvariant().StartsWith(\"dat_\"))\n            {\n                DisplayRed(\"Unrecognized dat - <\" + a_functionarguments.aszCmd[4] + \">\");\n                return (false);\n            }\n            else\n            {\n                // Look for hex number (take anything)...\n                if (a_functionarguments.aszCmd[4].ToLowerInvariant().StartsWith(\"dat_0x\"))\n                {\n                    if (!int.TryParse(a_functionarguments.aszCmd[4].ToLowerInvariant().Substring(4), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out a_functionarguments.iDat))\n                    {\n                        DisplayRed(\"Badly constructed dat - <\" + a_functionarguments.aszCmd[4] + \">\");\n                        return (false);\n                    }\n                }\n                else\n                {\n                    if (!Enum.TryParse(a_functionarguments.aszCmd[4].ToUpperInvariant().Substring(4), out dat))\n                    {\n                        DisplayRed(\"Unrecognized dat - <\" + a_functionarguments.aszCmd[4] + \">\");\n                        return (false);\n                    }\n                    a_functionarguments.iDat = (int)dat;\n                }\n            }\n\n            // Look for MSG...\n            if (!a_functionarguments.aszCmd[5].ToLowerInvariant().StartsWith(\"msg_\"))\n            {\n                DisplayRed(\"Unrecognized msg - <\" + a_functionarguments.aszCmd[5] + \">\");\n                return (false);\n            }\n            else\n            {\n                // Look for hex number (take anything)...\n                if (a_functionarguments.aszCmd[5].ToLowerInvariant().StartsWith(\"msg_0x\"))\n                {\n                    if (!int.TryParse(a_functionarguments.aszCmd[5].ToLowerInvariant().Substring(4), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out a_functionarguments.iMsg))\n                    {\n                        DisplayRed(\"Badly constructed dat - <\" + a_functionarguments.aszCmd[5] + \">\");\n                        return (false);\n                    }\n                }\n                else\n                {\n                    if (!Enum.TryParse(a_functionarguments.aszCmd[5].ToUpperInvariant().Substring(4), out msg))\n                    {\n                        DisplayRed(\"Unrecognized msg - <\" + a_functionarguments.aszCmd[5] + \">\");\n                        return (false);\n                    }\n                    a_functionarguments.iMsg = (int)msg;\n                }\n            }\n\n            // If this is issued directly by the user or runv is being used, let's\n            // give more info...\n            if (!m_blRunningScript || m_blVerbose)\n            {\n                CSV csv = new CSV();\n                foreach (string szCmd in a_functionarguments.aszCmd)\n                {\n                    csv.Add(szCmd);\n                }\n                DisplayBlue(\"snd: \" + csv.Get());\n            }\n\n            // Send the command...\n            switch (a_functionarguments.iDat)\n            {\n                // Ruh-roh, since we can't marshal it, we have to return an error,\n                // it would be nice to have a solution for this, but that will need\n                // a dynamic marshalling system...\n                default:\n                    a_functionarguments.sts = TWAIN.STS.BADPROTOCOL;\n                    break;\n\n                // DAT_AUDIOFILEXFER...\n                case (int)TWAIN.DAT.AUDIOFILEXFER:\n                    {\n                        a_functionarguments.sts = m_twain.DatAudiofilexfer((TWAIN.DG)a_functionarguments.iDg, (TWAIN.MSG)a_functionarguments.iMsg);\n                        a_functionarguments.szReturnValue = \"\";\n                        callstack.functionarguments.sts = a_functionarguments.sts;\n                        callstack.functionarguments.szReturnValue = a_functionarguments.szReturnValue;\n                    }\n                    break;\n\n                // DAT_AUDIOINFO..\n                case (int)TWAIN.DAT.AUDIOINFO:\n                    {\n                        TWAIN.TW_AUDIOINFO twaudioinfo = default(TWAIN.TW_AUDIOINFO);\n                        a_functionarguments.sts = m_twain.DatAudioinfo((TWAIN.DG)a_functionarguments.iDg, (TWAIN.MSG)a_functionarguments.iMsg, ref twaudioinfo);\n                        a_functionarguments.szReturnValue = TWAIN.AudioinfoToCsv(twaudioinfo);\n                        callstack.functionarguments.sts = a_functionarguments.sts;\n                        callstack.functionarguments.szReturnValue = a_functionarguments.szReturnValue;\n                    }\n                    break;\n\n                // DAT_AUDIONATIVEXFER..\n                case (int)TWAIN.DAT.AUDIONATIVEXFER:\n                    {\n                        IntPtr intptr = IntPtr.Zero;\n                        a_functionarguments.sts = m_twain.DatAudionativexfer((TWAIN.DG)a_functionarguments.iDg, (TWAIN.MSG)a_functionarguments.iMsg, ref intptr);\n                        a_functionarguments.szReturnValue = intptr.ToString();\n                        callstack.functionarguments.sts = a_functionarguments.sts;\n                        callstack.functionarguments.szReturnValue = a_functionarguments.szReturnValue;\n                    }\n                    break;\n\n                // DAT_CALLBACK...\n                case (int)TWAIN.DAT.CALLBACK:\n                    {\n                        TWAIN.TW_CALLBACK twcallback = default(TWAIN.TW_CALLBACK);\n                        TWAIN.CsvToCallback(ref twcallback, a_functionarguments.aszCmd[6]);\n                        a_functionarguments.sts = m_twain.DatCallback((TWAIN.DG)a_functionarguments.iDg, (TWAIN.MSG)a_functionarguments.iMsg, ref twcallback);\n                        a_functionarguments.szReturnValue = TWAIN.CallbackToCsv(twcallback);\n                        callstack.functionarguments.sts = a_functionarguments.sts;\n                        callstack.functionarguments.szReturnValue = a_functionarguments.szReturnValue;\n                    }\n                    break;\n\n                // DAT_CALLBACK2...\n                case (int)TWAIN.DAT.CALLBACK2:\n                    {\n                        TWAIN.TW_CALLBACK2 twcallback2 = default(TWAIN.TW_CALLBACK2);\n                        TWAIN.CsvToCallback2(ref twcallback2, a_functionarguments.aszCmd[6]);\n                        a_functionarguments.sts = m_twain.DatCallback2((TWAIN.DG)a_functionarguments.iDg, (TWAIN.MSG)a_functionarguments.iMsg, ref twcallback2);\n                        a_functionarguments.szReturnValue = TWAIN.Callback2ToCsv(twcallback2);\n                        callstack.functionarguments.sts = a_functionarguments.sts;\n                        callstack.functionarguments.szReturnValue = a_functionarguments.szReturnValue;\n                    }\n                    break;\n\n                // DAT_CAPABILITY...\n                case (int)TWAIN.DAT.CAPABILITY:\n                    {\n                        // Skip symbols for msg_querysupport, otherwise 0 gets turned into false, also\n                        // if the command fails the return value is whatever was sent into us, which\n                        // matches the experience one should get with C/C++...\n                        string szStatus = \"\";\n                        TWAIN.TW_CAPABILITY twcapability = default(TWAIN.TW_CAPABILITY);\n                        m_twain.CsvToCapability(ref twcapability, ref szStatus, a_functionarguments.aszCmd[6]);\n                        a_functionarguments.sts = m_twain.DatCapability((TWAIN.DG)a_functionarguments.iDg, (TWAIN.MSG)a_functionarguments.iMsg, ref twcapability);\n                        if ((a_functionarguments.sts == TWAIN.STS.SUCCESS) || (a_functionarguments.sts == TWAIN.STS.CHECKSTATUS))\n                        {\n                            // Convert the data to CSV...\n                            a_functionarguments.szReturnValue = m_twain.CapabilityToCsv(twcapability, ((TWAIN.MSG)a_functionarguments.iMsg != TWAIN.MSG.QUERYSUPPORT));\n                            // Free the handle if the driver created it...\n                            switch ((TWAIN.MSG)a_functionarguments.iMsg)\n                            {\n                                default: break;\n                                case TWAIN.MSG.GET:\n                                case TWAIN.MSG.GETCURRENT:\n                                case TWAIN.MSG.GETDEFAULT:\n                                case TWAIN.MSG.QUERYSUPPORT:\n                                case TWAIN.MSG.RESET:\n                                    m_twain.DsmMemFree(ref twcapability.hContainer);\n                                    break;\n                            }\n                        }\n                        else\n                        {\n                            a_functionarguments.szReturnValue = a_functionarguments.aszCmd[6];\n                        }\n                        callstack.functionarguments.sts = a_functionarguments.sts;\n                        callstack.functionarguments.szReturnValue = a_functionarguments.szReturnValue;\n                    }\n                    break;\n\n                // DAT_CIECOLOR..\n                case (int)TWAIN.DAT.CIECOLOR:\n                    {\n                        //TWAIN.TW_CIECOLOR twciecolor = default(TWAIN.TW_CIECOLOR);\n                        //a_functionarguments.sts = m_twain.DatCiecolor((TWAIN.DG)a_functionarguments.iDg, (TWAIN.MSG)a_functionarguments.iMsg, ref twciecolor);\n                        //a_functionarguments.szReturnValue = m_twain.CiecolorToCsv(twciecolor);\n                        //callstack.functionarguments.sts = a_functionarguments.sts;\n                        //callstack.functionarguments.szReturnValue = a_functionarguments.szReturnValue;\n                    }\n                    break;\n\n                // DAT_CUSTOMDSDATA...\n                case (int)TWAIN.DAT.CUSTOMDSDATA:\n                    {\n                        TWAIN.TW_CUSTOMDSDATA twcustomdsdata = default(TWAIN.TW_CUSTOMDSDATA);\n                        m_twain.CsvToCustomdsdata(ref twcustomdsdata, a_functionarguments.aszCmd[6]);\n                        a_functionarguments.sts = m_twain.DatCustomdsdata((TWAIN.DG)a_functionarguments.iDg, (TWAIN.MSG)a_functionarguments.iMsg, ref twcustomdsdata);\n                        a_functionarguments.szReturnValue = m_twain.CustomdsdataToCsv(twcustomdsdata);\n                        callstack.functionarguments.sts = a_functionarguments.sts;\n                        callstack.functionarguments.szReturnValue = a_functionarguments.szReturnValue;\n                    }\n                    break;\n\n                // DAT_DEVICEEVENT...\n                case (int)TWAIN.DAT.DEVICEEVENT:\n                    {\n                        TWAIN.TW_DEVICEEVENT twdeviceevent = default(TWAIN.TW_DEVICEEVENT);\n                        a_functionarguments.sts = m_twain.DatDeviceevent((TWAIN.DG)a_functionarguments.iDg, (TWAIN.MSG)a_functionarguments.iMsg, ref twdeviceevent);\n                        a_functionarguments.szReturnValue = TWAIN.DeviceeventToCsv(twdeviceevent);\n                        callstack.functionarguments.sts = a_functionarguments.sts;\n                        callstack.functionarguments.szReturnValue = a_functionarguments.szReturnValue;\n                    }\n                    break;\n\n                // DAT_ENTRYPOINT...\n                case (int)TWAIN.DAT.ENTRYPOINT:\n                    {\n                        TWAIN.TW_ENTRYPOINT twentrypoint = default(TWAIN.TW_ENTRYPOINT);\n                        twentrypoint.Size = (uint)Marshal.SizeOf(twentrypoint);\n                        a_functionarguments.sts = m_twain.DatEntrypoint((TWAIN.DG)a_functionarguments.iDg, (TWAIN.MSG)a_functionarguments.iMsg, ref twentrypoint);\n                        a_functionarguments.szReturnValue = TWAIN.EntrypointToCsv(twentrypoint);\n                        callstack.functionarguments.sts = a_functionarguments.sts;\n                        callstack.functionarguments.szReturnValue = a_functionarguments.szReturnValue;\n                    }\n                    break;\n\n                // DAT_EVENT...\n                case (int)TWAIN.DAT.EVENT:\n                    {\n                        TWAIN.TW_EVENT twevent = default(TWAIN.TW_EVENT);\n                        a_functionarguments.sts = m_twain.DatEvent((TWAIN.DG)a_functionarguments.iDg, (TWAIN.MSG)a_functionarguments.iMsg, ref twevent);\n                        a_functionarguments.szReturnValue = TWAIN.EventToCsv(twevent);\n                        callstack.functionarguments.sts = a_functionarguments.sts;\n                        callstack.functionarguments.szReturnValue = a_functionarguments.szReturnValue;\n                    }\n                    break;\n\n                // DAT_EXTIMAGEINFO...\n                case (int)TWAIN.DAT.EXTIMAGEINFO:\n                    {\n                        TWAIN.TW_EXTIMAGEINFO twextimageinfo = default(TWAIN.TW_EXTIMAGEINFO);\n                        TWAIN.CsvToExtimageinfo(ref twextimageinfo, a_functionarguments.aszCmd[6]);\n                        a_functionarguments.sts = m_twain.DatExtimageinfo((TWAIN.DG)a_functionarguments.iDg, (TWAIN.MSG)a_functionarguments.iMsg, ref twextimageinfo);\n                        a_functionarguments.szReturnValue = TWAIN.ExtimageinfoToCsv(twextimageinfo);\n                        callstack.functionarguments.sts = a_functionarguments.sts;\n                        callstack.functionarguments.szReturnValue = a_functionarguments.szReturnValue;\n                    }\n                    break;\n\n                // DAT_FILESYSTEM...\n                case (int)TWAIN.DAT.FILESYSTEM:\n                    {\n                        TWAIN.TW_FILESYSTEM twfilesystem = default(TWAIN.TW_FILESYSTEM);\n                        TWAIN.CsvToFilesystem(ref twfilesystem, a_functionarguments.aszCmd[6]);\n                        a_functionarguments.sts = m_twain.DatFilesystem((TWAIN.DG)a_functionarguments.iDg, (TWAIN.MSG)a_functionarguments.iMsg, ref twfilesystem);\n                        a_functionarguments.szReturnValue = TWAIN.FilesystemToCsv(twfilesystem);\n                        callstack.functionarguments.sts = a_functionarguments.sts;\n                        callstack.functionarguments.szReturnValue = a_functionarguments.szReturnValue;\n                    }\n                    break;\n\n                // DAT_FILTER...\n                case (int)TWAIN.DAT.FILTER:\n                    {\n                        //TWAIN.TW_FILTER twfilter = default(TWAIN.TW_FILTER);\n                        //m_twain.CsvToFilter(ref twfilter, a_functionarguments.aszCmd[6]);\n                        //a_functionarguments.sts = m_twain.DatFilter((TWAIN.DG)a_functionarguments.iDg, (TWAIN.MSG)a_functionarguments.iMsg, ref twfilter);\n                        //a_functionarguments.szReturnValue = m_twain.FilterToCsv(twfilter);\n                        //callstack.functionarguments.sts = a_functionarguments.sts;\n                        //callstack.functionarguments.szReturnValue = a_functionarguments.szReturnValue;\n                    }\n                    break;\n\n                // DAT_GRAYRESPONSE...\n                case (int)TWAIN.DAT.GRAYRESPONSE:\n                    {\n                        //TWAIN.TW_GRAYRESPONSE twgrayresponse = default(TWAIN.TW_GRAYRESPONSE);\n                        //m_twain.CsvToGrayresponse(ref twgrayresponse, a_functionarguments.aszCmd[6]);\n                        //a_functionarguments.sts = m_twain.DatGrayresponse((TWAIN.DG)a_functionarguments.iDg, (TWAIN.MSG)a_functionarguments.iMsg, ref twgrayresponse);\n                        //a_functionarguments.szReturnValue = m_twain.GrayresponseToCsv(twgrayresponse);\n                        //callstack.functionarguments.sts = a_functionarguments.sts;\n                        //callstack.functionarguments.szReturnValue = a_functionarguments.szReturnValue;\n                    }\n                    break;\n\n                // DAT_ICCPROFILE...\n                case (int)TWAIN.DAT.ICCPROFILE:\n                    {\n                        TWAIN.TW_MEMORY twmemory = default(TWAIN.TW_MEMORY);\n                        a_functionarguments.sts = m_twain.DatIccprofile((TWAIN.DG)a_functionarguments.iDg, (TWAIN.MSG)a_functionarguments.iMsg, ref twmemory);\n                        a_functionarguments.szReturnValue = TWAIN.IccprofileToCsv(twmemory);\n                        callstack.functionarguments.sts = a_functionarguments.sts;\n                        callstack.functionarguments.szReturnValue = a_functionarguments.szReturnValue;\n                    }\n                    break;\n\n                // DAT_IDENTITY...\n                case (int)TWAIN.DAT.IDENTITY:\n                    {\n                        TWAIN.TW_IDENTITY twidentity = default(TWAIN.TW_IDENTITY);\n                        TWAIN.CsvToIdentity(ref twidentity, a_functionarguments.aszCmd[6]);\n                        a_functionarguments.sts = m_twain.DatIdentity((TWAIN.DG)a_functionarguments.iDg, (TWAIN.MSG)a_functionarguments.iMsg, ref twidentity);\n                        a_functionarguments.szReturnValue = TWAIN.IdentityToCsv(twidentity);\n                        callstack.functionarguments.sts = a_functionarguments.sts;\n                        callstack.functionarguments.szReturnValue = a_functionarguments.szReturnValue;\n                    }\n                    break;\n\n                // DAT_IMAGEFILEXFER...\n                case (int)TWAIN.DAT.IMAGEFILEXFER:\n                    {\n                        a_functionarguments.sts = m_twain.DatImagefilexfer((TWAIN.DG)a_functionarguments.iDg, (TWAIN.MSG)a_functionarguments.iMsg);\n                        a_functionarguments.szReturnValue = \"\";\n                        callstack.functionarguments.sts = a_functionarguments.sts;\n                        callstack.functionarguments.szReturnValue = a_functionarguments.szReturnValue;\n                    }\n                    break;\n\n                // DAT_IMAGEINFO...\n                case (int)TWAIN.DAT.IMAGEINFO:\n                    {\n                        TWAIN.TW_IMAGEINFO twimageinfo = default(TWAIN.TW_IMAGEINFO);\n                        TWAIN.CsvToImageinfo(ref twimageinfo, a_functionarguments.aszCmd[6]);\n                        a_functionarguments.sts = m_twain.DatImageinfo((TWAIN.DG)a_functionarguments.iDg, (TWAIN.MSG)a_functionarguments.iMsg, ref twimageinfo);\n                        a_functionarguments.szReturnValue = TWAIN.ImageinfoToCsv(twimageinfo);\n                        callstack.functionarguments.sts = a_functionarguments.sts;\n                        callstack.functionarguments.szReturnValue = a_functionarguments.szReturnValue;\n                    }\n                    break;\n\n                // DAT_IMAGELAYOUT...\n                case (int)TWAIN.DAT.IMAGELAYOUT:\n                    {\n                        TWAIN.TW_IMAGELAYOUT twimagelayout = default(TWAIN.TW_IMAGELAYOUT);\n                        TWAIN.CsvToImagelayout(ref twimagelayout, a_functionarguments.aszCmd[6]);\n                        a_functionarguments.sts = m_twain.DatImagelayout((TWAIN.DG)a_functionarguments.iDg, (TWAIN.MSG)a_functionarguments.iMsg, ref twimagelayout);\n                        a_functionarguments.szReturnValue = TWAIN.ImagelayoutToCsv(twimagelayout);\n                        callstack.functionarguments.sts = a_functionarguments.sts;\n                        callstack.functionarguments.szReturnValue = a_functionarguments.szReturnValue;\n                    }\n                    break;\n\n                // DAT_IMAGEMEMFILEXFER...\n                case (int)TWAIN.DAT.IMAGEMEMFILEXFER:\n                    {\n                        TWAIN.TW_IMAGEMEMXFER twimagememxfer = default(TWAIN.TW_IMAGEMEMXFER);\n                        TWAIN.CsvToImagememxfer(ref twimagememxfer, a_functionarguments.aszCmd[6]);\n                        a_functionarguments.sts = m_twain.DatImagememfilexfer((TWAIN.DG)a_functionarguments.iDg, (TWAIN.MSG)a_functionarguments.iMsg, ref twimagememxfer);\n                        a_functionarguments.szReturnValue = TWAIN.ImagememxferToCsv(twimagememxfer);\n                        callstack.functionarguments.sts = a_functionarguments.sts;\n                        callstack.functionarguments.szReturnValue = a_functionarguments.szReturnValue;\n                    }\n                    break;\n\n                // DAT_IMAGEMEMXFER...\n                case (int)TWAIN.DAT.IMAGEMEMXFER:\n                    {\n                        TWAIN.TW_IMAGEMEMXFER twimagememxfer = default(TWAIN.TW_IMAGEMEMXFER);\n                        TWAIN.CsvToImagememxfer(ref twimagememxfer, a_functionarguments.aszCmd[6]);\n                        a_functionarguments.sts = m_twain.DatImagememxfer((TWAIN.DG)a_functionarguments.iDg, (TWAIN.MSG)a_functionarguments.iMsg, ref twimagememxfer);\n                        a_functionarguments.szReturnValue = TWAIN.ImagememxferToCsv(twimagememxfer);\n                        callstack.functionarguments.sts = a_functionarguments.sts;\n                        callstack.functionarguments.szReturnValue = a_functionarguments.szReturnValue;\n                    }\n                    break;\n\n                // DAT_IMAGENATIVEXFER...\n                case (int)TWAIN.DAT.IMAGENATIVEXFER:\n                    {\n                        IntPtr intptrBitmapHandle = IntPtr.Zero;\n                        a_functionarguments.sts = m_twain.DatImagenativexferHandle((TWAIN.DG)a_functionarguments.iDg, (TWAIN.MSG)a_functionarguments.iMsg, ref intptrBitmapHandle);\n                        a_functionarguments.szReturnValue = intptrBitmapHandle.ToString();\n                        callstack.functionarguments.sts = a_functionarguments.sts;\n                        callstack.functionarguments.szReturnValue = a_functionarguments.szReturnValue;\n                    }\n                    break;\n\n                // DAT_JPEGCOMPRESSION...\n                case (int)TWAIN.DAT.JPEGCOMPRESSION:\n                    {\n                        //TWAIN.TW_JPEGCOMPRESSION twjpegcompression = default(TWAIN.TW_JPEGCOMPRESSION);\n                        //m_twain.CsvToJpegcompression(ref twjpegcompression, a_functionarguments.aszCmd[6]);\n                        //a_functionarguments.sts = m_twain.DatJpegcompression((TWAIN.DG)a_functionarguments.iDg, (TWAIN.MSG)a_functionarguments.iMsg, ref twjpegcompression);\n                        //a_functionarguments.szReturnValue = m_twain.JpegcompressionToCsv(twjpegcompression);\n                        //callstack.functionarguments.sts = a_functionarguments.sts;\n                        //callstack.functionarguments.szReturnValue = a_functionarguments.szReturnValue;\n                    }\n                    break;\n\n                // DAT_METRICS...\n                case (int)TWAIN.DAT.METRICS:\n                    {\n                        TWAIN.TW_METRICS twmetrics = default(TWAIN.TW_METRICS);\n                        twmetrics.SizeOf = (uint)Marshal.SizeOf(twmetrics);\n                        a_functionarguments.sts = m_twain.DatMetrics((TWAIN.DG)a_functionarguments.iDg, (TWAIN.MSG)a_functionarguments.iMsg, ref twmetrics);\n                        a_functionarguments.szReturnValue = TWAIN.MetricsToCsv(twmetrics);\n                        callstack.functionarguments.sts = a_functionarguments.sts;\n                        callstack.functionarguments.szReturnValue = a_functionarguments.szReturnValue;\n                    }\n                    break;\n\n                // DAT_PALETTE8...\n                case (int)TWAIN.DAT.PALETTE8:\n                    {\n                        //TWAIN.TW_PALETTE8 twpalette8 = default(TWAIN.TW_PALETTE8);\n                        //m_twain.CsvToPalette8(ref twpalette8, a_functionarguments.aszCmd[6]);\n                        //a_functionarguments.sts = m_twain.DatPalette8((TWAIN.DG)a_functionarguments.iDg, (TWAIN.MSG)a_functionarguments.iMsg, ref twpalette8);\n                        //a_functionarguments.szReturnValue = m_twain.Palette8ToCsv(twpalette8);\n                        //callstack.functionarguments.sts = a_functionarguments.sts;\n                        //callstack.functionarguments.szReturnValue = a_functionarguments.szReturnValue;\n                    }\n                    break;\n\n                // DAT_PARENT...\n                case (int)TWAIN.DAT.PARENT:\n                    {\n                        a_functionarguments.sts = m_twain.DatParent((TWAIN.DG)a_functionarguments.iDg, (TWAIN.MSG)a_functionarguments.iMsg, ref m_intptrHwnd);\n                    }\n                    break;\n\n                // DAT_PASSTHRU...\n                case (int)TWAIN.DAT.PASSTHRU:\n                    {\n                        TWAIN.TW_PASSTHRU twpassthru = default(TWAIN.TW_PASSTHRU);\n                        TWAIN.CsvToPassthru(ref twpassthru, a_functionarguments.aszCmd[6]);\n                        a_functionarguments.sts = m_twain.DatPassthru((TWAIN.DG)a_functionarguments.iDg, (TWAIN.MSG)a_functionarguments.iMsg, ref twpassthru);\n                        a_functionarguments.szReturnValue = TWAIN.PassthruToCsv(twpassthru);\n                        callstack.functionarguments.sts = a_functionarguments.sts;\n                        callstack.functionarguments.szReturnValue = a_functionarguments.szReturnValue;\n                    }\n                    break;\n\n                // DAT_PENDINGXFERS...\n                case (int)TWAIN.DAT.PENDINGXFERS:\n                    {\n                        // Send the command...\n                        TWAIN.TW_PENDINGXFERS twpendingxfers = default(TWAIN.TW_PENDINGXFERS);\n                        a_functionarguments.sts = m_twain.DatPendingxfers((TWAIN.DG)a_functionarguments.iDg, (TWAIN.MSG)a_functionarguments.iMsg, ref twpendingxfers);\n                        a_functionarguments.szReturnValue = TWAIN.PendingxfersToCsv(twpendingxfers);\n                        callstack.functionarguments.sts = a_functionarguments.sts;\n                        callstack.functionarguments.szReturnValue = a_functionarguments.szReturnValue;\n\n                        // Clear the list, so the script writer doesn't have to (needed for when ShowUI is TRUE)...\n                        if (a_functionarguments.sts == TWAIN.STS.SUCCESS)\n                        {\n                            if ((a_functionarguments.iMsg == (int)TWAIN.MSG.RESET) || ((a_functionarguments.iMsg == (int)TWAIN.MSG.ENDXFER) && (twpendingxfers.Count == 0)))\n                            {\n                                lock (m_lmsgDatNull)\n                                {\n                                    m_lmsgDatNull.Clear();\n                                    m_autoreseteventMsgDatNull.Reset();\n                                }\n                            }\n                        }\n                    }\n                    break;\n\n                // DAT_RGBRESPONSE...\n                case (int)TWAIN.DAT.RGBRESPONSE:\n                    {\n                        //TWAIN.TW_RGBRESPONSE twrgbresponse = default(TWAIN.TW_RGBRESPONSE);\n                        //m_twain.CsvToRgbresponse(ref twrgbresponse, a_functionarguments.aszCmd[6]);\n                        //a_functionarguments.sts = m_twain.DatRgbresponse((TWAIN.DG)a_functionarguments.iDg, (TWAIN.MSG)a_functionarguments.iMsg, ref twrgbresponse);\n                        //a_functionarguments.szReturnValue = m_twain.RgbresponseToCsv(twrgbresponse);\n                        //callstack.functionarguments.sts = a_functionarguments.sts;\n                        //callstack.functionarguments.szReturnValue = a_functionarguments.szReturnValue;\n                    }\n                    break;\n\n                // DAT_SETUPFILEXFER...\n                case (int)TWAIN.DAT.SETUPFILEXFER:\n                    {\n                        TWAIN.TW_SETUPFILEXFER twsetupfilexfer = default(TWAIN.TW_SETUPFILEXFER);\n                        TWAIN.CsvToSetupfilexfer(ref twsetupfilexfer, a_functionarguments.aszCmd[6]);\n                        a_functionarguments.sts = m_twain.DatSetupfilexfer((TWAIN.DG)a_functionarguments.iDg, (TWAIN.MSG)a_functionarguments.iMsg, ref twsetupfilexfer);\n                        a_functionarguments.szReturnValue = TWAIN.SetupfilexferToCsv(twsetupfilexfer);\n                        callstack.functionarguments.sts = a_functionarguments.sts;\n                        callstack.functionarguments.szReturnValue = a_functionarguments.szReturnValue;\n                    }\n                    break;\n\n                // DAT_SETUPMEMXFER...\n                case (int)TWAIN.DAT.SETUPMEMXFER:\n                    {\n                        TWAIN.TW_SETUPMEMXFER twsetupmemxfer = default(TWAIN.TW_SETUPMEMXFER);\n                        a_functionarguments.sts = m_twain.DatSetupmemxfer((TWAIN.DG)a_functionarguments.iDg, (TWAIN.MSG)a_functionarguments.iMsg, ref twsetupmemxfer);\n                        a_functionarguments.szReturnValue = TWAIN.SetupmemxferToCsv(twsetupmemxfer);\n                        callstack.functionarguments.sts = a_functionarguments.sts;\n                        callstack.functionarguments.szReturnValue = a_functionarguments.szReturnValue;\n                    }\n                    break;\n\n                // DAT_STATUS...\n                case (int)TWAIN.DAT.STATUS:\n                    {\n                        TWAIN.TW_STATUS twstatus = default(TWAIN.TW_STATUS);\n                        a_functionarguments.sts = m_twain.DatStatus((TWAIN.DG)a_functionarguments.iDg, (TWAIN.MSG)a_functionarguments.iMsg, ref twstatus);\n                        a_functionarguments.szReturnValue = TWAIN.StatusToCsv(twstatus);\n                        callstack.functionarguments.sts = a_functionarguments.sts;\n                        callstack.functionarguments.szReturnValue = a_functionarguments.szReturnValue;\n                    }\n                    break;\n\n                // DAT_STATUSUTF8...\n                case (int)TWAIN.DAT.STATUSUTF8:\n                    {\n                        TWAIN.TW_STATUSUTF8 twstatusutf8 = default(TWAIN.TW_STATUSUTF8);\n                        a_functionarguments.sts = m_twain.DatStatusutf8((TWAIN.DG)a_functionarguments.iDg, (TWAIN.MSG)a_functionarguments.iMsg, ref twstatusutf8);\n                        a_functionarguments.szReturnValue = m_twain.Statusutf8ToCsv(twstatusutf8);\n                        callstack.functionarguments.sts = a_functionarguments.sts;\n                        callstack.functionarguments.szReturnValue = a_functionarguments.szReturnValue;\n                    }\n                    break;\n\n                // DAT_TWAINDIRECT...\n                case (int)TWAIN.DAT.TWAINDIRECT:\n                    {\n                        TWAIN.TW_TWAINDIRECT twtwaindirect = default(TWAIN.TW_TWAINDIRECT);\n                        TWAIN.CsvToTwaindirect(ref twtwaindirect, a_functionarguments.aszCmd[6]);\n                        a_functionarguments.sts = m_twain.DatTwaindirect((TWAIN.DG)a_functionarguments.iDg, (TWAIN.MSG)a_functionarguments.iMsg, ref twtwaindirect);\n                        a_functionarguments.szReturnValue = TWAIN.TwaindirectToCsv(twtwaindirect);\n                        callstack.functionarguments.sts = a_functionarguments.sts;\n                        callstack.functionarguments.szReturnValue = a_functionarguments.szReturnValue;\n                    }\n                    break;\n\n                // DAT_USERINTERFACE...\n                case (int)TWAIN.DAT.USERINTERFACE:\n                    {\n                        // Clear the list, so the script writer doesn't have to...\n                        if ((a_functionarguments.iMsg == (int)TWAIN.MSG.ENABLEDS) || (a_functionarguments.iMsg == (int)TWAIN.MSG.ENABLEDSUIONLY))\n                        {\n                            lock (m_lmsgDatNull)\n                            {\n                                m_lmsgDatNull.Clear();\n                                m_autoreseteventMsgDatNull.Reset();\n                            }\n                        }\n\n                        // Send the command...\n                        TWAIN.TW_USERINTERFACE twuserinterface = default(TWAIN.TW_USERINTERFACE);\n                        m_twain.CsvToUserinterface(ref twuserinterface, a_functionarguments.aszCmd[6]);\n                        a_functionarguments.sts = m_twain.DatUserinterface((TWAIN.DG)a_functionarguments.iDg, (TWAIN.MSG)a_functionarguments.iMsg, ref twuserinterface);\n                        a_functionarguments.szReturnValue = TWAIN.UserinterfaceToCsv(twuserinterface);\n                        callstack.functionarguments.sts = a_functionarguments.sts;\n                        callstack.functionarguments.szReturnValue = a_functionarguments.szReturnValue;\n\n                        // Clear the list, so the script writer doesn't have to...\n                        if (a_functionarguments.sts == TWAIN.STS.SUCCESS)\n                        {\n                            if (a_functionarguments.iMsg == (int)TWAIN.MSG.DISABLEDS)\n                            {\n                                lock (m_lmsgDatNull)\n                                {\n                                    m_lmsgDatNull.Clear();\n                                    m_autoreseteventMsgDatNull.Reset();\n                                }\n                            }\n                        }\n                    }\n                    break;\n\n                // DAT_XFERGROUP...\n                case (int)TWAIN.DAT.XFERGROUP:\n                    {\n                        uint uXferGroup = 0;\n                        a_functionarguments.sts = m_twain.DatXferGroup((TWAIN.DG)a_functionarguments.iDg, (TWAIN.MSG)a_functionarguments.iMsg, ref uXferGroup);\n                        a_functionarguments.szReturnValue = string.Format(\"0x{0:X}\", uXferGroup);\n                        callstack.functionarguments.sts = a_functionarguments.sts;\n                        callstack.functionarguments.szReturnValue = a_functionarguments.szReturnValue;\n                    }\n                    break;\n            }\n\n            // If this is issued directly by the user or runv is being used, let's\n            // give more info...\n            if (!m_blRunningScript || m_blVerbose)\n            {\n                DisplayBlue(\"rcv: \" + a_functionarguments.szReturnValue);\n                DisplayBlue(\"sts: \" + a_functionarguments.sts);\n            }\n\n            // All done...\n            return (false);\n        }\n\n        /// <summary>\n        /// Load the DSM...\n        /// </summary>\n        /// <param name=\"a_functionarguments\">tokenized command and anything needed</param>\n        /// <returns>true to quit</returns>\n        private bool CmdDsmLoad(ref Interpreter.FunctionArguments a_functionarguments)\n        {\n            Assembly assembly = typeof(Terminal).Assembly;\n            AssemblyName assemblyname = assembly.GetName();\n            Version version = assemblyname.Version;\n\n            string szManufacturer = \"TWAIN Working Group\";\n            string szProductFamily = \"TWAIN Open Source\";\n            string szProductName = \"TWAIN Certification\";\n            UInt16 u16ProtocolMajor = (UInt16)TWAIN.TWON_PROTOCOL.MAJOR;\n            UInt16 u16ProtocolMinor = (UInt16)TWAIN.TWON_PROTOCOL.MINOR;\n            UInt32 u32SupportedGroups = ((int)TWAIN.DG.APP2 | (int)TWAIN.DG.CONTROL | (int)TWAIN.DG.IMAGE);\n            TWAIN.TWCY twcy = TWAIN.TWCY.USA;\n            string szInfo = \"TWAIN Certification\";\n            TWAIN.TWLG twlg = TWAIN.TWLG.ENGLISH;\n            UInt16 u16MajorNum = (UInt16)version.Major;\n            UInt16 u16MinorNum = (UInt16)version.Minor;\n            bool blUseLegacyDSM = false;\n            bool blUseCallbacks = false;\n            TWAIN.DeviceEventCallback deviceeventcallback = DeviceEventCallback;\n            TWAIN.ScanCallback scancallback = ScanCallbackTrigger;\n            TWAIN.RunInUiThreadDelegate runinuithreaddelegate = null;\n            IntPtr intptrHwnd = m_intptrHwnd;\n\n            // Nope...\n            if (m_twain != null)\n            {\n                return (false);\n            }\n\n            // Look for matches in the argument list...\n            for (int aa = 0; aa < a_functionarguments.aszCmd.Length; aa++)\n            {\n                // Split it on the first '='...\n                string[] aszKeyValue = a_functionarguments.aszCmd[aa].Split(new char[] { '=' }, 2);\n                if (aszKeyValue.Length != 2)\n                {\n                    continue;\n                }\n\n                // Dispatch...\n                switch (aszKeyValue[0].ToLowerInvariant())\n                {\n                    default:\n                        DisplayRed(\"Unrecognized argument...<\" + a_functionarguments.aszCmd[aa] + \">\");\n                        break;\n                    case \"manufacturer\":\n                        szManufacturer = aszKeyValue[1];\n                        break;\n                    case \"productfamily\":\n                        szProductFamily = aszKeyValue[1];\n                        break;\n                    case \"productname\":\n                        szProductName = aszKeyValue[1];\n                        break;\n                    case \"protocolmajor\":\n                        UInt16.TryParse(aszKeyValue[1], out u16ProtocolMajor);\n                        break;\n                    case \"protocolminor\":\n                        UInt16.TryParse(aszKeyValue[1], out u16ProtocolMinor);\n                        break;\n                    case \"supportedgroups\":\n                        if (aszKeyValue[1].ToLowerInvariant().StartsWith(\"0x\"))\n                        {\n                            UInt32.TryParse(aszKeyValue[1].Substring(2), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out u32SupportedGroups);\n                        }\n                        else\n                        {\n                            UInt32.TryParse(aszKeyValue[1], out u32SupportedGroups);\n                        }\n                        break;\n                    case \"twcy\":\n                        Enum.TryParse(aszKeyValue[1], out twcy);\n                        break;\n                    case \"info\":\n                        szInfo = aszKeyValue[1];\n                        break;\n                    case \"twlg\":\n                        Enum.TryParse(aszKeyValue[1], out twlg);\n                        break;\n                    case \"majornum\":\n                        UInt16.TryParse(aszKeyValue[1], out u16MajorNum);\n                        break;\n                    case \"minornum\":\n                        UInt16.TryParse(aszKeyValue[1], out u16MinorNum);\n                        break;\n                    case \"uselegacydsm\":\n                        bool.TryParse(aszKeyValue[1], out blUseLegacyDSM);\n                        break;\n                    case \"usecallbacks\":\n                        bool.TryParse(aszKeyValue[1], out blUseCallbacks);\n                        break;\n                }\n            }\n\n            // Decide if we need a delegate...\n            if (m_formmain != null)\n            {\n                runinuithreaddelegate = RunInUiThread;\n            }\n\n            // Instantiate TWAIN, and register ourselves...\n            m_twain = new TWAIN\n            (\n                szManufacturer,\n                szProductFamily,\n                szProductName,\n                u16ProtocolMajor,\n                u16ProtocolMinor,\n                u32SupportedGroups,\n                twcy,\n                szInfo,\n                twlg,\n                u16MajorNum,\n                u16MinorNum,\n                blUseLegacyDSM,\n                blUseCallbacks,\n                deviceeventcallback,\n                scancallback,\n                runinuithreaddelegate,\n                intptrHwnd\n            );\n\n            // If verbose, display the app's identity...\n            if (m_blVerbose)\n            {\n                TWAIN.TW_IDENTITY twidentity = default(TWAIN.TW_IDENTITY);\n                TWAIN.CsvToIdentity(ref twidentity, m_twain.GetAppIdentity());\n                DisplayBlue(\"Application TW_IDENTITY.Id..................\" + twidentity.Id);\n                DisplayBlue(\"Application TW_IDENTITY.Version.MajorNum....\" + twidentity.Version.MajorNum);\n                DisplayBlue(\"Application TW_IDENTITY.Version.MinorNum....\" + twidentity.Version.MinorNum);\n                DisplayBlue(\"Application TW_IDENTITY.Version.Language....\" + twidentity.Version.Language);\n                DisplayBlue(\"Application TW_IDENTITY.Version.Country.....\" + twidentity.Version.Country);\n                DisplayBlue(\"Application TW_IDENTITY.Version.Info........\" + twidentity.Version.Info.Get());\n                DisplayBlue(\"Application TW_IDENTITY.ProtocolMajor.......\" + twidentity.ProtocolMajor);\n                DisplayBlue(\"Application TW_IDENTITY.ProtocolMinor.......\" + twidentity.ProtocolMinor);\n                DisplayBlue(\"Application TW_IDENTITY.SupportedGroups.....\" + twidentity.SupportedGroups);\n                DisplayBlue(\"Application TW_IDENTITY.Manufacturer........\" + twidentity.Manufacturer.Get());\n                DisplayBlue(\"Application TW_IDENTITY.ProductFamily.......\" + twidentity.ProductFamily.Get());\n                DisplayBlue(\"Application TW_IDENTITY.ProductName.........\" + twidentity.ProductName.Get());\n            }\n\n            // All done...\n            return (false);\n        }\n\n        /// <summary>\n        /// Unload the DSM...\n        /// </summary>\n        /// <param name=\"a_functionarguments\">tokenized command and anything needed</param>\n        /// <returns>true to quit</returns>\n        private bool CmdDsmUnload(ref Interpreter.FunctionArguments a_functionarguments)\n        {\n            // Nope...\n            if (m_twain == null)\n            {\n                return (false);\n            }\n\n            // Shut it down, make sure it's really gone...\n            m_twain.Dispose();\n            GC.Collect();\n            m_twain = null;\n\n            // All done...\n            return (false);\n        }\n\n        /// <summary>\n        /// Our callback for device events.  This is where we catch and\n        /// report that a device event has been detected.  Obviously,\n        /// we're not doing much with it.  A real application would\n        /// probably take some kind of action...\n        /// </summary>\n        /// <returns>TWAIN status</returns>\n        private TWAIN.STS DeviceEventCallback()\n        {\n            TWAIN.STS sts;\n            TWAIN.TW_DEVICEEVENT twdeviceevent;\n\n            // Drain the event queue...\n            while (true)\n            {\n                // Try to get an event...\n                twdeviceevent = default(TWAIN.TW_DEVICEEVENT);\n                sts = m_twain.DatDeviceevent(TWAIN.DG.CONTROL, TWAIN.MSG.GET, ref twdeviceevent);\n                if (sts != TWAIN.STS.SUCCESS)\n                {\n                    break;\n                }\n            }\n\n            // Return a status, in case we ever need it for anything...\n            return (TWAIN.STS.SUCCESS);\n        }\n\n        /// <summary>\n        /// TWAIN needs help, if we want it to run stuff in our main\n        /// UI thread...\n        /// </summary>\n        /// <param name=\"code\">the code to run</param>\n        private void RunInUiThread(Action a_action)\n        {\n            RunInUiThread(m_formmain, a_action);\n        }\n\n        /// <summary>\n        /// TWAIN needs help, if we want it to run stuff in our main\n        /// UI thread...\n        /// </summary>\n        /// <param name=\"control\">the control to run in</param>\n        /// <param name=\"code\">the code to run</param>\n        static public void RunInUiThread(Object a_object, Action a_action)\n        {\n            Control control = (Control)a_object;\n            if (control.InvokeRequired)\n            {\n                control.Invoke(new Terminal.RunInUiThreadDelegate(RunInUiThread), new object[] { a_object, a_action });\n                return;\n            }\n            a_action();\n        }\n\n        /// <summary>\n        /// Our scanning callback function.  We appeal directly to the supporting\n        /// TWAIN object.  This way we don't have to maintain some kind of a loop\n        /// inside of the application, which is the source of most problems that\n        /// developers run into.\n        /// \n        /// While it looks scary at first, there's really not a lot going on in\n        /// here.  We do some sanity checks, we watch for certain kinds of events,\n        /// we support the four methods of transferring images, and we dump out\n        /// some meta-data about the transferred image.  However, because it does\n        /// look scary I dropped in some region pragmas to break things up...\n        /// </summary>\n        /// <param name=\"a_blClosing\">We're shutting down</param>\n        /// <returns>TWAIN status</returns>\n        private TWAIN.STS ScanCallbackTrigger(bool a_blClosing)\n        {\n            m_formmain.BeginInvoke(new MethodInvoker(delegate { m_formmain.ScanCallbackEventHandler(this, new EventArgs()); }));\n            return (TWAIN.STS.SUCCESS);\n        }\n        public TWAIN.STS ScanCallback(bool a_blClosing)\n        {\n            bool blIsMsgXferReady = false;\n\n            // Scoot...\n            if (m_twain == null)\n            {\n                return (TWAIN.STS.FAILURE);\n            }\n\n            // We're leaving...\n            if (a_blClosing)\n            {\n                return (TWAIN.STS.SUCCESS);\n            }\n\n            // Collect DAT_NULL stuff...\n            if (m_twain.IsMsgXferReady())\n            {\n                lock (m_lmsgDatNull)\n                {\n                    if (!m_lmsgDatNull.Contains(TWAIN.MSG.XFERREADY))\n                    {\n                        m_lmsgDatNull.Add(TWAIN.MSG.XFERREADY);\n                        m_autoreseteventMsgDatNull.Set();\n                        blIsMsgXferReady = true;\n                    }\n                }\n            }\n            if (m_twain.IsMsgCloseDsReq())\n            {\n                lock (m_lmsgDatNull)\n                {\n                    if (!m_lmsgDatNull.Contains(TWAIN.MSG.CLOSEDSREQ))\n                    {\n                        m_lmsgDatNull.Add(TWAIN.MSG.CLOSEDSREQ);\n                        m_autoreseteventMsgDatNull.Set();\n                    }\n                }\n            }\n            if (m_twain.IsMsgCloseDsOk())\n            {\n                lock (m_lmsgDatNull)\n                {\n                    if (!m_lmsgDatNull.Contains(TWAIN.MSG.CLOSEDSOK))\n                    {\n                        m_lmsgDatNull.Add(TWAIN.MSG.CLOSEDSOK);\n                        m_autoreseteventMsgDatNull.Set();\n                    }\n                }\n            }\n\n            // We're waiting for that first image to show up, if we don't\n            // see it, then return...\n            if (!blIsMsgXferReady)\n            {\n                // If we're on Windows we need to send event requests to the driver...\n                if (TWAIN.GetPlatform() == TWAIN.Platform.WINDOWS)\n                {\n                    TWAIN.TW_EVENT twevent = default(TWAIN.TW_EVENT);\n                    twevent.pEvent = Marshal.AllocHGlobal(256); // over allocate for MSG structure\n                    if (twevent.pEvent != IntPtr.Zero)\n                    {\n                        m_twain.DatEvent(TWAIN.DG.CONTROL, TWAIN.MSG.PROCESSEVENT, ref twevent);\n                        Marshal.FreeHGlobal(twevent.pEvent);\n                    }\n                }\n\n                // Scoot...\n                return (TWAIN.STS.SUCCESS);\n            }\n\n            // All done...\n            return (TWAIN.STS.SUCCESS);\n        }\n\n        #endregion\n\n\n        // Private Methods (commands)\n        #region Private Methods (commands)\n\n        /// <summary>\n        /// Allocate a handle or a pointer, we'll get an IntPtr to it...\n        /// </summary>\n        /// <param name=\"a_functionarguments\">tokenized command and anything needed</param>\n        /// <returns>true to quit</returns>\n        private bool CmdAllocate(ref Interpreter.FunctionArguments a_functionarguments)\n        {\n            bool blResult;\n            bool blGlobal;\n            int iBytes;\n            string szValue;\n            UInt32 u32Bytes = 0;\n            IntPtr intptr = IntPtr.Zero;\n            CallStack callstack = m_lcallstack[m_lcallstack.Count - 1];\n\n            // Validate...\n            if (a_functionarguments.aszCmd.Length != 4)\n            {\n                DisplayError(\"command needs 3 arguments\", a_functionarguments);\n                a_functionarguments.sts = TWAIN.STS.BADVALUE;\n                a_functionarguments.szReturnValue = \"0\";\n                callstack.functionarguments.sts = a_functionarguments.sts;\n                callstack.functionarguments.szReturnValue = a_functionarguments.szReturnValue;\n                return (false);\n            }\n\n            // Get the size...\n            if (!UInt32.TryParse(a_functionarguments.aszCmd[3], out u32Bytes))\n            {\n                DisplayError(\"size is not a number <\" + a_functionarguments.aszCmd[3] + \">\", a_functionarguments);\n                a_functionarguments.sts = TWAIN.STS.BADVALUE;\n                a_functionarguments.szReturnValue = \"0\";\n                callstack.functionarguments.sts = a_functionarguments.sts;\n                callstack.functionarguments.szReturnValue = a_functionarguments.szReturnValue;\n                SetVariable(a_functionarguments.aszCmd[2], \"0\", 0, VariableScope.Local);\n                return (false);\n            }\n\n            // A heaping helping of paranoia...\n            blResult = GetVariable(a_functionarguments.aszCmd[2], 0, out szValue, out iBytes, out blGlobal, VariableScope.Local);\n            if (blResult)\n            {\n                if (szValue != \"0\")\n                {\n                    DisplayError(\"memory leak <\" + a_functionarguments.aszCmd[2] + \">\", a_functionarguments);\n                }\n            }\n\n            // Allocate a handle...\n            if (a_functionarguments.aszCmd[1].ToLowerInvariant() == \"handle\")\n            {\n                // Allocate the memory...\n                intptr = m_twain.DsmMemAlloc(u32Bytes);\n                if (intptr == IntPtr.Zero)\n                {\n                    DisplayError(\"allocation failed <\" + a_functionarguments.aszCmd[2] + \">\", a_functionarguments);\n                    a_functionarguments.sts = TWAIN.STS.LOWMEMORY;\n                    a_functionarguments.szReturnValue = \"0\";\n                    callstack.functionarguments.sts = a_functionarguments.sts;\n                    callstack.functionarguments.szReturnValue = a_functionarguments.szReturnValue;\n                    SetVariable(a_functionarguments.aszCmd[2], \"0\", 0, VariableScope.Local);\n                    return (false);\n                }\n            }\n\n            // Allocate a pointer...\n            else if (a_functionarguments.aszCmd[1].ToLowerInvariant() == \"pointer\")\n            {\n                intptr = Marshal.AllocHGlobal((IntPtr)u32Bytes);\n                if (intptr == IntPtr.Zero)\n                {\n                    DisplayError(\"allocation failed <\" + a_functionarguments.aszCmd[2] + \">\", a_functionarguments);\n                    a_functionarguments.sts = TWAIN.STS.LOWMEMORY;\n                    a_functionarguments.szReturnValue = \"0\";\n                    callstack.functionarguments.sts = a_functionarguments.sts;\n                    callstack.functionarguments.szReturnValue = a_functionarguments.szReturnValue;\n                    SetVariable(a_functionarguments.aszCmd[2], \"0\", 0, VariableScope.Local);\n                    return (false);\n                }\n            }\n\n            // Oops...\n            else\n            {\n                DisplayError(\"unrecognized flag <\" + a_functionarguments.aszCmd[1] + \">\", a_functionarguments);\n                a_functionarguments.sts = TWAIN.STS.BADVALUE;\n                a_functionarguments.szReturnValue = \"0\";\n                callstack.functionarguments.sts = a_functionarguments.sts;\n                callstack.functionarguments.szReturnValue = a_functionarguments.szReturnValue;\n                return (false);\n            }\n\n            // All done...\n            a_functionarguments.sts = TWAIN.STS.SUCCESS;\n            a_functionarguments.szReturnValue = intptr.ToString();\n            callstack.functionarguments.sts = a_functionarguments.sts;\n            callstack.functionarguments.szReturnValue = a_functionarguments.szReturnValue;\n            SetVariable(a_functionarguments.aszCmd[2], intptr.ToString(), (int)u32Bytes, VariableScope.Local);\n            return (false);\n        }\n\n        /// <summary>\n        /// Call a function...\n        /// </summary>\n        /// <param name=\"a_functionarguments\">tokenized command and anything needed</param>\n        /// <returns>true to quit</returns>Free\n        private bool CmdCall(ref Interpreter.FunctionArguments a_functionarguments)\n        {\n            int iLine;\n            string szLabel;\n\n            // Validate...\n            if (    (a_functionarguments.aszScript == null)\n                ||  (a_functionarguments.aszScript.Length < 2)\n                ||  (a_functionarguments.aszScript[0] == null)\n                ||  (a_functionarguments.aszCmd == null)\n                ||  (a_functionarguments.aszCmd.Length < 2)\n                ||  (a_functionarguments.aszCmd[1] == null))\n            {\n                return (false);\n            }\n\n            // Search for a match...\n            szLabel = \":\" + a_functionarguments.aszCmd[1];\n            for (iLine = 0; iLine < a_functionarguments.aszScript.Length; iLine++)\n            {\n                if (a_functionarguments.aszScript[iLine].Trim() == szLabel)\n                {\n                    // We need this to go to the function...\n                    a_functionarguments.blGotoLabel = true;\n                    a_functionarguments.iLabelLine = iLine;\n\n                    // We need this to get back...\n                    CallStack callstack = default(CallStack);\n                    callstack.functionarguments = a_functionarguments;\n                    m_lcallstack.Add(callstack);\n                    return (false);\n                }\n            }\n\n            // Ugh...\n            DisplayError(\"function label not found: <\" + szLabel + \">\", a_functionarguments);\n            return (false);\n        }\n\n        /// <summary>\n        /// Show or set the current directory...\n        /// </summary>\n        /// <param name=\"a_functionarguments\">tokenized command and anything needed</param>\n        /// <returns>true to quit</returns>\n        private bool CmdCd(ref Interpreter.FunctionArguments a_functionarguments)\n        {\n            // No data...\n            if ((a_functionarguments.aszCmd == null) || (a_functionarguments.aszCmd.Length < 2) || (a_functionarguments.aszCmd[1] == null) || (a_functionarguments.aszCmd[0].ToLowerInvariant() == \"pwd\"))\n            {\n                Display(Directory.GetCurrentDirectory(), true);\n                return (false);\n            }\n\n            // Ruh-roh...\n            if (!Directory.Exists(a_functionarguments.aszCmd[1]))\n            {\n                DisplayError(\"cd failed - path not found\", a_functionarguments);\n                return (false);\n            }\n\n            // Set the current directory...\n            try\n            {\n                Directory.SetCurrentDirectory(a_functionarguments.aszCmd[1]);\n            }\n            catch (Exception exception)\n            {\n                DisplayError(\"cd failed - \" + exception.Message, a_functionarguments);\n            }\n\n            // All done...\n            return (false);\n        }\n\n        /// <summary>\n        /// Clean the images folder...\n        /// </summary>\n        /// <param name=\"a_functionarguments\">tokenized command and anything needed</param>\n        /// <returns>true to quit</returns>\n        private bool CmdClean(ref Interpreter.FunctionArguments a_functionarguments)\n        {\n            // The images folder...\n            string szImagesFolder = Path.Combine(Config.Get(\"writeFolder\", null), \"images\");\n\n            // Delete the images folder...\n            if (Directory.Exists(szImagesFolder))\n            {\n                try\n                {\n                    DirectoryInfo directoryinfo = new DirectoryInfo(szImagesFolder);\n                    foreach (System.IO.FileInfo file in directoryinfo.GetFiles()) file.Delete();\n                    foreach (System.IO.DirectoryInfo subDirectory in directoryinfo.GetDirectories()) subDirectory.Delete(true);\n                }\n                catch (Exception exception)\n                {\n                    DisplayError(\"couldn't delete <\" + szImagesFolder + \"> - \" + exception.Message, a_functionarguments);\n                    return (false);\n                }\n            }\n\n            // All done...\n            return (false);\n        }\n\n        /// <summary>\n        /// Copy string bytes in and out of unmanaged memory...\n        /// </summary>\n        /// <param name=\"a_functionarguments\">tokenized command and anything needed</param>\n        /// <returns>true to quit</returns>\n        private bool CmdCopyBytes(ref Interpreter.FunctionArguments a_functionarguments)\n        {\n            bool blGlobal;\n            int iBytes;\n            string szStringVariable;\n            string szStringValue;\n            IntPtr intptrHandle;\n            IntPtr intptrPointer;\n            UInt64 u64Handle;\n\n            // Validate...\n            if ((a_functionarguments.aszCmd == null) || (a_functionarguments.aszCmd.Length < 5) || (a_functionarguments.aszCmd[0] == null))\n            {\n                DisplayError(\"copybytes needs five arguments\", a_functionarguments);\n                return (false);\n            }\n\n            // Figure out what we're copying in and out of...\n            switch (a_functionarguments.aszCmd[1].ToLowerInvariant())\n            {\n                // Eh?\n                default:\n                    DisplayError(\"bad mode\", a_functionarguments);\n                    return (false);\n\n                // Copy from a handle to utf8, and then to a string...\n                case \"handleutf8\":\n                    // Get the argument values...\n                    if (!UInt64.TryParse(a_functionarguments.aszCmd[2], out u64Handle))\n                    {\n                        DisplayError(\"bad handle\", a_functionarguments);\n                        return (false);\n                    }\n                    if (!int.TryParse(a_functionarguments.aszCmd[3], out iBytes))\n                    {\n                        DisplayError(\"bad handle size\", a_functionarguments);\n                        return (false);\n                    }\n                    intptrHandle = (IntPtr)u64Handle;\n                    szStringVariable = a_functionarguments.aszCmd[4];\n                    // Do the copy...\n                    if ((intptrHandle != IntPtr.Zero) && (iBytes > 0))\n                    {\n                        byte[] abValue = new byte[iBytes];\n                        intptrPointer = m_twain.DsmMemLock(intptrHandle);\n                        if (intptrPointer == IntPtr.Zero)\n                        {\n                            DisplayError(\"DsmMemLock failed\", a_functionarguments);\n                            return (false);\n                        }\n                        Marshal.Copy(intptrPointer, abValue, 0, iBytes);\n                        m_twain.DsmMemUnlock(intptrHandle);\n                        szStringValue = Encoding.UTF8.GetString(abValue);\n                        szStringValue = szStringValue.Replace(\"\\0\", \"\");\n                        SetVariable(szStringVariable, szStringValue, 0);\n                    }\n                    return (false);\n\n                // Copy from a string to utf8, and then to a handle...\n                case \"utf8handle\":\n                    // Get the argument values...\n                    szStringVariable = a_functionarguments.aszCmd[2];\n                    GetVariable(szStringVariable, -1, out szStringValue, out iBytes, out blGlobal);\n                    if (!UInt64.TryParse(a_functionarguments.aszCmd[3], out u64Handle))\n                    {\n                        DisplayError(\"bad handle\", a_functionarguments);\n                        return (false);\n                    }\n                    if (!int.TryParse(a_functionarguments.aszCmd[4], out iBytes))\n                    {\n                        DisplayError(\"bad handle size\", a_functionarguments);\n                        return (false);\n                    }\n                    intptrHandle = (IntPtr)u64Handle;\n                    // Do the copy...\n                    if ((szStringValue.Length > 0) && (intptrHandle != IntPtr.Zero) && (iBytes > 0))\n                    {\n                        byte[] abValue = Encoding.UTF8.GetBytes(szStringValue);\n                        if (abValue.Length > iBytes)\n                        {\n                            DisplayError(\"handle is too small\", a_functionarguments);\n                            return (false);\n                        }\n                        intptrPointer = m_twain.DsmMemLock(intptrHandle);\n                        if (intptrPointer == IntPtr.Zero)\n                        {\n                            DisplayError(\"DsmMemLock failed\", a_functionarguments);\n                            return (false);\n                        }\n                        Marshal.Copy(abValue, 0, intptrPointer, abValue.Length);\n                        m_twain.DsmMemUnlock(intptrHandle);\n                    }\n                    return (false);\n            }\n        }\n\n        /// <summary>\n        /// Lists the files and folders in the current directory...\n        /// </summary>\n        /// <param name=\"a_functionarguments\">tokenized command and anything needed</param>\n        /// <returns>true to quit</returns>\n        private bool CmdDir(ref Interpreter.FunctionArguments a_functionarguments)\n        {\n            // Get the folders...\n            string[] aszFolders = Directory.GetDirectories(\".\");\n            if ((aszFolders != null) && (aszFolders.Length > 0))\n            {\n                Array.Sort(aszFolders);\n                foreach (string sz in aszFolders)\n                {\n                    Display(sz.Replace(\".\\\\\",\"\").Replace(\"./\",\"\") + Path.DirectorySeparatorChar);\n                }\n            }\n\n            // Get the files...\n            string[] aszFiles = Directory.GetFiles(\".\");\n            if ((aszFiles != null) && (aszFiles.Length > 0))\n            {\n                Array.Sort(aszFiles);\n                foreach (string sz in aszFiles)\n                {\n                    Display(sz.Replace(\".\\\\\", \"\").Replace(\"./\", \"\"));\n                }\n            }\n\n            // All done...\n            return (false);\n        }\n\n        /// <summary>\n        /// Echo text...\n        /// </summary>\n        /// <param name=\"a_functionarguments\">tokenized command and anything needed</param>\n        /// <returns>true to quit</returns>\n        private bool CmdEcho(ref Interpreter.FunctionArguments a_functionarguments)\n        {\n            return (CmdEchoColor(ref a_functionarguments, ConsoleColor.White));\n        }\n\n        /// <summary>\n        /// Echo text as blue...\n        /// </summary>\n        /// <param name=\"a_functionarguments\">tokenized command and anything needed</param>\n        /// <returns>true to quit</returns>\n        private bool CmdEchoBlue(ref Interpreter.FunctionArguments a_functionarguments)\n        {\n            return (CmdEchoColor(ref a_functionarguments, m_consolecolorBlue));\n        }\n\n        /// <summary>\n        /// Echo text as green...\n        /// </summary>\n        /// <param name=\"a_functionarguments\">tokenized command and anything needed</param>\n        /// <returns>true to quit</returns>\n        private bool CmdEchoGreen(ref Interpreter.FunctionArguments a_functionarguments)\n        {\n            return (CmdEchoColor(ref a_functionarguments, m_consolecolorGreen));\n        }\n\n        /// <summary>\n        /// Echo text as red...\n        /// </summary>\n        /// <param name=\"a_functionarguments\">tokenized command and anything needed</param>\n        /// <returns>true to quit</returns>\n        private bool CmdEchoRed(ref Interpreter.FunctionArguments a_functionarguments)\n        {\n            return (CmdEchoColor(ref a_functionarguments, m_consolecolorRed));\n        }\n\n        /// <summary>\n        /// Echo text as yellow...\n        /// </summary>\n        /// <param name=\"a_functionarguments\">tokenized command and anything needed</param>\n        /// <returns>true to quit</returns>\n        private bool CmdEchoYellow(ref Interpreter.FunctionArguments a_functionarguments)\n        {\n            return (CmdEchoColor(ref a_functionarguments, m_consolecolorYellow));\n        }\n\n        /// <summary>\n        /// Echo text as white...\n        /// </summary>\n        /// <param name=\"a_functionarguments\">tokenized command and anything needed</param>\n        /// <returns>true to quit</returns>\n        private bool CmdEchoColor(ref Interpreter.FunctionArguments a_functionarguments, ConsoleColor a_consolecolor)\n        {\n            int ii;\n            string szLine = \"\";\n            string[] aszCmd;\n\n            // No data...\n            if ((a_functionarguments.aszCmd == null) || (a_functionarguments.aszCmd.Length < 2) || (a_functionarguments.aszCmd[0] == null))\n            {\n                Display(\"\", true);\n                return (false);\n            }\n\n            // Copy the array...\n            aszCmd = new string[a_functionarguments.aszCmd.Length];\n            Array.Copy(a_functionarguments.aszCmd, aszCmd, a_functionarguments.aszCmd.Length);\n\n            // Expand the symbols...\n            Expansion(a_functionarguments, ref aszCmd);\n\n            // Turn it into a line...\n            for (ii = 1; ii < aszCmd.Length; ii++)\n            {\n                szLine += ((szLine == \"\") ? \"\" : \" \") + aszCmd[ii];\n            }\n\n            // Spit it out...\n            switch (a_consolecolor)\n            {\n                default:\n                    Display(szLine, true);\n                    break;\n\n                case ConsoleColor.Blue:\n                    DisplayBlue(szLine, true);\n                    break;\n\n                case ConsoleColor.Green:\n                    DisplayGreen(szLine, true);\n                    break;\n\n                case ConsoleColor.Red:\n                    DisplayRed(szLine, true);\n                    break;\n\n                case ConsoleColor.Yellow:\n                    DisplayYellow(szLine, true);\n                    break;\n            }\n\n            // All done...\n            return (false);\n        }\n\n        /// <summary>\n        /// Display a pass/fail message...\n        /// </summary>\n        /// <param name=\"a_functionarguments\">tokenized command and anything needed</param>\n        /// <returns>true to quit</returns>\n        private bool CmdEchoPassfail(ref Interpreter.FunctionArguments a_functionarguments)\n        {\n            string szLine;\n            string szDots = \"..........................................................................................................\";\n\n            // No data...\n            if ((a_functionarguments.aszCmd == null) || (a_functionarguments.aszCmd.Length < 3) || (a_functionarguments.aszCmd[0] == null))\n            {\n                DisplayError(\"echo.passfail needs two arguments\", a_functionarguments);\n                return (false);\n            }\n\n            // Build the string...\n            szLine = a_functionarguments.aszCmd[1].TrimEnd();\n            if ((szDots.Length - szLine.Length) > 0)\n            {\n                szLine += szDots.Substring(0, szDots.Length - szLine.Length);\n            }\n            else\n            {\n                szLine += \"...\";\n            }\n            szLine += a_functionarguments.aszCmd[2];\n\n            // Spit it out...\n            if (a_functionarguments.aszCmd[2].Contains(\"fail\") || a_functionarguments.aszCmd[2].Contains(\"error\"))\n            {\n                DisplayRed(szLine, true);\n            }\n            else if (a_functionarguments.aszCmd[2].Contains(\"warn\"))\n            {\n                DisplayYellow(szLine, true);\n            }\n            else\n            {\n                Display(szLine, true);\n            }\n\n            // All done...\n            return (false);\n        }\n\n        /// <summary>\n        /// Display a progress message...\n        /// </summary>\n        /// <param name=\"a_functionarguments\">tokenized command and anything needed</param>\n        /// <returns>true to quit</returns>\n        private bool CmdEchoProgress(ref Interpreter.FunctionArguments a_functionarguments)\n        {\n            string szLine;\n            string szDots = \"..............................\";\n\n            // No data...\n            if ((a_functionarguments.aszCmd == null) || (a_functionarguments.aszCmd.Length < 3) || (a_functionarguments.aszCmd[0] == null))\n            {\n                DisplayError(\"echo.progress needs two arguments\", a_functionarguments);\n                return (false);\n            }\n\n            // Build the string...\n            szLine = a_functionarguments.aszCmd[1].TrimEnd();\n            if ((szDots.Length - szLine.Length) > 0)\n            {\n                szLine += szDots.Substring(0, szDots.Length - szLine.Length);\n            }\n            else\n            {\n                szLine += \"...\"; // mininum separation if we can't fit the left side in szDots\n            }\n            szLine += a_functionarguments.aszCmd[2];\n\n            // Spit it out...\n            Display(szLine, true);\n\n            // All done...\n            return (false);\n        }\n\n        /// <summary>\n        /// Echo text as red...\n        /// </summary>\n        /// <param name=\"a_functionarguments\">tokenized command and anything needed</param>\n        /// <returns>true to quit</returns>\n        private bool CmdEchoPrompt(ref Interpreter.FunctionArguments a_functionarguments)\n        {\n            return (CmdEchoColor(ref a_functionarguments, m_consolecolorGreen));\n        }\n\n        /// <summary>\n        /// Display a title suite message...\n        /// </summary>\n        /// <param name=\"a_functionarguments\">tokenized command and anything needed</param>\n        /// <returns>true to quit</returns>\n        private bool CmdEchoTitlesuite(ref Interpreter.FunctionArguments a_functionarguments)\n        {\n            string szStars = \"**************************************************************************************************************\";\n\n            // No data...\n            if ((a_functionarguments.aszCmd == null) || (a_functionarguments.aszCmd.Length < 2) || (a_functionarguments.aszCmd[0] == null))\n            {\n                DisplayError(\"echo.titlesuite needs one argument\", a_functionarguments);\n                return (false);\n            }\n\n            // Display it...\n            DisplayYellow(\"\", true);\n            DisplayYellow(\"\", true);\n            DisplayYellow(\"\", true);\n            DisplayYellow(szStars, true);\n            DisplayYellow(a_functionarguments.aszCmd[1], true);\n\n            // All done...\n            return (false);\n        }\n\n        /// <summary>\n        /// Display a title test message...\n        /// </summary>\n        /// <param name=\"a_functionarguments\">tokenized command and anything needed</param>\n        /// <returns>true to quit</returns>\n        private bool CmdEchoTitletest(ref Interpreter.FunctionArguments a_functionarguments)\n        {\n            int ii;\n            int iBlankLines = 3;\n\n            // No data...\n            if ((a_functionarguments.aszCmd == null) || (a_functionarguments.aszCmd.Length < 2) || (a_functionarguments.aszCmd[0] == null))\n            {\n                DisplayError(\"echo.titletest needs one argument\", a_functionarguments);\n                return (false);\n            }\n\n            // Override the number of blank lines...\n            if (a_functionarguments.aszCmd.Length >= 3)\n            {\n                int.TryParse(a_functionarguments.aszCmd[2], out iBlankLines);\n            }\n\n            // Display it...\n            for (ii = 0; ii < iBlankLines; ii++)\n            {\n                DisplayYellow(\"\", true);\n            }\n            DisplayYellow(a_functionarguments.aszCmd[1], true);\n\n            // All done...\n            return (false);\n        }\n\n        /// <summary>\n        /// Write data to a file...\n        /// </summary>\n        /// <param name=\"a_functionarguments\">tokenized command and anything needed</param>\n        /// <returns>true to quit</returns>\n        private bool CmdFileWrite(ref Interpreter.FunctionArguments a_functionarguments)\n        {\n            string szFilename;\n            string szValue;\n            CallStack callstack = m_lcallstack[m_lcallstack.Count - 1];\n\n            // Validate...\n            if (a_functionarguments.aszCmd.Length != 3)\n            {\n                DisplayError(\"command needs two arguments, file and value\", a_functionarguments);\n                return (false);\n            }\n\n            // Get the filename and the value...\n            szFilename = a_functionarguments.aszCmd[1];\n            szValue = a_functionarguments.aszCmd[2];\n\n            // Write the value to the file...\n            try\n            {\n                File.WriteAllText(szFilename, szValue);\n            }\n            catch\n            {\n                return (false);\n            }\n\n            // All done...\n            return (false);\n        }\n\n        /// <summary>\n        /// Free a handle or a pointer...\n        /// </summary>\n        /// <param name=\"a_functionarguments\">tokenized command and anything needed</param>\n        /// <returns>true to quit</returns>\n        private bool CmdFree(ref Interpreter.FunctionArguments a_functionarguments)\n        {\n            UInt64 u64IntPtr = 0;\n            IntPtr intptr = IntPtr.Zero;\n            CallStack callstack = m_lcallstack[m_lcallstack.Count - 1];\n\n            // Validate...\n            if (a_functionarguments.aszCmd.Length != 3)\n            {\n                DisplayError(\"command needs 3 arguments\", a_functionarguments);\n                a_functionarguments.sts = TWAIN.STS.BADVALUE;\n                a_functionarguments.szReturnValue = \"\";\n                callstack.functionarguments.sts = a_functionarguments.sts;\n                callstack.functionarguments.szReturnValue = a_functionarguments.szReturnValue;\n                return (false);\n            }\n\n            // Get the handle or pointer from the variable...\n            bool blGlobal = false;\n            KeyValue keyvalue = default(KeyValue);\n            keyvalue.szKey = a_functionarguments.aszCmd[2];\n            if (!GetVariable(keyvalue.szKey, -1, out keyvalue.szValue, out keyvalue.iBytes, out blGlobal, VariableScope.Local))\n            {\n                DisplayError(\"variable not found (make sure to set it to 0 at the top of the function)\", a_functionarguments);\n                a_functionarguments.sts = TWAIN.STS.BADVALUE;\n                a_functionarguments.szReturnValue = \"\";\n                callstack.functionarguments.sts = a_functionarguments.sts;\n                callstack.functionarguments.szReturnValue = a_functionarguments.szReturnValue;\n                return (false);\n            }\n\n            // Get the value...\n            if (!UInt64.TryParse(keyvalue.szValue, out u64IntPtr))\n            {\n                a_functionarguments.sts = TWAIN.STS.BADVALUE;\n                a_functionarguments.szReturnValue = \"0\";\n                callstack.functionarguments.sts = a_functionarguments.sts;\n                callstack.functionarguments.szReturnValue = a_functionarguments.szReturnValue;\n                return (false);\n            }\n\n            // If the value is non-zero, free it and clear the variable...\n            if (u64IntPtr > 0)\n            {\n                if (a_functionarguments.aszCmd[1] == \"handle\")\n                {\n                    intptr = (IntPtr)u64IntPtr;\n                    m_twain.DsmMemFree(ref intptr);\n                }\n                else if (a_functionarguments.aszCmd[1] == \"pointer\")\n                {\n                    intptr = (IntPtr)u64IntPtr;\n                    Marshal.FreeHGlobal(intptr);\n                }\n                else\n                {\n                    DisplayError(\"unrecognized flag <\" + a_functionarguments.aszCmd[1] + \">\", a_functionarguments);\n                    a_functionarguments.sts = TWAIN.STS.BADVALUE;\n                    a_functionarguments.szReturnValue = \"0\";\n                    callstack.functionarguments.sts = a_functionarguments.sts;\n                    callstack.functionarguments.szReturnValue = a_functionarguments.szReturnValue;\n                    return (false);\n                }\n            }\n\n            // All done (set the variable to 0)...\n            a_functionarguments.sts = TWAIN.STS.SUCCESS;\n            a_functionarguments.szReturnValue = \"\";\n            callstack.functionarguments.sts = a_functionarguments.sts;\n            callstack.functionarguments.szReturnValue = a_functionarguments.szReturnValue;\n            SetVariable(keyvalue.szKey, \"0\", 0, blGlobal ? VariableScope.Global : VariableScope.Local);\n            return (false);\n        }\n\n        /// <summary>\n        /// Garbage collection, used to freak out the system and catch\n        /// bugs that linger in places, like the bonjour interface...\n        /// </summary>\n        /// <param name=\"a_functionarguments\">tokenized command and anything needed</param>\n        /// <returns>true to quit</returns>\n        private bool CmdGc(ref Interpreter.FunctionArguments a_functionarguments)\n        {\n            // Let's see if we can break things...\n            GC.Collect();\n\n            // All done...\n            return (false);\n        }\n\n        /// <summary>\n        /// Goto the user...\n        /// </summary>\n        /// <param name=\"a_functionarguments\">tokenized command and anything needed</param>\n        /// <returns>true to quit</returns>\n        private bool CmdGoto(ref Interpreter.FunctionArguments a_functionarguments)\n        {\n            int iLine;\n            string szLabel;\n\n            // Validate...\n            if (    (a_functionarguments.aszScript == null)\n                ||  (a_functionarguments.aszScript.Length < 2)\n                ||  (a_functionarguments.aszScript[0] == null)\n                ||  (a_functionarguments.aszCmd == null)\n                ||  (a_functionarguments.aszCmd.Length < 2)\n                ||  (a_functionarguments.aszCmd[1] == null))\n            {\n                return (false);\n            }\n\n            // Search for a match...\n            szLabel = \":\" + a_functionarguments.aszCmd[1];\n            for (iLine = 0; iLine < a_functionarguments.aszScript.Length; iLine++)\n            {\n                if (a_functionarguments.aszScript[iLine].Trim() == szLabel)\n                {\n                    a_functionarguments.blGotoLabel = true;\n                    a_functionarguments.iLabelLine = iLine;\n                    return (false);\n                }\n            }\n\n            // Ugh...\n            DisplayError(\"goto label not found: <\" + szLabel + \">\", a_functionarguments);\n            return (false);\n        }\n\n        /// <summary>\n        /// Help the user...\n        /// </summary>\n        /// <param name=\"a_functionarguments\">tokenized command and anything needed</param>\n        /// <returns>true to quit</returns>\n        private bool CmdHelp(ref Interpreter.FunctionArguments a_functionarguments)\n        {\n            string szCommand;\n\n            // Summary...\n            if ((a_functionarguments.aszCmd == null) || (a_functionarguments.aszCmd.Length < 2) || (a_functionarguments.aszCmd[1] == null))\n            {\n                Display(m_szBanner);\n                Display(\"\");\n                Display(\"Argumements in square brackets [] are optional, and don't have to be provided\");\n                Display(\"to the command.  Arguments in curly brackets must be provided.\");\n                Display(\"\");\n                DisplayYellow(\"Overview\");\n                Display(\"help intro......................................introduction to this program\");\n                Display(\"help certification..............................certifying a scanner\");\n                Display(\"help scripting..................................general discussion of scripting\");\n                Display(\"\");\n                DisplayYellow(\"Data Source Manager (DSM) commands\");\n                Display(\"certify [productname] [verbose] [skipprompts]...certify a TWAIN driver\");\n                Display(\"dsmload [args]..................................load the DSM\");\n                Display(\"dsmunload.......................................unload the DSM\");\n                Display(\"dsmentry........................................send a command to the DSM\");\n                Display(\"help [command]..................................this text or info about a command\");\n                Display(\"status..........................................status info for this program\");\n                Display(\"wait [timeout]..................................wait for a DAT_NULL message\");\n                Display(\"verbose [on|off|restore]........................verbosity of dsmentry\");\n                Display(\"\");\n                DisplayYellow(\"Scripting\");\n                Display(\"allocate {flag} {variable} {size}...............allocate memory\");\n                Display(\"call {label}....................................call function\");\n                Display(\"cd [path].......................................shows or sets the current directory\");\n                Display(\"clean...........................................clean the images folder\");\n                Display(\"dir.............................................lists files and folders in the current directory\");\n                Display(\"echo[.color] [text].............................echo text\");\n                Display(\"echo.passfail {title} {result}..................echo test result in a tabular form\");\n                Display(\"echo.progress {title} {result}..................echo progress in a tabular form\");\n                Display(\"echo.prompt [text]..............................echo prior to using the input command\");\n                Display(\"echo.titlesuite {title}.........................echo test suite\");\n                Display(\"echo.titletest {title} [blank lines]............echo test title\");\n                Display(\"filewrite {file} {value}........................write data to a file\");\n                Display(\"free {flag} {variable}..........................free memory\");\n                Display(\"goto {label}....................................jump to the :label in the script\");\n                Display(\"if {item1} {operator} {item2} goto {label}......if statement\");\n                Display(\"increment {dst} {src} [step]....................increment src by step and store in dst\");\n                Display(\"input [text]....................................display text and wait for user input\");\n                Display(\"json2xml {file|json}............................convert json formatted data to xml\");\n                Display(\"log {info|warn|error,etc} text..................add a line to the log file\");\n                Display(\"multiply {dst} {src} {multiplier}...............multiply src by multiplier and store in dst\");\n                Display(\"pause [text]....................................display text and wait for ENTER key\");\n                Display(\"pwd.............................................report the current working directory\");\n                Display(\"report {initialize {driver}|save {folder}}......self certification report\");\n                Display(\"return [status].................................return from call function\");\n                Display(\"rollback [state#]...............................roll back to the desired state\");\n                Display(\"run [script]....................................run a script\");\n                Display(\"runv [script]...................................run a script verbosely\");\n                Display(\"setglobal [key [value]].........................show, set, or delete global keys\");\n                Display(\"setlocal [key [value]]..........................show, set, or delete local keys\");\n                Display(\"sleep {milliseconds}............................pause the current thread\");\n                return (false);\n            }\n\n            // Get the command...\n            szCommand = a_functionarguments.aszCmd[1].ToLower();\n\n            // Overview\n            #region Overview\n\n            // Scripting...\n            if ((szCommand == \"intro\"))\n            {\n                /////////0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789\n                DisplayYellow(\"INTRODUCTION TO THIS PROGRAM\");\n                Display(\"The TWAIN Certification program is an interpreter that interacts with TWAIN scanners.\");\n                Display(\"It's main purpose is to run certification scripts testing compliance with the TWAIN\");\n                Display(\"Specification.  It can also be used to test individual TWAIN commands with a high\");\n                Display(\"degree of granularity.  User's should be prepared to snuggle up with a copy of the\");\n                Display(\"TWAIN Specification if they want to get the most out of this program.  The most current\");\n                Display(\"version can be found at:  https://twain.org\");\n                Display(\"\");\n                Display(\"For help with scripting enter 'help scripting'.  It will also be instructive to look at the\");\n                Display(\"certification scripts, which are extensive, and exercise most of this program's features.\");\n                Display(\"\");\n                Display(\"For information about certifying scanners enter 'help certification'.\");\n                Display(\"\");\n                Display(\"Commands that may be of special interest are (use help for more info):\");\n                Display(\"  dsmload - load a DSM\");\n                Display(\"  dsmunload - unload a DSM\");\n                Display(\"  dsmentry - send a command to a DSM\");\n                Display(\"  quit - exit from this program\");\n                Display(\"  cd - change the current folder\");\n                Display(\"  run [script] - with no arguments lists scripts, or run a script\");\n                Display(\"\");\n                Display(\"The command prompt includes what the certification tool regards as the current TWAIN state,\");\n                Display(\"(ex: tw4>>>).  It's important to remember that while this should match the TWAIN state in\");\n                Display(\"the driver, there is no guarantee it is doing so.\");\n                return (false);\n            }\n\n            // Scripting...\n            if ((szCommand == \"certification\") || (szCommand == \"certify\"))\n            {\n                /////////0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789\n                DisplayYellow(\"CERTIFYING A SCANNER\");\n                Display(\"Certification is accomplished using scripts contained in the data/Certification folder.  These\");\n                Display(\"must be run for both 32-bit and 64-bit systems on all platforms supported by the driver.\");\n                Display(\"\");\n                Display(\"The following command runs certification:\");\n                Display(\"  certify [\\\"driver\\\"] [verbose] [skipprompts] [badges]\");\n                Display(\"  Where,\");\n                Display(\"      driver - the TW_IDENTITY.ProductName of a TWAIN driver\");\n                Display(\"      verbose - if you want to see under the hood\");\n                Display(\"      skipprompts - diagnostic, best used with simulators\");\n                Display(\"      badges - all, barcode, imageaddress, patchcode, printing, twaindirect\");\n                Display(\"\");\n                Display(\"If no arguments are provided the command shows a list of the installed TWAIN driver and prompts\");\n                Display(\"for which one to use.  Follow the instructions to complete the process.\");\n                Display(\"\");\n                Display(\"If debugging a problem the various scripts can be run separately.  Manually run the Opends\");\n                Display(\"script, and then the script you want to focus on.  Or write a script that includes the items\");\n                Display(\"that need testing.  The output from verbose is included in the output file, so that can also\");\n                Display(\"be a good place to start.  Each of the badges comes with a certification script that can be\");\n                Display(\"run standalone when diagnosing problems.\");\n                return (false);\n            }\n\n            // Scripting...\n            if ((szCommand == \"scripting\"))\n            {\n                /////////0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789\n                DisplayYellow(\"GENERAL DISCUSSION OF SCRIPTING\");\n                Display(\"The TWAIN Certification program is designed to test scanners.  It looks at DAT objects.  It's\");\n                Display(\"script based to make it easier to manage the tests.  Users can create and run their own tests,\");\n                Display(\"such as extracting key items from an existing test to make it easier to debug.\");\n                Display(\"\");\n                Display(\"The 'language' is not sophisticated.  It supports a goto, a conditional goto, and a call and\");\n                Display(\"run function.  The set and increment commands manage variables.  All of the TWAIN calls are\");\n                Display(\"accessible, including some extras used to stress the system.  Custom capabilities can be\");\n                Display(\"accessed using numbers.  Custom operations are not supported at this time (a flexible\");\n                Display(\"marshalling system would be needed).  The semicolon ';' is the comment indicator, it can appear\");\n                Display(\"by itself or at the end of a line.\");\n                Display(\"\");\n                Display(\"The most interesting part of the scripting support is variable expansion.  Variables take the\");\n                Display(\"form ${source:target} with the following available sources:\");\n                Display(\"\");\n                Display(\"  '${arg:[index:]target}'\");\n                Display(\"  Expands an argument argument to run, runv, or call.  A target of 0 is the name of the script\");\n                Display(\"  or label; 1 - n accesses the rest of the arguments.  An index can be specified to access any\");\n                Display(\"  command in the stack, but only 0 is recommended to look at the last user command.\");\n                Display(\"\");\n                Display(\"  '${app:[index]}'\");\n                Display(\"  Complete TW_IDENTITY of the current application.  Fields can be accessed with index.\");\n                Display(\"\");\n                Display(\"  '${bits:}'\");\n                Display(\"  32 or 64.\");\n                Display(\"\");\n                Display(\"  '${ds:[index]}'\");\n                Display(\"  Complete TW_IDENTITY of the current scanner driver.  Fields can be accessed with index.\");\n                Display(\"\");\n                Display(\"  '${dsm:}'\");\n                Display(\"  Full path to the current DSM, or an empty string if we don't currently have one.\");\n                Display(\"\");\n                Display(\"  '${folder:target}'\");\n                Display(\"  Resolves to the full path for a special folder indicated by target:\");\n                Display(\"    certification - main certification folder\");\n                Display(\"    certimages - folder to put images into\");\n                Display(\"    data - data folder (in same folder as twaincscert.exe)\");\n                Display(\"    desktop - user's desktop folder\");\n                Display(\"    local - user's local temp folder\");\n                Display(\"    parent - parent folder of the currently running script, or current folder\");\n                Display(\"    pictures - user's pictures folder\");\n                Display(\"    roaming - -user's roaming temp folder\");\n                Display(\"\");\n                Display(\"  '${format:specifier|value}'\");\n                Display(\"  Formats the value according to the specifier.\");\n                Display(\"\");\n                Display(\"  '${get:target}'\");\n                Display(\"  The value last assigned to the target using the set command.\");\n                Display(\"\");\n                Display(\"  '${getbytes:target:utf8}'\");\n                Display(\"  Get the number of bytes when target is converted to UTF-8.\");\n                Display(\"\");\n                Display(\"  '${gethandle:target:type:bytes}'\");\n                Display(\"  Memlocks the target, and based on the type and the bytes converts the value to a string.\");\n                Display(\"  The lock is freed when done.\");\n                Display(\"\");\n                Display(\"  '${gethandleindex:target:index:type}'\");\n                Display(\"  Memlocks the target, and based on the type converts the value at the index\");\n                Display(\"  to a string.  The lock is freed when done.\");\n                Display(\"\");\n                Display(\"  '${getindex:target:index}'\");\n                Display(\"  Runs the target through CSV and returns the item at the requested index.\");\n                Display(\"\");\n                Display(\"  '${gettwei:twei:target}'\");\n                Display(\"  Look up a TWEI value in TWAINH.CS (ex: ${gettwei:TWEI_PIXELFLAVOR:TWPF_CHOCOLATE}.  This\");\n                Display(\"  is useful when processing data returned by DAT_EXTIMAGEINFO.\");\n                Display(\"\");\n                Display(\"  '${localtime:[format]}'\");\n                Display(\"  Returns the current local time using the DateTime format.\");\n                Display(\"\");\n                Display(\"  '${platform:}'\");\n                Display(\"  WINDOWS, LINUX, or MACOSX.\");\n                Display(\"\");\n                Display(\"  '${program:}'\");\n                Display(\"  Gets the name of the program running this script, its version, date, and machine word size.\");\n                Display(\"\");\n                Display(\"  '${report:}'\");\n                Display(\"  Full path to the generated self certification report (after 'report save command').\");\n                Display(\"\");\n                Display(\"  '${ret:[index]}'\");\n                Display(\"  The value supplied to the return command that ended the last run, runv, or call.  If an\");\n                Display(\"  index is supplied the string is run through CSV and the indexed element is returned.\");\n                Display(\"\");\n                Display(\"  '${sizeof:type}'\");\n                Display(\"  Get the size of the item in bytes (ex: ${sizeof:TW_TWAINDIRECT}).\");\n                Display(\"\");\n                Display(\"  '${state:}'\");\n                Display(\"  The current TWAIN state (1 through 7).\");\n                Display(\"\");\n                Display(\"  '${sts:}'\");\n                Display(\"  The TWAIN TWRC return code for the command.  If the status was TWRC_FAILURE, this will\");\n                Display(\"  contain the TWCC condition code.\");\n                Display(\"\");\n                Display(\"Note that some tricks are allowed, one can do ${ret:${get:index}}, using the set and increment\");\n                Display(\"increment commands to enumerate through all of the fields returned in a TW_* structure.\");\n                return (false);\n            }\n\n            #endregion\n\n            // Data Source Manager (DSM) commands\n            #region Data Source Manager (DSM) commands\n\n            // Help...\n            if ((szCommand == \"help\"))\n            {\n                DisplayYellow(\"HELP [COMMAND]\");\n                Display(\"Provides assistence with command and their arguments.  It does not\");\n                Display(\"go into detail on TWAIN.  Please read the Specification for more\");\n                Display(\"information.\");\n                Display(\"\");\n                Display(\"Curly brackets {} indicate mandatory arguments to a command.  Square\");\n                Display(\"brackets [] indicate optional arguments.\");\n                return (false);\n            }\n\n            // Dsmload...\n            if ((szCommand == \"dsmload\"))\n            {\n                Assembly assembly = typeof(Terminal).Assembly;\n                AssemblyName assemblyname = assembly.GetName();\n                Version version = assemblyname.Version;\n\n                DisplayYellow(\"DSMLOAD\");\n                Display(\"Load the Data Source Manager (DSM).  This must be done before using\");\n                Display(\"dsmentry.  There are several arguments, which must be prefaced with\");\n                Display(\"their name (format is name=value):\");\n                Display(\"  manufacturer - tw_identity.Manufacturer (default='TWAIN Working Group')\");\n                Display(\"  productfamily - tw_identity.ProductFamily (default='TWAIN Open Source')\");\n                Display(\"  productname - tw_identity.ProductName (default='TWAIN Certification')\");\n                Display(\"  protocolmajor - tw_identity.ProtocolMajor (default=TWON_PROTOCOLMAJOR)\");\n                Display(\"  protocolminor - tw_identity.ProtocolMinor (default=TWON_PROTOCOLMINOR)\");\n                Display(\"  supportedgroups - tw_identity.SupportedGroups (default=DG_APP2|DG_CONTROL|DG_IMAGE)\");\n                Display(\"  twcy - tw_identity.Version.Country (default=TWCY_USA)\");\n                Display(\"  info - tw_identity.Version.Info (default='TWAIN Certification')\");\n                Display(\"  twlg - tw_identity.Version.Language (default=TWLG_ENGLISH)\");\n                Display(\"  majornum - tw_identity.Version.MajorNum (default=\" + version.Major + \")\");\n                Display(\"  minornum - tw_identity.Version.MinorNum (default=\" + version.Minor + \")\");\n                Display(\"  uselegacydsm - true|false (default=false)\");\n                Display(\"  usecallbacks - true|false (default=true, ignore if uselegacydsm is false)\");\n                return (false);\n            }\n\n            // Dsmload...\n            if ((szCommand == \"dsmunload\"))\n            {\n                DisplayYellow(\"DSMUNLOAD\");\n                Display(\"Unload the Data Source Manager (DSM).\");\n                return (false);\n            }\n\n            // Dsmentry...\n            if ((szCommand == \"dsmentry\"))\n            {\n                DisplayYellow(\"DSMENTRY src dst dg dat msg memref\");\n                Display(\"Send a command to the DSM with the following arguments:\");\n                Display(\"  src - source of the message (this application)\");\n                Display(\"  dst - destination, null for DSM commands, otherwise the Data Source\");\n                Display(\"  dg - Data group (DG_*)\");\n                Display(\"  dat - Data access type (DAT_*)\");\n                Display(\"  msg - Message\");\n                Display(\"  memref - the corresponding TW_* structure in CSV format\");\n                Display(\" \");\n                Display(\"Most commands support MSG_GET which can be used to get a look at the\");\n                Display(\"CSV format, which can be compared to the TW_* structure described in\");\n                Display(\"the TWAIN Specification.\");\n                return (false);\n            }\n\n            // Verbose...\n            if ((szCommand == \"verbose [on|off|restore]\"))\n            {\n                DisplayYellow(\"VERBOSE\");\n                Display(\"Turns on verbosity output.  Use this to see the dsmentry commmands\");\n                Display(\"being generated by either the command line or scripts.  It can be\");\n                Display(\"turned on or off, or restored to the previous setting after being\");\n                Display(\"set on or off.  With no arguments it displays the current setting.\");\n                return (false);\n            }\n\n            // Wait...\n            if ((szCommand == \"wait [reset|timeout]\"))\n            {\n                DisplayYellow(\"WAIT\");\n                Display(\"Wait for a DSM_NULL message, such as MSG_XFERREADY.  The message can\");\n                Display(\"arrive through the message pump on Windows, or the callback system on\");\n                Display(\"any of the platforms (assuming TWAINDSM is in use).\");\n                Display(\" \");\n                Display(\"The reset argument clears any pending messages.  It's recommended to\");\n                Display(\"do this before calls transitioning to state 5.\");\n                Display(\" \");\n                Display(\"The timeout is optional.  Specify it in milliseconds.  If the timeout\");\n                Display(\"is triggered the value of ${ret:} is 'timeout'.\");\n                Display(\" \");\n                Display(\"If one more messages are received they'll appear in ${ret:} as a comma\");\n                Display(\"separated list (ex: 'MSG_XFERREADY').\");\n                return (false);\n            }\n\n            // Quit...\n            if ((szCommand == \"quit\"))\n            {\n                DisplayYellow(\"QUIT\");\n                Display(\"Exit from this program.\");\n                return (false);\n            }\n\n            // Status...\n            if ((szCommand == \"status\"))\n            {\n                DisplayYellow(\"STATUS\");\n                Display(\"General information about the current operation of the program.\");\n                return (false);\n            }\n\n            #endregion\n\n            // Scripting\n            #region Scripting\n\n            // Allocate...\n            if ((szCommand == \"allocate\"))\n            {\n                DisplayYellow(\"ALLOCATE {HANDLE|POINTER} {VARIABLE} {SIZE}\");\n                Display(\"Allocate a pointer or a handle of SIZE bytes and store the value in\");\n                Display(\"the specified variable.  On failure the value will be 0.\");\n                return (false);\n            }\n\n            // Call...\n            else if ((szCommand == \"call\"))\n            {\n                DisplayYellow(\"CALL {FUNCTION [argument1 [argument2 [...]]}\");\n                Display(\"Call a function with optional arguments.  Check '${ret:} to see what the\");\n                Display(\"function sent back with its RETURN command.  The function must be prefixed\");\n                Display(\"with a colon.  For example...\");\n                Display(\"  call XYZ\");\n                Display(\"  ; the script will return here\");\n                Display(\"  ...\");\n                Display(\"  :XYZ\");\n                Display(\"  return\");\n                Display(\"\");\n                Display(\"Gotos are easy to implement, and easy to script, but they can get out of\");\n                Display(\"control fast.  Keep functions small.  And when doing a goto inside of a\");\n                Display(\"function, use the function name as a prefix to help avoid reusing the same\");\n                Display(\"label in more than one place.  For example...\");\n                Display(\"  call XYZ abc\");\n                Display(\"  ; the script will return here\");\n                Display(\"  ...\");\n                Display(\"  :XYZ\");\n                Display(\"  if '${arg:1}' == 'abc' goto XYZ.ABC\");\n                Display(\"  return 'is not abc'\");\n                Display(\"  :XYZ.ABC\");\n                Display(\"  return 'is abc'\");\n                return (false);\n            }\n\n            // Cd...\n            if ((szCommand == \"cd\"))\n            {\n                DisplayYellow(\"CD [PATH]\");\n                Display(\"Show the current directory.  If a path is specified, change to that path.\");\n                return (false);\n            }\n\n            // Clean...\n            if ((szCommand == \"clean\"))\n            {\n                DisplayYellow(\"CLEAN\");\n                Display(\"Delete all files and folders in the images folder.\");\n                return (false);\n            }\n\n            // Dir...\n            if ((szCommand == \"dir\"))\n            {\n                DisplayYellow(\"DIR\");\n                Display(\"Directory command, lists files and folders in the current directory.\");\n                return (false);\n            }\n\n            // Echo...\n            if ((szCommand == \"echo\"))\n            {\n                DisplayYellow(\"ECHO[.COLOR] [TEXT]\");\n                Display(\"Echoes the text.  If there is no text an empty line is echoed.  The\");\n                return (false);\n            }\n\n            // Echo.passfail...\n            if ((szCommand == \"echo.passfail\"))\n            {\n                DisplayYellow(\"ECHO.PASSFAIL [TITLE] [RESULT]\");\n                Display(\"Echoes the title and result in a long tabular format.\");\n                return (false);\n            }\n\n            // Echo.progress...\n            if ((szCommand == \"echo.progress\"))\n            {\n                DisplayYellow(\"ECHO.PROGRESS [TITLE] [RESULT]\");\n                Display(\"Echoes the title and result in a short tabular format.\");\n                return (false);\n            }\n\n            // Echo.progress...\n            if ((szCommand == \"echo.prompt\"))\n            {\n                DisplayYellow(\"ECHO.PROMPT [TEXT]\");\n                Display(\"Use prior to an input command.\");\n                return (false);\n            }\n\n            // Filewrite...\n            if ((szCommand == \"filewrite\"))\n            {\n                DisplayYellow(\"FILEWRITE {FILE} {VALUE}\");\n                Display(\"Write the value to a file.\");\n                return (false);\n            }\n\n            // Free...\n            if ((szCommand == \"free\"))\n            {\n                DisplayYellow(\"FREE {HANDLE|POINTER} {VARIABLE}\");\n                Display(\"Free a pointer or a handle in the specified variable.  If it\");\n                Display(\"is already 0, no action is taken.  On success the variable is\");\n                Display(\"set to 0.\");\n                return (false);\n            }\n\n            // Goto...\n            if ((szCommand == \"goto\"))\n            {\n                DisplayYellow(\"GOTO {LABEL}\");\n                Display(\"Jump to the specified label in the script.  The label must be\");\n                Display(\"prefixed with a colon.  For example...\");\n                Display(\"\");\n                Display(\"Examples\");\n                Display(\"  goto XYZ\");\n                Display(\"  :XYZ\");\n                return (false);\n            }\n\n            // If...\n            if ((szCommand == \"if\"))\n            {\n                DisplayYellow(\"IF {ITEM1} {OPERATOR} {ITEM2} [OPERATOR2 ITEM3] GOTO {LABEL}\");\n                Display(\"If the operator for ITEM1 and ITEM2 is true, then goto the\");\n                Display(\"label.  For the best experience get in the habit of putting\");\n                Display(\"either single or double quotes around the items.\");\n                Display(\"\");\n                Display(\"The & and | operators require the addition of a second operator\");\n                Display(\"(== or !=)and a third item for comparison with the result of the\");\n                Display(\"boolean operation.\");\n                Display(\"\");\n                Display(\"Operators\");\n                Display(\"==...........values are equal (case sensitive)\");\n                Display(\"<............item1 is numerically less than item2\");\n                Display(\"<=...........item1 is numerically less than or equal to item2\");\n                Display(\">............item1 is numerically greater than item2\");\n                Display(\">=...........item1 is numerically greater than or equal to item2\");\n                Display(\"&............item1 AND item2 compared to item3\");\n                Display(\"|............item1 OR item2 compared to item3\");\n                Display(\"~~...........values are equal (case insensitive)\");\n                Display(\"contains.....item2 is contained in item1 (case sensitive)\");\n                Display(\"~contains....item2 is contained in item1 (case insensitive)\");\n                Display(\"!=...........values are not equal (case sensitive)\");\n                Display(\"!~...........values are not equal (case insensitive)\");\n                Display(\"!contains....item2 is not contained in item1 (case sensitive)\");\n                Display(\"!~contains...item2 is not contained in item1 (case sensitive)\");\n                Display(\"\");\n                Display(\"Items\");\n                Display(\"See 'help scripting' for a list of the items that can be compared\");\n                Display(\"in addition to literals.\");\n                Display(\"\");\n                Display(\"Examples\");\n                Display(\"  if '${sts:}' != 'SUCCESS' goto FAIL\");\n                Display(\"  if '${get:value}' & '1' == '1' goto BITSET\");\n                return (false);\n            }\n\n            // Image...\n            if ((szCommand == \"image\"))\n            {\n                DisplayYellow(\"IMAGE {free} {variable}\");\n                DisplayYellow(\"IMAGE {append} {variable} {TW_IMAGEMEMXFER}\");\n                DisplayYellow(\"IMAGE {addheader} {variable} {TW_IMAGEINFO}\");\n                DisplayYellow(\"IMAGE {delete} {folder}\");\n                DisplayYellow(\"IMAGE {save} {variable} {native|memfile|memory} {filename}\");\n                Display(\"Use image append to chain together data from one or more DAT_IMAGEMEMXFER\");\n                Display(\"or DAT_IMAGEMEMFILEXFER calls.  Use image free to free that memory when\");\n                Display(\"done with it.\");\n                Display(\"\");\n                Display(\"Use image save to save an image to disk.  You can use the return value from\");\n                Display(\"DAT_IMAGENATIVEXFER to save a .bmp bitmap file.  If an extension isn't given\");\n                Display(\"one will be provided: .bmp, .jpg, or .tif.  Use image cleanfolder to specify\");\n                Display(\"a folder where .bmp, .jpg, and .tif files will be removed.\");\n                Display(\"\");\n                Display(\"Examples\");\n                Display(\"  image append mymemoryimage '${get:twimagememxfer}'\");\n                Display(\"  image addheader mymemoryimage  '${get:twimageinfo}'\");\n                Display(\"  image save mymemoryimage memfile ./myfile\");\n                Display(\"  image free mymemoryimage\");\n                Display(\"\");\n                Display(\"  image save twmemref memfile ./myfile\");\n                Display(\"\");\n                Display(\"  image append mymemfileimage '${get:twimagememxfer}'\");\n                Display(\"  image save mymemfileimage memfile ./myfile\");\n                Display(\"  image free mymemfileimage\");\n                Display(\"\");\n                return (false);\n            }\n\n            // Increment...\n            if ((szCommand == \"increment\"))\n            {\n                DisplayYellow(\"INCREMENT {DST} {SRC} [STEP]\");\n                Display(\"Increments SRC by STEP and stores in DST.  STEP defaults to 1.\");\n                return (false);\n            }\n\n            // Input...\n            if ((szCommand == \"input\"))\n            {\n                DisplayYellow(\"INPUT [TITLE]\");\n                Display(\"Echoes the text and waits for user input, which is complete when the ENTER\");\n                Display(\"key is pressed.  The input can be retrieved from ${ret:}\");\n                return (false);\n            }\n\n            // Multiply...\n            if ((szCommand == \"multiply\"))\n            {\n                DisplayYellow(\"MULTIPLY {DST} {SRC} {MULTIPLIER}\");\n                Display(\"Multiplies SRC by MUTIPLIER and stores in DST.\");\n                return (false);\n            }\n\n            // Pause...\n            if ((szCommand == \"pause\"))\n            {\n                DisplayYellow(\"PAUSE [TITLE]\");\n                Display(\"Echoes the text and waits for the ENTER key to be pressed.\");\n                return (false);\n            }\n\n            // pwd...\n            if ((szCommand == \"pwd\"))\n            {\n                DisplayYellow(\"PWD\");\n                Display(\"Show the path to the current working directory.\");\n                return (false);\n            }\n\n            // Report...\n            if ((szCommand == \"report\"))\n            {\n                DisplayYellow(\"REPORT {INITIALIZE | SAVE {FOLDER}}\");\n                Display(\"Initialize or save a self certification report.\");\n                return (false);\n            }\n\n            // Return...\n            if ((szCommand == \"return\"))\n            {\n                DisplayYellow(\"RETURN [DATA]\");\n                Display(\"Return data from a call function or a script invoked with RUN or\");\n                Display(\"RUNV.  The caller examines this value with the '${ret:}' symbol.\");\n                return (false);\n            }\n\n            // Rollback\n            if ((szCommand == \"rollback\"))\n            {\n                DisplayYellow(\"ROLLBACK [SCRIPT#]\");\n                Display(\"With no argument it displays the current state.  With an argument\");\n                Display(\"it rolls back both the application and the driver to the desired\");\n                Display(\"state.  This should only be used when handling errors, to get back\");\n                Display(\"to a known state.  Otherwise it's better to use the normal TWAIN\");\n                Display(\"calls to change state.\");\n                return (false);\n            }\n\n            // Run...\n            if ((szCommand == \"run\"))\n            {\n                DisplayYellow(\"RUN [SCRIPT]\");\n                Display(\"Runs the specified script.  SCRIPT is the full path to the script\");\n                Display(\"to be run.  If a SCRIPT is not specified, the scripts in the\");\n                Display(\"current folder are listed.\");\n                return (false);\n            }\n\n            // Run verbose...\n            if ((szCommand == \"runv\"))\n            {\n                DisplayYellow(\"RUNV [SCRIPT]\");\n                Display(\"Runs the specified script.  SCRIPT is the full path to the script\");\n                Display(\"to be run.  If a SCRIPT is not specified, the scripts in the\");\n                Display(\"current folder are listed.  The script commands are displayed.\");\n                return (false);\n            }\n\n            // Set...\n            if ((szCommand == \"setglobal\"))\n            {\n                DisplayYellow(\"SETGLOBAL {KEY} {VALUE}\");\n                Display(\"Set a key to the specified value.  If a KEY is not specified\");\n                Display(\"all of the current keys are listed with their values.  These\");\n                Display(\"are global to all scripts.  Use SETLOCAL when possible to\");\n                Display(\"prevent names from colliding.\");\n                Display(\"\");\n                Display(\"Values\");\n                Display(\"See 'help scripting' for information about the kinds of values\");\n                Display(\"that can be accessed in addition to simple literals.\");\n                return (false);\n            }\n\n            // Setlocal...\n            if ((szCommand == \"setlocal\"))\n            {\n                DisplayYellow(\"SETLOCAL {KEY} {VALUE}\");\n                Display(\"Set a key to the specified value.  If a KEY is not specified\");\n                Display(\"all of the current keys are listed with their values.  This\");\n                Display(\"key only exists in the context of the current function.  So\");\n                Display(\"it's safe to use the same value across invokations of 'call'\");\n                Display(\"or run, they won't interfere with each other.  Use SETGLOBAL\");\n                Display(\"command for values global to all scripts.\");\n                Display(\"\");\n                Display(\"Values\");\n                Display(\"See 'help scripting' for information about the kinds of values\");\n                Display(\"that can be accessed in addition to simple literals.\");\n                return (false);\n            }\n\n            // Sleep...\n            if ((szCommand == \"sleep\"))\n            {\n                DisplayYellow(\"SLEEP {MILLISECONDS}\");\n                Display(\"Pause the thread for the specified number of milliseconds.\");\n                return (false);\n            }\n\n            #endregion\n\n            // Well, this ain't good...\n            DisplayError(\"unrecognized command: \" + a_functionarguments.aszCmd[1], a_functionarguments);\n\n            // All done...\n            return (false);\n        }\n\n        /// <summary>\n        /// Certify a TWAIN driver...\n        /// </summary>\n        /// <param name=\"a_functionarguments\">tokenized command and anything needed</param>\n        /// <returns>true to quit</returns>\n        private bool CmdCertify(ref Interpreter.FunctionArguments a_functionarguments)\n        {\n            bool blDeveloper = false;\n            bool blRunningScriptRestore = m_blRunningScript;\n            bool blVerboseRestore = m_blVerbose;\n            bool blTwainSuccess = false;\n            string szBadges = \"\";\n            string szSelection = \"\";\n            Interpreter interpreter = new Interpreter(\"\", m_consolecolorDefault, m_consolecolorGreen);\n\n            // Gotta pretend we're in a script...\n            m_blRunningScript = true;\n\n            // Make sure skipprompts is off and badges is empty...\n            SetVariable(\"g_skipprompts\", \"\", 0, VariableScope.Global);\n            SetVariable(\"g_badges\", \"\", 0, VariableScope.Global);\n\n            // If we have arguments, drop them in...\n            if ((a_functionarguments.aszCmd != null) && (a_functionarguments.aszCmd.Length > 1) && (a_functionarguments.aszCmd[1] != null))\n            {\n                for (int aa = 1; aa < a_functionarguments.aszCmd.Length; aa++)\n                {\n                    if (a_functionarguments.aszCmd[aa].ToLowerInvariant() == \"verbose\")\n                    {\n                        m_blVerbose = true;\n                    }\n                    else if (a_functionarguments.aszCmd[aa].ToLowerInvariant() == \"skipprompts\")\n                    {\n                        SetVariable(\"g_skipprompts\", \"true\", 0, VariableScope.Global);\n                    }\n                    else if (a_functionarguments.aszCmd[aa].ToLowerInvariant() == \"all\")\n                    {\n                        szBadges = \"all\";\n                    }\n                    else if (a_functionarguments.aszCmd[aa].ToLowerInvariant() == \"barcode\")\n                    {\n                        if ((szBadges != \"all\") && !(\",\" + szBadges + \",\").Contains(\",barcode,\"))\n                        {\n                            szBadges += string.IsNullOrEmpty(szBadges) ? \"barcode\" : \",barcode\";\n                        }\n                    }\n                    else if (a_functionarguments.aszCmd[aa].ToLowerInvariant() == \"imageaddress\")\n                    {\n                        if ((szBadges != \"all\") && !(\",\" + szBadges + \",\").Contains(\",imageaddress,\"))\n                        {\n                            szBadges += string.IsNullOrEmpty(szBadges) ? \"imageaddress\" : \",imageaddress\";\n                        }\n                    }\n                    else if (a_functionarguments.aszCmd[aa].ToLowerInvariant() == \"patchcode\")\n                    {\n                        if ((szBadges != \"all\") && !(\",\" + szBadges + \",\").Contains(\",patchcode,\"))\n                        {\n                            szBadges += string.IsNullOrEmpty(szBadges) ? \"patchcode\" : \",patchcode\";\n                        }\n                    }\n                    else if (a_functionarguments.aszCmd[aa].ToLowerInvariant() == \"printing\")\n                    {\n                        if ((szBadges != \"all\") && !(\",\" + szBadges + \",\").Contains(\",printing,\"))\n                        {\n                            szBadges += string.IsNullOrEmpty(szBadges) ? \"printing\" : \",printing\";\n                        }\n                    }\n                    else if (a_functionarguments.aszCmd[aa].ToLowerInvariant() == \"twaindirect\")\n                    {\n                        if ((szBadges != \"all\") && !(\",\" + szBadges + \",\").Contains(\",twaindirect,\"))\n                        {\n                            szBadges += string.IsNullOrEmpty(szBadges) ? \"twaindirect\" : \",twaindirect\";\n                        }\n                    }\n                    else\n                    {\n                        szSelection = a_functionarguments.aszCmd[aa];\n                    }\n                }\n                if (!string.IsNullOrEmpty(szBadges))\n                {\n                    SetVariable(\"g_badges\", szBadges, 0, VariableScope.Global);\n                }\n            }\n\n            // Tell the user the plan...\n            DisplayYellow(\"TWAIN Certification\");\n\n            // Refresh the scripts...\n            Display(\"\");\n            if (!CreateTwainSelfCertDataFolder(true))\n            {\n                DisplayRed(\"Failed to refresh the certification scripts, try manually deleting the 'TWAIN Self Certification' folder on your desktop...\");\n                m_blRunningScript = blRunningScriptRestore;\n                m_blVerbose = blVerboseRestore;\n                return (false);\n            }\n\n            // Developer warning, release or debug folder detected, but not under the releases folder...\n            string szLocation = Assembly.GetEntryAssembly().Location;\n            if (   !szLocation.Contains(Path.DirectorySeparatorChar + \"releases\" + Path.DirectorySeparatorChar)\n                && (szLocation.Contains(Path.DirectorySeparatorChar + \"Debug\" + Path.DirectorySeparatorChar)\n                ||  szLocation.Contains(Path.DirectorySeparatorChar + \"Release\" + Path.DirectorySeparatorChar)))\n            {\n                DisplayYellow(\"  Developer environment detected...\");\n                blDeveloper = true;\n            }\n            Display(\"\");\n\n            // Info...\n            Display(\"  This tool certifies TWAIN drivers.  To complete certification it must be run on.\");\n            Display(\"  all platforms supported by the driver:  Windows, Linux, macOS for 32-bit and 64-bit.\");\n            Display(\"\");\n            Display(\"  The tool will ask for some information and begin the test, which only takes a\");\n            Display(\"  few minutes to complete.  On success the tool provides instructions on how to\");\n            Display(\"  submit information about a TWAIN driver that has passed certification.\");\n\n            // Pick a scanner (putting this in a block to make it easier to read)...\n            bool blNeedSelection = string.IsNullOrEmpty(szSelection);\n            {\n                List<string> aszDrivers = new List<string>();\n                Interpreter.FunctionArguments functionarguments;\n\n                // Load the DSM...\n                functionarguments = new Interpreter.FunctionArguments();\n                functionarguments.aszCmd = new string[] { \"dsmload\" };\n                CmdDsmLoad(ref functionarguments);\n                if (functionarguments.sts != TWAIN.STS.SUCCESS)\n                {\n                    Display(\"\");\n                    DisplayRed(\"dsmload error...\");\n                    m_blRunningScript = blRunningScriptRestore;\n                    m_blVerbose = blVerboseRestore;\n                    return (false);\n                }\n\n                // Open the DSM...\n                functionarguments = new Interpreter.FunctionArguments();\n                functionarguments.aszCmd = new string[] { \"dsmentry\", \"src\", \"null\", \"dg_control\", \"dat_parent\", \"msg_opendsm\", \"hwnd\" };\n                CmdDsmEntry(ref functionarguments);\n                if (functionarguments.sts != TWAIN.STS.SUCCESS)\n                {\n                    Display(\"\");\n                    DisplayRed(\"dsmopen error...\");\n                    m_blRunningScript = blRunningScriptRestore;\n                    m_blVerbose = blVerboseRestore;\n                    return (false);\n                }\n\n                // Walk the driver list...\n                functionarguments = new Interpreter.FunctionArguments();\n                functionarguments.aszCmd = new string[] { \"dsmentry\", \"src\", \"null\", \"dg_control\", \"dat_identity\", \"msg_getfirst\", \"0,0,0,0,0,,0,0,0x0,,,\" };\n                while (true)\n                {\n                    // Ask for this item...\n                    CmdDsmEntry(ref functionarguments);\n                    if (functionarguments.sts != TWAIN.STS.SUCCESS)\n                    {\n                        break;\n                    }\n\n                    // Parse out the data...\n                    string[] aszTwidentity = CSV.Parse(functionarguments.szReturnValue);\n                    if (aszTwidentity.Length == 12)\n                    {\n                        // ProductName / Version.MajorVersion / Version.MinorVersion\n                        if (aszTwidentity[1].Length == 1) aszTwidentity[1] = \"0\" + aszTwidentity[1];\n                        if (aszTwidentity[2].Length == 1) aszTwidentity[2] = \"0\" + aszTwidentity[2];\n                        aszDrivers.Add(\"\\\"\" + aszTwidentity[11] + \"\\\",\" + \"(v\" + aszTwidentity[1] + \".\" + aszTwidentity[2] + \")\");\n                    }\n\n                    // Next entry...\n                    functionarguments = new Interpreter.FunctionArguments();\n                    functionarguments.aszCmd = new string[] { \"dsmentry\", \"src\", \"null\", \"dg_control\", \"dat_identity\", \"msg_getnext\", \"0,0,0,0,0,,0,0,0x0,,,\" };\n                }\n\n                // Close the DSM...\n                functionarguments = new Interpreter.FunctionArguments();\n                functionarguments.aszCmd = new string[] { \"dsmentry\", \"src\", \"null\", \"dg_control\", \"dat_parent\", \"msg_closedsm\", \"hwnd\" };\n                CmdDsmEntry(ref functionarguments);\n\n                // Unload the DSM...\n                functionarguments = new Interpreter.FunctionArguments();\n                functionarguments.aszCmd = new string[] { \"dsmunload\" };\n                CmdDsmUnload(ref functionarguments);\n\n                // Ruh-roh...\n                if (aszDrivers.Count == 0)\n                {\n                    Display(\"\");\n                    DisplayRed(\"No drivers found...\");\n                    m_blRunningScript = blRunningScriptRestore;\n                    m_blVerbose = blVerboseRestore;\n                    return (false);\n                }\n\n                // Sort it...\n                aszDrivers.Sort();\n\n                // What we found...\n                if (blNeedSelection)\n                {\n                    Display(\"\");\n                    DisplayYellow(\"Available TWAIN Drivers:\");\n                    foreach (string szDriver in aszDrivers)\n                    {\n                        string[] aszDriver = CSV.Parse(szDriver);\n                        Display(\"  \" + aszDriver[0] + \" \" + aszDriver[1]);\n                    }\n                }\n\n                // Ask for a scanner...\n                bool blFound = false;\n                if (blNeedSelection)\n                {\n                    Display(\"\");\n                    Display(\"Please enter the name of a scanner from the list above (or quit\");\n                    Display(\"to get out). Partial names are okay, as long as they are unique:\");\n                }\n                while (true)\n                {\n                    if (blNeedSelection)\n                    {\n                        interpreter.SetPrompt(\"certify driver>>> \");\n                        szSelection = interpreter.Prompt(m_streamreaderConsole, 0);\n                    }\n                    if (   (szSelection.ToLowerInvariant() == \"quit\")\n                        || (szSelection.ToLowerInvariant() == \"q\"))\n                    {\n                        szSelection = \"\";\n                        m_blRunningScript = blRunningScriptRestore;\n                        m_blVerbose = blVerboseRestore;\n                        return (false);\n                    }\n                    if (!string.IsNullOrEmpty(szSelection))\n                    {\n                        // Do ends with first so that we can properly find\n                        // stuff like 1000 vs 1000X...\n                        foreach (string szDriver in aszDrivers)\n                        {\n                            string[] aszDriver = CSV.Parse(szDriver);\n                            if (aszDriver[0].ToLowerInvariant().EndsWith(szSelection.ToLowerInvariant()))\n                            {\n                                szSelection = szDriver;\n                                blFound = true;\n                                break;\n                            }\n                        }\n\n                        // Otherwise go for contains...\n                        if (!blFound)\n                        {\n                            foreach (string szDriver in aszDrivers)\n                            {\n                                string[] aszDriver = CSV.Parse(szDriver);\n                                if (aszDriver[0].ToLowerInvariant().Contains(szSelection.ToLowerInvariant()))\n                                {\n                                    szSelection = szDriver;\n                                    blFound = true;\n                                    break;\n                                }\n                            }\n                        }\n\n                        // If we found something, then scoot...\n                        if (blFound)\n                        {\n                            break;\n                        }\n\n                        // If the user gave szSelection to us as an argument, then bail...\n                        if (!blNeedSelection)\n                        {\n                            break;\n                        }\n                    }\n\n                    // If the user gave szSelection to us as an argument, then bail...\n                    if (blNeedSelection)\n                    {\n                        DisplayRed(\"ProductName not found: <\" + szSelection + \">\");\n                        Display(\"Running the certify command without arguments shows a list of the available scanners.\");\n                        szSelection = \"\";\n                        m_blRunningScript = blRunningScriptRestore;\n                        m_blVerbose = blVerboseRestore;\n                        return (false);\n                    }\n                }\n            }\n\n            // We're bailing...\n            if (string.IsNullOrEmpty(szSelection))\n            {\n                m_blRunningScript = blRunningScriptRestore;\n                m_blVerbose = blVerboseRestore;\n                return (false);\n            }\n\n            // Show the available badges so the user can pick one, if the user gave\n            // the scanner on the command line, but not the badge, assume they don't\n            // want to test any badges...\n            if (string.IsNullOrEmpty(szBadges) && blNeedSelection)\n            {\n                // What we found...\n                Display(\"\");\n                DisplayYellow(\"Available TWAIN Badges:\");\n                string[] aszBadges = \"none,all,barcode,imageaddress,patchcode,printing,twaindirect\".Split(new char[] { ',' });\n                foreach (string szBadge in aszBadges)\n                {\n                    Display(\"  \" + szBadge);\n                }\n\n                // Ask for a zero or more badges...\n                Display(\"\");\n                Display(\"Please enter a comma separated list with one or zero or more \");\n                Display(\"badges from the list above (or quit to get out). Partial names\");\n                Display(\"are okay as long as they are unique)\");\n                while (true)\n                {\n                    interpreter.SetPrompt(\"badges>>> \");\n                    szBadges = interpreter.Prompt(m_streamreaderConsole, 0);\n                    if (   (szBadges.ToLowerInvariant() == \"quit\")\n                        || (szBadges.ToLowerInvariant() == \"q\"))\n                    {\n                        szSelection = \"\"; // so we know we're quitting...\n                        szBadges = \"\";\n                        m_blRunningScript = blRunningScriptRestore;\n                        m_blVerbose = blVerboseRestore;\n                        return (false);\n                    }\n                    szBadges = szBadges.Replace(\" \", \"\");\n                    if (szBadges.Length > 0)\n                    {\n                        string szFound = \"\";\n                        string szResult = \"\";\n                        // Turn whatever the user gave us into a valid list that we'll\n                        // use to update szBadges...\n                        foreach (string szBadge in szBadges.Split(new char[] { ',' }))\n                        {\n                            int iFound = 0;\n\n                            // Look for a match...\n                            foreach (string sz in aszBadges)\n                            {\n                                if (sz.StartsWith(szBadge))\n                                {\n                                    iFound += 1;\n                                    szFound = sz;\n                                }\n                            }\n\n                            // If found isn't 1 we have a problem...\n                            if (iFound != 1)\n                            {\n                                szResult = \"\";\n                                Display(\"Unrecognized or ambiguous badge name.\");\n                                break;\n                            }\n\n                            // If it's none, scoot without a badge...\n                            if (szFound == \"none\")\n                            {\n                                szResult = \"none\";\n                                break;\n                            }\n\n                            // If it's all, scoot with just all...\n                            if (szFound == \"all\")\n                            {\n                                szResult = \"all\";\n                                break;\n                            }\n\n                            // We already have it...\n                            if (!string.IsNullOrEmpty(szResult) && (\",\" + szResult + \",\").Contains(\",\" + szFound + \",\"))\n                            {\n                                continue;\n                            }\n\n                            // Add it to our list...\n                            szResult = szResult + (string.IsNullOrEmpty(szResult) ? szFound : \",\" + szFound);\n                        }\n\n                        // Grab the result, this is the badge list we'll go with...\n                        if (!string.IsNullOrEmpty(szResult))\n                        {\n                            szBadges = szResult;\n                            if (szBadges == \"none\")\n                            {\n                                szBadges = \"\";\n                            }\n                            break;\n                        }\n                    }\n                }\n            }\n\n            // We're bailing...\n            if (string.IsNullOrEmpty(szSelection))\n            {\n                m_blRunningScript = blRunningScriptRestore;\n                m_blVerbose = blVerboseRestore;\n                return (false);\n            }\n\n            // Confirmation to proceed...\n            Display(\"\");\n            while (true)\n            {\n                // Parse and check the data...\n                string[] aszDriver = CSV.Parse(szSelection);\n                if (aszDriver.Length < 2)\n                {\n                    DisplayRed(\"ProductName not found: <\" + szSelection + \">\");\n                    Display(\"Running the certify command without arguments shows a list of the available scanners.\");\n                    m_blRunningScript = blRunningScriptRestore;\n                    m_blVerbose = blVerboseRestore;\n                    return (false);\n                }\n\n                // Prompt the user to see if this is good...\n                if (string.IsNullOrEmpty(szBadges))\n                {\n                    interpreter.SetPrompt(\"Certify '\" + aszDriver[0] + \" \" + aszDriver[1] + \"'\" + \" (yes/no)? \");\n                }\n                else\n                {\n                    interpreter.SetPrompt(\"Certify '\" + aszDriver[0] + \" \" + aszDriver[1] + \"' with badges:\" + szBadges + \" (yes/no)? \");\n                }\n                string szAnswer = interpreter.Prompt(m_streamreaderConsole, 0);\n                if (szAnswer.ToLowerInvariant().StartsWith(\"y\"))\n                {\n                    break;\n                }\n                else if (szAnswer.ToLowerInvariant().StartsWith(\"n\"))\n                {\n                    m_blRunningScript = blRunningScriptRestore;\n                    m_blVerbose = blVerboseRestore;\n                    return (false);\n                }\n            }\n\n            // Let's do it!\n            {\n                string[] aszDriver = CSV.Parse(szSelection);\n                m_szSelfCertDriverVersion = aszDriver[1];\n\n                Display(\"\");\n                Display(\"\");\n                Display(\"\");\n\n                // If we're in the development tree, use the folder the binary is in...\n                if (blDeveloper)\n                {\n                    m_szSelfCertDataCertFolder = Path.Combine(Path.GetDirectoryName(Application.ExecutablePath), Path.Combine(\"data\", \"Certification\"));\n                    Directory.SetCurrentDirectory(Path.GetDirectoryName(Application.ExecutablePath));\n                }\n                // Otherwise use the 'Twain Self Certification' folder...\n                else\n                {\n                    m_szSelfCertDataCertFolder = Path.Combine(m_szTwainSelfCertFolder, Path.Combine(\"data\", \"Certification\"));\n                    Directory.SetCurrentDirectory(m_szTwainSelfCertFolder);\n                }\n\n                // No joy...\n                if (!Directory.Exists(m_szSelfCertDataCertFolder))\n                {\n                    Display(\"\");\n                    DisplayRed(\"Can't find our data/Certification folder, it should be in the\");\n                    DisplayRed(\"same folder as this application, or the current folder.\");\n                    m_blRunningScript = blRunningScriptRestore;\n                    m_blVerbose = blVerboseRestore;\n                    m_szSelfCertDriverVersion = \"\";\n                    return (false);\n                }\n\n                // Make a note of it...\n                DisplayGreen(\"Using folder: \" + m_szSelfCertDataCertFolder);\n                Display(\"\");\n                Display(\"\");\n                Display(\"\");\n\n                // Go there and fire up the intepreter...\n                string szCurrentDirectory = Directory.GetCurrentDirectory();\n                Directory.SetCurrentDirectory(m_szSelfCertDataCertFolder);\n                Interpreter.FunctionArguments functionarguments = new Interpreter.FunctionArguments();\n                functionarguments = new Interpreter.FunctionArguments();\n                if (m_blVerbose)\n                {\n                    if (string.IsNullOrEmpty(szBadges))\n                    {\n                        functionarguments.aszCmd = new string[4] { \"runv\", \"certification\", aszDriver[0], aszDriver[1] };\n                    }\n                    else\n                    {\n                        functionarguments.aszCmd = new string[5] { \"runv\", \"certification\", aszDriver[0], aszDriver[1], szBadges };\n                    }\n                }\n                else\n                {\n                    if (string.IsNullOrEmpty(szBadges))\n                    {\n                        functionarguments.aszCmd = new string[4] { \"run\", \"certification\", aszDriver[0], aszDriver[1] };\n                    }\n                    else\n                    {\n                        functionarguments.aszCmd = new string[5] { \"run\", \"certification\", aszDriver[0], aszDriver[1], szBadges };\n                    }\n                }\n                CmdRun(ref functionarguments);\n                blTwainSuccess = (functionarguments.szReturnValue == \"pass\");\n                Directory.SetCurrentDirectory(szCurrentDirectory);\n            }\n\n            // Report successful results, and point the user to twaindirect.org...\n            if (blTwainSuccess)\n            {\n                if (blDeveloper)\n                {\n                    Display(\"\");\n                    Display(\"\");\n                    Display(\"\");\n                    DisplayYellow(\"TWAIN Certification passed...\");\n                    DisplayYellow(\"Developer environment detected...\");\n                    Display(\"Please rerun the latest released version of this program before submitting\");\n                    Display(\"the results.  Users are free to confirm drivers on their own, so please\");\n                    Display(\"don't make changes to either the code or the script, unless that change is\");\n                    Display(\"part of an update that will be rolled into a new released version.\");\n                }\n                else\n                {\n                    Display(\"\");\n                    Display(\"\");\n                    Display(\"\");\n                    DisplayGreen(\"TWAIN Certification passed...\");\n                    Display(\"If you are the manufacturer of this driver, please go to the TWAIN website\");\n                    Display(\"at https://twain.org to register your scanner.  There is a 'TWAIN Self\");\n                    Display(\"Certification' folder on your desktop that contains the report for this run.\");\n                    Display(\"This information does not have to be sent, but it is suggested that you keep\");\n                    Display(\"a copy in your records.\");\n                }\n            }\n\n            // Report unsuccessful results, and point the user to twaindirect.org...\n            else\n            {\n                Display(\"\");\n                Display(\"\");\n                Display(\"\");\n                DisplayRed(\"TWAIN Certification failed...\");\n                Display(\"Please refer to the log files in the 'TWAIN Self Certification' folder on your\");\n                Display(\"desktop for additional information.\");\n            }\n\n            // All done...\n            m_blRunningScript = blRunningScriptRestore;\n            m_blVerbose = blVerboseRestore;\n            m_szSelfCertDriverVersion = \"\";\n            return (false);\n        }\n\n        /// <summary>\n        /// Process an if-statement...\n        /// </summary>\n        /// <param name=\"a_functionarguments\">tokenized command and anything needed</param>\n        /// <returns>true to quit</returns>\n        private bool CmdIf(ref Interpreter.FunctionArguments a_functionarguments)\n        {\n            int iAction = 0;\n            bool blDoAction = false;\n            string szItem1 = \"\";\n            string szItem2 = \"\";\n            string szItem3 = \"\";\n            string szOperator = \"\";\n            string szOperator2 = \"\";\n\n            // Protection...\n            if ((a_functionarguments.aszCmd == null) || (a_functionarguments.aszCmd.Length < 3) || (a_functionarguments.aszCmd[1] == null))\n            {\n                DisplayError(\"badly formed if-statement\", a_functionarguments);\n                return (false);\n            }\n\n            // Get all of the stuff (logical operators need more)...\n            if (   (a_functionarguments.aszCmd[2] == \"&\")\n                || (a_functionarguments.aszCmd[2] == \"|\"))\n            {\n                if ((a_functionarguments.aszCmd == null) || (a_functionarguments.aszCmd.Length < 7) || (a_functionarguments.aszCmd[1] == null))\n                {\n                    DisplayError(\"badly formed if-statement\", a_functionarguments);\n                    return (false);\n                }\n                szItem1 = a_functionarguments.aszCmd[1];\n                szOperator = a_functionarguments.aszCmd[2];\n                szItem2 = a_functionarguments.aszCmd[3];\n                szOperator2 = a_functionarguments.aszCmd[4];\n                szItem3 = a_functionarguments.aszCmd[5];\n                iAction = 6;\n            }\n            // Everybody else needs less stuff...\n            else\n            {\n                if ((a_functionarguments.aszCmd == null) || (a_functionarguments.aszCmd.Length < 5) || (a_functionarguments.aszCmd[1] == null))\n                {\n                    DisplayError(\"badly formed if-statement\", a_functionarguments);\n                    return (false);\n                }\n                szItem1 = a_functionarguments.aszCmd[1];\n                szOperator = a_functionarguments.aszCmd[2];\n                szItem2 = a_functionarguments.aszCmd[3];\n                iAction = 4;\n            }\n\n            // Items must match (case sensitive)...\n            if (szOperator == \"==\")\n            {\n                if (szItem1 == szItem2)\n                {\n                    blDoAction = true;\n                }\n            }\n\n            // Items must match (case insensitive)...\n            else if (szOperator == \"~~\")\n            {\n                if (szItem1.ToLowerInvariant() == szItem2.ToLowerInvariant())\n                {\n                    blDoAction = true;\n                }\n            }\n\n            // Items must not match (case sensitive)...\n            else if (szOperator == \"!=\")\n            {\n                if (szItem1 != szItem2)\n                {\n                    blDoAction = true;\n                }\n            }\n\n            // Items must not match (case insensitive)...\n            else if (szOperator == \"!~\")\n            {\n                if (szItem1.ToLowerInvariant() != szItem2.ToLowerInvariant())\n                {\n                    blDoAction = true;\n                }\n            }\n\n            // Item1 > Item2...\n            else if (szOperator == \">\")\n            {\n                int iItem1;\n                int iItem2;\n                if (!int.TryParse(szItem1, out iItem1))\n                {\n                    DisplayError(\"<\" + szItem1 + \"> > <\" + szItem2 + \"> is invalid\", a_functionarguments);\n                }\n                else\n                {\n                    if (!int.TryParse(szItem2, out iItem2))\n                    {\n                        DisplayError(\"<\" + szItem1 + \"> > <\" + szItem2 + \"> is invalid\", a_functionarguments);\n                    }\n                    else\n                    {\n                        if (iItem1 > iItem2)\n                        {\n                            blDoAction = true;\n                        }\n                    }\n                }\n            }\n\n            // Item1 >= Item2...\n            else if (szOperator == \">=\")\n            {\n                int iItem1;\n                int iItem2;\n                if (!int.TryParse(szItem1, out iItem1))\n                {\n                    DisplayError(\"<\" + szItem1 + \"> >= <\" + szItem2 + \"> is invalid\", a_functionarguments);\n                }\n                else\n                {\n                    if (!int.TryParse(szItem2, out iItem2))\n                    {\n                        DisplayError(\"<\" + szItem1 + \"> >= <\" + szItem2 + \"> is invalid\", a_functionarguments);\n                    }\n                    else\n                    {\n                        if (iItem1 >= iItem2)\n                        {\n                            blDoAction = true;\n                        }\n                    }\n                }\n            }\n\n            // Item1 < Item2...\n            else if (szOperator == \"<\")\n            {\n                int iItem1;\n                int iItem2;\n                if (!int.TryParse(szItem1, out iItem1))\n                {\n                    DisplayError(\"<\" + szItem1 + \"> < <\" + szItem2 + \"> is invalid\", a_functionarguments);\n                }\n                else\n                {\n                    if (!int.TryParse(szItem2, out iItem2))\n                    {\n                        DisplayError(\"<\" + szItem1 + \"> < <\" + szItem2 + \"> is invalid\", a_functionarguments);\n                    }\n                    else\n                    {\n                        if (iItem1 < iItem2)\n                        {\n                            blDoAction = true;\n                        }\n                    }\n                }\n            }\n\n            // Item1 <= Item2...\n            else if (szOperator == \"<=\")\n            {\n                int iItem1;\n                int iItem2;\n                if (!int.TryParse(szItem1, out iItem1))\n                {\n                    DisplayError(\"<\" + szItem1 + \"> <= <\" + szItem2 + \"> is invalid\", a_functionarguments);\n                }\n                else\n                {\n                    if (!int.TryParse(szItem2, out iItem2))\n                    {\n                        DisplayError(\"<\" + szItem1 + \"> <= <\" + szItem2 + \"> is invalid\", a_functionarguments);\n                    }\n                    else\n                    {\n                        if (iItem1 <= iItem2)\n                        {\n                            blDoAction = true;\n                        }\n                    }\n                }\n            }\n\n            // Bit-wise AND, always compared to a target...\n            else if (szOperator == \"&\")\n            {\n                int iAnd = 0;\n                int iItem1 = 0;\n                int iItem2 = 0;\n                int iItem3 = 0;\n                bool blItem1 = false;\n                bool blItem2 = false;\n                bool blItem3 = false;\n                if (szItem1.ToLowerInvariant().StartsWith(\"0x\"))\n                {\n                    blItem1 = int.TryParse(szItem1.Substring(2), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out iItem1);\n                }\n                else\n                {\n                    blItem1 = int.TryParse(szItem1, out iItem1);\n                }\n                if (szItem2.ToLowerInvariant().StartsWith(\"0x\"))\n                {\n                    blItem2 = int.TryParse(szItem2.Substring(2), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out iItem2);\n                }\n                else\n                {\n                    blItem2 = int.TryParse(szItem2, out iItem2);\n                }\n                if (szItem3.ToLowerInvariant().StartsWith(\"0x\"))\n                {\n                    blItem3 = int.TryParse(szItem3.Substring(2), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out iItem3);\n                }\n                else\n                {\n                    blItem3 = int.TryParse(szItem3, out iItem3);\n                }\n                if (!blItem1 || !blItem2 || !blItem3)\n                {\n                    DisplayError(\"badly formed if-statement...\", a_functionarguments);\n                    return (false);\n                }\n                iAnd = iItem1 & iItem2;\n                if ((szOperator2 == \"==\") && (iAnd == iItem3))\n                {\n                    blDoAction = true;\n                }\n                else if ((szOperator2 == \"!=\") && (iAnd != iItem3))\n                {\n                    blDoAction = true;\n                }\n                else\n                {\n                    blDoAction = false;\n                }\n            }\n\n            // Bit-wise OR, always compared to a target...\n            else if (szOperator == \"|\")\n            {\n                int iOr = 0;\n                int iItem1 = 0;\n                int iItem2 = 0;\n                int iItem3 = 0;\n                bool blItem1 = false;\n                bool blItem2 = false;\n                bool blItem3 = false;\n                if (szItem1.ToLowerInvariant().StartsWith(\"0x\"))\n                {\n                    blItem1 = int.TryParse(szItem1.Substring(2), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out iItem1);\n                }\n                else\n                {\n                    blItem1 = int.TryParse(szItem1, out iItem1);\n                }\n                if (szItem2.ToLowerInvariant().StartsWith(\"0x\"))\n                {\n                    blItem2 = int.TryParse(szItem2.Substring(2), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out iItem2);\n                }\n                else\n                {\n                    blItem2 = int.TryParse(szItem2, out iItem2);\n                }\n                if (szItem3.ToLowerInvariant().StartsWith(\"0x\"))\n                {\n                    blItem3 = int.TryParse(szItem3.Substring(2), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out iItem3);\n                }\n                else\n                {\n                    blItem3 = int.TryParse(szItem3, out iItem3);\n                }\n                if (!blItem1 || !blItem2 || !blItem3)\n                {\n                    DisplayError(\"badly formed if-statement\", a_functionarguments);\n                    return (false);\n                }\n                iOr = iItem1 | iItem2;\n                if ((szOperator2 == \"==\") && (iOr == iItem3))\n                {\n                    blDoAction = true;\n                }\n                else if ((szOperator2 == \"!=\") && (iOr != iItem3))\n                {\n                    blDoAction = true;\n                }\n                else\n                {\n                    blDoAction = false;\n                }\n            }\n\n            // Item1 must contain items2 (case sensitive)...\n            else if (szOperator == \"contains\")\n            {\n                if (szItem1.Contains(szItem2))\n                {\n                    blDoAction = true;\n                }\n            }\n\n            // Item1 must contain items2 (case insensitive)...\n            else if (szOperator == \"~contains\")\n            {\n                if (szItem1.ToLowerInvariant().Contains(szItem2.ToLowerInvariant()))\n                {\n                    blDoAction = true;\n                }\n            }\n\n            // Item1 must not contain items2 (case sensitive)...\n            else if (szOperator == \"!contains\")\n            {\n                if (!szItem1.Contains(szItem2))\n                {\n                    blDoAction = true;\n                }\n            }\n\n            // Item1 must not contain items2 (case insensitive)...\n            else if (szOperator == \"!~contains\")\n            {\n                if (!szItem1.ToLowerInvariant().Contains(szItem2.ToLowerInvariant()))\n                {\n                    blDoAction = true;\n                }\n            }\n\n            // Unrecognized operator...\n            else\n            {\n                DisplayError(\"unrecognized operator: <\" + szOperator + \">\", a_functionarguments);\n                return (false);\n            }\n\n            // We've been told to do the action...\n            if (blDoAction)\n            {\n                // We're doing a goto...\n                if (a_functionarguments.aszCmd[iAction].ToLowerInvariant() == \"goto\")\n                {\n                    int iLine;\n                    string szLabel;\n\n                    // Validate...\n                    if ((a_functionarguments.aszCmd.Length < (iAction + 1)) || string.IsNullOrEmpty(a_functionarguments.aszCmd[iAction + 1]))\n                    {\n                        DisplayError(\"goto label is missing...\", a_functionarguments);\n                        return (false);\n                    }\n\n                    // Find the label...\n                    szLabel = \":\" + a_functionarguments.aszCmd[iAction + 1];\n                    for (iLine = 0; iLine < a_functionarguments.aszScript.Length; iLine++)\n                    {\n                        if (a_functionarguments.aszScript[iLine].Trim() == szLabel)\n                        {\n                            a_functionarguments.blGotoLabel = true;\n                            a_functionarguments.iLabelLine = iLine;\n                            return (false);\n                        }\n                    }\n\n                    // Ugh...\n                    DisplayError(\"goto label not found: <\" + szLabel + \">\", a_functionarguments);\n                    return (false);\n                }\n\n                // We have no idea what we're doing...\n                else\n                {\n                    DisplayError(\"unrecognized action: <\" + a_functionarguments.aszCmd[iAction] + \">\", a_functionarguments);\n                    return (false);\n                }\n            }\n\n            // All done...\n            return (false);\n        }\n\n        /// <summary>\n        /// Manage an image byte array for DAT_IMAGEMEMXFER or DAT_IMAGEMEMFILEXFER...\n        /// </summary>\n        /// <param name=\"a_functionarguments\">tokenized command and anything needed</param>\n        /// <returns>true to quit</returns>\n        private bool CmdImage(ref Interpreter.FunctionArguments a_functionarguments)\n        {\n            int iResult = 0;\n            int iHeaderBytes;\n            UInt64 u64Ptr = 0;\n            IntPtr intptrPtr = IntPtr.Zero;\n            bool blGlobal = false;\n            byte[] abImage = null;\n            string szFolder = \"\";\n            string szFilename = \"\";\n            KeyValue keyvalue = default(KeyValue);\n            TWAIN.TW_IMAGEINFO twimageinfo = default(TWAIN.TW_IMAGEINFO);\n            TWAIN.TW_IMAGEMEMXFER twimagememxfer = default(TWAIN.TW_IMAGEMEMXFER);\n\n            // Validate...\n            if (a_functionarguments.aszCmd.Length < 2)\n            {\n                DisplayError(\"must specify an action for the image command\", a_functionarguments);\n                return (false);\n            }\n\n            // Pick an action...\n            switch (a_functionarguments.aszCmd[1].ToLowerInvariant())\n            {\n                // Oops...\n                default:\n                    DisplayError(\"unrecognized action\", a_functionarguments);\n                    return (false);\n\n                // Add a header to data (this is always going to be TIFF)...\n                case \"addheader\":\n                    // Validate\n                    if (a_functionarguments.aszCmd.Length < 4)\n                    {\n                        DisplayError(\"must specify a variable and tw_imageinfo data\", a_functionarguments);\n                        return (false);\n                    }\n\n                    // Validate...\n                    keyvalue.szKey = a_functionarguments.aszCmd[2];\n                    if (!TWAIN.CsvToImageinfo(ref twimageinfo, a_functionarguments.aszCmd[3]))\n                    {\n                        DisplayError(\"invalid tw_imageinfo data <\" + a_functionarguments.aszCmd[3] + \">\", a_functionarguments);\n                        return (false);\n                    }\n\n                    // Find the local value for this key...\n                    GetVariable(keyvalue.szKey, -1, out keyvalue.szValue, out keyvalue.iBytes, out blGlobal, VariableScope.Local);\n\n                    // If we got a pointer\n                    if (!UInt64.TryParse(keyvalue.szValue, out u64Ptr))\n                    {\n                        DisplayError(\"bad pointer <\" + keyvalue.szValue + \">\", a_functionarguments);\n                        return (false);\n                    }\n\n                    // Ruh-roh...\n                    if (u64Ptr == 0)\n                    {\n                        DisplayError(\"null pointer <\" + a_functionarguments.aszCmd[2] + \">\", a_functionarguments);\n                        return (false);\n                    }\n\n                    // The pointer to our raw image data...\n                    intptrPtr = (IntPtr)u64Ptr;\n\n                    // Bitonal uncompressed...\n                    if (((TWAIN.TWPT)twimageinfo.PixelType == TWAIN.TWPT.BW) && ((TWAIN.TWCP)twimageinfo.Compression == TWAIN.TWCP.NONE))\n                    {\n                        TWAIN.TiffBitonalUncompressed tiffbitonaluncompressed;\n                        tiffbitonaluncompressed = new TWAIN.TiffBitonalUncompressed((uint)twimageinfo.ImageWidth, (uint)twimageinfo.ImageLength, (uint)twimageinfo.XResolution.Whole, (uint)keyvalue.iBytes);\n                        intptrPtr = Marshal.ReAllocHGlobal(intptrPtr, (IntPtr)(Marshal.SizeOf(tiffbitonaluncompressed) + keyvalue.iBytes));\n                        TWAIN.MemMove((IntPtr)((UInt64)intptrPtr + (UInt64)Marshal.SizeOf(tiffbitonaluncompressed)), intptrPtr, keyvalue.iBytes);\n                        Marshal.StructureToPtr(tiffbitonaluncompressed, intptrPtr, true);\n                        SetVariable(keyvalue.szKey, keyvalue.szValue, (int)(Marshal.SizeOf(tiffbitonaluncompressed) + keyvalue.iBytes), VariableScope.Local);\n                    }\n\n                    // Bitonal GROUP4...\n                    else if (((TWAIN.TWPT)twimageinfo.PixelType == TWAIN.TWPT.BW) && ((TWAIN.TWCP)twimageinfo.Compression == TWAIN.TWCP.GROUP4))\n                    {\n                        TWAIN.TiffBitonalG4 tiffbitonalg4;\n                        tiffbitonalg4 = new TWAIN.TiffBitonalG4((uint)twimageinfo.ImageWidth, (uint)twimageinfo.ImageLength, (uint)twimageinfo.XResolution.Whole, (uint)keyvalue.iBytes);\n                        intptrPtr = Marshal.ReAllocHGlobal(intptrPtr, (IntPtr)(Marshal.SizeOf(tiffbitonalg4) + keyvalue.iBytes));\n                        TWAIN.MemMove((IntPtr)((UInt64)intptrPtr + (UInt64)Marshal.SizeOf(tiffbitonalg4)), intptrPtr, keyvalue.iBytes);\n                        Marshal.StructureToPtr(tiffbitonalg4, intptrPtr, true);\n                        SetVariable(keyvalue.szKey, keyvalue.szValue, (int)(Marshal.SizeOf(tiffbitonalg4) + keyvalue.iBytes), VariableScope.Local);\n                    }\n\n                    // Gray uncompressed...\n                    else if (((TWAIN.TWPT)twimageinfo.PixelType == TWAIN.TWPT.GRAY) && ((TWAIN.TWCP)twimageinfo.Compression == TWAIN.TWCP.NONE))\n                    {\n                        TWAIN.TiffGrayscaleUncompressed tiffgrayscaleuncompressed;\n                        tiffgrayscaleuncompressed = new TWAIN.TiffGrayscaleUncompressed((uint)twimageinfo.ImageWidth, (uint)twimageinfo.ImageLength, (uint)twimageinfo.XResolution.Whole, (uint)keyvalue.iBytes);\n                        intptrPtr = Marshal.ReAllocHGlobal(intptrPtr, (IntPtr)(Marshal.SizeOf(tiffgrayscaleuncompressed) + keyvalue.iBytes));\n                        TWAIN.MemMove((IntPtr)((UInt64)intptrPtr + (UInt64)Marshal.SizeOf(tiffgrayscaleuncompressed)), intptrPtr, keyvalue.iBytes);\n                        Marshal.StructureToPtr(tiffgrayscaleuncompressed, intptrPtr, true);\n                        SetVariable(keyvalue.szKey, keyvalue.szValue, (int)(Marshal.SizeOf(tiffgrayscaleuncompressed) + keyvalue.iBytes), VariableScope.Local);\n                    }\n\n                    // Gray JPEG...\n                    else if (((TWAIN.TWPT)twimageinfo.PixelType == TWAIN.TWPT.GRAY) && ((TWAIN.TWCP)twimageinfo.Compression == TWAIN.TWCP.JPEG))\n                    {\n                        // No work to be done, we'll output JPEG...\n                    }\n\n                    // RGB uncompressed...\n                    else if (((TWAIN.TWPT)twimageinfo.PixelType == TWAIN.TWPT.RGB) && ((TWAIN.TWCP)twimageinfo.Compression == TWAIN.TWCP.NONE))\n                    {\n                        TWAIN.TiffColorUncompressed tiffcoloruncompressed;\n                        tiffcoloruncompressed = new TWAIN.TiffColorUncompressed((uint)twimageinfo.ImageWidth, (uint)twimageinfo.ImageLength, (uint)twimageinfo.XResolution.Whole, (uint)keyvalue.iBytes);\n                        intptrPtr = Marshal.ReAllocHGlobal(intptrPtr, (IntPtr)(Marshal.SizeOf(tiffcoloruncompressed) + keyvalue.iBytes));\n                        TWAIN.MemMove((IntPtr)((UInt64)intptrPtr + (UInt64)Marshal.SizeOf(tiffcoloruncompressed)), intptrPtr, keyvalue.iBytes);\n                        Marshal.StructureToPtr(tiffcoloruncompressed, intptrPtr, true);\n                        SetVariable(keyvalue.szKey, keyvalue.szValue, (int)(Marshal.SizeOf(tiffcoloruncompressed) + keyvalue.iBytes), VariableScope.Local);\n                    }\n\n                    // RGB JPEG...\n                    else if (((TWAIN.TWPT)twimageinfo.PixelType == TWAIN.TWPT.RGB) && ((TWAIN.TWCP)twimageinfo.Compression == TWAIN.TWCP.JPEG))\n                    {\n                        // No work to be done, we'll output JPEG...\n                    }\n\n                    // Oh well...\n                    else\n                    {\n                        DisplayError(\"unsupported format <\" + twimageinfo.PixelType + \",\" + twimageinfo.Compression + \">\", a_functionarguments);\n                        return (false);\n                    }\n                    return (false);\n\n                // Append (grow the memory)...\n                case \"append\":\n                    // Validate\n                    if (a_functionarguments.aszCmd.Length < 4)\n                    {\n                        DisplayError(\"must specify a variable and tw_imagememxfer data\", a_functionarguments);\n                        return (false);\n                    }\n\n                    // Validate...\n                    keyvalue.szKey = a_functionarguments.aszCmd[2];\n                    if (!TWAIN.CsvToImagememxfer(ref twimagememxfer, a_functionarguments.aszCmd[3]))\n                    {\n                        DisplayError(\"invalid tw_imagememxfer data <\" + a_functionarguments.aszCmd[3] + \">\", a_functionarguments);\n                        return (false);\n                    }\n\n                    // Validate the pointer...\n                    if (twimagememxfer.Memory.TheMem == IntPtr.Zero)\n                    {\n                        DisplayError(\"null tw_imagememxfer.memory.themem data <\" + a_functionarguments.aszCmd[3] + \">\", a_functionarguments);\n                        return (false);\n                    }\n\n                    // Only do this bit if there's something to do...\n                    if (twimagememxfer.BytesWritten > 0)\n                    {\n                        keyvalue.szKey = a_functionarguments.aszCmd[2];\n                        GetVariable(keyvalue.szKey, -1, out keyvalue.szValue, out keyvalue.iBytes, out blGlobal, VariableScope.Local);\n                        if (string.IsNullOrEmpty(keyvalue.szValue) || UInt64.TryParse(keyvalue.szValue, out u64Ptr))\n                        {\n                            // We're starting fresh...\n                            if (u64Ptr == 0)\n                            {\n                                intptrPtr = Marshal.AllocHGlobal((int)twimagememxfer.BytesWritten + 65536);\n                                if (intptrPtr == IntPtr.Zero)\n                                {\n                                    DisplayError(\"alloc failed <\" + a_functionarguments.aszCmd[3] + \">\", a_functionarguments);\n                                    return (false);\n                                }\n                                TWAIN.MemCpy(intptrPtr, twimagememxfer.Memory.TheMem, (int)twimagememxfer.BytesWritten);\n                                SetVariable(keyvalue.szKey, intptrPtr.ToString(), (int)twimagememxfer.BytesWritten, VariableScope.Local);\n                            }\n                            // We're appending...\n                            else\n                            {\n                                intptrPtr = (IntPtr)u64Ptr;\n                                intptrPtr = Marshal.ReAllocHGlobal(intptrPtr, (IntPtr)(keyvalue.iBytes + (int)twimagememxfer.BytesWritten + 65536));\n                                if (intptrPtr == IntPtr.Zero)\n                                {\n                                    DisplayError(\"alloc failed <\" + a_functionarguments.aszCmd[3] + \">\", a_functionarguments);\n                                    return (false);\n                                }\n                                TWAIN.MemCpy((IntPtr)((UInt64)intptrPtr + (UInt64)keyvalue.iBytes), twimagememxfer.Memory.TheMem, (int)twimagememxfer.BytesWritten);\n                                SetVariable(keyvalue.szKey, intptrPtr.ToString(), keyvalue.iBytes + (int)twimagememxfer.BytesWritten, VariableScope.Local);\n                            }\n                        }\n                    }\n                    return (false);\n\n                // Cleanfolder...\n                case \"cleanfolder\":\n                    // Validate\n                    if (a_functionarguments.aszCmd.Length != 3)\n                    {\n                        DisplayError(\"must specify 3 arguments\", a_functionarguments);\n                        return (false);\n                    }\n                    szFolder = a_functionarguments.aszCmd[2];\n                    if (!Directory.Exists(szFolder))\n                    {\n                        try { Directory.CreateDirectory(szFolder); } catch { /* don't care */ }\n                    }\n                    else\n                    {\n                        string[] aszFiles = Directory.GetFiles(szFolder, \"*.bmp\");\n                        foreach (string szFile in aszFiles) try { File.Delete(szFile); } catch { /* don't care */ }\n                        aszFiles = Directory.GetFiles(szFolder, \"*.tif\");\n                        foreach (string szFile in aszFiles) try { File.Delete(szFile); } catch { /* don't care */ }\n                        aszFiles = Directory.GetFiles(szFolder, \"*.jpg\");\n                        foreach (string szFile in aszFiles) try { File.Delete(szFile); } catch { /* don't care */ }\n                        aszFiles = Directory.GetFiles(szFolder, \"*.pdf\");\n                        foreach (string szFile in aszFiles) try { File.Delete(szFile); } catch { /* don't care */ }\n                    }\n                    return (false);\n\n                // Cleanfolderandmeta...\n                case \"cleanfolderandmeta\":\n                    // Validate\n                    if (a_functionarguments.aszCmd.Length != 3)\n                    {\n                        DisplayError(\"must specify 3 arguments\", a_functionarguments);\n                        return (false);\n                    }\n                    szFolder = a_functionarguments.aszCmd[2];\n                    if (!Directory.Exists(szFolder))\n                    {\n                        try { Directory.CreateDirectory(szFolder); } catch { /* don't care */ }\n                    }\n                    else\n                    {\n                        string[] aszFiles = Directory.GetFiles(szFolder, \"*.bmp\");\n                        foreach (string szFile in aszFiles) try { File.Delete(szFile); } catch { /* don't care */ }\n                        aszFiles = Directory.GetFiles(szFolder, \"*.tif\");\n                        foreach (string szFile in aszFiles) try { File.Delete(szFile); } catch { /* don't care */ }\n                        aszFiles = Directory.GetFiles(szFolder, \"*.jpg\");\n                        foreach (string szFile in aszFiles) try { File.Delete(szFile); } catch { /* don't care */ }\n                        aszFiles = Directory.GetFiles(szFolder, \"*.pdf\");\n                        foreach (string szFile in aszFiles) try { File.Delete(szFile); } catch { /* don't care */ }\n                        aszFiles = Directory.GetFiles(szFolder, \"*.txt\");\n                        foreach (string szFile in aszFiles) try { File.Delete(szFile); } catch { /* don't care */ }\n                    }\n                    return (false);\n\n                // Free...\n                case \"free\":\n                    // Validate\n                    if (a_functionarguments.aszCmd.Length < 3)\n                    {\n                        DisplayError(\"must specify a variable for the image free command\", a_functionarguments);\n                        return (false);\n                    }\n\n                    // Get the value...\n                    keyvalue.szKey = a_functionarguments.aszCmd[2];\n                    GetVariable(keyvalue.szKey, -1, out keyvalue.szValue, out keyvalue.iBytes, out blGlobal, VariableScope.Local);\n\n                    // If we have a pointer, free it, and set the varible to 0...\n                    if (string.IsNullOrEmpty(keyvalue.szValue))\n                    {\n                        SetVariable(keyvalue.szKey, \"0\", 0, VariableScope.Local);\n                    }\n                    else if (UInt64.TryParse(keyvalue.szValue, out u64Ptr))\n                    {\n                        intptrPtr = (IntPtr)u64Ptr;\n                        if (intptrPtr != IntPtr.Zero)\n                        {\n                            Marshal.FreeHGlobal(intptrPtr);\n                            SetVariable(keyvalue.szKey, \"0\", 0, VariableScope.Local);\n                        }\n                    }\n                    else\n                    {\n                        DisplayError(\"bad pointer <\" + keyvalue.szKey + \"=\" + keyvalue.szValue + \">\", a_functionarguments);\n                        SetVariable(keyvalue.szKey, \"0\", 0, VariableScope.Local);\n                    }\n                    return (false);\n\n                // Save...\n                case \"save\":\n                    // Validate\n                    if (a_functionarguments.aszCmd.Length < 5)\n                    {\n                        DisplayError(\"must specify a variable, xfermech, and a filename for the image save command\", a_functionarguments);\n                        return (false);\n                    }\n\n                    // More validating...\n                    if ((a_functionarguments.aszCmd[3].ToLowerInvariant() != \"native\") && (a_functionarguments.aszCmd[3].ToLowerInvariant() != \"memfile\") && (a_functionarguments.aszCmd[3].ToLowerInvariant() != \"memory\"))\n                    {\n                        DisplayError(\"unrecognized xfermech <\" + a_functionarguments.aszCmd[3] + \">\", a_functionarguments);\n                        return (false);\n                    }\n\n                    // Get the value...\n                    keyvalue.szKey = a_functionarguments.aszCmd[2];\n                    GetVariable(keyvalue.szKey, -1, out keyvalue.szValue, out keyvalue.iBytes, out blGlobal, VariableScope.Local);\n\n                    // Validate the pointer...\n                    if (!UInt64.TryParse(keyvalue.szValue, out u64Ptr))\n                    {\n                        DisplayError(\"bad pointer <\" + keyvalue.szKey + \">\", a_functionarguments);\n                        return (false);\n                    }\n                    if (u64Ptr == 0)\n                    {\n                        DisplayError(\"null pointer <\" + keyvalue.szKey + \">\", a_functionarguments);\n                        return (false);\n                    }\n\n                    // Make sure the folder exists...\n                    szFolder = a_functionarguments.aszCmd[4];\n                    if (!Directory.Exists(Path.GetDirectoryName(szFolder)))\n                    {\n                        try { Directory.CreateDirectory(Path.GetDirectoryName(szFolder)); } catch { /* don't care */ }\n                    }\n\n                    // Okay, we're ready to save...\n                    intptrPtr = (IntPtr)u64Ptr;\n                    switch (a_functionarguments.aszCmd[3].ToLowerInvariant())\n                    {\n                        default:\n                        case \"native\":\n                            abImage = m_twain.NativeToByteArray(intptrPtr, true, out iHeaderBytes);\n                            try\n                            {\n                                szFilename = szFolder;\n                                if (!Path.GetFileName(szFilename).Contains(\".\"))\n                                {\n                                    szFilename += \".bmp\";\n                                }\n                                File.WriteAllBytes(szFilename, abImage);\n\n                            }\n                            catch (Exception exception)\n                            {\n                                DisplayError(\"image save failed <\" + szFilename + \"> - \" + exception.Message, a_functionarguments);\n                                return (false);\n                            }\n                            break;\n\n                        case \"memfile\":\n                        case \"memory\":\n                            iResult = TWAIN.WriteImageFile(szFolder, intptrPtr, keyvalue.iBytes, out szFilename);\n                            if (iResult == -1)\n                            {\n                                DisplayError(\"image save failed <\" + szFolder + \">\", a_functionarguments);\n                                return (false);\n                            }\n                            break;\n                    }\n\n                    // Just the file and the DAT folder it's in...\n                    if (szFilename.Contains(\"\\\\DAT_\"))\n                    {\n                        szFilename = szFilename.Substring(szFilename.IndexOf(\"\\\\DAT_\"));\n                        if (szFilename.Contains(\"\\\\\") || szFilename.Contains(\"/\"))\n                        {\n                            szFilename = szFilename.Substring(szFilename.IndexOfAny(new char[] { '\\\\', '/' }) + 1);\n                        }\n                        a_functionarguments.szReturnValue = szFilename;\n                    }\n                    else if (szFilename.Contains(\"/DAT_\"))\n                    {\n                        szFilename = szFilename.Substring(szFilename.IndexOf(\"/DAT_\"));\n                        if (szFilename.Contains(\"\\\\\") || szFilename.Contains(\"/\"))\n                        {\n                            szFilename = szFilename.Substring(szFilename.IndexOfAny(new char[] { '\\\\', '/' }) + 1);\n                        }\n                        a_functionarguments.szReturnValue = szFilename;\n                    }\n                    else\n                    {\n                        a_functionarguments.szReturnValue = szFilename;\n                    }\n                    return (false);\n            }\n        }\n\n        /// <summary>\n        /// Increment a value and store it...\n        /// </summary>\n        /// <param name=\"a_functionarguments\">tokenized command and anything needed</param>\n        /// <returns>true to quit</returns>\n        private bool CmdIncrement(ref Interpreter.FunctionArguments a_functionarguments)\n        {\n            int iSrc;\n            int iDst;\n            int iStep = 1;\n\n            // Validate...\n            if ((a_functionarguments.aszCmd == null) || (a_functionarguments.aszCmd.Length < 3) || (a_functionarguments.aszCmd[1] == null))\n            {\n                DisplayError(\"badly formed increment\", a_functionarguments);\n                return (false);\n            }\n\n            // Turn the source into a number...\n            if (!int.TryParse(a_functionarguments.aszCmd[2], out iSrc))\n            {\n                DisplayError(\"source is not a number\", a_functionarguments);\n                return (false);\n            }\n\n            // Get the step...\n            if ((a_functionarguments.aszCmd.Length >= 4) && (a_functionarguments.aszCmd[3] != null))\n            {\n                if (!int.TryParse(a_functionarguments.aszCmd[3], out iStep))\n                {\n                    DisplayError(\"step is not a number\", a_functionarguments);\n                    return (false);\n                }\n            }\n\n            // Increment the value...\n            iDst = iSrc + iStep;\n\n            // Gotta know if the value is local or global, local wins so we'll search there...\n            bool blGlobal = true;\n            if ((m_lcallstack.Count > 0) && (m_lcallstack[m_lcallstack.Count - 1].lkeyvalue != null))\n            {\n                foreach (KeyValue keyvalue in m_lcallstack[m_lcallstack.Count - 1].lkeyvalue)\n                {\n                    if (keyvalue.szKey == a_functionarguments.aszCmd[1])\n                    {\n                        blGlobal = false;\n                        break;\n                    }\n                }\n            }\n\n            // Store the value...\n            Interpreter.FunctionArguments functionarguments = default(Interpreter.FunctionArguments);\n            functionarguments.aszCmd = new string[3];\n            functionarguments.aszCmd[0] = blGlobal ? \"setglobal\" : \"setlocal\";\n            functionarguments.aszCmd[1] = a_functionarguments.aszCmd[1];\n            functionarguments.aszCmd[2] = iDst.ToString();\n            if (blGlobal)\n            {\n                CmdSetGlobal(ref functionarguments);\n            }\n            else\n            {\n                CmdSetLocal(ref functionarguments);\n            }\n\n            // All done...\n            return (false);\n        }\n\n        /// <summary>\n        /// Accept command input from the user.  The data is returned in the\n        /// ${ret:} variable.  The first argument is a prompt, the rest of\n        /// the arguments are optional, and indicate values that must be\n        /// entered if the input command is going to return...\n        /// </summary>\n        /// <param name=\"a_functionarguments\">tokenized command and anything needed</param>\n        /// <returns>true to quit</returns>\n        private bool CmdInput(ref Interpreter.FunctionArguments a_functionarguments)\n        {\n            int ii;\n            string szCmd = \"\";\n            string szPrompt = \"enter input: \";\n            List<string> lszCommands = new List<string>();\n\n            // Get the prompt...\n            if ((a_functionarguments.aszCmd.Length >= 2) && (a_functionarguments.aszCmd[1] != null))\n            {\n                szPrompt = a_functionarguments.aszCmd[1];\n            }\n\n            // Get the commands...\n            for (ii = 3; true; ii++)\n            {\n                if ((ii >= a_functionarguments.aszCmd.Length) || string.IsNullOrEmpty(a_functionarguments.aszCmd[ii - 1]))\n                {\n                    break;\n                }\n                lszCommands.Add(a_functionarguments.aszCmd[ii - 1]);\n            }\n\n            // Loopy...\n            Interpreter interpreter = new Interpreter(szPrompt, m_consolecolorDefault, m_consolecolorGreen);\n            while (true)\n            {\n                // Get the command...\n                szCmd = interpreter.Prompt(m_streamreaderConsole, ((m_twain == null) ? 1 : (int)m_twain.GetState()));\n\n                // If we have no commands to compare it against, we're done...\n                if (lszCommands.Count == 0)\n                {\n                    break;\n                }\n\n                // Otherwise, we have to look for a match...\n                bool blFound = false;\n                foreach (string szCommand in lszCommands)\n                {\n                    if (szCmd.ToLowerInvariant() == szCommand.ToLowerInvariant())\n                    {\n                        blFound = true;\n                        break;\n                    }\n                }\n\n                // We got a match...\n                if (blFound)\n                {\n                    break;\n                }\n            }\n\n            // Update the return value...\n            CallStack callstack = m_lcallstack[m_lcallstack.Count - 1];\n            callstack.functionarguments.szReturnValue = szCmd;\n            m_lcallstack[m_lcallstack.Count - 1] = callstack;\n\n            // All done...\n            return (false);\n        }\n\n        /// <summary>\n        /// Quit...\n        /// </summary>\n        /// <param name=\"a_functionarguments\">tokenized command and anything needed</param>\n        /// <returns>true to quit</returns>\n        private bool CmdQuit(ref Interpreter.FunctionArguments a_functionarguments)\n        {\n            return (true);\n        }\n\n        /// <summary>\n        /// Log text...\n        /// </summary>\n        /// <param name=\"a_functionarguments\">tokenized command and anything needed</param>\n        /// <returns>true to quit</returns>\n        private bool CmdLog(ref Interpreter.FunctionArguments a_functionarguments)\n        {\n            int ii;\n            int iStart;\n            string szSeverity;\n            string szMessage;\n\n            // If we have no arguments, then log a blank informational...\n            if ((a_functionarguments.aszCmd == null) || (a_functionarguments.aszCmd.Length < 2) || (a_functionarguments.aszCmd[1] == null))\n            {\n                Log.Info(\"\");\n                return (false);\n            }\n\n            // Pick a severity...\n            switch (a_functionarguments.aszCmd[1])\n            {\n                default:\n                    szSeverity = \"info\";\n                    iStart = 1;\n                    break;\n                case \"info\":\n                    szSeverity = \"info\";\n                    iStart = 2;\n                    break;\n                case \"warn\":\n                    szSeverity = \"warn\";\n                    iStart = 2;\n                    break;\n                case \"error\":\n                    szSeverity = \"error\";\n                    iStart = 2;\n                    break;\n                case \"verbose\":\n                    szSeverity = \"verbose\";\n                    iStart = 2;\n                    break;\n                case \"assert\":\n                    szSeverity = \"assert\";\n                    iStart = 2;\n                    break;\n            }\n\n            // Build the message...\n            szMessage = \"\";\n            for (ii = iStart; ii < a_functionarguments.aszCmd.Length; ii++)\n            {\n                szMessage += (szMessage == \"\") ? a_functionarguments.aszCmd[ii] : \" \" + a_functionarguments.aszCmd[ii];\n            }\n\n            // Log it...\n            switch (szSeverity)\n            {\n                default:\n                case \"info\":\n                    Log.Info(szMessage);\n                    break;\n                case \"warn\":\n                    Log.Warn(szMessage);\n                    break;\n                case \"error\":\n                    Log.Error(szMessage);\n                    break;\n                case \"verbose\":\n                    Log.Verbose(szMessage);\n                    break;\n                case \"assert\":\n                    Log.Assert(szMessage);\n                    break;\n            }\n\n            // All done...\n            return (false);\n        }\n\n        /// <summary>\n        /// Multiply a value and store it...\n        /// </summary>\n        /// <param name=\"a_functionarguments\">tokenized command and anything needed</param>\n        /// <returns>true to quit</returns>\n        private bool CmdMultiply(ref Interpreter.FunctionArguments a_functionarguments)\n        {\n            int iSrc;\n            int iDst;\n            float fMultiplier;\n\n            // Validate...\n            if ((a_functionarguments.aszCmd == null) || (a_functionarguments.aszCmd.Length < 4) || (a_functionarguments.aszCmd[1] == null))\n            {\n                DisplayError(\"badly formed multiplier\", a_functionarguments);\n                return (false);\n            }\n\n            // Turn the source into a number...\n            if (!int.TryParse(a_functionarguments.aszCmd[2], out iSrc))\n            {\n                DisplayError(\"source is not a number\", a_functionarguments);\n                return (false);\n            }\n\n            // Turn the multiplier into a number...\n            if (!float.TryParse(a_functionarguments.aszCmd[3], out fMultiplier))\n            {\n                DisplayError(\"multiplier is not a number\", a_functionarguments);\n                return (false);\n            }\n\n            // Multiply the value...\n            iDst = (int)((float)iSrc * fMultiplier);\n\n            // Gotta know if the value is local or global, local wins so we'll search there...\n            bool blGlobal = true;\n            if ((m_lcallstack.Count > 0) && (m_lcallstack[m_lcallstack.Count - 1].lkeyvalue != null))\n            {\n                foreach (KeyValue keyvalue in m_lcallstack[m_lcallstack.Count - 1].lkeyvalue)\n                {\n                    if (keyvalue.szKey == a_functionarguments.aszCmd[1])\n                    {\n                        blGlobal = false;\n                        break;\n                    }\n                }\n            }\n\n            // Store the value...\n            Interpreter.FunctionArguments functionarguments = default(Interpreter.FunctionArguments);\n            functionarguments.aszCmd = new string[3];\n            functionarguments.aszCmd[0] = blGlobal ? \"setglobal\" : \"setlocal\";\n            functionarguments.aszCmd[1] = a_functionarguments.aszCmd[1];\n            functionarguments.aszCmd[2] = iDst.ToString();\n            if (blGlobal)\n            {\n                CmdSetGlobal(ref functionarguments);\n            }\n            else\n            {\n                CmdSetLocal(ref functionarguments);\n            }\n\n            // All done...\n            return (false);\n        }\n\n        /// <summary>\n        /// Pause until the user presses the enter key...\n        /// </summary>\n        /// <param name=\"a_functionarguments\">tokenized command and anything needed</param>\n        /// <returns>true to quit</returns>\n        private bool CmdPause(ref Interpreter.FunctionArguments a_functionarguments)\n        {\n            int ii;\n            string szCmd = \"\";\n            string szPrompt = \"(press ENTER to continue)\";\n            List<string> lszCommands = new List<string>();\n\n            // Get the prompt...\n            if ((a_functionarguments.aszCmd.Length >= 2) && (a_functionarguments.aszCmd[1] != null))\n            {\n                szPrompt = a_functionarguments.aszCmd[1];\n            }\n\n            // Get the commands...\n            for (ii = 3; true; ii++)\n            {\n                if ((ii >= a_functionarguments.aszCmd.Length) || string.IsNullOrEmpty(a_functionarguments.aszCmd[ii - 1]))\n                {\n                    break;\n                }\n                lszCommands.Add(a_functionarguments.aszCmd[ii - 1]);\n            }\n\n            // Wait for input...\n            Interpreter interpreter = new Interpreter(szPrompt, m_consolecolorDefault, m_consolecolorGreen);\n            szCmd = interpreter.Prompt(m_streamreaderConsole, ((m_twain == null) ? 1 : (int)m_twain.GetState()), true, false);\n\n            // Update the return value...\n            CallStack callstack = m_lcallstack[m_lcallstack.Count - 1];\n            callstack.functionarguments.szReturnValue = \"\";\n            m_lcallstack[m_lcallstack.Count - 1] = callstack;\n\n            // All done...\n            return (false);\n        }\n\n        /// <summary>\n        /// Manage the self cert report...\n        /// </summary>\n        /// <param name=\"a_functionarguments\">tokenized command and anything needed</param>\n        /// <returns>true to quit</returns>\n        private bool CmdReport(ref Interpreter.FunctionArguments a_functionarguments)\n        {\n            // If we have no arguments, then log a complaint...\n            if ((a_functionarguments.aszCmd == null) || (a_functionarguments.aszCmd.Length < 2) || (a_functionarguments.aszCmd[1] == null))\n            {\n                DisplayError(\"please specify initialize or save\", a_functionarguments);\n                return (false);\n            }\n\n            // Clear...\n            if (a_functionarguments.aszCmd[1].ToLowerInvariant() == \"initialize\")\n            {\n                string szFolder = \"\";\n                m_stringbuilderSelfCertReport = new StringBuilder();\n                m_szSelfCertReportPath = null;\n                m_szSelfCertReportProductname = \"\";\n                if ((a_functionarguments.aszCmd.Length < 3) || (a_functionarguments.aszCmd[2] == null))\n                {\n                    DisplayError(\"please specify a driver productname\", a_functionarguments);\n                    return (false);\n                }\n                m_szSelfCertReportProductname = a_functionarguments.aszCmd[2];\n                szFolder = Path.Combine(m_szTwainSelfCertFolder, Regex.Replace(m_szSelfCertReportProductname + m_szSelfCertDriverVersion, \"[^.a-zA-Z0-9]\", \"_\"));\n                szFolder = Path.Combine(szFolder, TWAIN.GetPlatform() + \"_\" + TWAIN.GetMachineWordBitSize());\n                if (Directory.Exists(szFolder))\n                {\n                    try { Directory.Delete(szFolder, true); } catch { /* don't care */ }\n                }\n            }\n\n            // Save file...\n            else if (a_functionarguments.aszCmd[1].ToLowerInvariant() == \"save\")\n            {\n                string szFolder = \"\";\n                if (string.IsNullOrEmpty(m_szSelfCertReportProductname))\n                {\n                    DisplayError(\"'report initialize' must come before 'report save'...\", a_functionarguments);\n                    return (false);\n                }\n                if ((a_functionarguments.aszCmd.Length >= 3) && (a_functionarguments.aszCmd[2] != null))\n                {\n                    szFolder = a_functionarguments.aszCmd[2];\n                }\n                try\n                {\n                    if (string.IsNullOrEmpty(szFolder))\n                    {\n                        szFolder = Path.Combine(m_szTwainSelfCertFolder, Regex.Replace(m_szSelfCertReportProductname + m_szSelfCertDriverVersion, \"[^.a-zA-Z0-9]\", \"_\"));\n                        szFolder = Path.Combine(szFolder, TWAIN.GetPlatform() + \"_\" + TWAIN.GetMachineWordBitSize());\n                    }\n                    if (!Directory.Exists(szFolder))\n                    {\n                        Directory.CreateDirectory(szFolder);\n                    }\n                    m_szSelfCertReportPath = Path.Combine(szFolder, Regex.Replace(m_szSelfCertReportProductname + m_szSelfCertDriverVersion, \"[^.a-zA-Z0-9]\", \"_\")) + \".txt\";\n                    File.WriteAllText(m_szSelfCertReportPath, m_stringbuilderSelfCertReport.ToString());\n                }\n                catch (Exception exception)\n                {\n                    DisplayError(\"save threw exception: \" + exception.Message, a_functionarguments);\n                    m_szSelfCertReportPath = null;\n                    return (false);\n                }\n            }\n\n            // No idea...\n            else\n            {\n                DisplayError(\"unrecognized commend: \" + a_functionarguments.aszCmd[1], a_functionarguments);\n            }\n\n            // All done...\n            return (false);\n        }\n\n        /// <summary>\n        /// Return from the current function...\n        /// </summary>\n        /// <param name=\"a_functionarguments\">tokenized command and anything needed</param>\n        /// <returns>true to quit</returns>\n        private bool CmdReturn(ref Interpreter.FunctionArguments a_functionarguments)\n        {\n            CallStack callstack;\n\n            // If we don't have anything on the stack, then scoot...\n            if ((m_lcallstack == null) || (m_lcallstack.Count == 0))\n            {\n                return (false);\n            }\n\n            // If this is the base of the stack, then return is a noop...\n            if (m_lcallstack.Count == 1)\n            {\n                return (false);\n            }\n\n            // Make a copy of the last item (which we're about to delete)...\n            callstack = m_lcallstack[m_lcallstack.Count - 1];\n\n            // Remove the last item...\n            m_lcallstack.RemoveAt(m_lcallstack.Count - 1);\n\n            // Set the line we want to jump back to...\n            a_functionarguments.blGotoLabel = true;\n            a_functionarguments.iLabelLine = callstack.functionarguments.iCurrentLine + 1;\n\n            // Make a note of the return value for \"ret:\"...\n            if ((a_functionarguments.aszCmd != null) && (a_functionarguments.aszCmd.Length > 1))\n            {\n                callstack = m_lcallstack[m_lcallstack.Count - 1];\n                callstack.functionarguments.szReturnValue = a_functionarguments.aszCmd[1];\n                m_lcallstack[m_lcallstack.Count - 1] = callstack;\n            }\n\n            // All done...\n            return (false);\n        }\n\n        /// <summary>\n        /// With no arguments, show the current state.  With an argument\n        /// rollback to that state.  This should only be used after an\n        /// error condition to make it easier to get a script into a known\n        /// state...\n        /// </summary>\n        /// <param name=\"a_functionarguments\">tokenized command and anything needed</param>\n        /// <returns>true to quit</returns>\n        private bool CmdRollback(ref Interpreter.FunctionArguments a_functionarguments)\n        {\n            string szState;\n            string[] aszState;\n\n            // No argument, show the current state...\n            if ((a_functionarguments.aszCmd == null) || (a_functionarguments.aszCmd.Length < 2) || (a_functionarguments.aszCmd[1] == null))\n            {\n                Display(\"Currently at: \" + ((m_twain == null) ? \"state0\" : m_twain.GetState().ToString().Replace(\"S\", \"state\")));\n                return (false);\n            }\n\n            // If we don't have m_twain, just scoot...\n            if (m_twain == null)\n            {\n                return (false);\n            }\n\n            // Reduce whatever we got to just the state number, we'll take the\n            // number, the enumeration, or state#...\n            aszState = a_functionarguments.aszCmd[1].Split(new char[] { '.' });\n            szState = aszState[aszState.Length - 1]; // grab the last element\n            szState = szState.ToLower().Replace(\"state\", \"\").Replace(\"s\", \"\");\n\n            // Rollback to the desired state...\n            switch (szState)\n            {\n                default: break;\n                case \"1\": m_twain.Rollback(TWAIN.STATE.S1, false); break;\n                case \"2\": m_twain.Rollback(TWAIN.STATE.S2, false); break;\n                case \"3\": m_twain.Rollback(TWAIN.STATE.S3, false); break;\n                case \"4\": m_twain.Rollback(TWAIN.STATE.S4, false); break;\n                case \"5\": m_twain.Rollback(TWAIN.STATE.S5, false); break;\n                case \"6\": m_twain.Rollback(TWAIN.STATE.S6, false); break;\n            }\n\n            // All done...\n            return (false);\n        }\n\n        /// <summary>\n        /// With no arguments, list the scripts.  With an argument,\n        /// run the specified script.  This one runs silent.\n        /// </summary>\n        /// <param name=\"a_functionarguments\">tokenized command and anything needed</param>\n        /// <returns>true to quit</returns>\n        private bool CmdRun(ref Interpreter.FunctionArguments a_functionarguments)\n        {\n            bool blSuccess;\n            bool blSilent = m_blSilent;\n            bool blSilentEvents = m_blSilentEvents;\n            if (m_blVerbose)\n            {\n                m_blSilent = false;\n                m_blSilentEvents = false;\n            }\n            else\n            {\n                m_blSilent = true;\n                m_blSilentEvents = true;\n            }\n            blSuccess = CmdRunv(ref a_functionarguments);\n            m_blSilent = blSilent;\n            m_blSilentEvents = blSilentEvents;\n            return (blSuccess);\n        }\n\n        /// <summary>\n        /// With no arguments, list the scripts.  With an argument,\n        /// run the specified script.  The one runs verbose.\n        /// </summary>\n        /// <param name=\"a_functionarguments\">tokenized command and anything needed</param>\n        /// <returns>true to quit</returns>\n        private bool CmdRunv(ref Interpreter.FunctionArguments a_functionarguments)\n        {\n            string szPrompt = \"tc>>> \";\n            string[] aszScript;\n            string szScriptFile;\n            int iCallStackCount;\n            CallStack callstack;\n            Interpreter interpreter;\n            bool blVerboseRestore = m_blVerbose;\n\n            // Be noisy...\n            if ((a_functionarguments.aszCmd != null) && (a_functionarguments.aszCmd[0].ToLowerInvariant() == \"runv\"))\n            {\n                m_blVerbose = true;\n            }\n\n            // List...\n            if ((a_functionarguments.aszCmd == null) || (a_functionarguments.aszCmd.Length < 2) || (a_functionarguments.aszCmd[1] == null))\n            {\n                // Get the script files...\n                string[] aszScriptFiles = Directory.GetFiles(\".\", \"*.tc\");\n                if ((aszScriptFiles == null) || (aszScriptFiles.Length == 0))\n                {\n                    DisplayError(\"no script files found\", a_functionarguments);\n                }\n\n                // List what we found...\n                Display(\"SCRIPT FILES\");\n                foreach (string sz in aszScriptFiles)\n                {\n                    Display(Path.GetFileNameWithoutExtension(sz), true);\n                }\n\n                // All done...\n                m_blVerbose = blVerboseRestore;\n                return (false);\n            }\n\n            // Make sure the file exists...\n            szScriptFile = a_functionarguments.aszCmd[1];\n            if (!File.Exists(szScriptFile))\n            {\n                szScriptFile = a_functionarguments.aszCmd[1] + \".tc\";\n                if (!File.Exists(szScriptFile))\n                {\n                    DisplayError(\"script not found...<\" + szScriptFile + \">\", a_functionarguments);\n                    m_blVerbose = blVerboseRestore;\n                    return (false);\n                }\n            }\n            szScriptFile = Path.GetFullPath(szScriptFile);\n\n            // Read the file...\n            try\n            {\n                aszScript = File.ReadAllLines(szScriptFile);\n            }\n            catch (Exception exception)\n            {\n                DisplayError(\"failed to read script...<\" + szScriptFile + \">\" + exception.Message, a_functionarguments);\n                m_blVerbose = blVerboseRestore;\n                return (false);\n            }\n\n            // Give ourselves an interpreter...\n            interpreter = new Interpreter(\"\", m_consolecolorDefault, m_consolecolorGreen);\n\n            // Bump ourself up on the call stack, because we're really\n            // working like a call.  At this point we'll be running with\n            // at least 2 items on the stack.  If we drop down to 1 item\n            // that's a hint that the return command was used to get out\n            // of the script...\n            callstack = default(CallStack);\n            callstack.functionarguments = a_functionarguments;\n            callstack.functionarguments.szScriptFile = szScriptFile;\n            callstack.functionarguments.aszScript = aszScript;\n            m_lcallstack.Add(callstack);\n            iCallStackCount = m_lcallstack.Count;\n\n            // Run each line in the script...\n            int iLine = 0;\n            bool blReturn = false;\n            TWAIN.STS sts = TWAIN.STS.SUCCESS;\n            string szReturnValue = \"\";\n            m_blRunningScript = true;\n            while (iLine < aszScript.Length)\n            {\n                bool blDone;\n                string szLine;\n                string[] aszCmd;\n\n                // Grab our line...\n                szLine = aszScript[iLine];\n\n                // Show the command...\n                if (!m_blSilent)\n                {\n                    Display(szPrompt + szLine.Trim());\n                }\n\n                // Tokenize...\n                aszCmd = interpreter.Tokenize(szLine.Trim());\n\n                // Restore the last dsmentry status and value, if this isn't a dsmentry command,\n                // we need this so we can examine the values in other commands...\n                if (   (aszCmd[0] != \"dsmentry\")\n                    && (aszCmd[0] != \"echo\")\n                    && (aszCmd[0] != \"goto\")\n                    && (aszCmd[0] != \"if\")\n                    && (aszCmd[0] != \"image\")\n                    && (aszCmd[0] != \"increment\")\n                    && (aszCmd[0] != \"log\")\n                    && (aszCmd[0] != \"multiply\")\n                    && (aszCmd[0] != \"setglobal\")\n                    && (aszCmd[0] != \"setlocal\")\n                    && (aszCmd[0] != \"sleep\"))\n                {\n                    callstack = m_lcallstack[m_lcallstack.Count - 1];\n                    callstack.functionarguments.sts = sts;\n                    callstack.functionarguments.szReturnValue = szReturnValue;\n                    m_lcallstack[m_lcallstack.Count - 1] = callstack;\n                }\n\n                // Build our function arguments...\n                Interpreter.FunctionArguments functionarguments = default(Interpreter.FunctionArguments);\n                functionarguments.aszCmd = aszCmd;\n                functionarguments.szScriptFile = szScriptFile;\n                functionarguments.aszScript = aszScript;\n                functionarguments.iCurrentLine = iLine;\n\n                // Expansion of symbols...\n                Expansion(functionarguments, ref aszCmd);\n\n                // Dispatch...\n                blDone = interpreter.Dispatch(ref functionarguments, m_ldispatchtable);\n                if (blDone)\n                {\n                    break;\n                }\n\n                // Squirrel this stuff away, not every command should override these\n                // items, otherwise we can't test them...  :)\n                if (   (aszCmd[0] == \"allocatehandle\")\n                    || (aszCmd[0] == \"allocatepointer\")\n                    || (aszCmd[0] == \"dsmentry\")\n                    || (aszCmd[0] == \"image\")\n                    || (aszCmd[0] == \"verbose\")\n                    || (aszCmd[0] == \"wait\"))\n                {\n                    sts = functionarguments.sts;\n                    szReturnValue = functionarguments.szReturnValue;\n                    if (m_lcallstack.Count > 0)\n                    {\n                        callstack = m_lcallstack[m_lcallstack.Count - 1];\n                        callstack.functionarguments.sts = sts;\n                        callstack.functionarguments.szReturnValue = szReturnValue;\n                        m_lcallstack[m_lcallstack.Count - 1] = callstack;\n                    }\n                }\n\n                // Handle gotos...\n                if (functionarguments.blGotoLabel)\n                {\n                    iLine = functionarguments.iLabelLine;\n                }\n                // Otherwise, just increment...\n                else\n                {\n                    iLine += 1;\n                }\n\n                // If the count dropped, that's a sign we need to bail...\n                if (m_lcallstack.Count < iCallStackCount)\n                {\n                    blReturn = true;\n                    break;\n                }\n            }\n\n            // Pop this item, and pass along the return value, but don't do it\n            // if we detect that a return call was made in the script, because\n            // it will have already popped the stack for us...\n            if (!blReturn && (m_lcallstack.Count > 1))\n            {\n                szReturnValue = m_lcallstack[m_lcallstack.Count - 1].functionarguments.szReturnValue;\n                if (szReturnValue == null)\n                {\n                    szReturnValue = \"\";\n                }\n                m_lcallstack.RemoveAt(m_lcallstack.Count - 1);\n                callstack = m_lcallstack[m_lcallstack.Count - 1];\n                callstack.functionarguments.szReturnValue = szReturnValue;\n                m_lcallstack[m_lcallstack.Count - 1] = callstack;\n            }\n\n            // Handle the last item on the stack, so we can report how things turned out...\n            else if (m_lcallstack.Count == 1)\n            {\n                a_functionarguments.szReturnValue = m_lcallstack[m_lcallstack.Count - 1].functionarguments.szReturnValue;\n            }\n\n            // All done...\n            m_blRunningScript = false;\n            m_blVerbose = blVerboseRestore;\n            return (false);\n        }\n\n        /// <summary>\n        /// Save an image to disk, used for DAT_IMAGEMEMFILEXFER, DAT_IMAGEMEMXFER,\n        /// and DAT_IMAGENATIVEXFER.  We don't need it for DAT_IMAGEFILEXFER...\n        /// </summary>\n        /// <param name=\"a_functionarguments\">tokenized command and anything needed</param>\n        /// <returns>true to quit</returns>\n        private bool CmdSaveImage(ref Interpreter.FunctionArguments a_functionarguments)\n        {\n            int iHeaderBytes;\n            byte[] abImage;\n            UInt64 u64Handle;\n\n            // Basic sanity check...\n            if ((a_functionarguments.aszCmd == null) || (a_functionarguments.aszCmd.Length < 2) || (a_functionarguments.aszCmd[1] == null))\n            {\n                DisplayError(\"insufficient arguments, please see help for saveimage\", a_functionarguments);\n                return (false);\n            }\n\n            // Dispatch off the second argument...\n            switch (a_functionarguments.aszCmd[1].ToLowerInvariant())\n            {\n                // Oh dear...\n                default:\n                    DisplayError(\"unrecognized type <\" + a_functionarguments.aszCmd[1] + \">\", a_functionarguments);\n                    return (false);\n\n                // Memory transfer, we need the image file, pointer, byte size, and DAT_IMAGEINFO metadata...\n                case \"mem\":\n                    if (a_functionarguments.aszCmd.Length < 6)\n                    {\n                        DisplayError(\"insufficient arguments, please see help for saveimage\", a_functionarguments);\n                        return (false);\n                    }\n                    break;\n\n                // Memory file transfer, we need the image file, pointer, and the byte size...\n                case \"memfile\":\n                    if (a_functionarguments.aszCmd.Length < 5)\n                    {\n                        DisplayError(\"insufficient arguments, please see help for saveimage\", a_functionarguments);\n                        return (false);\n                    }\n                    break;\n\n                // Native transfer, we need the image file and the handle...\n                case \"native\":\n                    if (a_functionarguments.aszCmd.Length < 4)\n                    {\n                        DisplayError(\"insufficient arguments, please see help for saveimage\", a_functionarguments);\n                        return (false);\n                    }\n                    string szImageFile = a_functionarguments.aszCmd[2];\n                    if (!UInt64.TryParse(a_functionarguments.aszCmd[3], out u64Handle))\n                    {\n                        DisplayError(\"failed to convert the byte size\", a_functionarguments);\n                        return (false);\n                    }\n                    // This beastie autodetects the image type...\n                    abImage = m_twain.NativeToByteArray((IntPtr)u64Handle, true, out iHeaderBytes);\n                    try\n                    {\n                        File.WriteAllBytes(szImageFile, abImage);\n                    }\n                    catch (Exception exception)\n                    {\n                        DisplayError(\"saveimage failed <\" + szImageFile + \"> - \" + exception.Message, a_functionarguments);\n                        return (false);\n                    }\n                    break;\n            }\n\n            // All done...\n            return (false);\n        }\n\n        /// <summary>\n        /// With no arguments, list the keys with their values.  With an argument,\n        /// set the specified value.\n        /// </summary>\n        /// <param name=\"a_functionarguments\">tokenized command and anything needed</param>\n        /// <returns>true to quit</returns>\n        private bool CmdSetGlobal(ref Interpreter.FunctionArguments a_functionarguments)\n        {\n            return (CmdSetGlobal(ref a_functionarguments, false));\n        }\n        private bool CmdSetGlobal(ref Interpreter.FunctionArguments a_functionarguments, bool a_blSysOnly)\n        {\n            // If we don't have any arguments, list what we have...\n            if ((a_functionarguments.aszCmd == null) || (a_functionarguments.aszCmd.Length < 2) || (a_functionarguments.aszCmd[1] == null))\n            {\n                lock (m_objectKeyValue)\n                {\n                    // Hmmm...\n                    if (m_lkeyvalue.Count == 0)\n                    {\n                        DisplayError(\"no keys to list\", a_functionarguments);\n                        return (false);\n                    }\n\n                    // Loopy...\n                    Display((a_blSysOnly ? \"SYS \" : \"\") + \"KEY/VALUE PAIRS\");\n                    foreach (KeyValue keyvalue in m_lkeyvalue)\n                    {\n                        if (a_blSysOnly && !keyvalue.szKey.StartsWith(\"sys_\"))\n                        {\n                            continue;\n                        }\n                        Display(keyvalue.szKey + \"=<\" + keyvalue.szValue + \">\");\n                    }\n                }\n\n                // All done...\n                return (false);\n            }\n\n            // Set the variable in the global list...\n            SetVariable(a_functionarguments.aszCmd[1], (a_functionarguments.aszCmd.Length < 3) || (a_functionarguments.aszCmd[2] == null) ? \"\" : a_functionarguments.aszCmd[2], 0, VariableScope.Global);\n\n            // All done...\n            return (false);\n        }\n\n        /// <summary>\n        /// With no arguments, list the keys with their values.  With an argument,\n        /// set the specified value.  All done in the context of the topmost item\n        /// on the stack...\n        /// </summary>\n        /// <param name=\"a_functionarguments\">tokenized command and anything needed</param>\n        /// <returns>true to quit</returns>\n        private bool CmdSetLocal(ref Interpreter.FunctionArguments a_functionarguments)\n        {\n            CallStack callstack;\n\n            // If we don't have a stack, add this to the global list...\n            if (m_lcallstack.Count == 0)\n            {\n                CmdSetGlobal(ref a_functionarguments);\n                return (false);\n            }\n\n            // This is what we'll be referencing...\n            callstack = m_lcallstack[m_lcallstack.Count - 1];\n            if (callstack.lkeyvalue == null)\n            {\n                callstack.lkeyvalue = new List<KeyValue>();\n            }\n\n            // If we don't have any arguments, list what we have for the whole stack...\n            if ((a_functionarguments.aszCmd == null) || (a_functionarguments.aszCmd.Length < 2) || (a_functionarguments.aszCmd[1] == null))\n            {\n                int ii;\n\n                // We got nothing...\n                if (callstack.lkeyvalue.Count == 0)\n                {\n                    DisplayError(\"no local keys to list\", a_functionarguments);\n                    return (false);\n                }\n\n                // Loopy...\n                Display(\"LOCAL KEY/VALUE PAIRS\");\n                for (ii = m_lcallstack.Count - 1; ii >= 0; ii--)\n                {\n                    Display(\"  STACK #\" + ii);\n                    if ((m_lcallstack[ii].lkeyvalue == null) || (m_lcallstack[ii].lkeyvalue.Count == 0))\n                    {\n                        Display(\"    (no local variables)\" + ii);\n                    }\n                    else\n                    {\n                        foreach (KeyValue keyvalue in m_lcallstack[ii].lkeyvalue)\n                        {\n                            Display(\"    \" + keyvalue.szKey + \"=<\" + keyvalue.szValue + \">\");\n                        }\n                    }\n                }\n\n                // All done...\n                return (false);\n            }\n\n            // Set the variable in the local list...\n            SetVariable(a_functionarguments.aszCmd[1], (a_functionarguments.aszCmd.Length < 3) || (a_functionarguments.aszCmd[2] == null) ? \"\" : a_functionarguments.aszCmd[2], 0, VariableScope.Local);\n\n            // All done...\n            return (false);\n        }\n\n        /// <summary>\n        /// Record variables being set into another variable...\n        /// </summary>\n        /// <param name=\"a_functionarguments\">tokenized command and anything needed</param>\n        /// <returns>true to quit</returns>\n        private bool CmdSetRecord(ref Interpreter.FunctionArguments a_functionarguments)\n        {\n            // No data...\n            if ((a_functionarguments.aszCmd == null) || (a_functionarguments.aszCmd.Length < 2) || (a_functionarguments.aszCmd[0] == null))\n            {\n                DisplayError(\"setrecord needs arguments\", a_functionarguments);\n                return (false);\n            }\n\n            // Turn it off, and save the result...\n            if (a_functionarguments.aszCmd[1].ToLowerInvariant() == \"off\")\n            {\n                if (!string.IsNullOrEmpty(m_szSetRecordVariable))\n                {\n                    SetVariable(m_szSetRecordVariable, m_szSetRecordData, 0, VariableScope.Global);\n                }\n                m_szSetRecordVariable = \"\";\n                m_szSetRecordFilter = \"\";\n                m_szSetRecordRemove = \"\";\n                m_szSetRecordData = \"\";\n                return (false);\n            }\n\n            // The only other valid option is on...\n            if (a_functionarguments.aszCmd[1].ToLowerInvariant() != \"on\")\n            {\n                DisplayError(\"unrecognized argument\", a_functionarguments);\n                return (false);\n            }\n\n            // Validate...\n            if ((a_functionarguments.aszCmd.Length < 3) || string.IsNullOrEmpty(a_functionarguments.aszCmd[2]))\n            {\n                DisplayError(\"setrecord on needs a variable name\", a_functionarguments);\n                return (false);\n            }\n\n            // Record the name...\n            m_szSetRecordVariable = a_functionarguments.aszCmd[2];\n            m_szSetRecordData = \"\";\n            m_szSetRecordFilter = \"\";\n            m_szSetRecordRemove = \"\";\n\n            // Check if the caller asked for a filter...\n            if ((a_functionarguments.aszCmd.Length < 4) || string.IsNullOrEmpty(a_functionarguments.aszCmd[3]))\n            {\n                return (false);\n            }\n\n            // Record the filter...\n            m_szSetRecordFilter = a_functionarguments.aszCmd[3];\n\n            // Check if the caller asked for a substring to remove...\n            if ((a_functionarguments.aszCmd.Length < 5) || string.IsNullOrEmpty(a_functionarguments.aszCmd[4]))\n            {\n                return (false);\n            }\n\n            // Record the remove string...\n            m_szSetRecordRemove = a_functionarguments.aszCmd[4];\n\n            // All done...\n            return (false);\n        }\n\n        /// <summary>\n        /// Some info that may be helpful...\n        /// </summary>\n        /// <param name=\"a_functionarguments\">tokenized command and anything needed</param>\n        /// <returns>true to quit</returns>\n        private bool CmdSizes(ref Interpreter.FunctionArguments a_functionarguments)\n        {\n            Display(\"int........\" + sizeof(int));\n            Display(\"intPtr.....\" + Marshal.SizeOf(typeof(IntPtr)));\n\n            // All done...\n            return (false);\n        }\n\n        /// <summary>\n        /// Sleep some number of milliseconds...\n        /// </summary>\n        /// <param name=\"a_functionarguments\">tokenized command and anything needed</param>\n        /// <returns>true to quit</returns>\n        private bool CmdSleep(ref Interpreter.FunctionArguments a_functionarguments)\n        {\n            int iMilliseconds;\n\n            // Get the milliseconds...\n            if ((a_functionarguments.aszCmd == null) || (a_functionarguments.aszCmd.Length < 2) || !int.TryParse(a_functionarguments.aszCmd[1], out iMilliseconds))\n            {\n                iMilliseconds = 0;\n            }\n            if (iMilliseconds < 0)\n            {\n                iMilliseconds = 0;\n            }\n\n            // Wait...\n            Thread.Sleep(iMilliseconds);\n\n            // All done...\n            return (false);\n        }\n\n        /// <summary>\n        /// Status of the program...\n        /// </summary>\n        /// <param name=\"a_functionarguments\">tokenized command and anything needed</param>\n        /// <returns>true to quit</returns>\n        private bool CmdStatus(ref Interpreter.FunctionArguments a_functionarguments)\n        {\n            // Platform...\n            Display(\"Platform..................\" + TWAINWorkingGroup.TWAIN.GetPlatform() + \" (\" + TWAINWorkingGroup.TWAIN.GetMachineWordBitSize() + \"-bit)\");\n            Display(\"Certification Folder......\" + m_szTwainSelfCertFolder);\n            Display(\"Current Folder............\" + Directory.GetCurrentDirectory());\n\n            // DSM is not loaded...\n            if (m_twain == null)\n            {\n                Display(\"DSM Path..................(not loaded)\");\n                return (false);\n            }\n\n            // DSM in use...\n            Display(\"DSM Path..................\" + m_twain.GetDsmPath());\n\n            // State...\n            Display(\"TWAIN State...............\" + ((int)m_twain.GetState()));\n\n            // If state 4 or higher, what is our driver?\n            if (m_twain.GetState() >= TWAIN.STATE.S4)\n            {\n                Display(\"TWAIN Driver..............\" + m_twain.GetDsIdentity());\n            }\n\n            // List the system variables...\n            Display(\"\");\n            CmdSetGlobal(ref a_functionarguments, true);\n\n            // All done...\n            return (false);\n        }\n\n        /// <summary>\n        /// Turn verbose on and off...\n        /// </summary>\n        /// <param name=\"a_functionarguments\">tokenized command and anything needed</param>\n        /// <returns>true to quit</returns>\n        private bool CmdVerbose(ref Interpreter.FunctionArguments a_functionarguments)\n        {\n            // Validate...\n            if ((a_functionarguments.aszCmd == null) || (a_functionarguments.aszCmd.Length < 2))\n            {\n                Display(\"verbose: \" + (m_blVerbose ? \"on\" : \"off\"));\n                return (false);\n            }\n\n            // Turn it on...\n            if (a_functionarguments.aszCmd[1].ToLowerInvariant() == \"on\")\n            {\n                m_iSilentRestore = m_blSilent ? 1 : 2;\n                m_iVerboseRestore = m_blVerbose ? 1 : 2;\n                m_blSilent = false;\n                m_blVerbose = true;\n                return (false);\n            }\n\n            // Turn it off...\n            if (a_functionarguments.aszCmd[1].ToLowerInvariant() == \"off\")\n            {\n                m_iVerboseRestore = m_blVerbose ? 1 : 2;\n                if (m_iSilentRestore > 0)\n                {\n                    m_blSilent = (m_iSilentRestore == 1) ? true : false;\n                }\n                m_blVerbose = false;\n                return (false);\n            }\n\n            // Restore it...\n            if (a_functionarguments.aszCmd[1].ToLowerInvariant() == \"restore\")\n            {\n                if (m_iSilentRestore > 0)\n                {\n                    m_blSilent = (m_iSilentRestore == 1) ? true : false;\n                }\n                if (m_iVerboseRestore > 0)\n                {\n                    m_blVerbose = (m_iVerboseRestore == 1) ? true : false;\n                }\n                return (false);\n            }\n\n            // Unrecognized argument...\n            DisplayError(\"unrecognized argument\", a_functionarguments);\n\n            // All done...\n            return (false);\n        }\n\n        /// <summary>\n        /// Wait for one or more events with a timeout, or clear pending events...\n        /// </summary>\n        /// <param name=\"a_functionarguments\">tokenized command and anything needed</param>\n        /// <returns>true to quit</returns>\n        private bool CmdWait(ref Interpreter.FunctionArguments a_functionarguments)\n        {\n            int ii;\n            int iMilliseconds = 0;\n            CallStack callstack = m_lcallstack[m_lcallstack.Count - 1];\n\n            // Validate...\n            if ((a_functionarguments.aszCmd == null) || (a_functionarguments.aszCmd.Length < 2))\n            {\n                return (false);\n            }\n\n            // Examine all of the arguments...\n            for (ii = 1; ii < a_functionarguments.aszCmd.Length; ii++)\n            {\n                // Clear pending messages...\n                if (a_functionarguments.aszCmd[1].ToLowerInvariant() == \"reset\")\n                {\n                    lock (m_lmsgDatNull)\n                    {\n                        m_lmsgDatNull.Clear();\n                        m_autoreseteventMsgDatNull.Reset();\n                    }\n                    a_functionarguments.szReturnValue = \"\";\n                    callstack.functionarguments.szReturnValue = a_functionarguments.szReturnValue;\n                    return (false);\n                }\n\n                // A number is the timeout value...\n                else if (int.TryParse(a_functionarguments.aszCmd[ii], out iMilliseconds))\n                {\n                    if (iMilliseconds < 0)\n                    {\n                        iMilliseconds = 0;\n                    }\n                }\n            }\n\n            // Wait for a signal or a timeout...\n            bool blSignaled;\n            Stopwatch stopwatch = new Stopwatch();\n            stopwatch.Start();\n            blSignaled = m_autoreseteventMsgDatNull.WaitOne(iMilliseconds);\n            if (!blSignaled)\n            {\n                a_functionarguments.szReturnValue = \"timeout\";\n                callstack.functionarguments.szReturnValue = a_functionarguments.szReturnValue;\n                return (false);\n            }\n\n            // Build a list of what we got, take a snapshot so we\n            // hold onto it for as little time as possible...\n            List<TWAIN.MSG> lmsgDatNull = null;\n            a_functionarguments.szReturnValue = \"\";\n            lock (m_lmsgDatNull)\n            {\n                lmsgDatNull = new List<TWAIN.MSG>(m_lmsgDatNull);\n            }\n            foreach (TWAIN.MSG msg in lmsgDatNull)\n            {\n                a_functionarguments.szReturnValue += (string.IsNullOrEmpty(a_functionarguments.szReturnValue) ? \"\" : \",\") + \"MSG_\" + msg;\n            }\n\n            // Update the stack...\n            callstack.functionarguments.szReturnValue = a_functionarguments.szReturnValue;\n\n            // All done...\n            return (false);\n        }\n\n        #endregion\n\n\n        // Private Methods (certification)\n        #region Private Methods (certification)\n\n        /// <summary>\n        /// Run the TWAIN Certification tests.  \n        /// </summary>\n        private void TwainDirectCertification()\n        {\n            int iPass = 0;\n            int iFail = 0;\n            int iSkip = 0;\n            int iTotal = 0;\n            string szCertificationFolder;\n            string[] aszCategories;\n\n            // Find our cert stuff...\n            szCertificationFolder = Path.Combine(Config.Get(\"writeFolder\", \"\"), \"tasks\");\n            szCertificationFolder = Path.Combine(szCertificationFolder, \"certification\");\n\n            // Whoops...nothing to work with...\n            if (!Directory.Exists(szCertificationFolder))\n            {\n                DisplayError(\"cannot find certification folder:\\n\" + szCertificationFolder, new Interpreter.FunctionArguments());\n                return;\n            }\n\n            // Get the categories...\n            aszCategories = Directory.GetDirectories(szCertificationFolder);\n            if (aszCategories == null)\n            {\n                DisplayError(\"cannot find any certification categories:\\n\" + szCertificationFolder, new Interpreter.FunctionArguments());\n                return;\n            }\n\n            // Pass count...\n            Log.Info(\"certification>>> PASS: \" + iPass);\n\n            // Fail count...\n            Log.Info(\"certification>>> FAIL: \" + iFail);\n\n            // Skip count...\n            Log.Info(\"certification>>> SKIP: \" + iSkip);\n\n            // Total count...\n            Log.Info(\"certification>>> TOTAL: \" + iTotal);\n        }\n\n        #endregion\n\n\n        // Private Methods (misc)\n        #region Private Methods (misc)\n\n        /// <summary>\n        /// Create or overwrite the data folder used for certification...\n        /// </summary>\n        private bool CreateTwainSelfCertDataFolder(bool a_blCertifying)\n        {\n            // Init stuff...\n            bool blUpdate = false;\n            string szOriginalFolder = Directory.GetCurrentDirectory();\n            m_szTwainSelfCertFolder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), \"TWAIN Self Certification\");\n\n            try\n            {\n                // Go somewhere else for a bit so we don't lock up the data folder...\n                Directory.SetCurrentDirectory(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory));\n\n                // Do this if certifying, we always overwrite the files...\n                if (a_blCertifying)\n                {\n                    blUpdate = true;\n                }\n\n                // Otherwise only create or update if we can't find it, or if we\n                // detect an older version...\n                else\n                {\n                    // Create our certification folder, if it doesn't exist...\n                    if (!Directory.Exists(m_szTwainSelfCertFolder))\n                    {\n                        Directory.CreateDirectory(m_szTwainSelfCertFolder);\n                    }\n\n                    // If we don't have the version.txt file, we're updating...\n                    if (!File.Exists(Path.Combine(m_szTwainSelfCertFolder, \"data\", \"version.txt\")))\n                    {\n                        blUpdate = true;\n                    }\n\n                    // Check if the data version is older than us...\n                    else\n                    {\n                        int iMajor = 0;\n                        int iMinor = 0;\n                        int iRevision = 0;\n                        int iBuild = 0;\n                        int iVersionTxt = 0;\n                        int iVersionCurrent = 0;\n\n                        // Get the assembly file version info from the data/version.txt file...\n                        string szVersionTxt = File.ReadAllText(Path.Combine(m_szTwainSelfCertFolder, \"data\", \"version.txt\"));\n                        szVersionTxt = szVersionTxt.Trim().Replace(\"\\r\", \"\").Replace(\"\\n\", \"\");\n                        string[] aszVersionTxt = szVersionTxt.Split('.');\n\n                        // Get our current version file version info...\n                        Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();\n                        FileVersionInfo fileversioninfo = FileVersionInfo.GetVersionInfo(assembly.Location);\n                        string[] aszVersionCurrent = fileversioninfo.FileVersion.Split('.');\n\n                        // Panic mode...\n                        if ((aszVersionTxt.Length != 4) || (aszVersionCurrent.Length != 4))\n                        {\n                            blUpdate = true;\n                        }\n\n                        // Keep going...\n                        else\n                        {\n                            // Convert...\n                            if (int.TryParse(aszVersionTxt[0], out iMajor) && int.TryParse(aszVersionTxt[1], out iMinor) && int.TryParse(aszVersionTxt[2], out iRevision) && int.TryParse(aszVersionTxt[3], out iBuild))\n                            {\n                                iVersionTxt = (iMajor * 1000000) + (iMinor * 10000) + (iRevision * 100) + iBuild;\n                            }\n                            if (int.TryParse(aszVersionCurrent[0], out iMajor) && int.TryParse(aszVersionCurrent[1], out iMinor) && int.TryParse(aszVersionCurrent[2], out iRevision) && int.TryParse(aszVersionCurrent[3], out iBuild))\n                            {\n                                iVersionCurrent = (iMajor * 1000000) + (iMinor * 10000) + (iRevision * 100) + iBuild;\n                            }\n\n                            // Compare...\n                            if ((iVersionTxt <= 0) || (iVersionCurrent <= 0) || (iVersionTxt < iVersionCurrent))\n                            {\n                                blUpdate = true;\n                            }\n                        }\n                    }\n                }\n\n                // We're creating or updating...\n                if (blUpdate)\n                {\n                    // Some info...\n                    Display((a_blCertifying ? \"  \" : \"\") + \"Creating/updating the TWAIN Self Certification data folder...\");\n                    Log.Info(\"Creating/updating the TWAIN Self Certification data folder...\");\n\n                    // Create our certification folder, if it doesn't exist...\n                    if (!Directory.Exists(m_szTwainSelfCertFolder))\n                    {\n                        Directory.CreateDirectory(m_szTwainSelfCertFolder);\n                    }\n\n                    // Delete the temporary data folder, if it exists...\n                    string szDataTmp = Path.Combine(m_szTwainSelfCertFolder, \"data.tmp\");\n                    if (Directory.Exists(szDataTmp))\n                    {\n                        Directory.Delete(szDataTmp, true);\n                    }\n\n                    // Create our temporary data folder...\n                    if (!Directory.Exists(szDataTmp))\n                    {\n                        string szDataZip = Path.Combine(szDataTmp, \"data.zip\");\n                        Directory.CreateDirectory(szDataTmp);\n                        File.WriteAllBytes(szDataZip, twaincscert.Properties.Resources.data);\n                        ZipFile.ExtractToDirectory(szDataZip, szDataTmp);\n                    }\n\n                    // Copy the temporary data folder to the data folder...\n                    if (!CopyFolder(Path.Combine(m_szTwainSelfCertFolder, \"data\"), Path.Combine(szDataTmp, \"data\")))\n                    {\n                        Log.Error(\"Couldn't merge the data folder...\");\n                        Directory.Delete(szDataTmp, true);\n                        Directory.SetCurrentDirectory(szOriginalFolder);\n                        return (false);\n                    }\n\n                    // Cleanup...\n                    Directory.Delete(szDataTmp, true);\n                }\n            }\n            catch (Exception exception)\n            {\n                DisplayRed(\"Couldn't create or update the data folder - \" + exception.Message);\n                Log.Error(\"Couldn't create or update the data folder - \" + exception.Message);\n                Directory.SetCurrentDirectory(szOriginalFolder);\n                return (false);\n            }\n\n            // All done...\n            Directory.SetCurrentDirectory(szOriginalFolder);\n            return (true);\n        }\n\n        /// <summary>\n        /// Copy one folder to another...\n        /// </summary>\n        /// <param name=\"a_szDst\"></param>\n        /// <param name=\"a_szSrc\"></param>\n        public bool CopyFolder(string a_szDst, string a_szSrc)\n        {\n            DirectoryInfo directoryinfoSrc = new DirectoryInfo(a_szSrc);\n            DirectoryInfo directoryinfoDst = new DirectoryInfo(a_szDst);\n            return (CopyAllFiles(directoryinfoDst, directoryinfoSrc));\n        }\n\n        /// <summary>\n        /// Copy files, with recursion...\n        /// </summary>\n        /// <param name=\"a_directoryinfoSrc\"></param>\n        /// <param name=\"a_directoryinfoDst\"></param>\n        public bool CopyAllFiles(DirectoryInfo a_directoryinfoDst, DirectoryInfo a_directoryinfoSrc)\n        {\n            try\n            {\n                Directory.CreateDirectory(a_directoryinfoDst.FullName);\n\n                // Copy each file into the new directory.\n                foreach (FileInfo fileinfo in a_directoryinfoSrc.GetFiles())\n                {\n                    fileinfo.CopyTo(Path.Combine(a_directoryinfoDst.FullName, fileinfo.Name), true);\n                }\n\n                // Copy each subdirectory using recursion.\n                foreach (DirectoryInfo directoryinfoSrcSubDir in a_directoryinfoSrc.GetDirectories())\n                {\n                    DirectoryInfo directoryinfoDstSubDir = a_directoryinfoDst.CreateSubdirectory(directoryinfoSrcSubDir.Name);\n                    CopyAllFiles(directoryinfoDstSubDir, directoryinfoSrcSubDir);\n                }\n            }\n            catch (Exception exception)\n            {\n                Log.Error(\"copy failed - \" + exception.Message);\n                return (false);\n            }\n\n            // All done...\n            return (true);\n        }\n\n        /// <summary>\n        /// Display text (if allowed)...\n        /// </summary>\n        /// <param name=\"a_szText\">the text to display</param>\n        private void Display(string a_szText, bool a_blForce = false)\n        {\n            if (!m_blSilent || a_blForce)\n            {\n                Console.Out.WriteLine(a_szText);\n            }\n            if (m_stringbuilderSelfCertReport != null)\n            {\n                m_stringbuilderSelfCertReport.AppendLine(a_szText);\n            }\n        }\n\n        /// <summary>\n        /// Display text (if allowed)...\n        /// </summary>\n        /// <param name=\"a_szText\">the text to display</param>\n        private void DisplayBlue(string a_szText, bool a_blForce = false)\n        {\n            if (!m_blSilent || a_blForce)\n            {\n                if (Console.BackgroundColor == ConsoleColor.Black)\n                {\n                    Console.ForegroundColor = m_consolecolorBlue;\n                    Console.Out.WriteLine(a_szText);\n                    Console.ForegroundColor = m_consolecolorDefault;\n                }\n                else\n                {\n                    Console.Out.WriteLine(a_szText);\n                }\n                if (m_stringbuilderSelfCertReport != null)\n                {\n                    m_stringbuilderSelfCertReport.AppendLine(a_szText);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Display text (if allowed)...\n        /// </summary>\n        /// <param name=\"a_szText\">the text to display</param>\n        private void DisplayGreen(string a_szText, bool a_blForce = false)\n        {\n            if (!m_blSilent || a_blForce)\n            {\n                if (Console.BackgroundColor == ConsoleColor.Black)\n                {\n                    Console.ForegroundColor = m_consolecolorGreen;\n                    Console.Out.WriteLine(a_szText);\n                    Console.ForegroundColor = m_consolecolorDefault;\n                }\n                else\n                {\n                    Console.Out.WriteLine(a_szText);\n                }\n                if (m_stringbuilderSelfCertReport != null)\n                {\n                    m_stringbuilderSelfCertReport.AppendLine(a_szText);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Display text (if allowed)...\n        /// </summary>\n        /// <param name=\"a_szText\">the text to display</param>\n        private void DisplayRed(string a_szText, bool a_blForce = false)\n        {\n            if (!m_blSilent || a_blForce)\n            {\n                if (Console.BackgroundColor == ConsoleColor.Black)\n                {\n                    Console.ForegroundColor = m_consolecolorRed;\n                    Console.Out.WriteLine(a_szText);\n                    Console.ForegroundColor = m_consolecolorDefault;\n                }\n                else\n                {\n                    Console.Out.WriteLine(a_szText);\n                }\n                if (m_stringbuilderSelfCertReport != null)\n                {\n                    m_stringbuilderSelfCertReport.AppendLine(a_szText);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Display text (if allowed)...\n        /// </summary>\n        /// <param name=\"a_szText\">the text to display</param>\n        private void DisplayYellow(string a_szText, bool a_blForce = false)\n        {\n            if (!m_blSilent || a_blForce)\n            {\n                if (Console.BackgroundColor == ConsoleColor.Black)\n                {\n                    Console.ForegroundColor = m_consolecolorYellow;\n                    Console.Out.WriteLine(a_szText);\n                    Console.ForegroundColor = m_consolecolorDefault;\n                }\n                else\n                {\n                    Console.Out.WriteLine(a_szText);\n                }\n                if (m_stringbuilderSelfCertReport != null)\n                {\n                    m_stringbuilderSelfCertReport.AppendLine(a_szText);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Display an error message...\n        /// </summary>\n        /// <param name=\"a_szText\">the text to display</param>\n        private void DisplayError(string a_szText, Interpreter.FunctionArguments a_functionarguments)\n        {\n            string szMessage;\n            if (string.IsNullOrEmpty(a_functionarguments.szScriptFile))\n            {\n                szMessage = \"ERROR: \" + a_szText;\n            }\n            else\n            {\n                szMessage =\n                    \"ERROR: \" + a_szText +\n                    \" ('\" + a_functionarguments.szScriptFile +\n                    \"' at line \" + (a_functionarguments.iCurrentLine + 1) + \")\";\n            }\n            Console.Out.WriteLine(szMessage);\n            if (m_stringbuilderSelfCertReport != null)\n            {\n                m_stringbuilderSelfCertReport.AppendLine(szMessage);\n            }\n        }\n\n        /// <summary>\n        /// Cleanup...\n        /// </summary>\n        /// <param name=\"a_blDisposing\">true if we need to clean up managed resources</param>\n        internal void Dispose(bool a_blDisposing)\n        {\n            // Free managed resources...\n            if (a_blDisposing)\n            {\n                if (m_autoreseteventMsgDatNull != null)\n                {\n                    m_autoreseteventMsgDatNull.Dispose();\n                    m_autoreseteventMsgDatNull = null;\n                }\n                if (m_autoreseteventScannerslist != null)\n                {\n                    m_autoreseteventScannerslist.Dispose();\n                    m_autoreseteventScannerslist = null;\n                }\n                if (m_twain != null)\n                {\n                    m_twain.Dispose();\n                    m_twain = null;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Expand symbols that we find in the tokenized strings.  Symbols take the form\n        /// ${source:key} where source can be one of the following:\n        ///     - the JSON text from the response to the last API command\n        ///     - the list maintains by the set command\n        ///     - the return value from the last run/runv or call in a script\n        ///     - the arguments to the program, run/runv or call in a script\n        /// \n        /// Symbols can be nests, for instance, if the first argument to a call\n        /// is a JSON key, it can be expanded as:\n        ///     - ${rj:${arg:1}}\n        /// </summary>\n        /// <param name=\"a_aszCmd\">tokenized string array to expand</param>\n        private void Expansion(Interpreter.FunctionArguments a_functionarguments, ref string[] a_aszCmd)\n        {\n            int ii;\n            int iReferenceCount;\n            int iCmd;\n            int iIndexLeft;\n            int iIndexRight;\n            CallStack callstack;\n\n            // Expansion...\n            for (iCmd = 0; iCmd < a_aszCmd.Length; iCmd++)\n            {\n                // If we don't find an occurrance of ${ in the string, then we're done...\n                if (!a_aszCmd[iCmd].Contains(\"${\"))\n                {\n                    continue;\n                }\n\n                // Find each outermost ${ in the string, meaning that if we have the\n                // following ${rj:${arg:1}}${get:y} we only want to find the rj and\n                // the get, the arg will be handled inside of the rj, so that means\n                // we have to properly count our way to the closing } for rj...\n                for (iIndexLeft = a_aszCmd[iCmd].IndexOf(\"${\");\n                     iIndexLeft >= 0;\n                     iIndexLeft = a_aszCmd[iCmd].IndexOf(\"${\"))\n                {\n                    string szSymbol;\n                    string szValue;\n                    string szKey = a_aszCmd[iCmd];\n\n                    // Find the corresponding }...\n                    iIndexRight = -1;\n                    iReferenceCount = 0;\n                    for (ii = iIndexLeft + 2; ii < szKey.Length; ii++)\n                    {\n                        // Either exit or decrement our reference count...\n                        if (szKey[ii] == '}')\n                        {\n                            if (iReferenceCount == 0)\n                            {\n                                iIndexRight = ii;\n                                break;\n                            }\n                            iReferenceCount -= 1;\n                        }\n\n                        // Bump up the reference count...\n                        if ((szKey[ii] == '$') && ((ii + 1) < szKey.Length) && (szKey[ii + 1] == '{'))\n                        {\n                            iReferenceCount += 1;\n                        }\n                    }\n\n                    // If we didn't find a closing }, we're done...\n                    if (iIndexRight == -1)\n                    {\n                        break;\n                    }\n\n                    // This is our symbol...\n                    // 0123456789\n                    // aa${rj:x}a\n                    // left index is 2, right index is 8, size is 7, so (r - l) + 1\n                    szSymbol = szKey.Substring(iIndexLeft, (iIndexRight - iIndexLeft) + 1);\n\n                    // Expand the stuff to the right of the source, so if we have\n                    // ${rj:x} we'll get x back, but if we have ${rj:${arg:1}}, we'll\n                    // get the value of ${arg:1} back...\n                    if (   szSymbol.StartsWith(\"${arg:\")\n                        || szSymbol.StartsWith(\"${app:\")\n                        || szSymbol.StartsWith(\"${bits:\")\n                        || szSymbol.StartsWith(\"${ds:\")\n                        || szSymbol.StartsWith(\"${dsm:\")\n                        || szSymbol.StartsWith(\"${folder:\")\n                        || szSymbol.StartsWith(\"${format:\")\n                        || szSymbol.StartsWith(\"${get:\")\n                        || szSymbol.StartsWith(\"${getbytes:\")\n                        || szSymbol.StartsWith(\"${gettwei:\")\n                        || szSymbol.StartsWith(\"${gethandle:\")\n                        || szSymbol.StartsWith(\"${gethandleindex:\")\n                        || szSymbol.StartsWith(\"${getindex:\")\n                        || szSymbol.StartsWith(\"${localtime:\")\n                        || szSymbol.StartsWith(\"${platform:\")\n                        || szSymbol.StartsWith(\"${program:\")\n                        || szSymbol.StartsWith(\"${report:\")\n                        || szSymbol.StartsWith(\"${ret:\")\n                        || szSymbol.StartsWith(\"${sizeof:\")\n                        || szSymbol.StartsWith(\"${state:\")\n                        || szSymbol.StartsWith(\"${sts:\"))\n                    {\n                        int iSymbolIndexLeft = szSymbol.IndexOf(\":\") + 1;\n                        int iSymbolIndexLength;\n                        string[] asz = new string[1];\n                        asz[0] = szSymbol.Substring(0, szSymbol.Length - 1).Substring(iSymbolIndexLeft);\n                        iSymbolIndexLength = asz[0].Length;\n                        Expansion(a_functionarguments, ref asz);\n                        szSymbol = szSymbol.Remove(iSymbolIndexLeft, iSymbolIndexLength);\n                        szSymbol = szSymbol.Insert(iSymbolIndexLeft, asz[0]);\n                    }\n\n                    // Assume the worse...\n                    szValue = \"\";\n\n                    // Get data from the top of the call stack...\n                    if (szSymbol.StartsWith(\"${arg:\"))\n                    {\n                        if ((m_lcallstack != null) && (m_lcallstack.Count > 0))\n                        {\n                            string szTarget = szSymbol.Substring(0, szSymbol.Length - 1).Substring(6);\n                            // If we have an index, use it to find our callstack.  As a general rule\n                            // the only 'safe' index to use is 0, since that'll point to the last\n                            // command entered by the user.  But fancier stuff is possible...\n                            if (szTarget.Contains(\":\"))\n                            {\n                                // Use the index info to get the right data...\n                                int iIndex;\n                                string szIndex = szTarget.Remove(szTarget.IndexOf(\":\"));\n                                if (int.TryParse(szIndex, out iIndex))\n                                {\n                                    iIndex += 1; // so we can have an index origin at 0...\n                                    if (iIndex < 1)\n                                    {\n                                        iIndex = 1;\n                                    }\n                                    else if (iIndex >= m_lcallstack.Count)\n                                    {\n                                        iIndex = m_lcallstack.Count - 1;\n                                    }\n                                }\n                                callstack = m_lcallstack[iIndex];\n                                // Ditch the index info...\n                                szTarget = szTarget.Substring(szTarget.IndexOf(\":\") + 1);\n                            }\n                            // Use the top of the stack...\n                            else\n                            {\n                                callstack = m_lcallstack[m_lcallstack.Count - 1];\n                            }\n                            // Return the number of arguments, wherever we ended up...\n                            if (szTarget == \"#\")\n                            {\n                                // Needs to be -2 to remove \"call xxx\" or \"run xxx\" from count...\n                                szValue = (callstack.functionarguments.aszCmd.Length - 2).ToString();\n                            }\n                            // Return the requested argument, wherever we ended up, -1 gets the command...\n                            else\n                            {\n                                int iIndex;\n                                if (int.TryParse(szTarget, out iIndex))\n                                {\n                                    if ((callstack.functionarguments.aszCmd != null) && (iIndex >= -1) && ((iIndex + 1) < callstack.functionarguments.aszCmd.Length))\n                                    {\n                                        szValue = callstack.functionarguments.aszCmd[iIndex + 1];\n                                    }\n                                }\n                            }\n                        }\n                    }\n\n                    // Get data from the application identity (indexible)...\n                    else if (szSymbol.StartsWith(\"${app:\"))\n                    {\n                        if (m_twain == null)\n                        {\n                            szValue = \"(dsm not loaded)\";\n                        }\n                        else if (szSymbol == \"${app:}\")\n                        {\n                            szValue = m_twain.GetAppIdentity();\n                        }\n                        else\n                        {\n                            int iIndex = 0;\n                            if (int.TryParse(szSymbol.Replace(\"${app:\", \"\").Replace(\"}\", \"\"), out iIndex))\n                            {\n                                string[] asz = CSV.Parse(m_twain.GetAppIdentity());\n                                if ((iIndex < 0) || (iIndex >= asz.Length))\n                                {\n                                    szValue = \"\";\n                                }\n                                else\n                                {\n                                    szValue = asz[iIndex];\n                                }\n                            }\n                        }\n                    }\n\n                    // Get number of bits in the machine word...\n                    else if (szSymbol.StartsWith(\"${bits:\"))\n                    {\n                        szValue = TWAINWorkingGroup.TWAIN.GetMachineWordBitSize().ToString();\n                    }\n\n                    // Get data from the data source (indexible)...\n                    else if (szSymbol.StartsWith(\"${ds:\"))\n                    {\n                        if (m_twain == null)\n                        {\n                            szValue = \"(dsm not loaded)\";\n                        }\n                        else if (szSymbol == \"${ds:}\")\n                        {\n                            szValue = m_twain.GetDsIdentity();\n                        }\n                        else\n                        {\n                            int iIndex = 0;\n                            if (int.TryParse(szSymbol.Replace(\"${ds:\", \"\").Replace(\"}\", \"\"), out iIndex))\n                            {\n                                string[] asz = CSV.Parse(m_twain.GetDsIdentity());\n                                if ((iIndex < 0) || (iIndex >= asz.Length))\n                                {\n                                    szValue = \"\";\n                                }\n                                else\n                                {\n                                    szValue = asz[iIndex];\n                                }\n                            }\n                        }\n                    }\n\n                    // Path to the DSM we're using (if any)...\n                    else if (szSymbol.StartsWith(\"${dsm:\"))\n                    {\n                        if (m_twain != null)\n                        {\n                            szValue = m_twain.GetDsmPath();\n                        }\n                    }\n\n                    // Special folders\n                    else if (szSymbol.StartsWith(\"${folder:\"))\n                    {\n                        if (szSymbol == \"${folder:certification}\")\n                        {\n                            szValue = m_szSelfCertDataCertFolder;\n                        }\n                        else if (szSymbol == \"${folder:certimages}\")\n                        {\n                            if ((m_twain != null) && !string.IsNullOrEmpty(m_twain.GetDsIdentity()))\n                            {\n                                string[] aszDs = CSV.Parse(m_twain.GetDsIdentity());\n                                if (aszDs.Length >= 12)\n                                {\n                                    szValue = m_szTwainSelfCertFolder;\n                                    szValue = Path.Combine(szValue, Regex.Replace(aszDs[11] + m_szSelfCertDriverVersion, \"[^.a-zA-Z0-9]\", \"_\"));\n                                    szValue = Path.Combine(szValue, TWAIN.GetPlatform() + \"_\" + TWAIN.GetMachineWordBitSize());\n                                }\n                            }\n                        }\n                        else if (szSymbol == \"${folder:data}\")\n                        {\n                            szValue = m_szTwainSelfCertFolder;\n                        }\n                        else if (szSymbol == \"${folder:desktop}\")\n                        {\n                            szValue = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);\n                        }\n                        else if (szSymbol == \"${folder:local}\")\n                        {\n                            szValue = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);\n                        }\n                        else if (szSymbol == \"${folder:parent}\")\n                        {\n                            if (string.IsNullOrEmpty(a_functionarguments.szScriptFile))\n                            {\n                                szValue = Directory.GetCurrentDirectory();\n                            }\n                            else\n                            {\n                                szValue = Path.GetFileName(Path.GetDirectoryName(a_functionarguments.szScriptFile));\n                            }\n                        }\n                        else if (szSymbol == \"${folder:pictures}\")\n                        {\n                            szValue = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures);\n                        }\n                        else if (szSymbol == \"${folder:roaming}\")\n                        {\n                            szValue = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);\n                        }\n                        else\n                        {\n                            // Not the most brilliant idea, but what the hell...\n                            szValue = szSymbol.Replace(\"${\", \"\").Replace(\":\", \"\").Replace(\"}\", \"\");\n                        }\n                    }\n\n                    // Format the data using a specifier...\n                    else if (szSymbol.StartsWith(\"${format:\"))\n                    {\n                        // Strip off ${...}, split specifier and value...\n                        string szFormat = szSymbol.Substring(0, szSymbol.Length - 1).Substring(9);\n                        string[] aszFormat = szFormat.Split(new char[] { '|' }, 2);\n                        if (aszFormat.Length >= 2)\n                        {\n                            // Assume it's a number...\n                            if (aszFormat[0].ToLowerInvariant().Contains(\"x\") || aszFormat[0].ToLowerInvariant().Contains(\"d\"))\n                            {\n                                int iValue = 0;\n                                int.TryParse(aszFormat[1], out iValue);\n                                szValue = string.Format(\"{0:\" + aszFormat[0] + \"}\", iValue);\n                            }\n                            // Assume it's a string...\n                            else\n                            {\n                                szValue = string.Format(\"{0:\" + aszFormat[0] + \"}\", aszFormat[1]);\n                            }\n                        }\n                    }\n\n                    // Use value as a GET key to get a value, we don't allow a null in this\n                    // case, it has to be an empty string.  We search the local list first,\n                    // and if that fails go to the global list...\n                    else if (szSymbol.StartsWith(\"${get:\"))\n                    {\n                        int iBytes = 0;\n                        bool blGlobal = false;\n\n                        // Strip off ${...}\n                        string szGet = szSymbol.Substring(0, szSymbol.Length - 1).Substring(6);\n\n                        if (szGet == \"twain.state\")\n                        {\n                            iBytes = 0;\n                        }\n\n                        // Get the value, if any...\n                        GetVariable(szGet, -1, out szValue, out iBytes, out blGlobal);\n                    }\n\n                    // Get the number of bytes in the string, right now the only encoding\n                    // we're doing this for is UTF-8.  I could see adding the current one\n                    // as well (at least for Windows)...\n                    else if (szSymbol.StartsWith(\"${getbytes:\"))\n                    {\n                        int iBytes = 0;\n                        bool blGlobal = false;\n                        byte[] abValue;\n                        string szValueLocal;\n\n                        // Assume zero...\n                        szValue = \"0\";\n\n                        // Strip off ${...}\n                        string szGetBytes = szSymbol.Substring(0, szSymbol.Length - 1).Substring(11);\n\n                        // If we don't have an encoding, assume UTF-8...\n                        if (!szGetBytes.Contains(\":\"))\n                        {\n                            GetVariable(szGetBytes, -1, out szValueLocal, out iBytes, out blGlobal);\n                            if (!string.IsNullOrEmpty(szValueLocal))\n                            {\n                                abValue = Encoding.UTF8.GetBytes(szValueLocal);\n                                szValue = abValue.Length.ToString();\n                            }\n                        }\n\n                        // Handle UTF-8\n                        else if (!szGetBytes.EndsWith(\":uft8\", StringComparison.InvariantCultureIgnoreCase))\n                        {\n                            szGetBytes = szGetBytes.Remove(szGetBytes.IndexOf(\":\"));\n                            GetVariable(szGetBytes, -1, out szValueLocal, out iBytes, out blGlobal);\n                            if (!string.IsNullOrEmpty(szValueLocal))\n                            {\n                                abValue = Encoding.UTF8.GetBytes(szValueLocal);\n                                szValue = abValue.Length.ToString();\n                            }\n                        }\n\n                        // Ruh-roh, leaving this here to help with debugging breakpoints...\n                        else\n                        {\n                            szValue = \"0\";\n                        }\n                    }\n\n                    // Format: ${gethandle:numeric handle:data type:bytes}\n                    // We only need bytes for TWTY_HANDLE, use 0 for all other types\n                    // Use -1 for NUL terminated strings\n                    //\n                    // Use value as a GET key to get a value, we don't allow a null in this\n                    // case, it has to be an empty string.  We search the local list first,\n                    // and if that fails go to the global list.  Once we have the value we\n                    // lock ts and extract the value based on the type.  If the type is a\n                    // handle when we also need the number of bytes...\n                    else if (szSymbol.StartsWith(\"${gethandle:\"))\n                    {\n                        // Strip off ${...}\n                        string szGet = szSymbol.Substring(0, szSymbol.Length - 1).Substring(12);\n                        string[] aszGet = szGet.Split(':');\n\n                        // Are we good?  We need gethandle:target:type:bytes...\n                        if (aszGet.Length == 3)\n                        {\n                            // Only keep going if we got a value and bytes...\n                            if (!string.IsNullOrEmpty(aszGet[0]))\n                            {\n                                ulong u64Handle;\n                                // Convert the value to an IntPtr...\n                                if (UInt64.TryParse(aszGet[0], out u64Handle))\n                                {\n                                    // Lock...\n                                    int iDataBytes;\n                                    byte[] abValue = null;\n                                    IntPtr intptrPointer;\n                                    IntPtr intptrHandle = (IntPtr)u64Handle;\n                                    intptrPointer = m_twain.DsmMemLock(intptrHandle);\n\n                                    // Okay, let's trigger off the type...\n                                    switch (aszGet[1])\n                                    {\n                                        default:\n                                            szValue = \"\";\n                                            break;\n                                        case \"TWTY_INT8\":\n                                            abValue = new byte[1];\n                                            Marshal.Copy(intptrPointer, abValue, 0, 1);\n                                            szValue = ((sbyte)abValue[0]).ToString();\n                                            break;\n                                        case \"TWTY_INT16\":\n                                            abValue = new byte[2];\n                                            Marshal.Copy(intptrPointer, abValue, 0, 2);\n                                            szValue = BitConverter.ToInt16(abValue, 0).ToString();\n                                            break;\n                                        case \"TWTY_INT32\":\n                                            abValue = new byte[4];\n                                            Marshal.Copy(intptrPointer, abValue, 0, 4);\n                                            szValue = BitConverter.ToInt32(abValue, 0).ToString();\n                                            break;\n                                        case \"TWTY_INT64\":\n                                            abValue = new byte[8];\n                                            Marshal.Copy(intptrPointer, abValue, 0, 8);\n                                            szValue = BitConverter.ToInt64(abValue, 0).ToString();\n                                            break;\n                                        case \"TWTY_UINT8\":\n                                            abValue = new byte[1];\n                                            Marshal.Copy(intptrPointer, abValue, 0, 1);\n                                            szValue = ((byte)abValue[0]).ToString();\n                                            break;\n                                        case \"TWTY_UINT16\":\n                                            abValue = new byte[2];\n                                            Marshal.Copy(intptrPointer, abValue, 0, 2);\n                                            szValue = BitConverter.ToUInt16(abValue, 0).ToString();\n                                            break;\n                                        case \"TWTY_UINT32\":\n                                            abValue = new byte[4];\n                                            Marshal.Copy(intptrPointer, abValue, 0, 4);\n                                            szValue = BitConverter.ToUInt32(abValue, 0).ToString();\n                                            break;\n                                        case \"TWTY_UINT64\":\n                                            abValue = new byte[8];\n                                            Marshal.Copy(intptrPointer, abValue, 0, 8);\n                                            szValue = BitConverter.ToUInt64(abValue, 0).ToString();\n                                            break;\n                                        case \"TWTY_STR32\":\n                                            szValue = \"\";\n                                            iDataBytes = Marshal.SizeOf(typeof(TWAIN.TW_STR32));\n                                            abValue = new byte[iDataBytes];\n                                            Marshal.Copy(intptrPointer, abValue, 0, iDataBytes);\n                                            szValue = Encoding.UTF8.GetString(abValue).Replace(\"\\0\", \"\");\n                                            break;\n                                        case \"TWTY_STR64\":\n                                            szValue = \"\";\n                                            iDataBytes = Marshal.SizeOf(typeof(TWAIN.TW_STR64));\n                                            abValue = new byte[iDataBytes];\n                                            Marshal.Copy(intptrPointer, abValue, 0, iDataBytes);\n                                            szValue = Encoding.UTF8.GetString(abValue).Replace(\"\\0\", \"\");\n                                            break;\n                                        case \"TWTY_STR128\":\n                                            szValue = \"\";\n                                            iDataBytes = Marshal.SizeOf(typeof(TWAIN.TW_STR128));\n                                            abValue = new byte[iDataBytes];\n                                            Marshal.Copy(intptrPointer, abValue, 0, iDataBytes);\n                                            szValue = Encoding.UTF8.GetString(abValue).Replace(\"\\0\", \"\");\n                                            break;\n                                        case \"TWTY_STR255\":\n                                            szValue = \"\";\n                                            iDataBytes = Marshal.SizeOf(typeof(TWAIN.TW_STR255));\n                                            abValue = new byte[iDataBytes];\n                                            Marshal.Copy(intptrPointer, abValue, 0, iDataBytes);\n                                            szValue = Encoding.UTF8.GetString(abValue).Replace(\"\\0\", \"\");\n                                            break;\n                                        case \"TWTY_HANDLE\":\n                                            szValue = \"\";\n                                            if (int.TryParse(aszGet[2], out iDataBytes))\n                                            {\n                                                // Handle NUL-terminated strings...\n                                                if (iDataBytes == -1)\n                                                {\n                                                    abValue = new byte[0x10000]; // try 64K, we're expecting a NUL\n                                                    Marshal.Copy(intptrPointer, abValue, 0, abValue.Length);\n                                                    szValue = Encoding.UTF8.GetString(abValue);\n                                                    if (szValue.IndexOf('\\0') == -1)\n                                                    {\n                                                        abValue = new byte[0x100000]; // try 1MB, we're expecting a NUL\n                                                        Marshal.Copy(intptrPointer, abValue, 0, abValue.Length);\n                                                        szValue = Encoding.UTF8.GetString(abValue);\n                                                    }\n                                                    int iNul = szValue.IndexOf('\\0');\n                                                    if (iNul >= 0)\n                                                    {\n                                                        szValue = szValue.Remove(iNul);\n                                                    }\n                                                }\n                                                // Handle anything where we have a real non-zero size...\n                                                else if (iDataBytes > 0)\n                                                {\n                                                    abValue = new byte[iDataBytes];\n                                                    Marshal.Copy(intptrPointer, abValue, 0, iDataBytes);\n                                                    szValue = Encoding.UTF8.GetString(abValue);\n                                                }\n                                            }\n                                            break;\n                                    }\n\n                                    // Unlock...\n                                    m_twain.DsmMemUnlock(intptrHandle);\n                                }\n                            }\n                        }\n                    }\n\n                    // Use value as a GET key to get a value, we don't allow a null in this\n                    // case, it has to be an empty string.  We search the local list first,\n                    // and if that fails go to the global list.  Once we have the value we\n                    // lock it and extract the value based on the type.  We index into the\n                    // array.  Note that we do not dig deeper into TW_HANDLE.  The caller\n                    // has to get the handle at the index using this call, and then get the\n                    // data at that handle using gethandle.  This is so that we done't hide\n                    // too much of what's going on from the scripts...\n                    else if (szSymbol.StartsWith(\"${gethandleindex:\"))\n                    {\n                        // Strip off ${...}\n                        string szGet = szSymbol.Substring(0, szSymbol.Length - 1).Substring(17);\n                        string[] aszGet = szGet.Split(':'); // name:handle:index:type\n\n                        // Are we good?  We need gethandleindex:target:index:type...\n                        if (aszGet.Length == 3)\n                        {\n                            // Only keep going if we got a value and bytes...\n                            if (!string.IsNullOrEmpty(aszGet[0]))\n                            {\n                                ulong u64Handle;\n\n                                // Get our index...\n                                int iIndex = -1;\n                                int.TryParse(aszGet[1], out iIndex);\n\n                                // Convert the value to an IntPtr, if we have a valid index...\n                                if ((iIndex >= 0) && UInt64.TryParse(aszGet[0], out u64Handle))\n                                {\n                                    // Lock...\n                                    byte[] abValue = null;\n                                    IntPtr intptrPointer;\n                                    IntPtr intptrHandle = (IntPtr)u64Handle;\n                                    intptrPointer = m_twain.DsmMemLock(intptrHandle);\n\n                                    // Okay, let's trigger off the type...\n                                    switch (aszGet[2])\n                                    {\n                                        default:\n                                            szValue = \"\";\n                                            break;\n                                        case \"TWTY_INT8\":\n                                            abValue = new byte[1 * (iIndex + 1)];\n                                            Marshal.Copy(intptrPointer, abValue, 0, 1 * (iIndex + 1));\n                                            szValue = ((sbyte)abValue[iIndex]).ToString();\n                                            break;\n                                        case \"TWTY_INT16\":\n                                            abValue = new byte[2 * (iIndex + 1)];\n                                            Marshal.Copy(intptrPointer, abValue, 0, 2 * (iIndex + 1));\n                                            szValue = BitConverter.ToInt16(abValue, 2 * iIndex).ToString();\n                                            break;\n                                        case \"TWTY_INT32\":\n                                            abValue = new byte[4 * (iIndex + 1)];\n                                            Marshal.Copy(intptrPointer, abValue, 0, 4 * (iIndex + 1));\n                                            szValue = BitConverter.ToInt32(abValue, 4 * iIndex).ToString();\n                                            break;\n                                        case \"TWTY_INT64\":\n                                            abValue = new byte[8 * (iIndex + 1)];\n                                            Marshal.Copy(intptrPointer, abValue, 0, 8 * (iIndex + 1));\n                                            szValue = BitConverter.ToInt64(abValue, 8 * iIndex).ToString();\n                                            break;\n                                        case \"TWTY_UINT8\":\n                                            abValue = new byte[1 * (iIndex + 1)];\n                                            Marshal.Copy(intptrPointer, abValue, 0, 1 * (iIndex + 1));\n                                            szValue = ((byte)abValue[iIndex]).ToString();\n                                            break;\n                                        case \"TWTY_UINT16\":\n                                            abValue = new byte[2 * (iIndex + 1)];\n                                            Marshal.Copy(intptrPointer, abValue, 0, 2 * (iIndex + 1));\n                                            szValue = BitConverter.ToUInt16(abValue, 2 * iIndex).ToString();\n                                            break;\n                                        case \"TWTY_UINT32\":\n                                            abValue = new byte[4 * (iIndex + 1)];\n                                            Marshal.Copy(intptrPointer, abValue, 0, 4 * (iIndex + 1));\n                                            szValue = BitConverter.ToUInt32(abValue, 4 * iIndex).ToString();\n                                            break;\n                                        case \"TWTY_UINT64\":\n                                            abValue = new byte[8 * (iIndex + 1)];\n                                            Marshal.Copy(intptrPointer, abValue, 0, 8 * (iIndex + 1));\n                                            szValue = BitConverter.ToUInt64(abValue, 8 * iIndex).ToString();\n                                            break;\n                                        case \"TWTY_STR32\":\n                                            break;\n                                        case \"TWTY_STR64\":\n                                            break;\n                                        case \"TWTY_STR128\":\n                                            break;\n                                        case \"TWTY_STR255\":\n                                            break;\n                                        case \"TWTY_HANDLE\":\n                                            szValue = \"\";\n                                            if (Marshal.SizeOf(typeof(IntPtr)) == 4)\n                                            {\n                                                abValue = new byte[4 * (iIndex + 1)];\n                                                Marshal.Copy(intptrPointer, abValue, 0, 4 * (iIndex + 1));\n                                                szValue = BitConverter.ToUInt32(abValue, 4 * iIndex).ToString();\n                                            }\n                                            else\n                                            {\n                                                abValue = new byte[8 * (iIndex + 1)];\n                                                Marshal.Copy(intptrPointer, abValue, 0, 8 * (iIndex + 1));\n                                                szValue = BitConverter.ToUInt64(abValue, 8 * iIndex).ToString();\n                                            }\n                                            break;\n                                    }\n\n                                    // Unlock...\n                                    m_twain.DsmMemUnlock(intptrHandle);\n                                }\n                            }\n                        }\n                    }\n\n                    // Use value as a GET key to get a value, we don't allow a null in this\n                    // case, it has to be an empty string.  CSV the value we get, and return\n                    // just the item indicated by the index.    We search the local list\n                    // first, and if that fails go to the global list...\n                    else if (szSymbol.StartsWith(\"${getindex:\"))\n                    {\n                        int iIndex = 0;\n                        int iBytes = 0;\n                        bool blGlobal = false;\n\n                        // Strip off ${...}, split name and index...\n                        string szGet = szSymbol.Substring(0, szSymbol.Length - 1).Substring(11);\n                        string[] aszGet = szGet.Split(':');\n\n                        // Get the value, if any...\n                        if ((aszGet.Length > 1) && int.TryParse(aszGet[1], out iIndex))\n                        {\n                            GetVariable(aszGet[0], iIndex, out szValue, out iBytes, out blGlobal);\n                        }\n                    }\n\n                    // Look up an enum value from TWAINH.CS...\n                    else if (szSymbol.StartsWith(\"${gettwei:\"))\n                    {\n                        TWAIN.TWEI twei;\n\n                        // Strip off ${...}\n                        string szGetTwei = szSymbol.Substring(0, szSymbol.Length - 1).Substring(10);\n                        string[] aszGetTwei = szGetTwei.Split(':');\n\n                        // Do the lookup...\n                        if (aszGetTwei.Length > 1)\n                        {\n                            if (Enum.TryParse(aszGetTwei[0].Replace(\"TWEI_\", \"\").Replace(\"twei_\", \"\"), out twei))\n                            {\n                                szValue = TWAIN.CvtTweiValueToEnum(twei, aszGetTwei[1]);\n                            }\n                        }\n                    }\n\n                    // Access to the local time...\n                    else if (szSymbol.StartsWith(\"${localtime:\"))\n                    {\n                        DateTime datetime = DateTime.Now;\n                        string szFormat = szSymbol.Substring(0, szSymbol.Length - 1).Substring(12);\n                        try\n                        {\n                            szValue = datetime.ToString(szFormat);\n                        }\n                        catch\n                        {\n                            szValue = datetime.ToString();\n                        }\n                    }\n\n                    // Get the platform...\n                    else if (szSymbol.StartsWith(\"${platform:\"))\n                    {\n                        szValue = TWAINWorkingGroup.TWAIN.GetPlatform().ToString();\n                    }\n\n                    // Get the program, version, and machine word size (meant for display only)...\n                    else if (szSymbol.StartsWith(\"${program:\"))\n                    {\n                        Assembly assembly = typeof(Terminal).Assembly;\n                        AssemblyName assemblyname = assembly.GetName();\n                        Version version = assemblyname.Version;\n                        DateTime datetime = new DateTime(2000, 1, 1).AddDays(version.Build).AddSeconds(version.MinorRevision * 2);\n                        szValue = assemblyname.Name + \" v\" + version.Major + \".\" + version.Minor + \" \" + datetime.Day + \"-\" + datetime.ToString(\"MMM\") + \"-\" + datetime.Year + \" \" + ((IntPtr.Size == 4) ? \"(32-bit)\" : \"(64-bit)\");\n                    }\n\n                    // Full path to the self cert report (meant for display only)...\n                    else if (szSymbol.StartsWith(\"${report:\"))\n                    {\n                        if (string.IsNullOrEmpty(m_szSelfCertReportPath))\n                        {\n                            szValue = \"(self cert file not specified)\";\n                        }\n                        else if (!File.Exists(m_szSelfCertReportPath))\n                        {\n                            szValue = m_szSelfCertReportPath + \" (not found)\";\n                        }\n                        else\n                        {\n                            szValue = m_szSelfCertReportPath;\n                        }\n                    }\n\n                    // Get data from the return value...\n                    else if (szSymbol.StartsWith(\"${ret:\"))\n                    {\n                        callstack = m_lcallstack[m_lcallstack.Count - 1];\n                        if (callstack.functionarguments.szReturnValue != null)\n                        {\n                            if (szSymbol == \"${ret:}\")\n                            {\n                                szValue = callstack.functionarguments.szReturnValue;\n                            }\n                            else\n                            {\n                                int iIndex = 0;\n                                if (int.TryParse(szSymbol.Replace(\"${ret:\", \"\").Replace(\"}\", \"\"), out iIndex))\n                                {\n                                    string[] asz = CSV.Parse(callstack.functionarguments.szReturnValue);\n                                    if ((iIndex < 0) || (iIndex >= asz.Length))\n                                    {\n                                        szValue = \"\";\n                                    }\n                                    else\n                                    {\n                                        szValue = asz[iIndex];\n                                    }\n                                }\n                            }\n                        }\n                    }\n\n                    // Get the size of the type...\n                    else if (szSymbol.StartsWith(\"${sizeof:\"))\n                    {\n                        szValue = \"0\";\n                        string szType = szSymbol.Substring(0, szSymbol.Length - 1).Substring(9);\n                        // If there's no dot and it starts with TW, assume it's a TWAIN type...\n                        if (!szType.Contains(\".\") && szType.ToUpperInvariant().StartsWith(\"TW\"))\n                        {\n                            szType = \"TWAINWorkingGroup.TWAIN+\" + szType.ToUpperInvariant() + \", TWAIN, Culture=neutral, PublicKeyToken=null\";\n                        }\n                        Type type = System.Type.GetType(szType);\n                        if (type != null)\n                        {\n                            szValue = Marshal.SizeOf(type).ToString();\n                        }\n                    }\n\n                    // Get the TWAIN state...\n                    else if (szSymbol.StartsWith(\"${state:\"))\n                    {\n                        if (m_twain == null)\n                        {\n                            szValue = \"1\";\n                        }\n                        else\n                        {\n                            szValue = ((int)m_twain.GetState()).ToString();\n                        }\n                    }\n\n                    // Get data from the TWAIN status...\n                    else if (szSymbol.StartsWith(\"${sts:\"))\n                    {\n                        callstack = m_lcallstack[m_lcallstack.Count - 1];\n                        szValue = callstack.functionarguments.sts.ToString();\n                    }\n\n                    // Failsafe (we should catch all of these up above)...\n                    if (szValue == null)\n                    {\n                        szValue = \"\";\n                    }\n\n                    // Replace the current contents with the expanded value...\n                    a_aszCmd[iCmd] = a_aszCmd[iCmd].Remove(iIndexLeft, (iIndexRight - iIndexLeft) + 1).Insert(iIndexLeft, szValue);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Get a variable from the local or global lists...\n        /// </summary>\n        /// <param name=\"a_szKey\">key to find</param>\n        /// <param name=\"a_iIndex\">-1 for all, 0 - n for a CSV index</param>\n        /// <param name=\"a_szValue\">value found</param>\n        /// <param name=\"a_iBytes\">bytes found</param>\n        /// <param name=\"a_blGlobal\">true if global</param>\n        /// <param name=\"a_variablescope\">scope</param>\n        /// <returns>true if found</returns>\n        private bool GetVariable(string a_szKey, int a_iIndex, out string a_szValue, out int a_iBytes, out bool a_blGlobal, VariableScope a_variablescope = VariableScope.Auto)\n        {\n            // Local check...\n            if ((a_variablescope != VariableScope.Global) && (m_lcallstack.Count > 0) && (m_lcallstack[m_lcallstack.Count - 1].lkeyvalue != null))\n            {\n                foreach (KeyValue keyvalue in m_lcallstack[m_lcallstack.Count - 1].lkeyvalue)\n                {\n                    if (keyvalue.szKey == a_szKey)\n                    {\n                        if (a_iIndex == -1)\n                        {\n                            a_szValue = (keyvalue.szValue == null) ? \"\" : keyvalue.szValue;\n                            a_iBytes = keyvalue.iBytes;\n                            a_blGlobal = false;\n                            return (true);\n                        }\n                        else\n                        {\n                            string[] aszValue = CSV.Parse((keyvalue.szValue == null) ? \"\" : keyvalue.szValue);\n                            a_szValue = ((a_iIndex >= 0) && (a_iIndex < aszValue.Length)) ? aszValue[a_iIndex] : \"\";\n                            a_iBytes = keyvalue.iBytes;\n                            a_blGlobal = false;\n                            return (true);\n                        }\n                    }\n                }\n            }\n\n            // Global check...\n            if (a_variablescope != VariableScope.Local)\n            {\n                lock (m_objectKeyValue)\n                {\n                    if (m_lkeyvalue.Count >= 0)\n                    {\n                        foreach (KeyValue keyvalue in m_lkeyvalue)\n                        {\n                            if (keyvalue.szKey == a_szKey)\n                            {\n                                if (a_iIndex == -1)\n                                {\n                                    a_szValue = (keyvalue.szValue == null) ? \"\" : keyvalue.szValue;\n                                    a_iBytes = keyvalue.iBytes;\n                                    a_blGlobal = true;\n                                    return (true);\n                                }\n                                else\n                                {\n                                    string[] aszValue = CSV.Parse((keyvalue.szValue == null) ? \"\" : keyvalue.szValue);\n                                    a_szValue = ((a_iIndex >= 0) && (a_iIndex < aszValue.Length)) ? aszValue[a_iIndex] : \"\";\n                                    a_iBytes = keyvalue.iBytes;\n                                    a_blGlobal = true;\n                                    return (true);\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n\n            // No joy...\n            a_szValue = \"\";\n            a_iBytes = 0;\n            a_blGlobal = false;\n            return (false);\n        }\n\n        /// <summary>\n        /// Set a global or a local variable...\n        /// </summary>\n        /// <param name=\"a_szKey\">key to set</param>\n        /// <param name=\"a_szValue\">value to set</param>\n        /// <param name=\"a_iBytes\">bytes to set</param>\n        /// <param name=\"a_variablescope\">scope</param>\n        public void SetVariable(string a_szKey, string a_szValue, int a_iBytes, VariableScope a_variablescope = VariableScope.Auto)\n        {\n            int iKey;\n\n            // Record stuff...\n            if (!string.IsNullOrEmpty(m_szSetRecordVariable))\n            {\n                string szKey = a_szKey;\n                if (string.IsNullOrEmpty(m_szSetRecordFilter) || a_szKey.Contains(m_szSetRecordFilter))\n                {\n                    if (!string.IsNullOrEmpty(m_szSetRecordRemove))\n                    {\n                        szKey = szKey.Replace(m_szSetRecordRemove, \"\");\n                    }\n                    m_szSetRecordData += string.IsNullOrEmpty(m_szSetRecordData) ? szKey : (\",\" + szKey);\n                }\n            }\n\n            // If automatic, check if we have a value in either list...\n            if (a_variablescope == VariableScope.Auto)\n            {\n                string szValue;\n                int iBytes;\n                bool blGlobal;\n                bool blFound = GetVariable(a_szKey, -1, out szValue, out iBytes, out blGlobal);\n                // If not found, force local...\n                if (!blFound)\n                {\n                    a_variablescope = VariableScope.Local;\n                }\n                // Otherwise, force to what we found...\n                else\n                {\n                    a_variablescope = blGlobal ? VariableScope.Global : VariableScope.Local;\n                }\n            }\n\n            // We're local if not-global, or if we don't have a stack...\n            if ((a_variablescope == VariableScope.Local) || (m_lcallstack.Count == 0))\n            {\n                CallStack callstack;\n\n                // This is what we'll be referencing...\n                callstack = m_lcallstack[m_lcallstack.Count - 1];\n                if (callstack.lkeyvalue == null)\n                {\n                    callstack.lkeyvalue = new List<KeyValue>();\n                }\n\n                // Find the value for this key...\n                for (iKey = 0; iKey < callstack.lkeyvalue.Count; iKey++)\n                {\n                    if (callstack.lkeyvalue[iKey].szKey == a_szKey)\n                    {\n                        break;\n                    }\n                }\n\n                // If we have no value to set, then delete this item...\n                if (string.IsNullOrEmpty(a_szValue))\n                {\n                    if (iKey < callstack.lkeyvalue.Count)\n                    {\n                        callstack.lkeyvalue.Remove(callstack.lkeyvalue[iKey]);\n                        m_lcallstack[m_lcallstack.Count - 1] = callstack;\n                    }\n                    return;\n                }\n\n                // Create a new keyvalue...\n                KeyValue keyvalueNew = default(KeyValue);\n                keyvalueNew.szKey = a_szKey;\n                keyvalueNew.szValue = a_szValue;\n                keyvalueNew.iBytes = a_iBytes;\n\n                // If the key already exists, update its value...\n                if (iKey < callstack.lkeyvalue.Count)\n                {\n                    callstack.lkeyvalue[iKey] = keyvalueNew;\n                    m_lcallstack[m_lcallstack.Count - 1] = callstack;\n                    return;\n                }\n\n                // Otherwise, add it, and sort...\n                callstack.lkeyvalue.Add(keyvalueNew);\n                callstack.lkeyvalue.Sort(SortByKeyAscending);\n                m_lcallstack[m_lcallstack.Count - 1] = callstack;\n\n                // All done...\n                return;\n            }\n\n            // Global: we need protection...\n            lock (m_objectKeyValue)\n            {\n                // Find the value for this key...\n                for (iKey = 0; iKey < m_lkeyvalue.Count; iKey++)\n                {\n                    if (m_lkeyvalue[iKey].szKey == a_szKey)\n                    {\n                        break;\n                    }\n                }\n\n                // If we have no value to set, then delete this item...\n                if (string.IsNullOrEmpty(a_szValue))\n                {\n                    if (iKey < m_lkeyvalue.Count)\n                    {\n                        m_lkeyvalue.Remove(m_lkeyvalue[iKey]);\n                    }\n                    return;\n                }\n\n                // Create a new keyvalue...\n                KeyValue keyvalueNew = default(KeyValue);\n                keyvalueNew.szKey = a_szKey;\n                keyvalueNew.szValue = a_szValue;\n                keyvalueNew.iBytes = a_iBytes;\n\n                // If the key already exists, update its value...\n                if (iKey < m_lkeyvalue.Count)\n                {\n                    m_lkeyvalue[iKey] = keyvalueNew;\n                    return;\n                }\n\n                // Otherwise, add it, and sort...\n                m_lkeyvalue.Add(keyvalueNew);\n                m_lkeyvalue.Sort(SortByKeyAscending);\n            }\n        }\n\n        /// <summary>\n        /// A comparison operator for sorting keys in CmdSet...\n        /// </summary>\n        /// <param name=\"name1\"></param>\n        /// <param name=\"name2\"></param>\n        /// <returns></returns>\n        private int SortByKeyAscending(KeyValue a_keyvalue1, KeyValue a_keyvalue2)\n        {\n\n            return (a_keyvalue1.szKey.CompareTo(a_keyvalue2.szKey));\n        }\n\n        /// <summary>\n        /// Set the return value on the top callstack item...\n        /// </summary>\n        /// <param name=\"a_szReturn\"></param>\n        /// <returns></returns>\n        private void SetReturnValue(string a_szReturnValue)\n        {\n            if (m_lcallstack.Count < 1) return;\n            CallStack callstack = m_lcallstack[m_lcallstack.Count - 1];\n            callstack.functionarguments.szReturnValue = a_szReturnValue;\n            m_lcallstack[m_lcallstack.Count - 1] = callstack;\n        }\n\n        #endregion\n\n\n        // Private Definitions\n        #region Private Definitions\n\n        /// <summary>\n        /// Select the cloud import code we're working with...\n        /// </summary>\n        private enum CloudImport\n        {\n            Undefined,\n            HazyBits\n        }\n\n        /// <summary>\n        /// A key/value pair...\n        /// </summary>\n        private struct KeyValue\n        {\n            /// <summary>\n            /// Our key...\n            /// </summary>\n            public string szKey;\n\n            /// <summary>\n            /// The key's value...\n            /// </summary>\n            public string szValue;\n\n            /// <summary>\n            /// The bytesize of value, only used when\n            /// value is an IntPtr to memory...\n            /// </summary>\n            public int iBytes;\n        }\n\n        /// <summary>\n        /// Call stack info...\n        /// </summary>\n        private struct CallStack\n        {\n            /// <summary>\n            /// The arguments to this call...\n            /// </summary>\n            public Interpreter.FunctionArguments functionarguments;\n            public List<KeyValue> lkeyvalue;\n        }\n\n        #endregion\n\n\n        // Private Attributes\n        #region Private Attributes\n\n        /// <summary>\n        /// Our TWAIN object...\n        /// </summary>\n        private TWAIN m_twain;\n\n        // The handle to our window...\n        private FormMain m_formmain;\n        private IntPtr m_intptrHwnd;\n\n        /// <summary>\n        /// Map commands to functions...\n        /// </summary>\n        private List<Interpreter.DispatchTable> m_ldispatchtable;\n\n        /// <summary>\n        /// Our console input...embiggened...\n        /// </summary>\n        private StreamReader m_streamreaderConsole;\n        private ConsoleColor m_consolecolorDefault;\n        private ConsoleColor m_consolecolorBlue;\n        private ConsoleColor m_consolecolorGreen;\n        private ConsoleColor m_consolecolorRed;\n        private ConsoleColor m_consolecolorYellow;\n\n        /// <summary>\n        /// No output when this is true...\n        /// </summary>\n        private bool m_blSilent;\n        private bool m_blSilentEvents;\n        private bool m_blRunningScript;\n        private bool m_blVerbose;\n        private int m_iSilentRestore;\n        private int m_iVerboseRestore;\n\n        /// <summary>\n        /// The list of key/value pairs created by the SET command...\n        /// </summary>\n        private List<KeyValue> m_lkeyvalue;\n        private object m_objectKeyValue;\n        private string m_szSetRecordVariable;\n        private string m_szSetRecordFilter;\n        private string m_szSetRecordRemove;\n        private string m_szSetRecordData;\n\n        /// <summary>\n        /// A last in first off stack of function calls...\n        /// </summary>\n        private List<CallStack> m_lcallstack;\n\n        /// <summary>\n        /// Our certification report, in glorious text...\n        /// </summary>\n        private StringBuilder m_stringbuilderSelfCertReport;\n        private string m_szSelfCertReportPath;\n        private string m_szSelfCertReportProductname;\n        private string m_szTwainSelfCertFolder;\n        private string m_szSelfCertDriverVersion;\n        private string m_szSelfCertDataCertFolder;\n\n        /// <summary>\n        /// The opening banner (program, version, etc)...\n        /// </summary>\n        private string m_szBanner;\n\n        /// <summary>\n        /// List of scanners paired with us in a cloud...\n        /// </summary>\n        private AutoResetEvent m_autoreseteventScannerslist;\n\n        /// <summary>\n        /// We use this to run code in the context of the caller's UI thread...\n        /// </summary>\n        /// <param name=\"a_object\">object (really a control)</param>\n        /// <param name=\"a_action\">code to run</param>\n        public delegate void RunInUiThreadDelegate(Object a_object, Action a_action);\n\n        /// <summary>\n        /// The list of pending DAT_NULL events...\n        /// </summary>\n        private List<TWAIN.MSG> m_lmsgDatNull = new List<TWAIN.MSG>();\n        private AutoResetEvent m_autoreseteventMsgDatNull = new AutoResetEvent(false);\n\n        #endregion\n    }\n\n    /// <summary>\n    /// Our configuration object.  We must be able to access this\n    /// from anywhere in the code...\n    /// </summary>\n    public static class Config\n    {\n        // Public Methods...\n        #region Public Methods...\n\n        /// <summary>\n        /// Get a value, if the value can't be found, return a default.  We look\n        /// for the item first in the command line arguments, then in the data\n        /// read from the config file, and finally based on a small collection of\n        /// keywords accessing static information.  This way we can override the\n        /// configuration at any point with a minimum of fuss.\n        /// </summary>\n        /// <param name=\"a_szKey\">the item we're seeking</param>\n        /// <param name=\"a_szDefault\">the default if we don't find it</param>\n        /// <returns>the result</returns>\n        public static string Get(string a_szKey, string a_szDefault)\n        {\n            // Try the command line first...\n            if (ms_aszCommandLine != null)\n            {\n                string szKey = a_szKey + \"=\";\n                foreach (string sz in ms_aszCommandLine)\n                {\n                    if ((sz == a_szKey) || (sz == szKey))\n                    {\n                        return (\"\");\n                    }\n                    if (sz.StartsWith(szKey))\n                    {\n                        return (sz.Remove(0, szKey.Length));\n                    }\n                }\n            }\n\n            // Try the JSON...\n            if (ms_jsonlookup != null)\n            {\n                string szValue;\n                JsonLookup.EPROPERTYTYPE epropertytype;\n                if (ms_jsonlookup.GetCheck(a_szKey, out szValue, out epropertytype, false))\n                {\n                    return (szValue);\n                }\n            }\n\n            // Try the folders...\n            if (a_szKey == \"executablePath\")\n            {\n                return (ms_szExecutablePath);\n            }\n            if (a_szKey == \"executableName\")\n            {\n                return (ms_szExecutableName);\n            }\n            if (a_szKey == \"readFolder\")\n            {\n                return (ms_szReadFolder);\n            }\n            if (a_szKey == \"writeFolder\")\n            {\n                return (ms_szWriteFolder);\n            }\n\n            // This is our default for the pfxFile, but only\n            // if the user didn't override it with their own\n            // default...\n            if ((a_szKey == \"pfxFile\") && string.IsNullOrEmpty(a_szDefault))\n            {\n                return (Path.Combine(Path.Combine(ms_szReadFolder, \"data\"), \"certificate.p12\"));\n            }\n\n            // All done...\n            return (a_szDefault);\n        }\n\n        /// <summary>\n        /// Get a long value, if the value can't be found, return a default...\n        /// </summary>\n        /// <param name=\"a_szKey\"></param>\n        /// <param name=\"a_szDefault\"></param>\n        /// <returns></returns>\n        public static long Get(string a_szKey, long a_lDefault)\n        {\n            // Get the value...\n            string szValue = Get(a_szKey, \"@@@NOTFOUND@@@@\");\n\n            // We didn't find it, use the default...\n            if (szValue == \"@@@NOTFOUND@@@@\")\n            {\n                return (a_lDefault);\n            }\n\n            // Try to get the value...\n            long lValue;\n            if (long.TryParse(szValue, out lValue))\n            {\n                return (lValue);\n            }\n\n            // No joy, use the default...\n            return (a_lDefault);\n        }\n\n        /// <summary>\n        /// Get a double value, if the value can't be found, return a default...\n        /// </summary>\n        /// <param name=\"a_szKey\"></param>\n        /// <param name=\"a_szDefault\"></param>\n        /// <returns></returns>\n        public static double Get(string a_szKey, double a_dfDefault)\n        {\n            // Get the value...\n            string szValue = Get(a_szKey, \"@@@NOTFOUND@@@@\");\n\n            // We didn't find it, use the default...\n            if (szValue == \"@@@NOTFOUND@@@@\")\n            {\n                return (a_dfDefault);\n            }\n\n            // Try to get the value...\n            double dfValue;\n            if (double.TryParse(szValue, out dfValue))\n            {\n                return (dfValue);\n            }\n\n            // No joy, use the default...\n            return (a_dfDefault);\n        }\n\n        /// <summary>\n        /// Return the command line passed into us...\n        /// </summary>\n        /// <returns>the command line</returns>\n        public static string[] GetCommandLine()\n        {\n            return (ms_aszCommandLine);\n        }\n\n        /// <summary>\n        /// Get a string from the supplied resource, return the key if we can't\n        /// find the resource...\n        /// </summary>\n        /// <param name=\"a_resourcemanager\">resource to use</param>\n        /// <param name=\"a_szKey\">key to lookup</param>\n        /// <returns>string we found, or the keyname</returns>\n        public static string GetResource(ResourceManager a_resourcemanager, string a_szKey)\n        {\n            string szResult = \"\";\n\n            // Ruh-roh...\n            if (a_resourcemanager == null)\n            {\n                return (a_szKey);\n            }\n\n            // Also, ruh-roh...\n            try\n            {\n                szResult = a_resourcemanager.GetString(a_szKey);\n            }\n            catch\n            {\n                return (a_szKey);\n            }\n            if (string.IsNullOrEmpty(szResult))\n            {\n                return (a_szKey);\n            }\n\n            // Got it...\n            return (szResult);\n        }\n\n        /// <summary>\n        /// Load the configuration object.  We want to read in the\n        /// configuaration data (in JSON format) and a list of the\n        /// command line arguments.\n        /// </summary>\n        /// <param name=\"a_szExecutablePath\">the fill path to the program using us</param>\n        /// <param name=\"a_szCommandLine\">key[=value] groupings</param>\n        /// <param name=\"a_szConfigFile\">a JSON file</param>\n        public static bool Load(string a_szExecutablePath, string[] a_aszCommandLine, string a_szConfigFile)\n        {\n            try\n            {\n                // Work out where our executable lives...\n                ms_szExecutablePath = a_szExecutablePath;\n                ms_szExecutableName = Path.GetFileNameWithoutExtension(ms_szExecutablePath);\n\n                // The read folder is the path to the executable.  This is where we're\n                // going to find our appdata.txt file, which contains configuration\n                // information that can be overridden by the user (assuming they have\n                // rights to it).  We'll put other readonly stuff here too, like the\n                // certification tests...\n                ms_szReadFolder = Path.GetDirectoryName(ms_szExecutablePath);\n\n                // The write folder is the path to all of the the files we can update,\n                // which includes image files, metadata, log files, registration/selection\n                // files.  This stuff is specific to a user, so by default we're going to\n                // keep it in their %appdata%/TwainWorkingGroup/twaicscert/executablename folder...\n                ms_szWriteFolder = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);\n                ms_szWriteFolder = Path.Combine(ms_szWriteFolder, \"TwainWorkingGroup\");\n                ms_szWriteFolder = Path.Combine(ms_szWriteFolder, ms_szExecutableName);\n\n                // Store the command line...\n                ms_aszCommandLine = a_aszCommandLine;\n\n                // Load the config, we'll first look for a name decorated version\n                // of the file (ex: TwainDirect.Scanner.appdata.txt) in the data\n                // folder, and if that fails we'll try the same folder as the .exe,\n                // if that fails we'll do just the name given to us...\n                string szConfigFile = Path.Combine(Path.Combine(ms_szReadFolder, \"data\"), ms_szExecutableName + \".\" + a_szConfigFile);\n                if (!File.Exists(szConfigFile))\n                {\n                    szConfigFile = Path.Combine(ms_szReadFolder, ms_szExecutableName + \".\" + a_szConfigFile);\n                    if (!File.Exists(szConfigFile))\n                    {\n                        szConfigFile = Path.Combine(ms_szReadFolder, a_szConfigFile);\n                    }\n                }\n                if (File.Exists(szConfigFile))\n                {\n                    long a_lJsonErrorindex;\n                    string szConfig = File.ReadAllText(szConfigFile);\n                    ms_jsonlookup = new JsonLookup();\n                    ms_jsonlookup.Load(szConfig, out a_lJsonErrorindex);\n                }\n\n                // Check if the user wants to override the read and write folders...\n                ms_szReadFolder = Get(\"readFolder\", ms_szReadFolder);\n                ms_szWriteFolder = Get(\"writeFolder\", ms_szWriteFolder);\n\n                // Make sure we have a write folder...\n                if (!Directory.Exists(ms_szWriteFolder))\n                {\n                    Directory.CreateDirectory(ms_szWriteFolder);\n                }\n            }\n            catch\n            {\n                return (false);\n            }\n\n            // All done...\n            return (true);\n        }\n\n        /// <summary>\n        /// Return 32 or 64...\n        /// </summary>\n        /// <returns>32 or 64</returns>\n        public static long GetMachineWordSize()\n        {\n            if (IntPtr.Size == 4)\n            {\n                return (32);\n            }\n            return (64);\n        }\n\n        /// <summary>\n        /// Put a UAC shield on a button...\n        /// </summary>\n        public static void ElevateButton(IntPtr a_intptrHandle)\n        {\n            NativeMethods.SendMessage(a_intptrHandle, NativeMethods.BCM_SETSHIELD, IntPtr.Zero, IntPtr.Zero - 1);\n        }\n\n        #endregion\n\n\n        // Private Attributes...\n        #region Private Attributes\n\n        /// <summary>\n        /// The command line arguments...\n        /// </summary>\n        private static string[] ms_aszCommandLine = null;\n\n        /// <summary>\n        /// The JSON lookup object that contains any configuration data\n        /// tht we want to access using a Get() command...\n        /// </summary>\n        private static JsonLookup ms_jsonlookup = null;\n\n        /// <summary>\n        /// The full path to our program...\n        /// </summary>\n        private static string ms_szExecutablePath;\n\n        /// <summary>\n        /// The base name, without extension of our program...\n        /// </summary>\n        private static string ms_szExecutableName;\n\n        /// <summary>\n        /// The readonly folder, which includes binaries and template\n        /// files that are never updated by running code...\n        /// </summary>\n        private static string ms_szReadFolder;\n\n        /// <summary>\n        /// The writeable folder, which is where logs, temporary files,\n        /// and configurable content is located...\n        /// </summary>\n        private static string ms_szWriteFolder;\n\n        #endregion\n    }\n\n    /// <summary>\n    /// Interpret and dispatch user commands...\n    /// </summary>\n    public sealed class Interpreter\n    {\n        // Public Methods\n        #region Public Methods\n\n        /// <summary>\n        /// Our constructor...\n        /// </summary>\n        /// <param name=\"a_szPrompt\">initialize the prompt</param>\n        public Interpreter(string a_szPrompt, ConsoleColor a_consolecolorDefault, ConsoleColor a_consolecolorPrompt)\n        {\n            // Our prompt...\n            m_szPrompt = (string.IsNullOrEmpty(a_szPrompt) ? \">>>\" : a_szPrompt);\n            m_consolecolorDefault = a_consolecolorDefault;\n            m_consolecolorPrompt = a_consolecolorPrompt;\n        }\n\n        /// <summary>\n        /// Create a console on Windows...\n        /// </summary>\n        public static StreamReader CreateConsole()\n        {\n            // Make sure we have a console...\n            if (TWAIN.GetPlatform() == TWAIN.Platform.WINDOWS)\n            {\n                // Get our console...\n                NativeMethods.AllocConsole();\n\n                // Only do this junk if running under Visual Studio, note that we'll\n                // lose color.  So it goes...\n                if (System.Diagnostics.Debugger.IsAttached)\n                {\n                    var handle = NativeMethods.CreateFile\n                    (\n                        \"CONOUT$\",\n                        NativeMethods.DesiredAccess.GenericWrite | NativeMethods.DesiredAccess.GenericWrite,\n                        NativeMethods.FileShare.Read | NativeMethods.FileShare.Write,\n                        IntPtr.Zero,\n                        NativeMethods.CreationDisposition.OpenExisting,\n                        NativeMethods.FileAttributes.Normal,\n                        IntPtr.Zero\n                    );\n                    SafeFileHandle safefilehandle = new SafeFileHandle(handle, true);\n                    FileStream fileStream = new FileStream(safefilehandle, FileAccess.Write);\n                    StreamWriter streamwriterStdout = new StreamWriter(fileStream, Encoding.ASCII);\n                    streamwriterStdout.AutoFlush = true;\n                    Console.SetOut(streamwriterStdout);\n                }\n            }\n\n            // And because life is hard, we need to up the size of standard input...\n            StreamReader streamreaderConsole = new StreamReader(Console.OpenStandardInput(65536));\n            return (streamreaderConsole);\n        }\n\n        /// <summary>\n        /// Get the desktop windows for Windows systems...\n        /// </summary>\n        /// <returns></returns>\n        public static IntPtr GetDesktopWindow()\n        {\n            // Get an hwnd...\n            if (TWAIN.GetPlatform() == TWAIN.Platform.WINDOWS)\n            {\n                return (NativeMethods.GetDesktopWindow());\n            }\n            else\n            {\n                return (IntPtr.Zero);\n            }\n        }\n\n        /// <summary>\n        /// Prompt for input, returning a string, if there's any data...\n        /// </summary>\n        /// <param name=\"a_streamreaderConsole\">the console to use</param>\n        /// <param name=\"a_iTwainState\">twain state</param>\n        /// <returns>data captured</returns>\n        public string Prompt(StreamReader a_streamreaderConsole, int a_iTwainState, bool a_blAllowEmptyLine = false, bool a_blEcho = false)\n        {\n            string szCmd;\n\n            // Read in a line...\n            while (true)\n            {\n                string szPrompt = m_szPrompt;\n                if (a_iTwainState > 0)\n                {\n                    szPrompt = szPrompt.Replace(\">>>\", a_iTwainState + \">>>\");\n                }\n\n                // Write out the prompt...\n                if (Console.BackgroundColor == ConsoleColor.Black)\n                {\n                    Console.ForegroundColor = m_consolecolorPrompt;\n                    Console.Out.Write(szPrompt);\n                    Console.ForegroundColor = m_consolecolorDefault;\n                }\n                else\n                {\n                    Console.Out.Write(szPrompt);\n                }\n\n                // Read in a line...\n                if (!Environment.OSVersion.ToString().Contains(\"Microsoft Windowsxxx\"))\n                {\n                    szCmd = (a_streamreaderConsole == null) ? Console.In.ReadLine() : a_streamreaderConsole.ReadLine();\n                    if (string.IsNullOrEmpty(szCmd))\n                    {\n                        if (a_blAllowEmptyLine)\n                        {\n                            break;\n                        }\n                        continue;\n                    }\n                }\n                else\n                {\n                    szCmd = Console.ReadLine();\n                    break;\n                    /*\n                    List<char> lchLine = new List<char>();\n                    TextReader textreader = (a_streamreaderConsole == null) ? Console.In : a_streamreaderConsole;\n                    bool blTyping = true;\n                    while (blTyping)\n                    {\n                        ConsoleKeyInfo consolekeyinfo = Console.ReadKey();\n                        int iCh = consolekeyinfo.KeyChar; // textreader.Read();\n                        switch (iCh)\n                        {\n                            // A character...\n                            default:\n                                lchLine.Add((char)iCh);\n                                if (a_blEcho)\n                                {\n                                    Console.Out.Write((char)iCh);\n                                }\n                                break;\n\n                            // Backspace and delete...\n                            case 0x08:\n                            case 0x7f:\n                                if (lchLine.Count > 0)\n                                {\n                                    lchLine.RemoveAt(lchLine.Count - 1);\n                                    if (a_blEcho)\n                                    {\n                                        Console.Out.Write('\\b');\n                                        Console.Out.Write(' ');\n                                        Console.Out.Write('\\b');\n                                    }\n                                }\n                                break;\n\n                            // Newline and carriage return...\n                            case 0x0a:\n                            case 0x0d:\n                                Console.Out.Write((char)iCh);\n                                blTyping = false;\n                                break;\n                        }\n                    }\n                    szCmd = \"\";\n                    foreach (char ch in lchLine)\n                    {\n                        szCmd += ch;\n                    }\n                    */\n                }\n\n                // Trim whitespace...\n                szCmd = szCmd.Trim();\n                if (string.IsNullOrEmpty(szCmd))\n                {\n                    if (!a_blAllowEmptyLine)\n                    {\n                        continue;\n                    }\n                }\n\n                // We must have data...\n                break;\n            }\n\n            // All done...\n            return (szCmd);\n        }\n\n        /// <summary>\n        /// Change the prompt...\n        /// </summary>\n        /// <param name=\"a_szPrompt\">new prompt</param>\n        public void SetPrompt(string a_szPrompt)\n        {\n            m_szPrompt = a_szPrompt;\n        }\n\n        /// <summary>\n        /// Tokenize a string, with support for single quotes and double quotes.\n        /// Inside the body of a quote the only thing can can be (or needs to be)\n        /// escaped is the current quote token.  The result is an array of strings...\n        /// </summary>\n        /// <param name=\"a_szCmd\">command to tokenize</param>\n        /// <returns>array of strings</returns>\n        public string[] Tokenize(string a_szCmd)\n        {\n            int cc;\n            int tt;\n            char szQuote = (char)0;\n            string[] aszTokens;\n\n            // We're coming out of this with at least one token...\n            aszTokens = new string[1];\n            tt = 0;\n\n            // Validate...\n            if (string.IsNullOrEmpty(a_szCmd))\n            {\n                aszTokens[tt] = \"\";\n                return (aszTokens);\n            }\n\n            // Handle comments...\n            if (a_szCmd[0] == ';')\n            {\n                aszTokens[tt] = \"\";\n                return (aszTokens);\n            }\n\n            // Skip over goto labels...\n            if (a_szCmd[0] == ':')\n            {\n                aszTokens[tt] = \"\";\n                return (aszTokens);\n            }\n\n            // If we have no special characters, then we're done...\n            if (a_szCmd.IndexOfAny(new char[] { ' ', '\\t', '\\'', '\"' }) == -1)\n            {\n                aszTokens[tt] = a_szCmd;\n                return (aszTokens);\n            }\n\n            // Devour leading whitespace...\n            cc = 0;\n            while ((cc < a_szCmd.Length) && ((a_szCmd[cc] == ' ') || (a_szCmd[cc] == '\\t')))\n            {\n                cc += 1;\n            }\n\n            // Loopy...\n            while (cc < a_szCmd.Length)\n            {\n                // Handle single and double quotes...\n                if ((a_szCmd[cc] == '\\'') || (a_szCmd[cc] == '\"'))\n                {\n                    // Skip the quote...\n                    szQuote = a_szCmd[cc];\n                    cc += 1;\n\n                    // Copy all of the string to the next unescaped single quote...\n                    while (cc < a_szCmd.Length)\n                    {\n                        // We found our terminator (don't copy it)...\n                        if (a_szCmd[cc] == szQuote)\n                        {\n                            szQuote = (char)0;\n                            cc += 1;\n                            break;\n                        }\n\n                        // We're escaping the quote...\n                        if ((cc + 1 < a_szCmd.Length) && (a_szCmd[cc] == '\\\\') && (a_szCmd[cc + 1] == szQuote))\n                        {\n                            aszTokens[tt] += szQuote;\n                            cc += 1;\n                        }\n\n                        // Otherwise, just copy the character...\n                        else\n                        {\n                            aszTokens[tt] += a_szCmd[cc];\n                        }\n\n                        // Next character...\n                        cc += 1;\n                    }\n                }\n\n                // Handle whitespace...\n                else if ((a_szCmd[cc] == ' ') || (a_szCmd[cc] == '\\t'))\n                {\n                    // Devour all of the whitespace...\n                    while ((cc < a_szCmd.Length) && ((a_szCmd[cc] == ' ') || (a_szCmd[cc] == '\\t')))\n                    {\n                        cc += 1;\n                    }\n\n                    // If we have more data, prep for it...\n                    if (cc < a_szCmd.Length)\n                    {\n                        string[] asz = new string[aszTokens.Length + 1];\n                        Array.Copy(aszTokens, asz, aszTokens.Length);\n                        asz[aszTokens.Length] = \"\";\n                        aszTokens = asz;\n                        tt += 1;\n                    }\n                }\n\n                // Bail if we find an inline comment...\n                else if ((szQuote == (char)0) && (a_szCmd[cc] == ';'))\n                {\n                    Array.Resize<string>(ref aszTokens, aszTokens.Length - 1);\n                    break;\n                }\n\n                // Anything else is data in the current token...\n                else\n                {\n                    aszTokens[tt] += a_szCmd[cc];\n                    cc += 1;\n                }\n\n                // Next character.,\n            }\n\n            // All done...\n            return (aszTokens);\n        }\n\n        /// <summary>\n        /// Dispatch a command...\n        /// </summary>\n        /// <param name=\"a_functionarguments\">the arguments to the command</param>\n        /// <param name=\"a_dispatchtable\">dispatch table</param>\n        /// <returns>true if the program should exit</returns>\n        public bool Dispatch(ref FunctionArguments a_functionarguments, List<DispatchTable> a_ldispatchtable)\n        {\n            string szCmd;\n\n            // Apparently we got nothing, it's a noop...\n            if ((a_functionarguments.aszCmd == null) || (a_functionarguments.aszCmd.Length == 0) || string.IsNullOrEmpty(a_functionarguments.aszCmd[0]))\n            {\n                return (false);\n            }\n\n            // Find the command...\n            szCmd = a_functionarguments.aszCmd[0].ToLowerInvariant();\n            foreach (DispatchTable dispatchtable in a_ldispatchtable)\n            {\n                foreach (string sz in dispatchtable.m_aszCmd)\n                {\n                    if (sz == szCmd)\n                    {\n                        return (dispatchtable.m_function(ref a_functionarguments));\n                    }\n                }\n            }\n\n            // No joy, make sure to lose the last transaction if the\n            // user enters a bad command, so that we reduce the risk\n            // of it be badly interpreted later on...\n            if (string.IsNullOrEmpty(a_functionarguments.szScriptFile))\n            {\n                Console.Out.WriteLine(\"command not found: \" + a_functionarguments.aszCmd[0]);\n            }\n            else\n            {\n                Console.Out.WriteLine\n                (\n                    \"command not found: \" + a_functionarguments.aszCmd[0] +\n                    \" ('\" + a_functionarguments.szScriptFile +\n                    \"' at line \" + (a_functionarguments.iCurrentLine + 1) + \")\"\n                );\n            }\n            return (false);\n        }\n\n        #endregion\n\n\n        // Public Definitions\n        #region Public Definitions\n\n        public struct FunctionArguments\n        {\n            /// <summary>\n            /// The tokenized command...\n            /// </summary>\n            public string[] aszCmd;\n\n            /// <summary>\n            /// The script we're running or null, used for\n            /// commands like \"goto\"...\n            /// </summary>\n            public string szScriptFile;\n            public string[] aszScript;\n\n            /// <summary>\n            /// True if we've been asked to jump to a label,\n            /// which includes the index to go to...\n            /// </summary>\n            public bool blGotoLabel;\n            public int iLabelLine;\n\n            /// <summary>\n            /// The command triplet...\n            /// </summary>\n            public int iDg;\n            public int iDat;\n            public int iMsg;\n\n            /// <summary>\n            /// The status return from the driver...\n            /// </summary>\n            public TWAIN.STS sts;\n\n            /// <summary>\n            /// The function value when returning from a call...\n            /// </summary>\n            public string szReturnValue;\n\n            /// <summary>\n            /// The current line in the script...\n            /// </summary>\n            public int iCurrentLine;\n        }\n\n        /// <summary>\n        /// Function to call from the Dispatcher...\n        /// </summary>\n        /// <param name=\"a_aszCmd\">arguments</param>\n        /// <param name=\"a_aszScript\">script or null</param>\n        /// <returns>true if the program should exit</returns>\n        public delegate bool Function(ref FunctionArguments a_functionarguments);\n\n        /// <summary>\n        /// Map commands to functions...\n        /// </summary>\n        public class DispatchTable\n        {\n            /// <summary>\n            /// Stock our entries...\n            /// </summary>\n            /// <param name=\"a_function\">the function</param>\n            /// <param name=\"a_aszCmd\">command variants for this function</param>\n            public DispatchTable(Function a_function, string[] a_aszCmd)\n            {\n                m_aszCmd = a_aszCmd;\n                m_function = a_function;\n            }\n\n            /// <summary>\n            /// Variations for this command...\n            /// </summary>\n            public string[] m_aszCmd;\n\n            /// <summary>\n            /// Function to call...\n            /// </summary>\n            public Function m_function;\n        }\n\n        #endregion\n\n\n        // Private Attributes\n        #region Private Attributes\n\n        /// <summary>\n        /// Our prompt...\n        /// </summary>\n        private string m_szPrompt;\n        private ConsoleColor m_consolecolorDefault;\n        private ConsoleColor m_consolecolorPrompt;\n\n        #endregion\n    }\n\n    /// <summary>\n    /// This is a simple JSON parser.  It was written by staring at the JSON\n    /// railroad diagrams and coding like a loon, and then stress testing it\n    /// with a variety of real world strings.\n    /// \n    /// It makes no claims to being overly fast.  It is relatively efficient\n    /// insofar as it makes a single pass, doesn't munge the original string\n    /// and creates a tree representing the data.\n    /// \n    /// It's main benefit is that it doesn't require a binding to a strongly\n    /// typed class, so the data can be literally anything.  And it supports\n    /// a simple dotted notation for looking up content.  Adding functions\n    /// to allow for enumerating the data wouldn't be hard, but haven't been\n    /// added at this time.\n    /// \n    /// Two functions do all the heavy lifting:\n    /// \n    ///     bool Load(string a_szJson, out lResponseCharacterOffset)\n    ///     Causes the class to parse the JSON data and create an internal\n    ///     data structure for it.  If a problem occurs it returns false and\n    ///     an index into the string showering where the badness occurred.\n    ///     \n    ///     string Get(string a_szKey)\n    ///     Returns a string for the item that was found.  If you need to\n    ///     know the type, then use the GetCheck function.\n    ///     \n    ///     Here's some sample JSON:\n    ///         {\n    ///             \"array\": [\n    ///                 {\n    ///                     \"first\": 1\n    ///                 },\n    ///                 {\n    ///                     \"second\": {\n    ///                         \"third\": 3\n    ///                     }\n    ///                 }\n    ///             ]\n    ///         }\n    ///         \n    ///     To get the data for \"third\" we use the key:\n    ///     \n    ///         array[1].second.third\n    ///         \n    ///     As you might expect, if the property name has a dot or square\n    ///     brackets in it, that would cause a problem.  This isn't an issue\n    ///     for how we plan to use it, but it would be possible to get\n    ///     around it if needed, by using a prefix delimiter in the lookup\n    ///     string.\n    /// \n    /// Clarity is a good thing, and hopefully this code is fairly simple to\n    /// chug through.\n    /// </summary>\n    public sealed class JsonLookup\n    {\n        ///////////////////////////////////////////////////////////////////////////////\n        // Public Methods...\n        ///////////////////////////////////////////////////////////////////////////////\n        #region Public Methods...\n\n        /// <summary>\n        /// Init stuff...\n        /// </summary>\n        public JsonLookup()\n        {\n            m_blStrictParsingRules = false;\n            m_property = null;\n            m_szJson = null;\n        }\n\n        /// <summary>\n        /// Dump the contents of the property tree...\n        /// </summary>\n        /// <returns>the JSON string</returns>\n\t\tpublic string Dump()\n        {\n            if (m_lkeyvalueOverride == null)\n            {\n                m_lkeyvalueOverride = new List<KeyValue>();\n            }\n            return (DumpPrivate(m_property, 0, \"\", false));\n        }\n\n        /// <summary>\n        /// Does a find, and if the item is found, does a get...\n        /// </summary>\n        /// <param name=\"a_szKey\">key to find</param>\n        /// <param name=\"a_iStartingIndex\">array index to start at</param>\n        /// <param name=\"a_iCount\">count of array elements to search</param>\n        /// <param name=\"a_szValue\">value to return</param>\n        /// <param name=\"a_epropertytype\">type of property that we've found</param>\n        /// <param name=\"a_blLog\">log if key isn't found</param>\n        /// <returns>0 - n on success, -1 on failure</returns>\n        public int FindGet(string a_szKey, int a_iStartingIndex, int a_iCount, out string a_szValue, out EPROPERTYTYPE a_epropertytype, bool a_blLog)\n        {\n            bool blSuccess;\n            int iIndex;\n            int iIndexBrackets;\n            string szKey;\n\n            // Init stuff...\n            a_szValue = \"\";\n            a_epropertytype = EPROPERTYTYPE.UNDEFINED;\n\n            // Find the item...\n            iIndex = FindKey(a_szKey, a_iStartingIndex, a_iCount);\n            if (iIndex < 0)\n            {\n                return (iIndex);\n            }\n\n            // If we found it, then create the full key at this index...\n            iIndexBrackets = a_szKey.IndexOf(\"[].\");\n            if (iIndexBrackets < 0)\n            {\n                return (-1);\n            }\n            szKey = a_szKey.Substring(0, iIndexBrackets) + \"[\" + iIndex + \"].\" + a_szKey.Substring(iIndexBrackets + 3);\n\n            // And get the data...\n            blSuccess = GetCheck(szKey, out a_szValue, out a_epropertytype, a_blLog);\n            if (!blSuccess)\n            {\n                return (-1);\n            }\n\n            // All done...\n            return (iIndex);\n        }\n\n        /// <summary>\n        ///\tFind a key in an array of objects.  The JSON needs to take\n        ///\ta form similar to:\n        ///\t\t{ \"array\":[\n        ///\t\t\t{\"key1\":data},\n        ///\t\t\t{\"key2\":data},\n        ///\t\t\t{\"key3\":data},\n        ///\t\t\t...\n        ///\t\t}\n        ///\tIn this case a search string could be:\n        ///\t\tarray[].key2\n        ///\tWhere [] indicates the array to be enumerated, and key2 is\n        ///\tthe property name we're searching for.  In the case of a\n        ///\trooted array like:\n        ///\t\t[\n        ///\t\t\t{\"key1\":data},\n        ///\t\t\t{\"key2\":data},\n        ///\t\t\t{\"key3\":data},\n        ///\t\t\t...\n        ///\t\t]\n        ///\tThen the search string would be [].key2\n        /// </summary>\n        /// <param name=\"a_szKey\">key to find</param>\n        /// <param name=\"a_iStartingIndex\">array index to start at</param>\n        /// <param name=\"a_iCount\">count of array elements to search</param>\n        /// <returns>0 - n on success, -1 on failure</returns>\n        public int FindKey(string a_szKey, int a_iStartingIndex = 0, int a_iCount = 0)\n        {\n            bool blSuccess;\n            int iCount;\n            int iIndex;\n            string szKey;\n            string szKeyLeft;\n            string szKeyRight;\n            string szValue;\n            EPROPERTYTYPE epropertytype;\n\n            // Validate...\n            if (string.IsNullOrEmpty(a_szKey) || (a_iStartingIndex < 0) || (a_iCount < 0))\n            {\n                return (-1);\n            }\n\n            // The function is useless unless it can enumerate through an array,\n            // so just bail if the user didn't ask for this...\n            iIndex = a_szKey.IndexOf(\"[].\");\n            if (iIndex == -1)\n            {\n                return (-1);\n            }\n\n            // Get the left and right sides of the key...\n            szKeyLeft = a_szKey.Substring(0, iIndex);\n            szKeyRight = a_szKey.Substring(iIndex + 3);\n\n            // The left side can be empty, but not the right side...\n            if (string.IsNullOrEmpty(szKeyRight))\n            {\n                return (-1);\n            }\n\n            // The left side must be found, and it must be an array...\n            blSuccess = GetCheck(szKeyLeft, out szValue, out epropertytype, false);\n            if (!blSuccess || (epropertytype != EPROPERTYTYPE.ARRAY))\n            {\n                return (-1);\n            }\n\n            // Figure out our endpoint in the array...\n            if (a_iCount == 0)\n            {\n                iCount = int.MaxValue;\n            }\n            else\n            {\n                iCount = a_iStartingIndex + a_iCount;\n            }\n\n            // Okay, it's time to loop.  We need to make sure the array item exists\n            // before we look for the key, so this is a two step process...\n            for (iIndex = a_iStartingIndex; iIndex < iCount; iIndex++)\n            {\n                // Build the array key...\n                szKey = szKeyLeft + \"[\" + iIndex + \"]\";\n\n                // Does the array element exist?  And is it an object?\n                blSuccess = GetCheck(szKey, out szValue, out epropertytype, false);\n                if (!blSuccess || (epropertytype != EPROPERTYTYPE.OBJECT))\n                {\n                    return (-1);\n                }\n\n                // Okay, try to get the full key...\n                szKey += \".\" + szKeyRight;\n                blSuccess = GetCheck(szKey, out szValue, out epropertytype, false);\n                if (blSuccess)\n                {\n                    return (iIndex);\n                }\n            }\n\n            // No joy...\n            return (-1);\n        }\n\n        /// <summary>\n        /// Get the string associated with the key.  This is a convenience\n        /// function, because in most cases getting back a null string is\n        /// enough, so we don't need a special boolean check...\n        /// </summary>\n        /// <param name=\"a_szKey\">dotted key notation</param>\n        /// <param name=\"a_szValue\">value to return</param>\n        /// <returns>string on success, else null</returns>\n        public string Get(string a_szKey, bool a_blLog = true)\n        {\n            bool blSuccess;\n            string szValue;\n            EPROPERTYTYPE epropertytype;\n\n            // Do the lookup...\n            blSuccess = GetCheck(a_szKey, out szValue, out epropertytype, a_blLog);\n\n            // We're good...\n            if (blSuccess)\n            {\n                return (szValue);\n            }\n\n            // Ruh-roh...\n            return (null);\n        }\n\n        /// <summary>\n        /// Get the string associated with the key, and let us know how\n        /// the lookup turned out...\n        /// </summary>\n        /// <param name=\"a_szKey\">dotted key notation</param>\n        /// <param name=\"a_szValue\">value to return</param>\n        /// <param name=\"a_epropertytype\">type of property that we've found</param>\n        /// <param name=\"a_blLog\">log if key isn't found</param>\n        /// <returns>true on success</returns>\n\t\tpublic bool GetCheck(string a_szKey, out string a_szValue, out EPROPERTYTYPE a_epropertytype, bool a_blLog)\n        {\n            string[] aszKey;\n            string szIndex;\n            string szBaseName;\n            string szProperty;\n            UInt32 kk;\n            UInt32 uu;\n            UInt32 u32Index;\n            Property property;\n\n            // Init...\n            a_szValue = \"\";\n            a_epropertytype = EPROPERTYTYPE.UNDEFINED;\n\n            // Validate...\n            if ((a_szKey == null) || (m_property == null))\n            {\n                Log.Error(\"GetCheck: null argument...\");\n                return (false);\n            }\n\n            // If the key is empty, return the whole object...\n            if (a_szKey.Length == 0)\n            {\n                a_szValue = m_szJson;\n                a_epropertytype = m_property.epropertytype;\n                return (true);\n            }\n\n            // Fully tokenize the key so we can look ahead when needed...\n            aszKey = a_szKey.Split('.');\n\n            // Search, always skip the root if it's an object,\n            // if it's an array we need to process it...\n            property = m_property;\n            if (property.epropertytype == EPROPERTYTYPE.OBJECT)\n            {\n                property = m_property.propertyChild;\n            }\n            for (kk = 0; kk < aszKey.Length; kk++)\n            {\n                // Extract the basename, in case we have an index...\n                szBaseName = aszKey[kk];\n                if (szBaseName.Contains(\"[\"))\n                {\n                    szBaseName = szBaseName.Substring(0, szBaseName.IndexOf('['));\n                }\n\n                // Look for a match among the siblings at this level...\n                while (property != null)\n                {\n                    GetProperty(property, out szProperty);\n                    if (szProperty == szBaseName)\n                    {\n                        break;\n                    }\n                    property = property.propertySibling;\n                }\n\n                // No joy...\n                if (property == null)\n                {\n                    if (a_blLog)\n                    {\n                        Log.Info(\"GetCheck: key not found...\" + a_szKey);\n                    }\n                    return (false);\n                }\n\n                // If we found a value, then we're done...\n                if ((property.epropertytype == EPROPERTYTYPE.STRING)\n                    || (property.epropertytype == EPROPERTYTYPE.NUMBER)\n                    || (property.epropertytype == EPROPERTYTYPE.BOOLEAN)\n                    || (property.epropertytype == EPROPERTYTYPE.NULL))\n                {\n                    // If there's more to the key, then we weren't successful...\n                    if ((kk + 1) < aszKey.Length)\n                    {\n                        if (a_blLog)\n                        {\n                            Log.Info(\"GetCheck: key not found...\" + a_szKey);\n                        }\n                        return (false);\n                    }\n\n                    // Return what we found...\n                    return (GetValue(property, out a_szValue, out a_epropertytype));\n                }\n\n                // We found an object...\n                if (property.epropertytype == EPROPERTYTYPE.OBJECT)\n                {\n                    // We've no more keys, so return the object...\n                    if ((kk + 1) >= aszKey.Length)\n                    {\n                        return (GetValue(property, out a_szValue, out a_epropertytype));\n                    }\n\n                    // Otherwise, step into the object...\n                    property = property.propertyChild;\n                    continue;\n                }\n\n                // If we're an array, we need to walk the siblings of the child...\n                if (property.epropertytype == EPROPERTYTYPE.ARRAY)\n                {\n                    // If we don't have a '[' and this is the last key, return the whole thing...\n                    if (!aszKey[kk].Contains(\"[\") && ((kk + 1) >= aszKey.Length))\n                    {\n                        return (GetValue(property, out a_szValue, out a_epropertytype));\n                    }\n                    // If we don't have a '[' and there is more to the key, we're in trouble...\n                    else if (!aszKey[kk].Contains(\"[\") && ((kk + 1) < aszKey.Length))\n                    {\n                        if (a_blLog)\n                        {\n                            Log.Info(\"GetCheck: key not found...\" + a_szKey);\n                        }\n                        return (false);\n                    }\n\n                    // We must have a valid index in the key...\n                    szIndex = aszKey[kk].Substring(aszKey[kk].IndexOf('['));\n                    if ((szIndex.Length < 3) || !szIndex.StartsWith(\"[\") || !szIndex.EndsWith(\"]\"))\n                    {\n                        if (a_blLog)\n                        {\n                            Log.Info(\"GetCheck: key not found...\" + a_szKey);\n                        }\n                        return (false);\n                    }\n\n                    // Get the basename and look for a match...\n                    if (!UInt32.TryParse(szIndex.Substring(1, szIndex.Length - 2), out u32Index))\n                    {\n                        if (a_blLog)\n                        {\n                            Log.Info(\"GetCheck: key not found...\" + a_szKey);\n                        }\n                        return (false);\n                    }\n\n                    // Step into the child...\n                    property = property.propertyChild;\n                    if (property == null)\n                    {\n                        if (a_blLog)\n                        {\n                            Log.Info(\"GetCheck: key not found...\" + a_szKey);\n                        }\n                        return (false);\n                    }\n\n                    // Walk the siblings in this child...\n                    for (uu = 0; uu < u32Index; uu++)\n                    {\n                        property = property.propertySibling;\n                        if (property == null)\n                        {\n                            if (a_blLog)\n                            {\n                                Log.Info(\"GetCheck: key not found...\" + a_szKey);\n                            }\n                            return (false);\n                        }\n                    }\n\n                    // We've no more keys, so return the object...\n                    if ((kk + 1) >= aszKey.Length)\n                    {\n                        return (GetValue(property, out a_szValue, out a_epropertytype));\n                    }\n\n                    // If the thing we hit is an object, then we need to step into it...\n                    if (property.epropertytype == EPROPERTYTYPE.OBJECT)\n                    {\n                        property = property.propertyChild;\n                    }\n\n                    // Otherwise, keep on looking...\n                    continue;\n                }\n\n                // Well, this was unexpected...\n                Log.Info(\"GetCheck: unexpected error...\" + a_szKey);\n                return (false);\n            }\n\n            // All done...\n            return (true);\n        }\n\n        /// <summary>\n        /// Get the string associated with the key.  This is a convenience\n        /// function, because in most cases getting back a null string is\n        /// enough, so we don't need a special boolean check.\n        /// \n        /// The caller of this function is expecting to get back JSON data\n        /// in string form.  We examine that data, looking for evidence\n        /// that the strings are escaped, and if so, we unescape them.\n        /// </summary>\n        /// <param name=\"a_szKey\">dotted key notation</param>\n        /// <param name=\"a_szValue\">value to return</param>\n        /// <returns>string on success, else null</returns>\n        public string GetJson(string a_szKey)\n        {\n            bool blSuccess;\n            int iIndex;\n            string szValue;\n            EPROPERTYTYPE epropertytype;\n\n            // Do the lookup...\n            blSuccess = GetCheck(a_szKey, out szValue, out epropertytype, true);\n\n            // No joy...\n            if (!blSuccess)\n            {\n                return (null);\n            }\n\n            // Look for the first double-quote in the string, if the character\n            // before it is a backslash, then we'll replace all of the \\\" with\n            // \".  By definition the \" has to be in index 1 or higher for this\n            // to make sense, so we can ignore index 0...\n            iIndex = szValue.IndexOf('\"');\n            if (iIndex >= 1)\n            {\n                if (szValue[iIndex - 1] == '\\\\')\n                {\n                    szValue = szValue.Replace(\"\\\\\\\"\", \"\\\"\");\n                }\n            }\n\n            // Ruh-roh...\n            return (szValue);\n        }\n\n        /// <summary>\n        /// Get the property of the key, if not found we'll come back\n        /// with undefined...\n        /// </summary>\n        /// <param name=\"a_szKey\">dotted key notation</param>\n        /// <returns>type of the property</returns>\n        public JsonLookup.EPROPERTYTYPE GetType(string a_szKey)\n        {\n            bool blSuccess;\n            string szValue;\n            JsonLookup.EPROPERTYTYPE epropertytype;\n\n            // Do the lookup...\n            blSuccess = GetCheck(a_szKey, out szValue, out epropertytype, true);\n\n            // We're good...\n            if (blSuccess)\n            {\n                return (epropertytype);\n            }\n\n            // Ruh-roh...\n            return (JsonLookup.EPROPERTYTYPE.UNDEFINED);\n        }\n\n        /// <summary>\n        /// Get the JSON data as XML.  This is a simple name/value conversion...\n        /// </summary>\n        /// <param name=\"a_szRootName\">instead of o, use this as the name for the outermost tag</o></param>\n        /// <returns>the XML string</returns>\n        public string GetXml(string a_szRootName = \"\")\n        {\n            return (GetXmlPrivate(m_property, a_szRootName, 0, \"\"));\n        }\n\n        /// <summary>\n        /// Loads a JSON string...\n        /// </summary>\n        /// <param name=\"a_szJson\">JSON string to parse</param>\n        /// <param name=\"a_lJsonErrorindex\">index where error occurred, if return is false</param>\n        /// <returns>true on success</returns>\n\t\tpublic bool Load(string a_szJson, out long a_lJsonErrorindex)\n        {\n            bool blSuccess;\n            UInt32 u32Json;\n\n            // Init stuff...\n            a_lJsonErrorindex = 0;\n\n            // Free old content...\n            Unload();\n\n            // We have no new data...\n            if (a_szJson == null)\n            {\n                return (true);\n            }\n\n            // Make a copy of the string, in C# we'll work with the\n            // index instead of pointers like we do in C/C++...\n            u32Json = 0;\n            m_szJson = a_szJson;\n\n            // Parse the JSON and return...\n            blSuccess = Deserialize(ref u32Json);\n            if (!blSuccess)\n            {\n                a_lJsonErrorindex = u32Json;\n                Unload();\n            }\n\n            // All done...\n            return (blSuccess);\n        }\n\n        /// <summary>\n        /// Add an override for the Dump.  A value of null can be used\n        /// to \"delete\" an override.  Overrides are only supported for\n        /// boolean, null, number, and string.  It would be possible to\n        /// add support for array and object, but that seems a lot more\n        /// risky, so I'm holding off for now.\n        /// </summary>\n        /// <param name=\"a_szKey\"></param>\n        /// <param name=\"a_szValue\"></param>\n        public void Override(string a_szKey, string a_szValue)\n        {\n            // Make sure we have our list...\n            if (m_lkeyvalueOverride == null)\n            {\n                m_lkeyvalueOverride = new List<KeyValue>();\n            }\n\n            // If we already have this key, remove it...\n            int iIndex = m_lkeyvalueOverride.FindIndex(item => item.szKey == a_szKey);\n            if (iIndex >= 0)\n            {\n                m_lkeyvalueOverride.RemoveAt(iIndex);\n            }\n\n            // Add the new data to our list...\n            if (a_szValue != null)\n            {\n                KeyValue keyvalue = new KeyValue();\n                keyvalue.szKey = a_szKey;\n                keyvalue.szValue = a_szValue;\n                m_lkeyvalueOverride.Add(keyvalue);\n            }\n        }\n\n        #endregion\n\n\n        ///////////////////////////////////////////////////////////////////////////////\n        // Public Definitions...\n        ///////////////////////////////////////////////////////////////////////////////\n        #region Public Definitions...\n\n        /// <summary>\n        /// The kinds of data types we can get from the class...\n        /// </summary>\n        public enum EPROPERTYTYPE\n        {\n            UNDEFINED = 0,\n            ARRAY = 1,\n            OBJECT = 2,\n            STRING = 3,\n            BOOLEAN = 4,\n            NUMBER = 5,\n            NULL = 6,\n            LAST\n        };\n\n        #endregion\n\n\n        ///////////////////////////////////////////////////////////////////////////////\n        // Private Methods...\n        ///////////////////////////////////////////////////////////////////////////////\n        #region Private Methods...\n\n        /// <summary>\n        /// The control function for parsing the JSON string...\n        /// </summary>\n        /// <param name=\"a_u32Json\">JSON to parse</param>\n        /// <returns>true on success</returns>\n        private bool Deserialize(ref UInt32 a_u32Json)\n        {\n            UInt32 u32Json = a_u32Json;\n\n            // Validate...\n            if (string.IsNullOrEmpty(m_szJson))\n            {\n                Log.Error(\"Deserialize: null arguments...\");\n                return (false);\n            }\n\n            // Initialize the first property as root...\n            m_property = new Property();\n\n            // Clear any whitespace...\n            if (!SkipWhitespace(ref u32Json))\n            {\n                Log.Error(\"Deserialize: we ran out of data...\");\n                a_u32Json = u32Json;\n                return (false);\n            }\n\n            // We have an object...\n            if (m_szJson[(int)u32Json] == '{')\n            {\n                // What we are...\n                m_property.epropertytype = EPROPERTYTYPE.OBJECT;\n\n                // We don't need a colon, we just go straight to looking for the object,\n                // this function returns the closing curly bracket (if it finds it)...\n                if (!ParseObject(m_property, ref u32Json))\n                {\n                    Log.Error(\"Deserialize: ParseObject failed...\");\n                    a_u32Json = u32Json;\n                    return (false);\n                }\n            }\n\n            // Else we have an array...\n            else if (m_szJson[(int)u32Json] == '[')\n            {\n                // What we are...\n                m_property.epropertytype = EPROPERTYTYPE.ARRAY;\n\n                // We don't need a colon, we just go straight to looking for the object,\n                // this function returns the closing curly bracket (if it finds it)...\n                if (!ParseArray(m_property, ref u32Json))\n                {\n                    Log.Error(\"Deserialize: ParseArray failed...\");\n                    a_u32Json = u32Json;\n                    return (false);\n                }\n            }\n\n            // Else we have a problem...\n            else\n            {\n                Log.Error(\"Deserialize: bad token...\");\n                a_u32Json = u32Json;\n                return (false);\n            }\n\n\n            // All of the remaining content can only be whitespace...\n            if (SkipWhitespace(ref u32Json))\n            {\n                Log.Error(\"Deserialize: found cruft...\");\n                a_u32Json = u32Json;\n                return (false);\n            }\n\n            // All done...\n            a_u32Json = u32Json;\n            return (true);\n        }\n\n        /// <summary>\n        /// Diagnostic dump of the results of a Load, this function\n        /// runs recursively...\n        /// </summary>\n        /// <param name=\"a_property\">property to dump</param>\n        /// <param name=\"a_iDepth\">depth we're at</param>\n        /// <param name=\"a_szKey\">key for this item</param>\n        /// <param name=\"a_blArray\">true if we're elements in an array</param>\n        /// <returns>the JSON string</returns>\n        private string DumpPrivate\n        (\n            Property a_property,\n            int a_iDepth,\n            string a_szKey,\n            bool a_blArray\n        )\n        {\n            int iArray;\n            string szKey;\n            string szName;\n            string szValue;\n            string szResult;\n            Property property;\n            KeyValue keyvalue;\n            EPROPERTYTYPE epropertytype;\n\n            // Init...\n            iArray = -1;\n            szResult = \"\";\n            property = a_property;\n            if (property == null)\n            {\n                property = m_property;\n            }\n\n            // Dump...\n            while (property != null)\n            {\n                // Our key...\n                szKey = a_szKey;\n\n                // We're in an array, so subscript us...\n                if (a_blArray)\n                {\n                    iArray += 1;\n                    szKey += \"[\" + iArray + \"]\";\n                }\n\n                switch (property.epropertytype)\n                {\n                    // This can't be right...\n                    default:\n                        return (\"\");\n\n                    // Dump an array...\n                    case EPROPERTYTYPE.ARRAY:\n                        // name:[ or just [\n                        GetProperty(property, out szName);\n                        if (!string.IsNullOrEmpty(szName))\n                        {\n                            szResult += \"\\\"\" + szName + \"\\\":[\";\n                            szKey += string.IsNullOrEmpty(szKey) ? szName : \".\" + szName;\n                        }\n                        else\n                        {\n                            szResult += \"[\";\n                        }\n\n                        // If we have a kiddie, dive down into it...\n                        if (property.propertyChild != null)\n                        {\n                            szResult += DumpPrivate(property.propertyChild, a_iDepth + 1, szKey, true);\n                        }\n\n                        // If the last character is a comma, remove it...\n                        if (szResult.EndsWith(\",\"))\n                        {\n                            szResult = szResult.Remove(szResult.Length - 1);\n                        }\n\n                        // just ],\n                        szResult += \"],\";\n                        break;\n\n                    // Dump a boolean, null, or number...\n                    case EPROPERTYTYPE.BOOLEAN:\n                    case EPROPERTYTYPE.NULL:\n                    case EPROPERTYTYPE.NUMBER:\n                        GetProperty(property, out szName);\n                        szKey += string.IsNullOrEmpty(szKey) ? szName : \".\" + szName;\n                        keyvalue = m_lkeyvalueOverride.Find(item => item.szKey == szKey);\n                        if ((keyvalue == null) || (keyvalue.szValue == null))\n                        {\n                            GetValue(property, out szValue, out epropertytype);\n                            szResult += \"\\\"\" + szName + \"\\\":\" + szValue + \",\";\n                        }\n                        else\n                        {\n                            szResult += \"\\\"\" + szName + \"\\\":\" + keyvalue.szValue + \",\";\n                        }\n                        break;\n\n                    // Dump an object...\n                    case EPROPERTYTYPE.OBJECT:\n                        // name:{ or just {\n                        GetProperty(property, out szName);\n                        if (!string.IsNullOrEmpty(szName))\n                        {\n                            szResult += \"\\\"\" + szName + \"\\\":{\";\n                            szKey += string.IsNullOrEmpty(szKey) ? szName : \".\" + szName;\n                        }\n                        else\n                        {\n                            szResult += \"{\";\n                        }\n\n                        // If we have a kiddie, dive down into it...\n                        if (property.propertyChild != null)\n                        {\n                            szResult += DumpPrivate(property.propertyChild, a_iDepth + 1, szKey, false);\n                        }\n\n                        // If the last character is a comma, remove it...\n                        if (szResult.EndsWith(\",\"))\n                        {\n                            szResult = szResult.Remove(szResult.Length - 1);\n                        }\n\n                        // just },\n                        szResult += \"},\";\n                        break;\n\n                    // Dump a string...\n                    case EPROPERTYTYPE.STRING:\n                        GetProperty(property, out szName);\n                        szKey += string.IsNullOrEmpty(szKey) ? szName : \".\" + szName;\n                        keyvalue = m_lkeyvalueOverride.Find(item => item.szKey == szKey);\n                        if ((keyvalue == null) || (keyvalue.szValue == null))\n                        {\n                            GetValue(property, out szValue, out epropertytype);\n                            szResult += \"\\\"\" + szName + \"\\\":\\\"\" + szValue + \"\\\",\";\n                        }\n                        else\n                        {\n                            szResult += \"\\\"\" + szName + \"\\\":\\\"\" + keyvalue.szValue + \"\\\",\";\n                        }\n                        break;\n                }\n\n                // Next sibling...\n                property = property.propertySibling;\n            }\n\n            // If the last character is a comma, remove it...\n            if (szResult.EndsWith(\",\"))\n            {\n                szResult = szResult.Remove(szResult.Length - 1);\n            }\n\n            // All done...\n            return (szResult);\n        }\n\n        /// <summary>\n        /// Emit the JSON data as compact XML.  We're doing this in a\n        /// literal fashion.  Therefore:\n        /// \n        ///    {\n        ///        \"metadata\": {\n        ///             \"address\": {\n        ///\t                \"imageNumber\": 1,\n        ///\t                \"imagePart\": 1,\n        ///\t                \"moreParts\": lastPartInFile,\n        ///\t                \"sheetNumber\": 1,\n        ///\t                \"source\": \"feederFront\",\n        ///\t                \"streamName\": \"stream0\",\n        ///\t                \"sourceName\": \"source0\",\n        ///\t                \"pixelFormatName\": \"pixelFormat0\"\n        ///             },\n        ///             \"image\": {\n        ///\t                \"compression\": \"none\",\n        ///\t                \"pixelFormat\": \"bw1\",\n        ///\t                \"pixelHeight\": 2200,\n        ///\t                \"pixelOffsetX\": 0,\n        ///\t                \"pixelOffsetY\": 0,\n        ///\t                \"pixelWidth\": 1728,\n        ///\t                \"resolution\": 200,\n        ///\t                \"size\": 476279\n        ///             },Cmd\n        ///\t                <s:source>feederFront</s:source>\n        ///\t                <s:streamName>stream0</s:streamName>\n        ///\t                <s:sourceName>source0</s:sourceName>\n        ///\t                <s:pixelFormatName>pixelFormat0</s:pixelFormatName>\n        ///             </o:address>\n        ///             <o:image>\n        ///\t                <s:compression>none</s:compression>\n        ///\t                <pixelFormat>bw1</n:pixelFormat>\n        ///\t                <n:pixelHeight>2200</n:pixelHeight>\n        ///\t                <n:pixelOffsetX>0</n:pixelOffsetX>\n        ///\t                <n:pixelOffsetY>0</n:pixelOffsetY>\n        ///\t                <n:pixelWidth>1728</n:pixelWidth>\n        ///\t                <n:resolution>200</n:resolution>\n        ///\t                <n:size>476279</n:size>\n        ///             </o:image>\n\t\t///             <o:status>\n\t\t///\t                 <s:success>true</s:success>\n\t\t///             </o:status>\n\t    ///        </o:metadata>\n        ///    </o>\n        ///    \n        /// Arrays are handle like so:\n        /// \n        ///     {\n        ///         \"array\": [1, 2, 3]\n        ///     }\n        ///     \n        ///     <o>\n        ///         <a:array>\n        ///             <n:item>1</n:item>\n        ///             <n:item>2</n:item>\n        ///             <n:item>3</n:item>\n        ///         </a:array>\n        ///     </o>\n        ///     \n        /// We do allow overriding the outermost tag, so that instead\n        /// of \"o\" it can be something a little more descriptive, like\n        /// \"tdm\" for TWAIN metadata...\n        /// \n        /// </summary>\n        /// <param name=\"a_property\">property to emit</param>\n        /// <param name=\"a_szRootName\">rootname to use for outermost tag at depth 0</param>\n        /// <param name=\"a_iDepth\">depth we're at</param>\n        /// <param name=\"a_szXml\">current string provided by caller</param>\n        /// /// <returns>an XML string, or null on error</returns>\n        private string GetXmlPrivate(Property a_property, string a_szRootName, int a_iDepth, string a_szXml)\n        {\n            string szXml = a_szXml;\n            string szData;\n            string szName;\n            Property property;\n            EPROPERTYTYPE epropertytype;\n\n            // Init...\n            property = a_property;\n            if (property == null)\n            {\n                return (null);\n            }\n\n            // Loopy...\n            while (property != null)\n            {\n                // Get the name...\n                if (!GetProperty(property, out szName))\n                {\n                    return (null);\n                }\n\n                // If we didn't get a name, make one up...\n                if (string.IsNullOrEmpty(szName))\n                {\n                    switch (property.epropertytype)\n                    {\n                        default: szName = \"z\"; break;\n                        case EPROPERTYTYPE.ARRAY: szName = \"a\"; break;\n                        case EPROPERTYTYPE.OBJECT:\n                            // We can override the outermost tag...\n                            if (!string.IsNullOrEmpty(a_szRootName) && (a_iDepth == 0))\n                            {\n                                szName = a_szRootName;\n                            }\n                            else\n                            {\n                                szName = \"o\";\n                            }\n                            break;\n                    }\n                }\n\n                // If we got a name, prefix it with obj or arr, if needed...\n                else\n                {\n                    switch (property.epropertytype)\n                    {\n                        default: szName = \"z:\" + szName; break;\n                        case EPROPERTYTYPE.ARRAY: szName = \"a:\" + szName; break;\n                        case EPROPERTYTYPE.BOOLEAN: szName = \"b:\" + szName; break;\n                        case EPROPERTYTYPE.NULL: szName = \"u:\" + szName; break;\n                        case EPROPERTYTYPE.NUMBER: szName = \"n:\" + szName; break;\n                        case EPROPERTYTYPE.OBJECT: szName = \"o:\" + szName; break;\n                        case EPROPERTYTYPE.STRING: szName = \"s:\" + szName; break;\n                    }\n                }\n\n                // ADD: our opening tag...\n                szXml += \"<\" + szName + \">\";\n\n                // Get the value...\n                if (!GetValue(property, out szData, out epropertytype))\n                {\n                    return (null);\n                }\n\n                // Dive into our kiddie, if we have one...\n                if (property.propertyChild != null)\n                {\n                    // Dive in...\n                    szXml = GetXmlPrivate(property.propertyChild, \"\", a_iDepth + 1, szXml);\n                    if (szXml == null)\n                    {\n                        return (null);\n                    }\n                }\n                else\n                {\n                    szXml += szData;\n                }\n\n                // ADD: our closing tag...\n                szXml += \"</\" + szName + \">\";\n\n                // Next sibling...\n                property = property.propertySibling;\n            }\n\n            // This is what we have so far...\n            return (szXml);\n        }\n\n        /// <summary>\n        /// Free a property tree...\n        /// </summary>\n        /// <param name=\"a_property\"></param>\n        private void FreeProperty(Property a_property)\n        {\n            Property property;\n            Property propertySibling;\n\n            // Validate...\n            if (a_property == null)\n            {\n                return;\n            }\n\n            // Remove siblings, go after children as needed...\n            for (property = a_property; property != null; property = propertySibling)\n            {\n                // Next sibling...\n                propertySibling = property.propertySibling;\n\n                // Remove kiddies...\n                if (property.propertyChild != null)\n                {\n                    FreeProperty(property.propertyChild);\n                    property.propertyChild = null;\n                }\n\n                // Remove ourselves...\n                property = null;\n            }\n        }\n\n        /// <summary>\n        /// Get a property name.  When the JSON rules are relaxed we allow\n        /// for the following combinations:\n        ///\n        ///     \"property\": ...\n        ///     'property': ...\n        ///     \\\"property\\\": ...\n        ///     \\'property\\': ...\n        ///     property: ...\n        ///     \n        /// </summary>\n        /// <param name=\"a_property\">our place in the tree</param>\n        /// <param name=\"a_szProperty\">whatever we find (it can be empty)</param>\n        /// <returns></returns>\n        private bool GetProperty(Property a_property, out string a_szProperty)\n        {\n            // Init stuff...\n            a_szProperty = \"\";\n\n            // Validate the arguments...\n            if (a_property == null)\n            {\n                Log.Error(\"GetProperty: null argument...\");\n                return (false);\n            }\n\n            // No name (we get this with the root and with arrays)...\n            if (a_property.u32PropertyLength == 0)\n            {\n                return (true);\n            }\n\n            // Copy the property, losing the quotes...\n            if ((m_szJson[(int)a_property.u32PropertyOffset] == '\"') || (m_szJson[(int)a_property.u32PropertyOffset] == '\\''))\n            {\n                a_szProperty = m_szJson.Substring((int)(a_property.u32PropertyOffset + 1), (int)(a_property.u32PropertyLength - 2));\n            }\n\n            // Under relaxed mode, handle escaped quotes...\n            else if (((a_property.u32PropertyOffset + 1) < m_szJson.Length)\n                     && ((m_szJson.Substring((int)a_property.u32PropertyOffset, 2) == \"\\\\\\\"\")\n                     || (m_szJson.Substring((int)a_property.u32PropertyOffset, 2) == \"\\\\'\")))\n            {\n                a_szProperty = m_szJson.Substring((int)(a_property.u32PropertyOffset + 2), (int)(a_property.u32PropertyLength - 4));\n            }\n\n            // Under relaxed mode, we may not have quotes to lose...\n            else\n            {\n                a_szProperty = m_szJson.Substring((int)a_property.u32PropertyOffset, (int)a_property.u32PropertyLength);\n            }\n\n            // All done...\n            return (true);\n        }\n\n        /// <summary>\n        /// Get a value.  When the JSON rules are relaxed we allow for the\n        /// following combinations:\n        ///\n        ///     \"property\": ...\n        ///     'property': ...\n        ///     \\\"property\\\": ...\n        ///     \\'property\\': ...\n        ///\n        /// </summary>\n        /// <param name=\"a_property\">our place in the tree</param>\n        /// <param name=\"a_szValue\">whatever we find (it can be empty)</param>\n        /// <param name=\"a_epropertytype\">the type of the item we found</param>\n        /// <returns></returns>\n        private bool GetValue(Property a_property, out string a_szValue, out EPROPERTYTYPE a_epropertytype)\n        {\n            // Clear the target...\n            a_szValue = \"\";\n            a_epropertytype = EPROPERTYTYPE.UNDEFINED;\n\n            // Validate the arguments...\n            if (a_property == null)\n            {\n                Log.Error(\"GetValue: null argument...\");\n                return (false);\n            }\n\n            // Handle strings...\n            if (a_property.epropertytype == EPROPERTYTYPE.STRING)\n            {\n                // Empty string...\n                if (a_property.u32ValueLength == 0)\n                {\n                    a_epropertytype = a_property.epropertytype;\n                    return (true);\n                }\n\n                // Handle escaped quotes...\n                else if (((a_property.u32ValueOffset + 1) < m_szJson.Length)\n                         && ((m_szJson.Substring((int)a_property.u32ValueOffset, 2) == \"\\\\\\\"\")\n                         || (m_szJson.Substring((int)a_property.u32ValueOffset, 2) == \"\\\\'\")))\n                {\n                    a_szValue = m_szJson.Substring((int)(a_property.u32ValueOffset + 2), (int)(a_property.u32ValueLength - 4));\n                }\n\n                // Handle regular quotes...\n                else\n                {\n                    // All we have is \"\" (an empty string)...\n                    if (a_property.u32ValueLength == 2)\n                    {\n                        a_szValue = \"\";\n                    }\n                    // We have data in our quotes...\n                    else\n                    {\n                        a_szValue = m_szJson.Substring((int)(a_property.u32ValueOffset + 1), (int)(a_property.u32ValueLength - 2));\n                    }\n                }\n            }\n\n            // Handle everything else...\n            else\n            {\n                // Copy the entire block of data (whole objects and arrays included)...\n                a_szValue = m_szJson.Substring((int)a_property.u32ValueOffset, (int)a_property.u32ValueLength);\n            }\n\n            // All done...\n            a_epropertytype = a_property.epropertytype;\n            return (true);\n        }\n\n        /// <summary>\n        /// Work our way through an object...\n        /// </summary>\n        /// <param name=\"a_property\">current place in the tree</param>\n        /// <param name=\"a_u32Json\">current offset into the JSON string</param>\n        /// <returns></returns>\n        private bool ParseObject(Property a_property, ref UInt32 a_u32Json)\n        {\n            UInt32 u32Json;\n            UInt32 u32ValueOffset;\n            Property property;\n            Property propertyPrev;\n\n            // Init stuff...\n            u32Json = a_u32Json;\n\n            // We have to start with an open square bracket...\n            if (m_szJson[(int)u32Json] != '{')\n            {\n                Log.Error(\"ParseObject: expected open curly...\");\n                return (false);\n            }\n\n            // Make a note of where we are...\n            u32ValueOffset = u32Json;\n\n            // Skip the curly...\n            u32Json += 1;\n\n            // Clear any whitespace...\n            if (!SkipWhitespace(ref u32Json))\n            {\n                Log.Error(\"ParseObject: we ran out of data...\");\n                a_u32Json = u32Json;\n                return (false);\n            }\n\n            // We're an empty object...\n            if (m_szJson[(int)u32Json] == '}')\n            {\n                a_property.epropertytype = EPROPERTYTYPE.OBJECT;\n                a_property.u32ValueOffset = u32ValueOffset;\n                a_property.u32ValueLength = (u32Json + 1) - a_property.u32ValueOffset;\n                a_u32Json = u32Json + 1;\n                return (true);\n            }\n\n            // Loopy...\n            propertyPrev = a_property;\n            for (; u32Json < m_szJson.Length; u32Json++)\n            {\n                // Create a new record...\n                property = new Property();\n\n                // First kiddie in the list, so it's our child...\n                if (a_property.propertyChild == null)\n                {\n                    a_property.propertyChild = property;\n                    propertyPrev = a_property.propertyChild;\n                }\n                // Append to the end of our child's sibling list...\n                else\n                {\n                    propertyPrev.propertySibling = property;\n                    propertyPrev = propertyPrev.propertySibling;\n                }\n\n                // Clear any whitespace...\n                if (!SkipWhitespace(ref u32Json))\n                {\n                    Log.Error(\"ParseObject: we ran out of data...\");\n                    a_u32Json = u32Json;\n                    return (false);\n                }\n\n                // This needs to be a property name...\n                if (!ParseString(property, ref u32Json, false))\n                {\n                    Log.Error(\"ParseObject: ParseString failed...\");\n                    a_u32Json = u32Json;\n                    return (false);\n                }\n\n                // Clear any whitespace...\n                if (!SkipWhitespace(ref u32Json))\n                {\n                    a_u32Json = u32Json;\n                    Log.Error(\"ParseObject: we ran out of data...\");\n                    return (false);\n                }\n\n                // We need a colon...\n                if (m_szJson[(int)u32Json] != ':')\n                {\n                    Log.Error(\"ParseObject: expected a colon...\");\n                    a_u32Json = u32Json;\n                    return (false);\n                }\n\n                // Clear the colon...\n                u32Json += 1;\n\n                // Clear any whitespace...\n                if (!SkipWhitespace(ref u32Json))\n                {\n                    a_u32Json = u32Json;\n                    Log.Error(\"ParseObject: we ran out of data...\");\n                    return (false);\n                }\n\n                // This needs to be a value...\n                if (!ParseValue(property, ref u32Json))\n                {\n                    Log.Error(\"ParseObject: ParseValue failed...\");\n                    a_u32Json = u32Json;\n                    return (false);\n                }\n\n                // Clear any whitespace...\n                if (!SkipWhitespace(ref u32Json))\n                {\n                    Log.Error(\"ParseObject: we ran out of data...\");\n                    a_u32Json = u32Json;\n                    return (false);\n                }\n\n                // If we see a comma, we have more coming...\n                if (m_szJson[(int)u32Json] == ',')\n                {\n                    continue;\n                }\n\n                // If we see a closing square bracket, then we're done...\n                if (m_szJson[(int)u32Json] == '}')\n                {\n                    a_property.epropertytype = EPROPERTYTYPE.OBJECT;\n                    a_property.u32ValueOffset = u32ValueOffset;\n                    a_property.u32ValueLength = (u32Json + 1) - a_property.u32ValueOffset;\n                    a_u32Json = u32Json + 1;\n                    return (true);\n                }\n\n                // Uh-oh...\n                break;\n            }\n\n            // Uh-oh...\n            Log.Error(\"ParseObject: expected a closing curly...\");\n            a_u32Json = u32Json;\n            return (false);\n        }\n\n        /// <summary>\n        /// Work our way through an array...\n        /// </summary>\n        /// <param name=\"a_property\">current place in the tree</param>\n        /// <param name=\"a_u32Json\">current offset into the JSON string</param>\n        /// <returns></returns>\n        private bool ParseArray(Property a_property, ref UInt32 a_u32Json)\n        {\n            UInt32 u32Json;\n            UInt32 u32ValueOffset;\n            Property property;\n            Property propertyPrev;\n\n            // Init stuff...\n            u32Json = a_u32Json;\n\n            // We have to start with an open square bracket...\n            if (m_szJson[(int)u32Json] != '[')\n            {\n                Log.Error(\"ParseArray: expected a open square bracket...\");\n                return (false);\n            }\n\n            // Make a note of where we are...\n            u32ValueOffset = u32Json;\n\n            // Skip the bracket...\n            u32Json += 1;\n\n            // Clear any whitespace...\n            if (!SkipWhitespace(ref u32Json))\n            {\n                Log.Error(\"ParseObject: we ran out of data...\");\n                a_u32Json = u32Json;\n                return (false);\n            }\n\n            // We're an empty array...\n            if (m_szJson[(int)u32Json] == ']')\n            {\n                a_property.epropertytype = EPROPERTYTYPE.ARRAY;\n                a_property.u32ValueOffset = u32ValueOffset;\n                a_property.u32ValueLength = (u32Json + 1) - a_property.u32ValueOffset;\n                a_u32Json = u32Json + 1;\n                return (true);\n            }\n\n            // Loopy...\n            propertyPrev = a_property;\n            for (; u32Json < m_szJson.Length; u32Json++)\n            {\n                // Create a new record...\n                property = new Property();\n\n                // First kiddie in the list, so it's our child...\n                if (a_property.propertyChild == null)\n                {\n                    a_property.propertyChild = property;\n                    propertyPrev = a_property.propertyChild;\n                }\n                // Append to the end of our child's sibling list...\n                else\n                {\n                    propertyPrev.propertySibling = property;\n                    propertyPrev = propertyPrev.propertySibling;\n                }\n\n                // Clear any whitespace...\n                if (!SkipWhitespace(ref u32Json))\n                {\n                    a_u32Json = u32Json;\n                    Log.Error(\"ParseObject: we ran out of data...\");\n                    return (false);\n                }\n\n                // This needs to be a value...\n                if (!ParseValue(property, ref u32Json))\n                {\n                    Log.Error(\"ParseArray: ParseValue failed...\");\n                    a_u32Json = u32Json;\n                    return (false);\n                }\n\n                // Clear any whitespace...\n                if (!SkipWhitespace(ref u32Json))\n                {\n                    Log.Error(\"ParseArray: we ran out of data...\");\n                    a_u32Json = u32Json;\n                    return (false);\n                }\n\n                // If we see a comma, we have more coming...\n                if (m_szJson[(int)u32Json] == ',')\n                {\n                    continue;\n                }\n\n                // If we see a closing square bracket, then we're done...\n                if (m_szJson[(int)u32Json] == ']')\n                {\n                    a_property.epropertytype = EPROPERTYTYPE.ARRAY;\n                    a_property.u32ValueOffset = u32ValueOffset;\n                    a_property.u32ValueLength = (u32Json + 1) - a_property.u32ValueOffset;\n                    a_u32Json = u32Json + 1;\n                    return (true);\n                }\n\n                // Uh-oh...\n                break;\n            }\n\n            // Uh-oh...\n            Log.Error(\"ParseArray: expected a closing square bracket...\");\n            a_u32Json = u32Json;\n            return (false);\n        }\n\n        /// <summary>\n        /// Work our way through a value...\n        /// </summary>\n        /// <param name=\"a_property\">current place in the tree</param>\n        /// <param name=\"a_u32Json\">current offset into the JSON string</param>\n        /// <returns></returns>\n        private bool ParseValue(Property a_property, ref UInt32 a_u32Json)\n        {\n            UInt32 u32Json = a_u32Json;\n\n            switch (m_szJson[(int)u32Json])\n            {\n                // Well, that wasn't value...\n                default:\n                    Log.Error(\"ParseValue: unexpected token at (\" + u32Json + \")...<\" + m_szJson[(int)u32Json] + \">\");\n                    return (false);\n\n                // A string or an escaped string...\n                case '\"':\n                case '\\'':\n                case '\\\\':\n                    return (ParseString(a_property, ref a_u32Json, true));\n\n                // A number...\n                case '-':\n                case '0':\n                case '1':\n                case '2':\n                case '3':\n                case '4':\n                case '5':\n                case '6':\n                case '7':\n                case '8':\n                case '9':\n                    return (ParseNumber(a_property, ref a_u32Json));\n\n                // An object...\n                case '{':\n                    return (ParseObject(a_property, ref a_u32Json));\n\n                // An array...\n                case '[':\n                    return (ParseArray(a_property, ref a_u32Json));\n\n                // A boolean true...\n                case 't':\n                    if (m_szJson[(int)(u32Json + 1)] != 'r')\n                    {\n                        Log.Error(\"ParseValue: it ain't tRue...\");\n                        a_u32Json = u32Json + 1;\n                        return (false);\n                    }\n                    if (m_szJson[(int)(u32Json + 2)] != 'u')\n                    {\n                        Log.Error(\"ParseValue: it ain't trUe...\");\n                        a_u32Json = u32Json + 2;\n                        return (false);\n                    }\n                    if (m_szJson[(int)(u32Json + 3)] != 'e')\n                    {\n                        Log.Error(\"ParseValue: it ain't truE...\");\n                        a_u32Json = u32Json + 3;\n                        return (false);\n                    }\n                    a_u32Json = u32Json + 4;\n                    a_property.epropertytype = EPROPERTYTYPE.BOOLEAN;\n                    a_property.u32ValueOffset = u32Json;\n                    a_property.u32ValueLength = 4;\n                    return (true);\n\n                // A boolean false...\n                case 'f':\n                    if (m_szJson[(int)(u32Json + 1)] != 'a')\n                    {\n                        Log.Error(\"ParseValue: it ain't fAlse...\");\n                        a_u32Json = u32Json + 1;\n                        return (false);\n                    }\n                    if (m_szJson[(int)(u32Json + 2)] != 'l')\n                    {\n                        Log.Error(\"ParseValue: it ain't faLse...\");\n                        a_u32Json = u32Json + 2;\n                        return (false);\n                    }\n                    if (m_szJson[(int)(u32Json + 3)] != 's')\n                    {\n                        Log.Error(\"ParseValue: it ain't falSe...\");\n                        a_u32Json = u32Json + 3;\n                        return (false);\n                    }\n                    if (m_szJson[(int)(u32Json + 4)] != 'e')\n                    {\n                        Log.Error(\"ParseValue: it ain't falsE...\");\n                        a_u32Json = u32Json + 4;\n                        return (false);\n                    }\n                    a_u32Json = u32Json + 5;\n                    a_property.epropertytype = EPROPERTYTYPE.BOOLEAN;\n                    a_property.u32ValueOffset = u32Json;\n                    a_property.u32ValueLength = 5;\n                    return (true);\n\n                // A boolean null...\n                case 'n':\n                    if (m_szJson[(int)(u32Json + 1)] != 'u')\n                    {\n                        Log.Error(\"ParseValue: it ain't nUll...\");\n                        a_u32Json = u32Json + 1;\n                        return (false);\n                    }\n                    if (m_szJson[(int)(u32Json + 2)] != 'l')\n                    {\n                        Log.Error(\"ParseValue: it ain't nuLl...\");\n                        a_u32Json = u32Json + 2;\n                        return (false);\n                    }\n                    if (m_szJson[(int)(u32Json + 3)] != 'l')\n                    {\n                        Log.Error(\"ParseValue: it ain't nulL...\");\n                        a_u32Json = u32Json + 3;\n                        return (false);\n                    }\n                    a_u32Json = u32Json + 4;\n                    a_property.epropertytype = EPROPERTYTYPE.NULL;\n                    a_property.u32ValueOffset = u32Json;\n                    a_property.u32ValueLength = 4;\n                    return (true);\n            }\n        }\n\n        /// <summary>\n        /// Work our way through a string (property or value)...\n        /// </summary>\n        /// <param name=\"a_property\">current place in the tree</param>\n        /// <param name=\"a_u32Json\">current offset into the JSON string</param>\n        /// <param name=\"a_blValue\">true if a value</param>\n        /// <returns></returns>\n        bool ParseString(Property a_property, ref UInt32 a_u32Json, bool a_blValue)\n        {\n            string szQuote;\n            UInt32 u32Json = a_u32Json;\n\n            // Under strict rules the first character must be a doublequote...\n            if (m_blStrictParsingRules)\n            {\n                if (m_szJson[(int)u32Json] != '\"')\n                {\n                    Log.Error(\"ParseString: expected a opening doublequote...\");\n                    return (false);\n                }\n                szQuote = m_szJson[(int)u32Json].ToString();\n            }\n\n            // Come here for relaxed rules...\n            else\n            {\n                // Handle escaped quotes...\n                if (((u32Json + 1) < m_szJson.Length) && ((m_szJson.Substring((int)u32Json, 2) == \"\\\\\\\"\") || (m_szJson.Substring((int)u32Json, 2) == \"\\\\'\")))\n                {\n                    szQuote = m_szJson.Substring((int)u32Json, 2);\n                }\n\n                // A value must have an opening quote (double or single), or\n                // if we detect that we have a quote, then pop in here...\n                else if (a_blValue || (m_szJson[(int)u32Json] == '\"') || (m_szJson[(int)u32Json] == '\\''))\n                {\n                    if ((m_szJson[(int)u32Json] != '\"') && (m_szJson[(int)u32Json] != '\\''))\n                    {\n                        Log.Error(\"ParseString: expected an opening quote...\");\n                        return (false);\n                    }\n                    szQuote = m_szJson[(int)u32Json].ToString();\n                }\n\n                // A property name can have quotes or be an alphanumeric, and underscore or a dollarsign...\n                else\n                {\n                    if (!Char.IsLetterOrDigit(m_szJson[(int)u32Json]) && (m_szJson[(int)u32Json] != '_') && (m_szJson[(int)u32Json] != '$'))\n                    {\n                        Log.Error(\"ParseString: expected a valid property name...\");\n                        return (false);\n                    }\n                    szQuote = m_szJson[(int)u32Json].ToString();\n                }\n            }\n\n            // Init stuff...\n            if (a_blValue)\n            {\n                a_property.u32ValueOffset = u32Json;\n            }\n            else\n            {\n                a_property.u32PropertyOffset = u32Json;\n            }\n\n            // Clear the quote if we found one...\n            if ((szQuote == \"\\\\\\\"\") || (szQuote == \"\\\\'\"))\n            {\n                u32Json += 2;\n            }\n            else if ((szQuote == \"\\\"\") || (szQuote == \"'\"))\n            {\n                u32Json += 1;\n            }\n\n            // Loopy...\n            for (; u32Json < m_szJson.Length; u32Json++)\n            {\n                // Fail on a control character...\n                if (Char.IsControl(m_szJson[(int)u32Json]))\n                {\n                    Log.Error(\"ParseString: detected a control character...\");\n                    a_u32Json = u32Json;\n                    return (false);\n                }\n\n                // Under strict rules a doublequote ends us...\n                if (m_blStrictParsingRules)\n                {\n                    if (m_szJson[(int)u32Json] == '\"')\n                    {\n                        if (a_blValue)\n                        {\n                            a_property.u32ValueLength = (u32Json + 1) - a_property.u32ValueOffset;\n                            a_property.epropertytype = EPROPERTYTYPE.STRING;\n                        }\n                        else\n                        {\n                            a_property.u32PropertyLength = (u32Json + 1) - a_property.u32PropertyOffset;\n                            // Don't change the type, we could be anything...\n                        }\n                        a_u32Json = u32Json + 1;\n                        return (true);\n                    }\n                }\n\n                // Under relaxed rules we'll end on a matching escaped quite...\n                else if (((u32Json + 1) < m_szJson.Length) && (szQuote == (m_szJson.Substring((int)u32Json, 2))))\n                {\n                    if (a_blValue)\n                    {\n                        a_property.u32ValueLength = (u32Json + 2) - a_property.u32ValueOffset;\n                        a_property.epropertytype = EPROPERTYTYPE.STRING;\n                    }\n                    else\n                    {\n                        a_property.u32PropertyLength = (u32Json + 2) - a_property.u32PropertyOffset;\n                        // Don't change the type, we could be anything...\n                    }\n                    a_u32Json = u32Json + 2;\n                    return (true);\n                }\n\n                // Under relaxed rules we'll end on a matching quote, if we have one, this\n                // path is guaranteed to catch the closing quote on a value...\n                else if ((m_szJson[(int)u32Json].ToString() == szQuote) && ((szQuote == \"\\\"\") || (szQuote == \"'\")))\n                {\n                    if (a_blValue)\n                    {\n                        a_property.u32ValueLength = (u32Json + 1) - a_property.u32ValueOffset;\n                        a_property.epropertytype = EPROPERTYTYPE.STRING;\n                    }\n                    else\n                    {\n                        a_property.u32PropertyLength = (u32Json + 1) - a_property.u32PropertyOffset;\n                        // Don't change the type, we could be anything...\n                    }\n                    a_u32Json = u32Json + 1;\n                    return (true);\n                }\n\n                // Otherwise, (still under relaxed rules) if we're a property name, and we\n                // didn't open on a quote, we'll end on anything that isn't alphanumeric,\n                // an underscore or a dollarsign...\n                else if (!a_blValue\n                         && (szQuote != \"\\\"\")\n                         && (szQuote != \"'\")\n                         && !Char.IsLetterOrDigit(m_szJson[(int)u32Json])\n                         && (m_szJson[(int)u32Json] != '_')\n                         && (m_szJson[(int)u32Json] != '$'))\n                {\n                    a_property.u32PropertyLength = u32Json - a_property.u32PropertyOffset;\n                    // Don't change the type, we could be anything...\n                    // Don't skip over this item...\n                    a_u32Json = u32Json;\n                    return (true);\n                }\n\n                // If we're not a backslash, we're okay...\n                if (m_szJson[(int)u32Json] != '\\\\')\n                {\n                    continue;\n                }\n\n                // Handle escape characters...\n                u32Json += 1;\n                switch (m_szJson[(int)u32Json])\n                {\n                    default:\n                        Log.Error(\"ParseString: bad escape character at (\" + u32Json + \")...<\" + m_szJson[(int)u32Json] + \">\");\n                        a_u32Json = u32Json;\n                        return (false);\n\n                    case '\"':\n                    case '\\\\':\n                    case '/':\n                    case 'n':\n                    case 'r':\n                    case 't':\n                    case 'b':\n                    case 'f':\n                        continue;\n\n                    // Make sure we have at least four of these in a row...\n                    case 'u':\n                        if (!IsXDigit(m_szJson[(int)(u32Json + 1)]))\n                        {\n                            Log.Error(\"ParseString: it ain't a \\\\uXxxx\");\n                            a_u32Json = u32Json + 1;\n                            return (false);\n                        }\n                        if (!IsXDigit(m_szJson[(int)(u32Json + 2)]))\n                        {\n                            Log.Error(\"ParseString: it ain't a \\\\uxXxx\");\n                            a_u32Json = u32Json + 2;\n                            return (false);\n                        }\n                        if (!IsXDigit(m_szJson[(int)(u32Json + 3)]))\n                        {\n                            Log.Error(\"ParseString: it ain't a \\\\uxxXx\");\n                            a_u32Json = u32Json + 3;\n                            return (false);\n                        }\n                        if (!IsXDigit(m_szJson[(int)(u32Json + 4)]))\n                        {\n                            Log.Error(\"ParseString: it ain't a \\\\uxxxX\");\n                            a_u32Json = u32Json + 4;\n                            return (false);\n                        }\n                        a_u32Json = u32Json + 5;\n                        continue;\n                }\n            }\n\n            // Uh-oh...\n            Log.Error(\"ParseString: expected a closing quote or something...\");\n            a_u32Json = u32Json;\n            return (false);\n        }\n\n        /// <summary>\n        /// Work our way through a number...\n        /// </summary>\n        /// <param name=\"a_property\">current place in the tree</param>\n        /// <param name=\"a_u32Json\">current offset into the JSON string</param>\n        /// <returns></returns>\n        bool ParseNumber(Property a_property, ref UInt32 a_u32Json)\n        {\n            bool blDecimalDetected;\n            bool blExponentDetected;\n            bool blExponentSignDetected;\n            bool blExponentDigitDetected;\n            bool blLeadingZero;\n            bool blNonZeroDigitDetected;\n            UInt32 u32Json;\n\n            // Init stuff...\n            blDecimalDetected = false;\n            blExponentDetected = false;\n            blExponentSignDetected = false;\n            blExponentDigitDetected = false;\n            blLeadingZero = false;\n            blNonZeroDigitDetected = false;\n            a_property.u32ValueOffset = a_u32Json;\n\n            // Loopy...\n            for (u32Json = a_u32Json; u32Json < m_szJson.Length; u32Json++)\n            {\n                // Detect termination of the number and watch for illegal values...\n                switch (m_szJson[(int)u32Json])\n                {\n                    // We've a problem...\n                    default:\n                        Log.Error(\"ParseNumber: not a valid token in a number...\");\n                        a_u32Json = u32Json;\n                        return (false);\n\n                    // We're done (and okay) on the following...\n                    case ' ':\n                    case '\\t':\n                    case '\\r':\n                    case '\\n':\n                    case ',':\n                    case '}':\n                    case ']':\n                        // Bad exponent...\n                        if (blExponentDetected && !blExponentDigitDetected)\n                        {\n                            Log.Error(\"ParseNumber: bad exponent...\");\n                            a_u32Json = u32Json;\n                            return (false);\n                        }\n\n                        // Don't skip past this value, the function above us needs to be able to check it...\n                        a_u32Json = u32Json;\n                        a_property.epropertytype = EPROPERTYTYPE.NUMBER;\n                        a_property.u32ValueLength = u32Json - a_property.u32ValueOffset;\n                        return (true);\n\n                    // We're good...\n                    case '-':\n                    case '.':\n                    case '+':\n                    case 'e':\n                    case 'E':\n                    case '0':\n                    case '1':\n                    case '2':\n                    case '3':\n                    case '4':\n                    case '5':\n                    case '6':\n                    case '7':\n                    case '8':\n                    case '9':\n                        break;\n                }\n\n                // Fail on embedded or trailing minus (not part of exponent, that's further down)...\n                // good: 1-23\n                // bad: 1-, 1-123\n                if (!blExponentDetected && (m_szJson[(int)u32Json] == '-'))\n                {\n                    if ((m_szJson[(int)u32Json] == '-') && ((u32Json != a_u32Json) || (u32Json >= m_szJson.Length)))\n                    {\n                        Log.Error(\"ParseNumber: problem with how minus is being used...\");\n                        a_u32Json = u32Json;\n                        return (false);\n                    }\n                    continue;\n                }\n\n                // Detect a leading zero...\n                if (!blNonZeroDigitDetected && (m_szJson[(int)u32Json] == '0'))\n                {\n                    // We can be the first or second item in the string...\n                    if ((u32Json == a_u32Json) || (u32Json == (a_u32Json + 1)))\n                    {\n                        blLeadingZero = true;\n                        continue;\n                    }\n                    Log.Error(\"ParseNumber: found a leading zero...\");\n                    a_u32Json = u32Json;\n                    return (false);\n                }\n\n                // Fail on a leading zero...\n                // ex: 000, 0123\n                if (blLeadingZero && !blNonZeroDigitDetected && Char.IsDigit(m_szJson[(int)u32Json]))\n                {\n                    Log.Error(\"ParseNumber: found a leading zero...\");\n                    a_u32Json = u32Json;\n                    return (false);\n                }\n\n                // Fail on multiple decimals or a decimal with no leading digit...\n                if (m_szJson[(int)u32Json] == '.')\n                {\n                    if (blDecimalDetected\n                        || (!blLeadingZero && !blNonZeroDigitDetected))\n                    {\n                        Log.Error(\"ParseNumber: bad decimal point...\");\n                        a_u32Json = u32Json;\n                        return (false);\n                    }\n                    // Clear the leading zero check, we don't need this anymore...\n                    blLeadingZero = false;\n                    blDecimalDetected = true;\n                    continue;\n                }\n\n                // Fail on multiple exponent or an exponent with no leading digit...\n                if ((m_szJson[(int)u32Json] == 'e') || (m_szJson[(int)u32Json] == 'E'))\n                {\n                    if (blExponentDetected\n                        || (!blLeadingZero && !blNonZeroDigitDetected))\n                    {\n                        Log.Error(\"ParseNumber: bad exponent...\");\n                        a_u32Json = u32Json;\n                        return (false);\n                    }\n                    blExponentDetected = true;\n                    continue;\n                }\n\n                // Fail on multiple exponent sign, or sign with no leading exponent,\n                // or sign after exponent digit...\n                if ((m_szJson[(int)u32Json] == '+') || (m_szJson[(int)u32Json] == '-'))\n                {\n                    if (blExponentSignDetected\n                        || !blExponentDetected\n                        || blExponentDigitDetected)\n                    {\n                        Log.Error(\"ParseNumber: bad exponent...\");\n                        a_u32Json = u32Json;\n                        return (false);\n                    }\n                    blExponentSignDetected = true;\n                    continue;\n                }\n\n                // Detected an integer digit...\n                if (!blDecimalDetected && !blExponentDetected)\n                {\n                    switch (m_szJson[(int)u32Json])\n                    {\n                        default:\n                            break;\n                        case '-':\n                        case '.':\n                        case '+':\n                        case 'e':\n                        case 'E':\n                        case '0':\n                        case '1':\n                        case '2':\n                        case '3':\n                        case '4':\n                        case '5':\n                        case '6':\n                        case '7':\n                        case '8':\n                        case '9':\n                            blNonZeroDigitDetected = true;\n                            continue;\n                    }\n                }\n\n                // Make sure we catch decimal numbers...\n                if (Char.IsDigit(m_szJson[(int)u32Json]))\n                {\n                    if (!blExponentDetected)\n                    {\n                        blNonZeroDigitDetected = true;\n                    }\n                    else\n                    {\n                        blExponentDigitDetected = true;\n                    }\n                }\n            }\n\n            // Uh-oh...\n            Log.Error(\"ParseNumber: problem with a number...\");\n            a_u32Json = u32Json;\n            return (false);\n        }\n\n        /// <summary>\n        /// Skip whitespace in the JSON string...\n        /// </summary>\n        /// <param name=\"a_u32Json\">index to move</param>\n        /// <returns>false if we run out of string</returns>\n        private bool SkipWhitespace(ref UInt32 a_u32Json)\n        {\n            // Loopy...\n            while (a_u32Json < m_szJson.Length)\n            {\n                if (!Char.IsWhiteSpace(m_szJson[(int)a_u32Json]))\n                {\n                    return (true);\n                }\n                a_u32Json += 1;\n            }\n\n            // We ran out of data...\n            return (false);\n        }\n\n        /// <summary>\n        /// Free resources...\n        /// </summary>\n        private void Unload()\n        {\n            m_szJson = null;\n\n            if (m_property != null)\n            {\n                FreeProperty(m_property);\n                m_property = null;\n            }\n        }\n\n        /// <summary>\n        /// C# leaves out the most amazing stuff...\n        /// </summary>\n        /// <param name=\"c\">character to check</param>\n        /// <returns>true if its a hexit</returns>\n        private static bool IsXDigit(char c)\n        {\n            if (Char.IsDigit(c)) return true;\n            if ((c >= 'a') && (c <= 'f')) return true;\n            if ((c >= 'A') && (c <= 'F')) return true;\n            return false;\n        }\n\n        #endregion\n\n\n        ///////////////////////////////////////////////////////////////////////////////\n        // Private Definitions...\n        ///////////////////////////////////////////////////////////////////////////////\n        #region Private Definitions...\n\n        /// <summary>\n        /// Our main data structure for holding onto the information about\n        /// a JSON string after we've loaded it...\n        /// </summary>\n        private class Property\n        {\n            // Init stuff...\n            public Property()\n            {\n                propertySibling = null;\n                propertyChild = null;\n                epropertytype = EPROPERTYTYPE.UNDEFINED;\n                u32PropertyOffset = 0;\n                u32PropertyLength = 0;\n                u32ValueOffset = 0;\n                u32ValueLength = 0;\n            }\n\n            // Our attributes...\n            public Property propertySibling;\n            public Property propertyChild;\n            public EPROPERTYTYPE epropertytype;\n            public UInt32 u32PropertyOffset;\n            public UInt32 u32PropertyLength;\n            public UInt32 u32ValueOffset;\n            public UInt32 u32ValueLength;\n        };\n\n        /// <summary>\n        /// Key/Value pair structure, used to override the\n        /// values of keys during a Dump()...\n        /// </summary>\n        private class KeyValue\n        {\n            public string szKey;\n            public string szValue;\n        }\n\n        #endregion\n\n\n        ///////////////////////////////////////////////////////////////////////////////\n        // Private Attributes...\n        ///////////////////////////////////////////////////////////////////////////////\n        #region Private Attributes...\n\n        /// <summary>\n        /// A place to store the JSON string while we work with it...\n        /// </summary>\n        private string m_szJson;\n\n        /// <summary>\n        /// A place to store the load data on the JSON string...\n        /// </summary>\n        private Property m_property;\n\n        /// <summary>\n        /// If false, then property names don't have to have quotes\n        /// as long as they don't have any embedded whitespace, and\n        /// single-quotes are allowed.  This makes it easier on folks\n        /// generating JSON from scripted languages, or if they use\n        /// command line tools like cURL...\n        /// </summary>\n        private bool m_blStrictParsingRules;\n\n        /// <summary>\n        /// List of changes to the JSON in key/value pairs...\n        /// </summary>\n        private List<KeyValue> m_lkeyvalueOverride;\n\n        #endregion\n    }\n\n    /// <summary>\n    /// P/Invokes, note that these are designed to be only accessible to classes in\n    /// the TwainDirect.Support namespace.  So if you need this functions in other\n    /// namespaces, they have to be wrapped in a function somewhere in one of the\n    /// TwainDirect.Support classes that have public access (not this one)...\n    /// </summary>\n    internal sealed class NativeMethods\n    {\n        ///////////////////////////////////////////////////////////////////////////////\n        // Windows\n        ///////////////////////////////////////////////////////////////////////////////\n        #region Windows\n\n        /// <summary>\n        /// So we can get a console window on Windows...\n        /// </summary>\n        /// <returns></returns>\n        [DllImport(\"kernel32.dll\", EntryPoint = \"AllocConsole\", SetLastError = true, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]\n        public static extern int AllocConsole();\n\n        /// <summary>\n        /// Get the desktop window so we have a parent...\n        /// </summary>\n        /// <returns></returns>\n        [DllImport(\"user32.dll\", SetLastError = false)]\n        public static extern IntPtr GetDesktopWindow();\n\n        [DllImport(\"kernel32.dll\", EntryPoint = \"GetStdHandle\", SetLastError = true, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]\n        public static extern IntPtr GetStdHandle(int nStdHandle);\n\n        [DllImport(\"kernel32.dll\", EntryPoint = \"SetStdHandle\", SetLastError = true, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]\n        public static extern bool SetStdHandle(int nStdHandle, IntPtr hHandle);\n\n        [DllImport(\"kernel32.dll\", SetLastError = true, CharSet = CharSet.Unicode)]\n        public static extern IntPtr CreateFile\n            (string lpFileName\n            , [MarshalAs(UnmanagedType.U4)] DesiredAccess dwDesiredAccess\n            , [MarshalAs(UnmanagedType.U4)] FileShare dwShareMode\n            , IntPtr lpSecurityAttributes\n            , [MarshalAs(UnmanagedType.U4)] CreationDisposition dwCreationDisposition\n            , [MarshalAs(UnmanagedType.U4)] FileAttributes dwFlagsAndAttributes\n            , IntPtr hTemplateFile\n            );\n        [Flags]\n        public enum DesiredAccess : uint\n        {\n            GenericRead = 0x80000000,\n            GenericWrite = 0x40000000,\n            GenericExecute = 0x20000000,\n            GenericAll = 0x10000000\n        }\n        [Flags]\n        public enum FileShare : uint\n        {\n            /// <summary>\n            /// \n            /// </summary>\n            None = 0x00000000,\n            /// <summary>\n            /// Enables subsequent open operations on an object to request read access. \n            /// Otherwise, other processes cannot open the object if they request read access. \n            /// If this flag is not specified, but the object has been opened for read access, the function fails.\n            /// </summary>\n            Read = 0x00000001,\n            /// <summary>\n            /// Enables subsequent open operations on an object to request write access. \n            /// Otherwise, other processes cannot open the object if they request write access. \n            /// If this flag is not specified, but the object has been opened for write access, the function fails.\n            /// </summary>\n            Write = 0x00000002,\n            /// <summary>\n            /// Enables subsequent open operations on an object to request delete access. \n            /// Otherwise, other processes cannot open the object if they request delete access.\n            /// If this flag is not specified, but the object has been opened for delete access, the function fails.\n            /// </summary>\n            Delete = 0x00000004\n        }\n        public enum CreationDisposition : uint\n        {\n            /// <summary>\n            /// Creates a new file. The function fails if a specified file exists.\n            /// </summary>\n            New = 1,\n            /// <summary>\n            /// Creates a new file, always. \n            /// If a file exists, the function overwrites the file, clears the existing attributes, combines the specified file attributes, \n            /// and flags with FILE_ATTRIBUTE_ARCHIVE, but does not set the security descriptor that the SECURITY_ATTRIBUTES structure specifies.\n            /// </summary>\n            CreateAlways = 2,\n            /// <summary>\n            /// Opens a file. The function fails if the file does not exist. \n            /// </summary>\n            OpenExisting = 3,\n            /// <summary>\n            /// Opens a file, always. \n            /// If a file does not exist, the function creates a file as if dwCreationDisposition is CREATE_NEW.\n            /// </summary>\n            OpenAlways = 4,\n            /// <summary>\n            /// Opens a file and truncates it so that its size is 0 (zero) bytes. The function fails if the file does not exist.\n            /// The calling process must open the file with the GENERIC_WRITE access right. \n            /// </summary>\n            TruncateExisting = 5\n        }\n        [Flags]\n        public enum FileAttributes : uint\n        {\n            Readonly = 0x00000001,\n            Hidden = 0x00000002,\n            System = 0x00000004,\n            Directory = 0x00000010,\n            Archive = 0x00000020,\n            Device = 0x00000040,\n            Normal = 0x00000080,\n            Temporary = 0x00000100,\n            SparseFile = 0x00000200,\n            ReparsePoint = 0x00000400,\n            Compressed = 0x00000800,\n            Offline = 0x00001000,\n            NotContentIndexed = 0x00002000,\n            Encrypted = 0x00004000,\n            Write_Through = 0x80000000,\n            Overlapped = 0x40000000,\n            NoBuffering = 0x20000000,\n            RandomAccess = 0x10000000,\n            SequentialScan = 0x08000000,\n            DeleteOnClose = 0x04000000,\n            BackupSemantics = 0x02000000,\n            PosixSemantics = 0x01000000,\n            OpenReparsePoint = 0x00200000,\n            OpenNoRecall = 0x00100000,\n            FirstPipeInstance = 0x00080000\n        }\n\n        public const int STD_INPUT_HANDLE = -10;\n        public const int STD_OUTPUT_HANDLE = -11;\n        public const int STD_ERROR_HANDLE = -12;\n        public const int MY_CODE_PAGE = 437;\n\n        /// <summary>\n        /// Having this helps a little bit with logging on Windows, it's\n        /// not a huge win, though, so it may well go away at some point...\n        /// </summary>\n        /// <returns></returns>\n        [DllImport(\"kernel32.dll\")]\n\n        internal static extern int GetCurrentThreadId();\n        // Message sent to the Window when a Bonjour event occurs.\n        public const int BONJOUR_EVENT = (0x8000 + 0x100); // WM_USER\n\n        [DllImport(\"msvcrt.dll\", CallingConvention = CallingConvention.Cdecl)]\n        public static extern void free(IntPtr ptr);\n\n        [DllImport(\"msvcrt.dll\", CallingConvention = CallingConvention.Cdecl)]\n        public static extern IntPtr calloc(IntPtr num, IntPtr size);\n\n        [DllImport(\"user32.dll\")]\n        public static extern int GetMessage\n        (\n            out MSG lpMsg,\n            IntPtr hWnd,\n            int wMsgFilterMin,\n            int wMsgFilterMax\n        );\n\n        [DllImport(\"user32.dll\", CharSet = CharSet.Unicode, SetLastError = true)]\n        [return: MarshalAs(UnmanagedType.Bool)]\n        public static extern bool DestroyWindow(IntPtr hwnd);\n\n        [DllImport(\"user32\")]\n        public static extern IntPtr SendMessage(IntPtr hWnd, UInt32 msg, IntPtr wParam, IntPtr lParam);\n        internal const int BCM_FIRST = 0x1600; //Normal button\n        internal const int BCM_SETSHIELD = (BCM_FIRST + 0x000C); //Elevated button\n\n        [DllImport(\"user32.dll\")]\n        public static extern int TranslateMessage([In] ref MSG lpMsg);\n\n        [DllImport(\"user32.dll\")]\n        public static extern IntPtr DispatchMessage([In] ref MSG lpMsg);\n\n        [DllImport(\"wsock32.dll\")]\n        public static extern int WSAAsyncSelect\n        (\n            IntPtr socket,\n            IntPtr hWnd,\n            int wMsg,\n            int lEvent\n        );\n\n        [return: MarshalAs(UnmanagedType.Bool)]\n        [DllImport(\"user32.dll\", SetLastError = true, CharSet = CharSet.Auto)]\n        public static extern bool PostMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);\n\n        [DllImport(\"kernel32.dll\", SetLastError = true, CharSet = CharSet.Unicode)]\n        public static extern IntPtr LoadLibraryExW(string lpFileName, IntPtr hReservedNull, int dwFlags);\n\n        [DllImport(\"kernel32\", CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true, BestFitMapping = false, ThrowOnUnmappableChar = true)]\n        public static extern IntPtr GetProcAddress\n        (\n            IntPtr hModule,\n            [MarshalAs(UnmanagedType.LPStr)] string procName\n        );\n\n        [DllImport(\"kernel32.dll\", SetLastError = true)]\n        public static extern int FreeLibrary(IntPtr handle);\n\n        [DllImport(\"user32.dll\", EntryPoint = \"GetWindowLong\")]\n        [SuppressMessage(\"Microsoft.Portability\", \"CA1901:PInvokeDeclarationsShouldBePortable\", MessageId = \"return\", Justification = \"This declaration is not used on 64-bit Windows.\")]\n        [SuppressMessage(\"Microsoft.Portability\", \"CA1901:PInvokeDeclarationsShouldBePortable\", MessageId = \"2\", Justification = \"This declaration is not used on 64-bit Windows.\")]\n        public static extern int GetWindowLong(IntPtr hWnd, int nIndex);\n\n        [DllImport(\"user32.dll\", EntryPoint = \"GetWindowLongPtr\")]\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\", Justification = \"Entry point does exist on 64-bit Windows.\")]\n        public static extern IntPtr GetWindowLongPtr(IntPtr hWnd, int nIndex);\n\n        [DllImport(\"user32.dll\", SetLastError = true, EntryPoint = \"SetWindowLong\")]\n        [SuppressMessage(\"Microsoft.Portability\", \"CA1901:PInvokeDeclarationsShouldBePortable\", MessageId = \"return\", Justification = \"This declaration is not used on 64-bit Windows.\")]\n        [SuppressMessage(\"Microsoft.Portability\", \"CA1901:PInvokeDeclarationsShouldBePortable\", MessageId = \"2\", Justification = \"This declaration is not used on 64-bit Windows.\")]\n        public static extern int SetWindowLong(IntPtr hWnd, Int32 nIndex, int dwNewLong);\n\n        [DllImport(\"user32.dll\", SetLastError = true, EntryPoint = \"SetWindowLongPtr\")]\n        [SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\", Justification = \"Entry point does exist on 64-bit Windows.\")]\n        public static extern IntPtr SetWindowLongPtr(IntPtr hWnd, Int32 nIndex, IntPtr dwNewLong);\n\n        [DllImport(\"user32.dll\", SetLastError = true)]\n        public static extern IntPtr CreateWindowExW\n        (\n           UInt32 dwExStyle,\n           [MarshalAs(UnmanagedType.LPWStr)] string lpClassName,\n           [MarshalAs(UnmanagedType.LPWStr)] string lpWindowName,\n           Int32 dwStyle,\n           Int32 x,\n           Int32 y,\n           Int32 nWidth,\n           Int32 nHeight,\n           IntPtr hWndParent,\n           IntPtr hMenu,\n           IntPtr hInstance,\n           IntPtr lpParam\n        );\n\n        [DllImport(\"user32.dll\", EntryPoint = \"ShowWindow\", SetLastError = true)]\n        public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);\n\n        [DllImport(\"user32.dll\", SetLastError = true)]\n        [return: MarshalAs(UnmanagedType.U2)]\n        public static extern short RegisterClassExW([In] ref WNDCLASSEXW lpwc);\n\n        /// <summary>\n        /// The Windows Point structure.\n        /// Needed for the PreFilterMessage function when we're\n        /// handling DAT_EVENT...\n        /// </summary>\n        [StructLayout(LayoutKind.Sequential, Pack = 1)]\n        public struct POINT\n        {\n            public int X;\n            public int Y;\n        }\n\n        /// <summary>\n        /// The Windows MSG structure.\n        /// Needed for the PreFilterMessage function when we're\n        /// handling DAT_EVENT...\n        /// </summary>\n        [StructLayout(LayoutKind.Sequential)]\n        public struct MSG\n        {\n            public IntPtr hwnd;\n            public Int32 message;\n            public IntPtr wParam;\n            public IntPtr lParam;\n            public Int32 time;\n            public POINT pt;\n        }\n\n        public delegate IntPtr WndProcDelegate(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);\n\n        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]\n        [SuppressMessage(\"Microsoft.Design\", \"CA1049:TypesThatOwnNativeResourcesShouldBeDisposable\", Justification = \"Not allocating any resources.\")]\n        public struct WNDCLASSEXW\n        {\n            [MarshalAs(UnmanagedType.U4)]\n            public int cbSize;\n            [MarshalAs(UnmanagedType.U4)]\n            public int style;\n            public IntPtr lpfnWndProc; // not WndProc\n            public int cbClsExtra;\n            public int cbWndExtra;\n            public IntPtr hInstance;\n            public IntPtr hIcon;\n            public IntPtr hCursor;\n            public IntPtr hbrBackground;\n            [System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPWStr)]\n            public string lpszMenuName;\n            [System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPWStr)]\n            public string lpszClassName;\n            public IntPtr hIconSm;\n        }\n\n        [DllImport(\"kernel32.dll\", CharSet = CharSet.Unicode)]\n        public static extern IntPtr GetModuleHandleW(string lpModuleName);\n\n        [DllImport(\"user32.dll\")]\n        public static extern IntPtr DefWindowProc(IntPtr hWnd, int iMsg, IntPtr wParam, IntPtr lParam);\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "twaincs/source/twaincscert/source/twaincscert.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <ProductVersion>15.0.27428.2005</ProductVersion>\n    <ImplicitlyExpandNETStandardFacades>false</ImplicitlyExpandNETStandardFacades>\n    <DisableHandlePackageFileConflicts>true</DisableHandlePackageFileConflicts>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">x86</Platform>\n    <SchemaVersion>2.0</SchemaVersion>\n    <ProjectGuid>{ED11A4C1-1C03-4092-B1FA-F1D35C47D59E}</ProjectGuid>\n    <OutputType>WinExe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>twaincscert</RootNamespace>\n    <AssemblyName>twaincscert</AssemblyName>\n    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <SccProjectName>\n    </SccProjectName>\n    <SccLocalPath>\n    </SccLocalPath>\n    <SccAuxPath>\n    </SccAuxPath>\n    <SccProvider>\n    </SccProvider>\n    <TargetFrameworkProfile>\n    </TargetFrameworkProfile>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|x86' \">\n    <PlatformTarget>x86</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\x86\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>\n    <RunCodeAnalysis>true</RunCodeAnalysis>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|x86' \">\n    <PlatformTarget>x86</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\x86\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <RunCodeAnalysis>true</RunCodeAnalysis>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|x64'\">\n    <DebugSymbols>true</DebugSymbols>\n    <OutputPath>bin\\x64\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>\n    <DebugType>full</DebugType>\n    <PlatformTarget>x64</PlatformTarget>\n    <ErrorReport>prompt</ErrorReport>\n    <RunCodeAnalysis>true</RunCodeAnalysis>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|x64'\">\n    <OutputPath>bin\\x64\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <Optimize>true</Optimize>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>x64</PlatformTarget>\n    <ErrorReport>prompt</ErrorReport>\n    <RunCodeAnalysis>true</RunCodeAnalysis>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'\">\n    <DebugSymbols>true</DebugSymbols>\n    <OutputPath>bin\\AnyCPU\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>\n    <DebugType>full</DebugType>\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <ErrorReport>prompt</ErrorReport>\n    <RunCodeAnalysis>true</RunCodeAnalysis>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|AnyCPU'\">\n    <OutputPath>bin\\AnyCPU\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <Optimize>true</Optimize>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <ErrorReport>prompt</ErrorReport>\n    <RunCodeAnalysis>true</RunCodeAnalysis>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Drawing\" />\n    <Reference Include=\"System.IO.Compression.FileSystem\" />\n    <Reference Include=\"System.Windows.Forms\" />\n    <Reference Include=\"TWAIN\">\n      <SpecificVersion>False</SpecificVersion>\n      <HintPath>..\\..\\bin\\$(Platform)\\$(Configuration)\\TWAIN.dll</HintPath>\n    </Reference>\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"FormMain.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"FormMain.designer.cs\">\n      <DependentUpon>FormMain.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"terminal.cs\" />\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <EmbeddedResource Include=\"FormMain.resx\">\n      <DependentUpon>FormMain.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Properties\\Resources.resx\">\n      <Generator>ResXFileCodeGenerator</Generator>\n      <LastGenOutput>Resources.Designer.cs</LastGenOutput>\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n    <Compile Include=\"Properties\\Resources.Designer.cs\">\n      <AutoGen>True</AutoGen>\n      <DependentUpon>Resources.resx</DependentUpon>\n      <DesignTime>True</DesignTime>\n    </Compile>\n    <None Include=\"app.config\">\n      <SubType>Designer</SubType>\n    </None>\n    <None Include=\"Properties\\Settings.settings\">\n      <Generator>SettingsSingleFileGenerator</Generator>\n      <LastGenOutput>Settings.Designer.cs</LastGenOutput>\n    </None>\n    <Compile Include=\"Properties\\Settings.Designer.cs\">\n      <AutoGen>True</AutoGen>\n      <DependentUpon>Settings.settings</DependentUpon>\n      <DesignTimeSharedInput>True</DesignTimeSharedInput>\n    </Compile>\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\twaincs.csproj\">\n      <Project>{E00DEC90-0A85-47D5-B0E4-39940AF8C141}</Project>\n      <Name>twaincs</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <ItemGroup />\n  <Import Project=\"MsBuildAL1073WarningWorkaround.targets\" />\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <PropertyGroup>\n    <PostBuildEvent>echo Post-build actions...\nRMDIR /S /Q \"$(TargetDir)data\"\nXCOPY \"$(ProjectDir)data\" \"$(TargetDir)data\" /i /e /y /q\n</PostBuildEvent>\n  </PropertyGroup>\n  <PropertyGroup>\n    <PreBuildEvent>call \"$(ProjectDir)version.bat\"\nXCOPY \"$(ProjectDir)data\" \"$(TargetDir)data\" /i /e /y /q\ncd \"$(TargetDir)data\\..\"\npowershell Compress-Archive -Force \"$(ProjectDir)data\" \"$(ProjectDir)Properties/data.zip\"</PreBuildEvent>\n  </PropertyGroup>\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "twaincs/source/twaincscert/source/version.bat",
    "content": "::\n:: Grab our version info...\n::\nfor /f \"tokens=2 delims=^(^)\" %%a in ('type \"%~dp0%Properties\\AssemblyInfo.cs\" ^| find \"AssemblyFileVersion\"') do (\n  set VERSION=%%a\n)\n\n::\n:: Clean it up a little...\n::\nset VERSION=%VERSION:\"=%\n\n::\n:: Save it...\n::\necho %VERSION% > \"%~dp0%data\\version.txt\"\n"
  },
  {
    "path": "twaincs/source/twaincsscan/source/FormScan.Designer.cs",
    "content": "﻿namespace TWAINCSScan\r\n{\r\n    partial class FormScan\r\n    {\r\n        /// <summary>\r\n        /// Required designer variable.\r\n        /// </summary>\r\n        private System.ComponentModel.IContainer components = null;\r\n\r\n        #region Windows Form Designer generated code\r\n\r\n        /// <summary>\r\n        /// Required method for Designer support - do not modify\r\n        /// the contents of this method with the code editor.\r\n        /// </summary>\r\n        private void InitializeComponent()\r\n        {\r\n            this.m_pictureboxImage1 = new System.Windows.Forms.PictureBox();\r\n            this.m_buttonScan = new System.Windows.Forms.Button();\r\n            this.m_buttonSetup = new System.Windows.Forms.Button();\r\n            this.m_pictureboxImage2 = new System.Windows.Forms.PictureBox();\r\n            this.m_buttonClose = new System.Windows.Forms.Button();\r\n            this.m_buttonOpen = new System.Windows.Forms.Button();\r\n            this.m_buttonStop = new System.Windows.Forms.Button();\r\n            ((System.ComponentModel.ISupportInitialize)(this.m_pictureboxImage1)).BeginInit();\r\n            ((System.ComponentModel.ISupportInitialize)(this.m_pictureboxImage2)).BeginInit();\r\n            this.SuspendLayout();\r\n            // \r\n            // m_pictureboxImage1\r\n            // \r\n            this.m_pictureboxImage1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;\r\n            this.m_pictureboxImage1.Location = new System.Drawing.Point(13, 13);\r\n            this.m_pictureboxImage1.Name = \"m_pictureboxImage1\";\r\n            this.m_pictureboxImage1.Size = new System.Drawing.Size(335, 424);\r\n            this.m_pictureboxImage1.TabIndex = 0;\r\n            this.m_pictureboxImage1.TabStop = false;\r\n            // \r\n            // m_buttonScan\r\n            // \r\n            this.m_buttonScan.Location = new System.Drawing.Point(533, 453);\r\n            this.m_buttonScan.Name = \"m_buttonScan\";\r\n            this.m_buttonScan.Size = new System.Drawing.Size(75, 23);\r\n            this.m_buttonScan.TabIndex = 1;\r\n            this.m_buttonScan.Text = \"Scan\";\r\n            this.m_buttonScan.UseVisualStyleBackColor = true;\r\n            this.m_buttonScan.Click += new System.EventHandler(this.m_buttonScan_Click);\r\n            // \r\n            // m_buttonSetup\r\n            // \r\n            this.m_buttonSetup.Location = new System.Drawing.Point(452, 453);\r\n            this.m_buttonSetup.Name = \"m_buttonSetup\";\r\n            this.m_buttonSetup.Size = new System.Drawing.Size(75, 23);\r\n            this.m_buttonSetup.TabIndex = 3;\r\n            this.m_buttonSetup.Text = \"Setup...\";\r\n            this.m_buttonSetup.UseVisualStyleBackColor = true;\r\n            this.m_buttonSetup.Click += new System.EventHandler(this.m_buttonSetup_Click);\r\n            // \r\n            // m_pictureboxImage2\r\n            // \r\n            this.m_pictureboxImage2.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;\r\n            this.m_pictureboxImage2.Location = new System.Drawing.Point(354, 13);\r\n            this.m_pictureboxImage2.Name = \"m_pictureboxImage2\";\r\n            this.m_pictureboxImage2.Size = new System.Drawing.Size(335, 424);\r\n            this.m_pictureboxImage2.TabIndex = 4;\r\n            this.m_pictureboxImage2.TabStop = false;\r\n            // \r\n            // m_buttonClose\r\n            // \r\n            this.m_buttonClose.Location = new System.Drawing.Point(94, 453);\r\n            this.m_buttonClose.Name = \"m_buttonClose\";\r\n            this.m_buttonClose.Size = new System.Drawing.Size(75, 23);\r\n            this.m_buttonClose.TabIndex = 5;\r\n            this.m_buttonClose.Text = \"Close\";\r\n            this.m_buttonClose.UseVisualStyleBackColor = true;\r\n            this.m_buttonClose.Click += new System.EventHandler(this.m_buttonClose_Click);\r\n            // \r\n            // m_buttonOpen\r\n            // \r\n            this.m_buttonOpen.Location = new System.Drawing.Point(13, 453);\r\n            this.m_buttonOpen.Name = \"m_buttonOpen\";\r\n            this.m_buttonOpen.Size = new System.Drawing.Size(75, 23);\r\n            this.m_buttonOpen.TabIndex = 6;\r\n            this.m_buttonOpen.Text = \"Open...\";\r\n            this.m_buttonOpen.UseVisualStyleBackColor = true;\r\n            this.m_buttonOpen.Click += new System.EventHandler(this.m_buttonOpen_Click);\r\n            // \r\n            // m_buttonStop\r\n            // \r\n            this.m_buttonStop.Location = new System.Drawing.Point(614, 453);\r\n            this.m_buttonStop.Name = \"m_buttonStop\";\r\n            this.m_buttonStop.Size = new System.Drawing.Size(75, 23);\r\n            this.m_buttonStop.TabIndex = 7;\r\n            this.m_buttonStop.Text = \"Stop\";\r\n            this.m_buttonStop.UseVisualStyleBackColor = true;\r\n            this.m_buttonStop.Click += new System.EventHandler(this.m_buttonStop_Click);\r\n            // \r\n            // FormScan\r\n            // \r\n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\r\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r\n            this.ClientSize = new System.Drawing.Size(702, 488);\r\n            this.Controls.Add(this.m_buttonStop);\r\n            this.Controls.Add(this.m_buttonOpen);\r\n            this.Controls.Add(this.m_buttonClose);\r\n            this.Controls.Add(this.m_pictureboxImage2);\r\n            this.Controls.Add(this.m_buttonSetup);\r\n            this.Controls.Add(this.m_buttonScan);\r\n            this.Controls.Add(this.m_pictureboxImage1);\r\n            this.Name = \"FormScan\";\r\n            this.Text = \"TWAIN C# Scan\";\r\n            ((System.ComponentModel.ISupportInitialize)(this.m_pictureboxImage1)).EndInit();\r\n            ((System.ComponentModel.ISupportInitialize)(this.m_pictureboxImage2)).EndInit();\r\n            this.ResumeLayout(false);\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n        private System.Windows.Forms.PictureBox m_pictureboxImage1;\r\n        private System.Windows.Forms.Button m_buttonScan;\r\n        private System.Windows.Forms.Button m_buttonSetup;\r\n        private System.Windows.Forms.PictureBox m_pictureboxImage2;\r\n        private System.Windows.Forms.Button m_buttonClose;\r\n        private System.Windows.Forms.Button m_buttonOpen;\r\n        private System.Windows.Forms.Button m_buttonStop;\r\n    }\r\n}"
  },
  {
    "path": "twaincs/source/twaincsscan/source/FormScan.cs",
    "content": "﻿///////////////////////////////////////////////////////////////////////////////////////\r\n//\r\n// TWAINCSScan.FormScan\r\n//\r\n// This is the main class for the application.  We're showing how to select and\r\n// load a TWAIN driver.  How to configure it for a scan session, and how to capture\r\n// and display images.\r\n//\r\n// This (moreso than then TWAINCSTst) is designed to be a possible template for\r\n// developers looking to add TWAIN to their C# applications.  It's small, and it's\r\n// focused on the tasks needed to capture image data.\r\n//\r\n///////////////////////////////////////////////////////////////////////////////////////\r\n//  Author          Date            Version     Comment\r\n//  M.McLaughlin    21-May-2014     2.0.0.0     64-bit Linux\r\n//  M.McLaughlin    27-Feb-2014     1.1.0.0     ShowImage additions\r\n//  M.McLaughlin    21-Oct-2013     1.0.0.0     Initial Release\r\n///////////////////////////////////////////////////////////////////////////////////////\r\n//  Copyright (C) 2013-2019 Kodak Alaris Inc.\r\n//\r\n//  Permission is hereby granted, free of charge, to any person obtaining a\r\n//  copy of this software and associated documentation files (the \"Software\"),\r\n//  to deal in the Software without restriction, including without limitation\r\n//  the rights to use, copy, modify, merge, publish, distribute, sublicense,\r\n//  and/or sell copies of the Software, and to permit persons to whom the\r\n//  Software is furnished to do so, subject to the following conditions:\r\n//\r\n//  The above copyright notice and this permission notice shall be included in\r\n//  all copies or substantial portions of the Software.\r\n//\r\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\r\n//  THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\r\n//  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\r\n//  DEALINGS IN THE SOFTWARE.\r\n///////////////////////////////////////////////////////////////////////////////////////\r\n\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Diagnostics.CodeAnalysis;\r\nusing System.Drawing;\r\nusing System.Drawing.Drawing2D;\r\nusing System.Drawing.Imaging;\r\nusing System.IO;\r\nusing System.Runtime.InteropServices;\r\nusing System.Security.Permissions;\r\nusing System.Windows.Forms;\r\nusing TWAINWorkingGroup;\r\n\r\nnamespace TWAINCSScan\r\n{\r\n    /// <summary>\r\n    /// Our mainform for this application...\r\n    /// </summary>\r\n    public partial class FormScan : Form, IMessageFilter\r\n    {\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        // Public Methods...\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        #region Public Methods...\r\n\r\n        /// <summary>\r\n        /// Our constructor...\r\n        /// </summary>\r\n        public FormScan()\r\n        {\r\n            // Build our form...\r\n            InitializeComponent();\r\n\r\n            // Open the log in our working folder, and say hi...\r\n            TWAINWorkingGroup.Log.Open(\"TWAINCSScan\", \".\", 1);\r\n            TWAINWorkingGroup.Log.Info(\"TWAINCSScan v\" + System.Reflection.Assembly.GetEntryAssembly().GetName().Version.ToString());\r\n\r\n            // Init other stuff...\r\n            m_blIndicators = true;\r\n            m_blExit = false;\r\n            m_iUseBitmap = 0;\r\n            this.FormClosing += new FormClosingEventHandler(FormScan_FormClosing);\r\n\r\n            // Create our image capture object...\r\n            try\r\n            {\r\n                // Init stuff...\r\n                TWAIN.DeviceEventCallback deviceeventcallback = DeviceEventCallback;\r\n                TWAIN.ScanCallback scancallback = ScanCallbackTrigger;\r\n                TWAIN.RunInUiThreadDelegate runinuithreaddelegate = RunInUiThread;\r\n\r\n                // Instantiate TWAIN, and register ourselves...\r\n                m_twain = new TWAIN\r\n                (\r\n                    \"TWAIN Working Group\",\r\n                    \"TWAIN Open Source\",\r\n                    \"TWAIN CS Scan App\",\r\n                    (ushort)TWAIN.TWON_PROTOCOL.MAJOR,\r\n                    (ushort)TWAIN.TWON_PROTOCOL.MINOR,\r\n                    ((uint)TWAIN.DG.APP2 | (uint)TWAIN.DG.CONTROL | (uint)TWAIN.DG.IMAGE),\r\n                    TWAIN.TWCY.USA,\r\n                    \"TWAIN CS Scan App\",\r\n                    TWAIN.TWLG.ENGLISH_USA,\r\n                    2,\r\n                    4,\r\n                    false,\r\n                    false,\r\n                    deviceeventcallback,\r\n                    scancallback,\r\n                    runinuithreaddelegate,\r\n                    this.Handle\r\n                );\r\n            }\r\n            catch (Exception exception)\r\n            {\r\n                TWAINWorkingGroup.Log.Error(\"exception - \" + exception.Message);\r\n                m_twain = null;\r\n                m_blExit = true;\r\n                MessageBox.Show\r\n                (\r\n                    \"Unable to start, the most likely reason is that the TWAIN\\n\" +\r\n                    \"Data Source Manager is not installed on your system.\\n\\n\" +\r\n                    \"An internet search for 'TWAIN DSM' will locate it and once\\n\" +\r\n                    \"installed, you should be able to proceed.\\n\\n\" +\r\n                    \"You can also try the following link:\\n\" +\r\n                    \"http://sourceforge.net/projects/twain-dsm/\",\r\n                    \"Error Starting TWAIN CS Scan\"\r\n                );\r\n                return;\r\n            }\r\n\r\n            // Init our picture box...\r\n            InitImage();\r\n\r\n            // Prep for TWAIN events...\r\n            SetMessageFilter(true);\r\n\r\n            // Init our buttons...\r\n            SetButtons(EBUTTONSTATE.CLOSED);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Our scan callback event, used to drive the engine when scanning...\r\n        /// </summary>\r\n        public delegate void ScanCallbackEvent();\r\n\r\n        /// <summary>\r\n        /// Our event handler for the scan callback event.  This will be\r\n        /// called once by ScanCallbackTrigger on receipt of an event\r\n        /// like MSG_XFERREADY, and then will be reissued on every call\r\n        /// into ScanCallback until we're done and get back to state 4.\r\n        ///  \r\n        /// This helps to make sure we're always running in the context\r\n        /// of FormMain on Windows, which is critical if we want drivers\r\n        /// to work properly.  It also gives a way to break up the calls\r\n        /// so the message pump is still reponsive.\r\n        /// </summary>\r\n        /// <param name=\"sender\"></param>\r\n        /// <param name=\"e\"></param>\r\n        private void ScanCallbackEventHandler(object sender, EventArgs e)\r\n        {\r\n            ScanCallback((m_twain == null) ? true : (m_twain.GetState() <= TWAIN.STATE.S3));\r\n        }\r\n\r\n        /// <summary>\r\n        /// Rollback the TWAIN state to whatever is requested...\r\n        /// </summary>\r\n        /// <param name=\"a_state\"></param>\r\n        public void Rollback(TWAIN.STATE a_state)\r\n        {\r\n            TWAIN.TW_PENDINGXFERS twpendingxfers = default(TWAIN.TW_PENDINGXFERS);\r\n            TWAIN.TW_USERINTERFACE twuserinterface = default(TWAIN.TW_USERINTERFACE);\r\n            TWAIN.TW_IDENTITY twidentity = default(TWAIN.TW_IDENTITY);\r\n\r\n            // Make sure we have something to work with...\r\n            if (m_twain == null)\r\n            {\r\n                return;\r\n            }\r\n\r\n            // Walk the states, we don't care about the status returns.  Basically,\r\n            // these need to work, or we're guaranteed to hang...\r\n\r\n            // 7 --> 6\r\n            if ((m_twain.GetState() == TWAIN.STATE.S7) && (a_state < TWAIN.STATE.S7))\r\n            {\r\n                m_twain.DatPendingxfers(TWAIN.DG.CONTROL, TWAIN.MSG.ENDXFER, ref twpendingxfers);\r\n            }\r\n\r\n            // 6 --> 5\r\n            if ((m_twain.GetState() == TWAIN.STATE.S6) && (a_state < TWAIN.STATE.S6))\r\n            {\r\n                m_twain.DatPendingxfers(TWAIN.DG.CONTROL, TWAIN.MSG.RESET, ref twpendingxfers);\r\n            }\r\n\r\n            // 5 --> 4\r\n            if ((m_twain.GetState() == TWAIN.STATE.S5) && (a_state < TWAIN.STATE.S5))\r\n            {\r\n                m_twain.DatUserinterface(TWAIN.DG.CONTROL, TWAIN.MSG.DISABLEDS, ref twuserinterface);\r\n            }\r\n\r\n            // 4 --> 3\r\n            if ((m_twain.GetState() == TWAIN.STATE.S4) && (a_state < TWAIN.STATE.S4))\r\n            {\r\n                TWAIN.CsvToIdentity(ref twidentity, m_twain.GetDsIdentity());\r\n                m_twain.DatIdentity(TWAIN.DG.CONTROL, TWAIN.MSG.CLOSEDS, ref twidentity);\r\n            }\r\n\r\n            // 3 --> 2\r\n            if ((m_twain.GetState() == TWAIN.STATE.S3) && (a_state < TWAIN.STATE.S3))\r\n            {\r\n                m_twain.DatParent(TWAIN.DG.CONTROL, TWAIN.MSG.CLOSEDSM, ref m_intptrHwnd);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Monitor for DG_CONTROL / DAT_NULL / MSG_* stuff (ex MSG_XFERREADY), this\r\n        /// function is only triggered when SetMessageFilter() is called with 'true'...\r\n        /// </summary>\r\n        /// <param name=\"a_message\">Message to process</param>\r\n        /// <returns>Result of the processing</returns>\r\n        [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]\r\n        public bool PreFilterMessage(ref Message a_message)\r\n        {\r\n            if (m_twain != null)\r\n            {\r\n                return (m_twain.PreFilterMessage(a_message.HWnd, a_message.Msg, a_message.WParam, a_message.LParam));\r\n            }\r\n            return (true);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Turn message filtering on or off, we use this to capture stuff\r\n        /// like MSG_XFERREADY.  If it's off, then it's assumed we're getting\r\n        /// this info through DAT_CALLBACK2...\r\n        /// </summary>\r\n        /// <param name=\"a_blAdd\">True to turn it on</param>\r\n        public void SetMessageFilter(bool a_blAdd)\r\n        {\r\n            if (a_blAdd)\r\n            {\r\n                Application.AddMessageFilter(this);\r\n            }\r\n            else\r\n            {\r\n                Application.RemoveMessageFilter(this);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Restore a snapshot of driver values...\r\n        /// </summary>\r\n        /// <param name=\"a_szFile\">File to use to restore driver settings</param>\r\n        /// <returns>SUCCESS if the restore succeeded</returns>\r\n        [PermissionSet(SecurityAction.LinkDemand, Name = \"FullTrust\", Unrestricted = false)]\r\n        public TWAIN.STS RestoreSnapshot(string a_szFile)\r\n        {\r\n            TWAIN.STS sts;\r\n            byte[] abSettings;\r\n            UInt32 u32Length;\r\n            IntPtr intptrHandle;\r\n            string szCustomdsdata;\r\n            string szStatus;\r\n            CSV csv = new CSV();\r\n            TWAIN.TW_CAPABILITY twcapability;\r\n            TWAIN.TW_CUSTOMDSDATA twcustomdsdata;\r\n\r\n            // Reset the driver, we don't care if it succeeds or fails...\r\n            szStatus = \"\";\r\n            twcapability = default(TWAIN.TW_CAPABILITY);\r\n            m_twain.CsvToCapability(ref twcapability, ref szStatus, \"0,0,0\");\r\n            m_twain.DatCapability(TWAIN.DG.CONTROL, TWAIN.MSG.RESETALL, ref twcapability);\r\n\r\n            // Get the snapshot from a file...\r\n            FileStream filestream = null;\r\n            try\r\n            {\r\n                filestream = new FileStream(a_szFile, FileMode.Open);\r\n                u32Length = (UInt32)filestream.Length;\r\n                abSettings = new byte[u32Length];\r\n                filestream.Read(abSettings, 0, abSettings.Length);\r\n            }\r\n            finally\r\n            {\r\n                if (filestream != null)\r\n                {\r\n                    filestream.Dispose();\r\n                }\r\n            }\r\n\r\n            // Put it in an intptr...\r\n            intptrHandle = Marshal.AllocHGlobal((int)u32Length);\r\n            Marshal.Copy(abSettings, 0, intptrHandle, (int)u32Length);\r\n\r\n            // Set the snapshot, if possible...\r\n            csv.Add(u32Length.ToString());\r\n            csv.Add(intptrHandle.ToString());\r\n            szCustomdsdata = csv.Get();\r\n            twcustomdsdata = default(TWAIN.TW_CUSTOMDSDATA);\r\n            m_twain.CsvToCustomdsdata(ref twcustomdsdata, szCustomdsdata);\r\n            sts = m_twain.DatCustomdsdata(TWAIN.DG.CONTROL, TWAIN.MSG.SET, ref twcustomdsdata);\r\n\r\n            // Cleanup...\r\n            Marshal.FreeHGlobal(intptrHandle);\r\n\r\n            // All done...\r\n            return (sts);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Save a snapshot of the driver values...\r\n        /// </summary>\r\n        /// <param name=\"a_szFile\">File to receive driver settings</param>\r\n        /// <returns>SUCCESS if the restore succeeded</returns>\r\n        [PermissionSet(SecurityAction.LinkDemand, Name = \"FullTrust\", Unrestricted = false)]\r\n        public TWAIN.STS SaveSnapshot(string a_szFile)\r\n        {\r\n            TWAIN.STS sts;\r\n            TWAIN.TW_CUSTOMDSDATA twcustomdsdata;\r\n\r\n            // Test...\r\n            if ((a_szFile == null) || (a_szFile == \"\"))\r\n            {\r\n                return (TWAIN.STS.SUCCESS);\r\n            }\r\n\r\n            // Get a snapshot, if possible...\r\n            twcustomdsdata = default(TWAIN.TW_CUSTOMDSDATA);\r\n            sts = m_twain.DatCustomdsdata(TWAIN.DG.CONTROL, TWAIN.MSG.GET, ref twcustomdsdata);\r\n            if (sts != TWAIN.STS.SUCCESS)\r\n            {\r\n                TWAINWorkingGroup.Log.Error(\"DAT_CUSTOMDSDATA failed...\");\r\n                return (sts);\r\n            }\r\n\r\n            // Save the data to a file...\r\n            FileStream filestream = null;\r\n            try\r\n            {\r\n                IntPtr intptrInfo;\r\n                filestream = new FileStream(a_szFile, FileMode.Create);\r\n                byte[] abSettings = new byte[twcustomdsdata.InfoLength];\r\n                intptrInfo = m_twain.DsmMemLock(twcustomdsdata.hData);\r\n                Marshal.Copy(intptrInfo, abSettings, 0, (int)twcustomdsdata.InfoLength);\r\n                m_twain.DsmMemUnlock(twcustomdsdata.hData);\r\n                filestream.Write(abSettings, 0, abSettings.Length);\r\n            }\r\n            finally\r\n            {\r\n                if (filestream != null)\r\n                {\r\n                    filestream.Dispose();\r\n                }\r\n            }\r\n\r\n            // Free the memory...\r\n            m_twain.DsmMemFree(ref twcustomdsdata.hData);\r\n\r\n            // All done...\r\n            return (TWAIN.STS.SUCCESS);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Our callback for device events.  This is where we catch and\r\n        /// report that a device event has been detected.  Obviously,\r\n        /// we're not doing much with it.  A real application would\r\n        /// probably take some kind of action...\r\n        /// </summary>\r\n        /// <returns>TWAIN status</returns>\r\n        private TWAIN.STS DeviceEventCallback()\r\n        {\r\n            TWAIN.STS sts;\r\n            TWAIN.TW_DEVICEEVENT twdeviceevent;\r\n\r\n            // Drain the event queue...\r\n            while (true)\r\n            {\r\n                // Try to get an event...\r\n                twdeviceevent = default(TWAIN.TW_DEVICEEVENT);\r\n                sts = m_twain.DatDeviceevent(TWAIN.DG.CONTROL, TWAIN.MSG.GET, ref twdeviceevent);\r\n                if (sts != TWAIN.STS.SUCCESS)\r\n                {\r\n                    break;\r\n                }\r\n            }\r\n\r\n            // Return a status, in case we ever need it for anything...\r\n            return (TWAIN.STS.SUCCESS);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Our scanning callback function.  We appeal directly to the supporting\r\n        /// TWAIN object.  This way we don't have to maintain some kind of a loop\r\n        /// inside of the application, which is the source of most problems that\r\n        /// developers run into.\r\n        /// \r\n        /// While it looks scary at first, there's really not a lot going on in\r\n        /// here.  We do some sanity checks, we watch for certain kinds of events,\r\n        /// we support the four methods of transferring images, and we dump out\r\n        /// some meta-data about the transferred image.  However, because it does\r\n        /// look scary I dropped in some region pragmas to break things up...\r\n        /// </summary>\r\n        /// <param name=\"a_blClosing\">We're shutting down</param>\r\n        /// <returns>TWAIN status</returns>\r\n        private TWAIN.STS ScanCallbackTrigger(bool a_blClosing)\r\n        {\r\n            BeginInvoke(new MethodInvoker(delegate { ScanCallbackEventHandler(this, new EventArgs()); }));\r\n            return (TWAIN.STS.SUCCESS);\r\n        }\r\n        private TWAIN.STS ScanCallback(bool a_blClosing)\r\n        {\r\n            TWAIN.STS sts;\r\n\r\n            // Scoot...\r\n            if (m_twain == null)\r\n            {\r\n                return (TWAIN.STS.FAILURE);\r\n            }\r\n\r\n            // We're superfluous...\r\n            if (m_twain.GetState() <= TWAIN.STATE.S4)\r\n            {\r\n                return (TWAIN.STS.SUCCESS);\r\n            }\r\n\r\n            // We're leaving...\r\n            if (a_blClosing)\r\n            {\r\n                return (TWAIN.STS.SUCCESS);\r\n            }\r\n\r\n            // Do this in the right thread, we'll usually be in the\r\n            // right spot, save maybe on the first call...\r\n            if (this.InvokeRequired)\r\n            {\r\n                return\r\n                (\r\n                    (TWAIN.STS)Invoke\r\n                    (\r\n                        (Func<TWAIN.STS>)delegate\r\n                        {\r\n                            return (ScanCallback(a_blClosing));\r\n                        }\r\n                    )\r\n                );\r\n            }\r\n\r\n            // Handle DAT_NULL/MSG_XFERREADY...\r\n            if (m_twain.IsMsgXferReady() && !m_blXferReadySent)\r\n            {\r\n                m_blXferReadySent = true;\r\n\r\n                // Get the amount of memory needed...\r\n                m_twsetupmemxfer = default(TWAIN.TW_SETUPMEMXFER);\r\n                sts = m_twain.DatSetupmemxfer(TWAIN.DG.CONTROL, TWAIN.MSG.GET, ref m_twsetupmemxfer);\r\n                if ((sts != TWAIN.STS.SUCCESS) || (m_twsetupmemxfer.Preferred == 0))\r\n                {\r\n                    m_blXferReadySent = false;\r\n                    if (!m_blDisableDsSent)\r\n                    {\r\n                        m_blDisableDsSent = true;\r\n                        Rollback(TWAIN.STATE.S4);\r\n                    }\r\n                }\r\n\r\n                // Allocate the transfer memory (with a little extra to protect ourselves)...\r\n                m_intptrXfer = Marshal.AllocHGlobal((int)m_twsetupmemxfer.Preferred + 65536);\r\n                if (m_intptrXfer == IntPtr.Zero)\r\n                {\r\n                    m_blDisableDsSent = true;\r\n                    Rollback(TWAIN.STATE.S4);\r\n                }\r\n            }\r\n\r\n            // Handle DAT_NULL/MSG_CLOSEDSREQ...\r\n            if (m_twain.IsMsgCloseDsReq() && !m_blDisableDsSent)\r\n            {\r\n                m_blDisableDsSent = true;\r\n                Rollback(TWAIN.STATE.S4);\r\n                SetButtons(EBUTTONSTATE.OPEN);\r\n            }\r\n\r\n            // Handle DAT_NULL/MSG_CLOSEDSOK...\r\n            if (m_twain.IsMsgCloseDsOk() && !m_blDisableDsSent)\r\n            {\r\n                m_blDisableDsSent = true;\r\n                Rollback(TWAIN.STATE.S4);\r\n                SetButtons(EBUTTONSTATE.OPEN);\r\n            }\r\n\r\n            // This is where the state machine transfers and optionally\r\n            // saves the images to disk (it also displays them).  It'll go back\r\n            // and forth between states 6 and 7 until an error occurs, or until\r\n            // we run out of images...\r\n            if (m_blXferReadySent && !m_blDisableDsSent)\r\n            {\r\n                CaptureImages();\r\n            }\r\n\r\n            // Trigger the next event, this is where things all chain together.\r\n            // We need begininvoke to prevent blockking, so that we don't get\r\n            // backed up into a messy kind of recursion.  We need DoEvents,\r\n            // because if things really start moving fast it's really hard for\r\n            // application events, like button clicks to break through...\r\n            Application.DoEvents();\r\n            BeginInvoke(new MethodInvoker(delegate { ScanCallbackEventHandler(this, new EventArgs()); }));\r\n\r\n            // All done...\r\n            return (TWAIN.STS.SUCCESS);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Go through the sequence needed to capture images...\r\n        /// </summary>\r\n        private void CaptureImages()\r\n        {\r\n            TWAIN.STS sts;\r\n            TWAIN.TW_IMAGEINFO twimageinfo = default(TWAIN.TW_IMAGEINFO);\r\n            TWAIN.TW_IMAGEMEMXFER twimagememxfer = default(TWAIN.TW_IMAGEMEMXFER);\r\n            TWAIN.TW_PENDINGXFERS twpendingxfers = default(TWAIN.TW_PENDINGXFERS);\r\n            TWAIN.TW_USERINTERFACE twuserinterface = default(TWAIN.TW_USERINTERFACE);\r\n\r\n            // Dispatch on the state...\r\n            switch (m_twain.GetState())\r\n            {\r\n                // Not a good state, just scoot...\r\n                default:\r\n                    return;\r\n\r\n                // We're on our way out...\r\n                case TWAIN.STATE.S5:\r\n                    m_blDisableDsSent = true;\r\n                    m_twain.DatUserinterface(TWAIN.DG.CONTROL, TWAIN.MSG.DISABLEDS, ref twuserinterface);\r\n                    SetButtons(EBUTTONSTATE.OPEN);\r\n                    return;\r\n\r\n                // Memory transfers...\r\n                case TWAIN.STATE.S6:\r\n                case TWAIN.STATE.S7:\r\n                    TWAIN.CsvToImagememxfer(ref twimagememxfer, \"0,0,0,0,0,0,0,\" + ((int)TWAIN.TWMF.APPOWNS | (int)TWAIN.TWMF.POINTER) + \",\" + m_twsetupmemxfer.Preferred + \",\" + m_intptrXfer);\r\n                    sts = m_twain.DatImagememxfer(TWAIN.DG.IMAGE, TWAIN.MSG.GET, ref twimagememxfer);\r\n                    break;\r\n            }\r\n\r\n            // Handle problems...\r\n            if ((sts != TWAIN.STS.SUCCESS) && (sts != TWAIN.STS.XFERDONE))\r\n            {\r\n                m_blDisableDsSent = true;\r\n                Rollback(TWAIN.STATE.S4);\r\n                SetButtons(EBUTTONSTATE.OPEN);\r\n                return;\r\n            }\r\n\r\n            // Allocate or grow the image memory...\r\n            if (m_intptrImage == IntPtr.Zero)\r\n            {\r\n                m_intptrImage = Marshal.AllocHGlobal((int)twimagememxfer.BytesWritten);\r\n            }\r\n            else\r\n            {\r\n                m_intptrImage = Marshal.ReAllocHGlobal(m_intptrImage, (IntPtr)(m_iImageBytes + twimagememxfer.BytesWritten));\r\n            }\r\n\r\n            // Ruh-roh...\r\n            if (m_intptrImage == IntPtr.Zero)\r\n            {\r\n                m_blDisableDsSent = true;\r\n                Rollback(TWAIN.STATE.S4);\r\n                SetButtons(EBUTTONSTATE.OPEN);\r\n                return;\r\n            }\r\n\r\n            // Copy into the buffer, and bump up our byte tally...\r\n            TWAIN.MemCpy(m_intptrImage + m_iImageBytes, m_intptrXfer, (int)twimagememxfer.BytesWritten);\r\n            m_iImageBytes += (int)twimagememxfer.BytesWritten;\r\n\r\n            // If we saw XFERDONE we can save the image, display it,\r\n            // end the transfer, and see if we have more images...\r\n            if (sts == TWAIN.STS.XFERDONE)\r\n            {\r\n                // Bump up our image counter, this always grows for the\r\n                // life of the entire session...\r\n                m_iImageCount += 1;\r\n\r\n                // Get the image info...\r\n                sts = m_twain.DatImageinfo(TWAIN.DG.IMAGE, TWAIN.MSG.GET, ref twimageinfo);\r\n\r\n                // Add the appropriate header...\r\n\r\n                // Bitonal uncompressed...\r\n                if (((TWAIN.TWPT)twimageinfo.PixelType == TWAIN.TWPT.BW) && ((TWAIN.TWCP)twimageinfo.Compression == TWAIN.TWCP.NONE))\r\n                {\r\n                    TWAIN.TiffBitonalUncompressed tiffbitonaluncompressed;\r\n                    tiffbitonaluncompressed = new TWAIN.TiffBitonalUncompressed((uint)twimageinfo.ImageWidth, (uint)twimageinfo.ImageLength, (uint)twimageinfo.XResolution.Whole, (uint)m_iImageBytes);\r\n                    m_intptrImage = Marshal.ReAllocHGlobal(m_intptrImage, (IntPtr)(Marshal.SizeOf(tiffbitonaluncompressed) + m_iImageBytes));\r\n                    TWAIN.MemMove((IntPtr)((UInt64)m_intptrImage + (UInt64)Marshal.SizeOf(tiffbitonaluncompressed)), m_intptrImage, m_iImageBytes);\r\n                    Marshal.StructureToPtr(tiffbitonaluncompressed, m_intptrImage, true);\r\n                    m_iImageBytes += (int)Marshal.SizeOf(tiffbitonaluncompressed);\r\n                }\r\n\r\n                // Bitonal GROUP4...\r\n                else if (((TWAIN.TWPT)twimageinfo.PixelType == TWAIN.TWPT.BW) && ((TWAIN.TWCP)twimageinfo.Compression == TWAIN.TWCP.GROUP4))\r\n                {\r\n                    TWAIN.TiffBitonalG4 tiffbitonalg4;\r\n                    tiffbitonalg4 = new TWAIN.TiffBitonalG4((uint)twimageinfo.ImageWidth, (uint)twimageinfo.ImageLength, (uint)twimageinfo.XResolution.Whole, (uint)m_iImageBytes);\r\n                    m_intptrImage = Marshal.ReAllocHGlobal(m_intptrImage, (IntPtr)(Marshal.SizeOf(tiffbitonalg4) + m_iImageBytes));\r\n                    TWAIN.MemMove((IntPtr)((UInt64)m_intptrImage + (UInt64)Marshal.SizeOf(tiffbitonalg4)), m_intptrImage, m_iImageBytes);\r\n                    Marshal.StructureToPtr(tiffbitonalg4, m_intptrImage, true);\r\n                    m_iImageBytes += (int)Marshal.SizeOf(tiffbitonalg4);\r\n                }\r\n\r\n                // Gray uncompressed...\r\n                else if (((TWAIN.TWPT)twimageinfo.PixelType == TWAIN.TWPT.GRAY) && ((TWAIN.TWCP)twimageinfo.Compression == TWAIN.TWCP.NONE))\r\n                {\r\n                    TWAIN.TiffGrayscaleUncompressed tiffgrayscaleuncompressed;\r\n                    tiffgrayscaleuncompressed = new TWAIN.TiffGrayscaleUncompressed((uint)twimageinfo.ImageWidth, (uint)twimageinfo.ImageLength, (uint)twimageinfo.XResolution.Whole, (uint)m_iImageBytes);\r\n                    m_intptrImage = Marshal.ReAllocHGlobal(m_intptrImage, (IntPtr)(Marshal.SizeOf(tiffgrayscaleuncompressed) + m_iImageBytes));\r\n                    TWAIN.MemMove((IntPtr)((UInt64)m_intptrImage + (UInt64)Marshal.SizeOf(tiffgrayscaleuncompressed)), m_intptrImage, m_iImageBytes);\r\n                    Marshal.StructureToPtr(tiffgrayscaleuncompressed, m_intptrImage, true);\r\n                    m_iImageBytes += (int)Marshal.SizeOf(tiffgrayscaleuncompressed);\r\n                }\r\n\r\n                // Gray JPEG...\r\n                else if (((TWAIN.TWPT)twimageinfo.PixelType == TWAIN.TWPT.GRAY) && ((TWAIN.TWCP)twimageinfo.Compression == TWAIN.TWCP.JPEG))\r\n                {\r\n                    // No work to be done, we'll output JPEG...\r\n                }\r\n\r\n                // RGB uncompressed...\r\n                else if (((TWAIN.TWPT)twimageinfo.PixelType == TWAIN.TWPT.RGB) && ((TWAIN.TWCP)twimageinfo.Compression == TWAIN.TWCP.NONE))\r\n                {\r\n                    TWAIN.TiffColorUncompressed tiffcoloruncompressed;\r\n                    tiffcoloruncompressed = new TWAIN.TiffColorUncompressed((uint)twimageinfo.ImageWidth, (uint)twimageinfo.ImageLength, (uint)twimageinfo.XResolution.Whole, (uint)m_iImageBytes);\r\n                    m_intptrImage = Marshal.ReAllocHGlobal(m_intptrImage, (IntPtr)(Marshal.SizeOf(tiffcoloruncompressed) + m_iImageBytes));\r\n                    TWAIN.MemMove((IntPtr)((UInt64)m_intptrImage + (UInt64)Marshal.SizeOf(tiffcoloruncompressed)), m_intptrImage, m_iImageBytes);\r\n                    Marshal.StructureToPtr(tiffcoloruncompressed, m_intptrImage, true);\r\n                    m_iImageBytes += (int)Marshal.SizeOf(tiffcoloruncompressed);\r\n                }\r\n\r\n                // RGB JPEG...\r\n                else if (((TWAIN.TWPT)twimageinfo.PixelType == TWAIN.TWPT.RGB) && ((TWAIN.TWCP)twimageinfo.Compression == TWAIN.TWCP.JPEG))\r\n                {\r\n                    // No work to be done, we'll output JPEG...\r\n                }\r\n\r\n                // Oh well...\r\n                else\r\n                {\r\n                    TWAINWorkingGroup.Log.Error(\"unsupported format <\" + twimageinfo.PixelType + \",\" + twimageinfo.Compression + \">\");\r\n                    m_blDisableDsSent = true;\r\n                    Rollback(TWAIN.STATE.S4);\r\n                    SetButtons(EBUTTONSTATE.OPEN);\r\n                    return;\r\n                }\r\n\r\n                // Save the image to disk, if we're doing that...\r\n                if (!string.IsNullOrEmpty(m_formsetup.GetImageFolder()))\r\n                {\r\n                    // Create the directory, if needed...\r\n                    if (!Directory.Exists(m_formsetup.GetImageFolder()))\r\n                    {\r\n                        try\r\n                        {\r\n                            Directory.CreateDirectory(m_formsetup.GetImageFolder());\r\n                        }\r\n                        catch (Exception exception)\r\n                        {\r\n                            TWAINWorkingGroup.Log.Error(\"CreateDirectory failed - \" + exception.Message);\r\n                        }\r\n                    }\r\n\r\n                    // Write it out...\r\n                    string szFilename = Path.Combine(m_formsetup.GetImageFolder(), \"img\" + string.Format(\"{0:D6}\", m_iImageCount));\r\n                    TWAIN.WriteImageFile(szFilename, m_intptrImage, m_iImageBytes, out szFilename);\r\n                }\r\n\r\n                // Turn the image into a byte array, and free the original memory...\r\n                byte[] abImage = new byte[m_iImageBytes];\r\n                Marshal.Copy(m_intptrImage, abImage, 0, m_iImageBytes);\r\n                Marshal.FreeHGlobal(m_intptrImage);\r\n                m_intptrImage = IntPtr.Zero;\r\n                m_iImageBytes = 0;\r\n\r\n                // Turn the byte array into a stream...\r\n                MemoryStream memorystream = new MemoryStream(abImage);\r\n                Bitmap bitmap = (Bitmap)Image.FromStream(memorystream);\r\n\r\n                // Display the image...\r\n                if (m_iUseBitmap == 0)\r\n                {\r\n                    m_iUseBitmap = 1;\r\n                    LoadImage(ref m_pictureboxImage1, ref m_graphics1, ref m_bitmapGraphic1, bitmap);\r\n                }\r\n                else\r\n                {\r\n                    m_iUseBitmap = 0;\r\n                    LoadImage(ref m_pictureboxImage2, ref m_graphics2, ref m_bitmapGraphic2, bitmap);\r\n                }\r\n\r\n                // Cleanup...\r\n                bitmap.Dispose();\r\n                memorystream = null; // disposed by the bitmap\r\n                abImage = null;\r\n\r\n                // End the transfer...\r\n                m_twain.DatPendingxfers(TWAIN.DG.CONTROL, TWAIN.MSG.ENDXFER, ref twpendingxfers);\r\n\r\n                // Looks like we're done!\r\n                if (twpendingxfers.Count == 0)\r\n                {\r\n                    m_blDisableDsSent = true;\r\n                    m_twain.DatUserinterface(TWAIN.DG.CONTROL, TWAIN.MSG.DISABLEDS, ref twuserinterface);\r\n                    SetButtons(EBUTTONSTATE.OPEN);\r\n                    return;\r\n                }\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Clean up any resources being used.\r\n        /// </summary>\r\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\r\n        [SuppressMessage(\"Microsoft.Security\", \"CA2123:OverrideLinkDemandsShouldBeIdenticalToBase\")]\r\n        [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]\r\n        protected override void Dispose(bool disposing)\r\n        {\r\n            if (disposing && (components != null))\r\n            {\r\n                if (m_twain != null)\r\n                {\r\n                    m_twain.Dispose();\r\n                    m_twain = null;\r\n                }\r\n                if (m_bitmapGraphic1 != null)\r\n                {\r\n                    m_bitmapGraphic1.Dispose();\r\n                    m_bitmapGraphic1 = null;\r\n                }\r\n                if (m_bitmapGraphic2 != null)\r\n                {\r\n                    m_bitmapGraphic2.Dispose();\r\n                    m_bitmapGraphic2 = null;\r\n                }\r\n                if (m_brushBackground != null)\r\n                {\r\n                    m_brushBackground.Dispose();\r\n                    m_brushBackground = null;\r\n                }\r\n                components.Dispose();\r\n            }\r\n            base.Dispose(disposing);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Something horrible has happened and we need to abort...\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public bool ExitRequested()\r\n        {\r\n            return (m_blExit);\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        // Private Methods, this includes our callback \"ReportImage\"...\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        #region Private Methods...\r\n\r\n\r\n        /// <summary>\r\n        /// We're being closed, clean up nicely...\r\n        /// </summary>\r\n        /// <param name=\"sender\"></param>\r\n        /// <param name=\"e\"></param>\r\n        private void FormScan_FormClosing(object sender, FormClosingEventArgs e)\r\n        {\r\n            // Make sure this thing is off...\r\n            SetMessageFilter(false);\r\n\r\n            // Get rid of the TWAIN object...\r\n            if (m_twain != null)\r\n            {\r\n                m_twain.Dispose();\r\n                m_twain = null;\r\n            }\r\n\r\n            // This will prevent ReportImage from doing anything as we close...\r\n            m_graphics1 = null;\r\n\r\n            // Bye-bye logging...\r\n            TWAINWorkingGroup.Log.Close();\r\n        }\r\n\r\n        /// <summary>\r\n        /// The user wants to setup a customdsdata or a scan session...\r\n        /// </summary>\r\n        /// <param name=\"sender\"></param>\r\n        /// <param name=\"e\"></param>\r\n        private void m_buttonSetup_Click(object sender, EventArgs e)\r\n        {\r\n            m_formsetup.StartPosition = FormStartPosition.CenterParent;\r\n            m_formsetup.ShowDialog(this);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Start a scan session...\r\n        /// </summary>\r\n        /// <param name=\"sender\"></param>\r\n        /// <param name=\"e\"></param>\r\n        private void m_buttonScan_Click(object sender, EventArgs e)\r\n        {\r\n            m_iUseBitmap = 0;\r\n            string szTwmemref;\r\n            TWAIN.STS sts;\r\n\r\n            // Silently start scanning if we detect that customdsdata is supported,\r\n            // otherwise bring up the driver GUI so the user can change settings...\r\n            if (m_formsetup.IsCustomDsDataSupported())\r\n            {\r\n                szTwmemref = \"FALSE,FALSE,\" + this.Handle;\r\n            }\r\n            else\r\n            {\r\n                szTwmemref = \"TRUE,FALSE,\" + this.Handle;\r\n            }\r\n\r\n            // Send the command...\r\n            ClearEvents();\r\n            TWAIN.TW_USERINTERFACE twuserinterface = default(TWAIN.TW_USERINTERFACE);\r\n            m_twain.CsvToUserinterface(ref twuserinterface, szTwmemref);\r\n            sts = m_twain.DatUserinterface(TWAIN.DG.CONTROL, TWAIN.MSG.ENABLEDS, ref twuserinterface);\r\n            if (sts == TWAIN.STS.SUCCESS)\r\n            {\r\n                SetButtons(EBUTTONSTATE.SCANNING);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Clear our event list, and reset our event...\r\n        /// </summary>\r\n\r\n        public void ClearEvents()\r\n        {\r\n            m_blXferReadySent = false;\r\n            m_blDisableDsSent = false;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Debugging output that we can monitor, this is just a place\r\n        /// holder for this particular application...\r\n        /// </summary>\r\n        /// <param name=\"a_szOutput\"></param>\r\n        private void WriteOutput(string a_szOutput)\r\n        {\r\n            return;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Load an image into a picture box, maintain its aspect ratio...\r\n        /// </summary>\r\n        /// <param name=\"a_picturebox\"></param>\r\n        /// <param name=\"a_graphics\"></param>\r\n        /// <param name=\"a_bitmapGraphic\"></param>\r\n        /// <param name=\"a_bitmap\"></param>\r\n        private void LoadImage(ref PictureBox a_picturebox, ref Graphics a_graphics, ref Bitmap a_bitmapGraphic, Bitmap a_bitmap)\r\n        {\r\n            // We want to maintain the aspect ratio...\r\n            double fRatioWidth = (double)a_bitmapGraphic.Size.Width / (double)a_bitmap.Width;\r\n            double fRatioHeight = (double)a_bitmapGraphic.Size.Height / (double)a_bitmap.Height;\r\n            double fRatio = (fRatioWidth < fRatioHeight) ? fRatioWidth : fRatioHeight;\r\n            int iWidth = (int)(a_bitmap.Width * fRatio);\r\n            int iHeight = (int)(a_bitmap.Height * fRatio);\r\n\r\n            // Display the image...\r\n            a_graphics.FillRectangle(m_brushBackground, m_rectangleBackground);\r\n            a_graphics.DrawImage(a_bitmap, new Rectangle(((int)a_bitmapGraphic.Width - iWidth) / 2, ((int)a_bitmapGraphic.Height - iHeight) / 2, iWidth, iHeight));\r\n            a_picturebox.Image = a_bitmapGraphic;\r\n            a_picturebox.Update();\r\n        }\r\n\r\n        /// <summary>\r\n        /// Initialize the picture boxes and the graphics to support them, we're\r\n        /// doing this to maximize performance during scanner...\r\n        /// </summary>\r\n        private void InitImage()\r\n        {\r\n            // Make sure our picture boxes don't do much work...\r\n            m_pictureboxImage1.SizeMode = PictureBoxSizeMode.Normal;\r\n            m_pictureboxImage2.SizeMode = PictureBoxSizeMode.Normal;\r\n\r\n            m_bitmapGraphic1 = new Bitmap(m_pictureboxImage1.Width, m_pictureboxImage1.Height, PixelFormat.Format32bppPArgb);\r\n            m_graphics1 = Graphics.FromImage(m_bitmapGraphic1);\r\n            m_graphics1.CompositingMode = CompositingMode.SourceCopy;\r\n            m_graphics1.CompositingQuality = CompositingQuality.HighSpeed;\r\n            m_graphics1.InterpolationMode = InterpolationMode.Low;\r\n            m_graphics1.PixelOffsetMode = PixelOffsetMode.HighSpeed;\r\n            m_graphics1.SmoothingMode = SmoothingMode.HighSpeed;\r\n\r\n            m_bitmapGraphic2 = new Bitmap(m_pictureboxImage1.Width, m_pictureboxImage1.Height, PixelFormat.Format32bppPArgb);\r\n            m_graphics2 = Graphics.FromImage(m_bitmapGraphic2);\r\n            m_graphics2.CompositingMode = CompositingMode.SourceCopy;\r\n            m_graphics2.CompositingQuality = CompositingQuality.HighSpeed;\r\n            m_graphics2.InterpolationMode = InterpolationMode.Low;\r\n            m_graphics2.PixelOffsetMode = PixelOffsetMode.HighSpeed;\r\n            m_graphics2.SmoothingMode = SmoothingMode.HighSpeed;\r\n\r\n            m_brushBackground = new SolidBrush(Color.White);\r\n            m_rectangleBackground = new Rectangle(0, 0, m_bitmapGraphic1.Width, m_bitmapGraphic1.Height);\r\n        }\r\n\r\n        /// <summary>\r\n        /// TWAIN needs help, if we want it to run stuff in our main\r\n        /// UI thread...\r\n        /// </summary>\r\n        /// <param name=\"code\">the code to run</param>\r\n        private void RunInUiThread(Action a_action)\r\n        {\r\n            RunInUiThread(this, a_action);\r\n        }\r\n\r\n        /// <summary>\r\n        /// TWAIN needs help, if we want it to run stuff in our main\r\n        /// UI thread...\r\n        /// </summary>\r\n        /// <param name=\"control\">the control to run in</param>\r\n        /// <param name=\"code\">the code to run</param>\r\n        static public void RunInUiThread(Object a_object, Action a_action)\r\n        {\r\n            Control control = (Control)a_object;\r\n            if (control.InvokeRequired)\r\n            {\r\n                control.Invoke(new FormScan.RunInUiThreadDelegate(RunInUiThread), new object[] { a_object, a_action });\r\n                return;\r\n            }\r\n            a_action();\r\n        }\r\n\r\n        /// <summary>\r\n        /// Configure our buttons to match our current state...\r\n        /// </summary>\r\n        /// <param name=\"a_ebuttonstate\"></param>\r\n        private void SetButtons(EBUTTONSTATE a_ebuttonstate)\r\n        {\r\n            switch (a_ebuttonstate)\r\n            {\r\n                default:\r\n                case EBUTTONSTATE.CLOSED:\r\n                    m_buttonOpen.Enabled = true;\r\n                    m_buttonClose.Enabled = false;\r\n                    m_buttonSetup.Enabled = false;\r\n                    m_buttonScan.Enabled = false;\r\n                    m_buttonStop.Enabled = false;\r\n                    break;\r\n\r\n                case EBUTTONSTATE.OPEN:\r\n                    m_buttonOpen.Enabled = false;\r\n                    m_buttonClose.Enabled = true;\r\n                    m_buttonSetup.Enabled = true;\r\n                    m_buttonScan.Enabled = true;\r\n                    m_buttonStop.Enabled = false;\r\n                    break;\r\n\r\n                case EBUTTONSTATE.SCANNING:\r\n                    m_buttonOpen.Enabled = false;\r\n                    m_buttonClose.Enabled = false;\r\n                    m_buttonSetup.Enabled = false;\r\n                    m_buttonScan.Enabled = false;\r\n                    m_buttonStop.Enabled = true;\r\n                    break;\r\n            }\r\n        }\r\n\r\n\r\n        /// <summary>\r\n        /// Select and open a TWAIN driver...\r\n        /// </summary>\r\n        /// <param name=\"sender\"></param>\r\n        /// <param name=\"e\"></param>\r\n        private void m_buttonOpen_Click(object sender, EventArgs e)\r\n        {\r\n            string szIdentity;\r\n            string szDefault = \"\";\r\n            string szStatus;\r\n            List<string> lszIdentity = new List<string>();\r\n            FormSelect formselect;\r\n            DialogResult dialogresult;\r\n            TWAIN.STS sts;\r\n            TWAIN.TW_CAPABILITY twcapability;\r\n            TWAIN.TW_IDENTITY twidentity = default(TWAIN.TW_IDENTITY);\r\n\r\n            // Get the default driver...\r\n            m_intptrHwnd = this.Handle;\r\n            sts = m_twain.DatParent(TWAIN.DG.CONTROL, TWAIN.MSG.OPENDSM, ref m_intptrHwnd);\r\n            if (sts != TWAIN.STS.SUCCESS)\r\n            {\r\n                MessageBox.Show(\"OPENDSM failed...\");\r\n                return;\r\n            }\r\n\r\n            // Get the default driver...\r\n            sts = m_twain.DatIdentity(TWAIN.DG.CONTROL, TWAIN.MSG.GETDEFAULT, ref twidentity);\r\n            if (sts == TWAIN.STS.SUCCESS)\r\n            {\r\n                szDefault = TWAIN.IdentityToCsv(twidentity);\r\n            }\r\n\r\n            // Enumerate the drivers...\r\n            for (sts = m_twain.DatIdentity(TWAIN.DG.CONTROL, TWAIN.MSG.GETFIRST, ref twidentity);\r\n                 sts != TWAIN.STS.ENDOFLIST;\r\n                 sts = m_twain.DatIdentity(TWAIN.DG.CONTROL, TWAIN.MSG.GETNEXT, ref twidentity))\r\n            {               \r\n                lszIdentity.Add(TWAIN.IdentityToCsv(twidentity));\r\n            }\r\n\r\n            // Ruh-roh...\r\n            if (lszIdentity.Count == 0)\r\n            {\r\n                MessageBox.Show(\"There are no TWAIN drivers installed on this system...\");\r\n                return;\r\n            }\r\n\r\n            // Instantiate our form...\r\n            formselect = new FormSelect(lszIdentity, szDefault);\r\n            formselect.StartPosition = FormStartPosition.CenterParent;\r\n            dialogresult = formselect.ShowDialog(this);\r\n            if (dialogresult != System.Windows.Forms.DialogResult.OK)\r\n            {\r\n                m_blExit = true;\r\n                return;\r\n            }\r\n\r\n            // Get all the identities...\r\n            szIdentity = formselect.GetSelectedDriver();\r\n            if (szIdentity == null)\r\n            {\r\n                m_blExit = true;\r\n                return;\r\n            }\r\n\r\n            // Get the selected identity...\r\n            m_blExit = true;\r\n            foreach (string sz in lszIdentity)\r\n            {\r\n                if (sz.Contains(szIdentity))\r\n                {\r\n                    m_blExit = false;\r\n                    szIdentity = sz;\r\n                    break;\r\n                }\r\n            }\r\n            if (m_blExit)\r\n            {\r\n                return;\r\n            }\r\n\r\n            // Make it the default, we don't care if this succeeds...\r\n            twidentity = default(TWAIN.TW_IDENTITY);\r\n            TWAIN.CsvToIdentity(ref twidentity, szIdentity);\r\n            m_twain.DatIdentity(TWAIN.DG.CONTROL, TWAIN.MSG.SET, ref twidentity);\r\n\r\n            // Open it...\r\n            sts = m_twain.DatIdentity(TWAIN.DG.CONTROL, TWAIN.MSG.OPENDS, ref twidentity);\r\n            if (sts != TWAIN.STS.SUCCESS)\r\n            {\r\n                MessageBox.Show(\"Unable to open scanner (it is turned on and plugged in?)\");\r\n                m_blExit = true;\r\n                return;\r\n            }\r\n\r\n            // Update the main form title...\r\n            this.Text = \"TWAIN C# Scan (\" + twidentity.ProductName.Get() + \")\";\r\n\r\n            // Strip off unsafe chars.  Sadly, mono let's us down here...\r\n            m_szProductDirectory = CSV.Parse(szIdentity)[11];\r\n            foreach (char c in new char [41]\r\n                            { '\\x00', '\\x01', '\\x02', '\\x03', '\\x04', '\\x05', '\\x06', '\\x07',\r\n                              '\\x08', '\\x09', '\\x0A', '\\x0B', '\\x0C', '\\x0D', '\\x0E', '\\x0F', '\\x10', '\\x11', '\\x12', \r\n                              '\\x13', '\\x14', '\\x15', '\\x16', '\\x17', '\\x18', '\\x19', '\\x1A', '\\x1B', '\\x1C', '\\x1D', \r\n                              '\\x1E', '\\x1F', '\\x22', '\\x3C', '\\x3E', '\\x7C', ':', '*', '?', '\\\\', '/'\r\n                            }\r\n                    )\r\n            {\r\n                m_szProductDirectory = m_szProductDirectory.Replace(c, '_');\r\n            }\r\n\r\n            // We're doing memory transfers...\r\n            szStatus = \"\";\r\n            twcapability = default(TWAIN.TW_CAPABILITY);\r\n            m_twain.CsvToCapability(ref twcapability, ref szStatus, \"ICAP_XFERMECH,TWON_ONEVALUE,TWTY_UINT16,TWSX_MEMORY\");\r\n            sts = m_twain.DatCapability(TWAIN.DG.CONTROL, TWAIN.MSG.SET, ref twcapability);\r\n            if (sts != TWAIN.STS.SUCCESS)\r\n            {\r\n                m_blExit = true;\r\n                return;\r\n            }\r\n\r\n            // Decide whether or not to show the driver's window messages...\r\n            szStatus = \"\";\r\n            twcapability = default(TWAIN.TW_CAPABILITY);\r\n            m_twain.CsvToCapability(ref twcapability, ref szStatus, \"CAP_INDICATORS,TWON_ONEVALUE,TWTY_BOOL,\" + (m_blIndicators ? \"TRUE\" : \"FALSE\"));\r\n            sts = m_twain.DatCapability(TWAIN.DG.CONTROL, TWAIN.MSG.SET, ref twcapability);\r\n            if (sts != TWAIN.STS.SUCCESS)\r\n            {\r\n                m_blExit = true;\r\n                return;\r\n            }\r\n\r\n            // New state...\r\n            SetButtons(EBUTTONSTATE.OPEN);\r\n\r\n            // Create the setup form...\r\n            m_formsetup = new FormSetup(this, ref m_twain, m_szProductDirectory);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Close the currently open TWAIN driver...\r\n        /// </summary>\r\n        /// <param name=\"sender\"></param>\r\n        /// <param name=\"e\"></param>\r\n        private void m_buttonClose_Click(object sender, EventArgs e)\r\n        {\r\n            this.Text = \"TWAIN C# Scan\";\r\n            Rollback(TWAIN.STATE.S2);\r\n            SetButtons(EBUTTONSTATE.CLOSED);\r\n            m_formsetup.Dispose();\r\n            m_formsetup = null;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Request that scanning stop (gracefully)...\r\n        /// </summary>\r\n        /// <param name=\"sender\"></param>\r\n        /// <param name=\"e\"></param>\r\n        private void m_buttonStop_Click(object sender, EventArgs e)\r\n        {\r\n            TWAIN.TW_PENDINGXFERS twpendingxfers = default(TWAIN.TW_PENDINGXFERS);\r\n            m_twain.DatPendingxfers(TWAIN.DG.CONTROL, TWAIN.MSG.STOPFEEDER, ref twpendingxfers);\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        // Private Definitons...\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        #region Private Definitons...\r\n\r\n        /// <summary>\r\n        /// Our button states...\r\n        /// </summary>\r\n        private enum EBUTTONSTATE\r\n        {\r\n            CLOSED,\r\n            OPEN,\r\n            SCANNING\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        // Private Attributes...\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        #region Private Attributes...\r\n\r\n        /// <summary>\r\n        /// Use if something really bad happens...\r\n        /// </summary>\r\n        private bool m_blExit;\r\n\r\n        /// <summary>\r\n        /// Our interface to TWAIN...\r\n        /// </summary>\r\n        private TWAIN m_twain;\r\n        private IntPtr m_intptrHwnd;\r\n        private bool m_blDisableDsSent = false;\r\n        private bool m_blXferReadySent = false;\r\n        private IntPtr m_intptrXfer = IntPtr.Zero;\r\n        private IntPtr m_intptrImage = IntPtr.Zero;\r\n        private int m_iImageBytes = 0;\r\n        private TWAIN.TW_SETUPMEMXFER m_twsetupmemxfer;\r\n\r\n        // Setup information...\r\n        private FormSetup m_formsetup;\r\n\r\n        /// <summary>\r\n        /// We use this name (modified and made file system safe)\r\n        /// as the place where we'll put customdsdata...\r\n        /// </summary>\r\n        private string m_szProductDirectory;\r\n\r\n        /// <summary>\r\n        /// If true, then show the driver's window messages while\r\n        /// we're scanning.  Set this in the constructor...\r\n        /// </summary>\r\n        private bool m_blIndicators;\r\n\r\n        /// <summary>\r\n        /// Stuff used to display the images...\r\n        /// </summary>\r\n        private Bitmap m_bitmapGraphic1;\r\n        private Bitmap m_bitmapGraphic2;\r\n        private Graphics m_graphics1;\r\n        private Graphics m_graphics2;\r\n        private Brush m_brushBackground;\r\n        private Rectangle m_rectangleBackground;\r\n        private int m_iUseBitmap;\r\n        private int m_iImageCount = 0;\r\n\r\n        /// <summary>\r\n        /// We use this to run code in the context of the caller's UI thread...\r\n        /// </summary>\r\n        /// <param name=\"a_object\">object (really a control)</param>\r\n        /// <param name=\"a_action\">code to run</param>\r\n        public delegate void RunInUiThreadDelegate(Object a_object, Action a_action);\r\n\r\n        #endregion\r\n    }\r\n}\r\n"
  },
  {
    "path": "twaincs/source/twaincsscan/source/FormScan.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n</root>"
  },
  {
    "path": "twaincs/source/twaincsscan/source/FormSelect.Designer.cs",
    "content": "﻿namespace TWAINCSScan\r\n{\r\n    partial class FormSelect\r\n    {\r\n        /// <summary>\r\n        /// Required designer variable.\r\n        /// </summary>\r\n        private System.ComponentModel.IContainer components = null;\r\n\r\n        /// <summary>\r\n        /// Clean up any resources being used.\r\n        /// </summary>\r\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\r\n        protected override void Dispose(bool disposing)\r\n        {\r\n            if (disposing && (components != null))\r\n            {\r\n                components.Dispose();\r\n            }\r\n            base.Dispose(disposing);\r\n        }\r\n\r\n        #region Windows Form Designer generated code\r\n\r\n        /// <summary>\r\n        /// Required method for Designer support - do not modify\r\n        /// the contents of this method with the code editor.\r\n        /// </summary>\r\n        private void InitializeComponent()\r\n        {\r\n            this.m_listboxSelect = new System.Windows.Forms.ListBox();\r\n            this.m_buttonOpen = new System.Windows.Forms.Button();\r\n            this.m_labelSelect = new System.Windows.Forms.Label();\r\n            this.SuspendLayout();\r\n            // \r\n            // m_listboxSelect\r\n            // \r\n            this.m_listboxSelect.FormattingEnabled = true;\r\n            this.m_listboxSelect.Location = new System.Drawing.Point(12, 38);\r\n            this.m_listboxSelect.Name = \"m_listboxSelect\";\r\n            this.m_listboxSelect.Size = new System.Drawing.Size(259, 173);\r\n            this.m_listboxSelect.Sorted = true;\r\n            this.m_listboxSelect.TabIndex = 0;\r\n            this.m_listboxSelect.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(m_listboxSelect_MouseDoubleClick);\r\n            // \r\n            // m_buttonOpen\r\n            // \r\n            this.m_buttonOpen.DialogResult = System.Windows.Forms.DialogResult.OK;\r\n            this.m_buttonOpen.Location = new System.Drawing.Point(197, 223);\r\n            this.m_buttonOpen.Name = \"m_buttonOpen\";\r\n            this.m_buttonOpen.Size = new System.Drawing.Size(75, 23);\r\n            this.m_buttonOpen.TabIndex = 1;\r\n            this.m_buttonOpen.Text = \"Open\";\r\n            this.m_buttonOpen.UseVisualStyleBackColor = true;\r\n            this.m_buttonOpen.Click += new System.EventHandler(this.m_buttonOpen_Click);\r\n            // \r\n            // m_labelSelect\r\n            // \r\n            this.m_labelSelect.AutoSize = true;\r\n            this.m_labelSelect.Location = new System.Drawing.Point(12, 12);\r\n            this.m_labelSelect.Name = \"m_labelSelect\";\r\n            this.m_labelSelect.Size = new System.Drawing.Size(110, 13);\r\n            this.m_labelSelect.TabIndex = 3;\r\n            this.m_labelSelect.Text = \"Select TWAIN Driver:\";\r\n            // \r\n            // FormSelect\r\n            // \r\n            this.AcceptButton = this.m_buttonOpen;\r\n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\r\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r\n            this.ClientSize = new System.Drawing.Size(284, 262);\r\n            this.Controls.Add(this.m_labelSelect);\r\n            this.Controls.Add(this.m_buttonOpen);\r\n            this.Controls.Add(this.m_listboxSelect);\r\n            this.Name = \"FormSelect\";\r\n            this.Text = \"Open TWAIN Driver\";\r\n            this.ResumeLayout(false);\r\n            this.PerformLayout();\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n        private System.Windows.Forms.ListBox m_listboxSelect;\r\n        private System.Windows.Forms.Button m_buttonOpen;\r\n        private System.Windows.Forms.Label m_labelSelect;\r\n    }\r\n}\r\n\r\n"
  },
  {
    "path": "twaincs/source/twaincsscan/source/FormSelect.cs",
    "content": "﻿///////////////////////////////////////////////////////////////////////////////////////\r\n//\r\n//  TWAINCSScan.FormSelect\r\n//\r\n//  This class helps us select a TWAIN driver that we wish to open.\r\n//\r\n///////////////////////////////////////////////////////////////////////////////////////\r\n//  Author          Date            Version     Comment\r\n//  M.McLaughlin    21-May-2014     2.0.0.0     64-bit Linux\r\n//  M.McLaughlin    27-Feb-2014     1.1.0.0     ShowImage additions\r\n//  M.McLaughlin    21-Oct-2013     1.0.0.0     Initial Release\r\n///////////////////////////////////////////////////////////////////////////////////////\r\n//  Copyright (C) 2013-2019 Kodak Alaris Inc.\r\n//\r\n//  Permission is hereby granted, free of charge, to any person obtaining a\r\n//  copy of this software and associated documentation files (the \"Software\"),\r\n//  to deal in the Software without restriction, including without limitation\r\n//  the rights to use, copy, modify, merge, publish, distribute, sublicense,\r\n//  and/or sell copies of the Software, and to permit persons to whom the\r\n//  Software is furnished to do so, subject to the following conditions:\r\n//\r\n//  The above copyright notice and this permission notice shall be included in\r\n//  all copies or substantial portions of the Software.\r\n//\r\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\r\n//  THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\r\n//  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\r\n//  DEALINGS IN THE SOFTWARE.\r\n///////////////////////////////////////////////////////////////////////////////////////\r\n\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Windows.Forms;\r\nusing TWAINWorkingGroup;\r\n\r\nnamespace TWAINCSScan\r\n{\r\n    public partial class FormSelect : Form\r\n    {\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        // Public Methods...\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        #region Public Methods...\r\n\r\n        /// <summary>\r\n        /// Our constructor...\r\n        /// </summary>\r\n        /// <param name=\"a_lszIdentity\">list of scanners to show</param>\r\n        /// <param name=\"a_szDefault\">the default selection</param>\r\n        public FormSelect(List<string> a_lszIdentity, string a_szDefault)\r\n        {\r\n            string[] aszIdentity;\r\n            string[] aszDefault;\r\n\r\n            // Init stuff...\r\n            InitializeComponent();\r\n\r\n            // Explode the default...\r\n            aszDefault = CSV.Parse(a_szDefault);\r\n\r\n            // Suspend updating...\r\n            m_listboxSelect.BeginUpdate();\r\n\r\n            // Populate our driver list...\r\n            foreach (string sz in a_lszIdentity)\r\n            {\r\n                aszIdentity = CSV.Parse(sz);\r\n                m_listboxSelect.Items.Add(aszIdentity[11].ToString());\r\n            }\r\n\r\n            // Select the default...\r\n            m_listboxSelect.SelectedIndex = m_listboxSelect.FindStringExact(aszDefault[11]);\r\n\r\n            // Resume updating...\r\n            m_listboxSelect.EndUpdate();\r\n        }\r\n\r\n        public string GetSelectedDriver()\r\n        {\r\n            return (m_szSelected);\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        // Private Methods...\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        #region Private Methods...\r\n\r\n        /// <summary>\r\n        /// Select this as our driver and close the dialog...\r\n        /// </summary>\r\n        /// <param name=\"sender\"></param>\r\n        /// <param name=\"e\"></param>\r\n        private void m_buttonOpen_Click(object sender, EventArgs e)\r\n        {\r\n            m_szSelected = (string)m_listboxSelect.SelectedItem;\r\n        }\r\n\r\n        private void m_listboxSelect_MouseDoubleClick(object sender, MouseEventArgs e)\r\n        {\r\n            m_szSelected = (string)m_listboxSelect.SelectedItem;\r\n            this.DialogResult = System.Windows.Forms.DialogResult.OK;\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        // Private Attributes...\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        #region Private Attributes...\r\n\r\n        /// <summary>\r\n        /// The currently selected item...\r\n        /// </summary>\r\n        private string m_szSelected;\r\n\r\n        #endregion\r\n    }\r\n}\r\n"
  },
  {
    "path": "twaincs/source/twaincsscan/source/FormSelect.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n</root>"
  },
  {
    "path": "twaincs/source/twaincsscan/source/FormSetup.Designer.cs",
    "content": "﻿namespace TWAINCSScan\r\n{\r\n    partial class FormSetup\r\n    {\r\n        /// <summary>\r\n        /// Required designer variable.\r\n        /// </summary>\r\n        private System.ComponentModel.IContainer components = null;\r\n\r\n        /// <summary>\r\n        /// Clean up any resources being used.\r\n        /// </summary>\r\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\r\n        protected override void Dispose(bool disposing)\r\n        {\r\n            if (disposing && (components != null))\r\n            {\r\n                components.Dispose();\r\n            }\r\n            base.Dispose(disposing);\r\n        }\r\n\r\n        #region Windows Form Designer generated code\r\n\r\n        /// <summary>\r\n        /// Required method for Designer support - do not modify\r\n        /// the contents of this method with the code editor.\r\n        /// </summary>\r\n        private void InitializeComponent()\r\n        {\r\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormSetup));\r\n            this.m_labelUseUiSettings = new System.Windows.Forms.Label();\r\n            this.m_buttonShowDriverUi = new System.Windows.Forms.Button();\r\n            this.m_buttonSaveUiSettings = new System.Windows.Forms.Button();\r\n            this.m_labelSelectDestinationFolder = new System.Windows.Forms.Label();\r\n            this.m_textboxFolder = new System.Windows.Forms.TextBox();\r\n            this.m_buttonSelectDestinationFolder = new System.Windows.Forms.Button();\r\n            this.m_buttonUseUiSettings = new System.Windows.Forms.Button();\r\n            this.m_textboxUseUiSettings = new System.Windows.Forms.TextBox();\r\n            this.m_groupboxCreateUiSetting = new System.Windows.Forms.GroupBox();\r\n            this.m_groupboxManageSettings = new System.Windows.Forms.GroupBox();\r\n            this.m_buttonDeleteSetting = new System.Windows.Forms.Button();\r\n            this.m_groupboxImageDestination = new System.Windows.Forms.GroupBox();\r\n            this.m_groupboxManageSettings.SuspendLayout();\r\n            this.SuspendLayout();\r\n            // \r\n            // m_labelUseUiSettings\r\n            // \r\n            this.m_labelUseUiSettings.AutoSize = true;\r\n            this.m_labelUseUiSettings.Location = new System.Drawing.Point(30, 261);\r\n            this.m_labelUseUiSettings.Name = \"m_labelUseUiSettings\";\r\n            this.m_labelUseUiSettings.Size = new System.Drawing.Size(305, 13);\r\n            this.m_labelUseUiSettings.TabIndex = 1;\r\n            this.m_labelUseUiSettings.Text = \"Select driver settings for next scan (if blank the driver chooses):\";\r\n            // \r\n            // m_buttonShowDriverUi\r\n            // \r\n            this.m_buttonShowDriverUi.Location = new System.Drawing.Point(33, 133);\r\n            this.m_buttonShowDriverUi.Name = \"m_buttonShowDriverUi\";\r\n            this.m_buttonShowDriverUi.Size = new System.Drawing.Size(294, 23);\r\n            this.m_buttonShowDriverUi.TabIndex = 1;\r\n            this.m_buttonShowDriverUi.Text = \"Change driver settings (press this first)...\";\r\n            this.m_buttonShowDriverUi.UseVisualStyleBackColor = true;\r\n            this.m_buttonShowDriverUi.Click += new System.EventHandler(this.m_buttonSetup_Click);\r\n            // \r\n            // m_buttonSaveUiSettings\r\n            // \r\n            this.m_buttonSaveUiSettings.Location = new System.Drawing.Point(33, 171);\r\n            this.m_buttonSaveUiSettings.Name = \"m_buttonSaveUiSettings\";\r\n            this.m_buttonSaveUiSettings.Size = new System.Drawing.Size(294, 23);\r\n            this.m_buttonSaveUiSettings.TabIndex = 2;\r\n            this.m_buttonSaveUiSettings.Text = \"Save driver settings (then press this one)...\";\r\n            this.m_buttonSaveUiSettings.UseVisualStyleBackColor = true;\r\n            this.m_buttonSaveUiSettings.Click += new System.EventHandler(this.m_buttonSaveas_Click);\r\n            // \r\n            // m_labelSelectDestinationFolder\r\n            // \r\n            this.m_labelSelectDestinationFolder.AutoSize = true;\r\n            this.m_labelSelectDestinationFolder.Location = new System.Drawing.Point(30, 38);\r\n            this.m_labelSelectDestinationFolder.Name = \"m_labelSelectDestinationFolder\";\r\n            this.m_labelSelectDestinationFolder.Size = new System.Drawing.Size(302, 13);\r\n            this.m_labelSelectDestinationFolder.TabIndex = 4;\r\n            this.m_labelSelectDestinationFolder.Text = \"Select image destination folder (set blank if not saving images):\";\r\n            // \r\n            // m_textboxFolder\r\n            // \r\n            this.m_textboxFolder.Location = new System.Drawing.Point(33, 56);\r\n            this.m_textboxFolder.Name = \"m_textboxFolder\";\r\n            this.m_textboxFolder.Size = new System.Drawing.Size(262, 20);\r\n            this.m_textboxFolder.TabIndex = 5;\r\n            this.m_textboxFolder.TextChanged += new System.EventHandler(this.m_textboxFolder_TextChanged);\r\n            // \r\n            // m_buttonSelectDestinationFolder\r\n            // \r\n            this.m_buttonSelectDestinationFolder.BackgroundImage = ((System.Drawing.Image)(resources.GetObject(\"m_buttonSelectDestinationFolder.BackgroundImage\")));\r\n            this.m_buttonSelectDestinationFolder.Location = new System.Drawing.Point(301, 54);\r\n            this.m_buttonSelectDestinationFolder.Name = \"m_buttonSelectDestinationFolder\";\r\n            this.m_buttonSelectDestinationFolder.Size = new System.Drawing.Size(26, 23);\r\n            this.m_buttonSelectDestinationFolder.TabIndex = 6;\r\n            this.m_buttonSelectDestinationFolder.UseVisualStyleBackColor = true;\r\n            this.m_buttonSelectDestinationFolder.Click += new System.EventHandler(this.m_buttonBrowse_Click);\r\n            // \r\n            // m_buttonUseUiSettings\r\n            // \r\n            this.m_buttonUseUiSettings.BackgroundImage = ((System.Drawing.Image)(resources.GetObject(\"m_buttonUseUiSettings.BackgroundImage\")));\r\n            this.m_buttonUseUiSettings.Location = new System.Drawing.Point(301, 277);\r\n            this.m_buttonUseUiSettings.Name = \"m_buttonUseUiSettings\";\r\n            this.m_buttonUseUiSettings.Size = new System.Drawing.Size(26, 23);\r\n            this.m_buttonUseUiSettings.TabIndex = 8;\r\n            this.m_buttonUseUiSettings.UseVisualStyleBackColor = true;\r\n            this.m_buttonUseUiSettings.Click += new System.EventHandler(this.m_buttonUseUiSettings_Click);\r\n            // \r\n            // m_textboxUseUiSettings\r\n            // \r\n            this.m_textboxUseUiSettings.Location = new System.Drawing.Point(33, 279);\r\n            this.m_textboxUseUiSettings.Name = \"m_textboxUseUiSettings\";\r\n            this.m_textboxUseUiSettings.Size = new System.Drawing.Size(262, 20);\r\n            this.m_textboxUseUiSettings.TabIndex = 7;\r\n            // \r\n            // m_groupboxCreateUiSetting\r\n            // \r\n            this.m_groupboxCreateUiSetting.Location = new System.Drawing.Point(15, 103);\r\n            this.m_groupboxCreateUiSetting.Name = \"m_groupboxCreateUiSetting\";\r\n            this.m_groupboxCreateUiSetting.Size = new System.Drawing.Size(329, 109);\r\n            this.m_groupboxCreateUiSetting.TabIndex = 9;\r\n            this.m_groupboxCreateUiSetting.TabStop = false;\r\n            this.m_groupboxCreateUiSetting.Text = \"Create new driver settings\";\r\n            // \r\n            // m_groupboxManageSettings\r\n            // \r\n            this.m_groupboxManageSettings.Controls.Add(this.m_buttonDeleteSetting);\r\n            this.m_groupboxManageSettings.Location = new System.Drawing.Point(15, 230);\r\n            this.m_groupboxManageSettings.Name = \"m_groupboxManageSettings\";\r\n            this.m_groupboxManageSettings.Size = new System.Drawing.Size(329, 109);\r\n            this.m_groupboxManageSettings.TabIndex = 10;\r\n            this.m_groupboxManageSettings.TabStop = false;\r\n            this.m_groupboxManageSettings.Text = \"Select driver settings\";\r\n            // \r\n            // m_buttonDeleteSetting\r\n            // \r\n            this.m_buttonDeleteSetting.Location = new System.Drawing.Point(195, 77);\r\n            this.m_buttonDeleteSetting.Name = \"m_buttonDeleteSetting\";\r\n            this.m_buttonDeleteSetting.Size = new System.Drawing.Size(117, 23);\r\n            this.m_buttonDeleteSetting.TabIndex = 0;\r\n            this.m_buttonDeleteSetting.Text = \"Delete setting...\";\r\n            this.m_buttonDeleteSetting.UseVisualStyleBackColor = true;\r\n            this.m_buttonDeleteSetting.Click += new System.EventHandler(this.m_buttonDeleteSetting_Click);\r\n            // \r\n            // m_groupboxImageDestination\r\n            // \r\n            this.m_groupboxImageDestination.Location = new System.Drawing.Point(15, 12);\r\n            this.m_groupboxImageDestination.Name = \"m_groupboxImageDestination\";\r\n            this.m_groupboxImageDestination.Size = new System.Drawing.Size(329, 78);\r\n            this.m_groupboxImageDestination.TabIndex = 11;\r\n            this.m_groupboxImageDestination.TabStop = false;\r\n            this.m_groupboxImageDestination.Text = \"Select image destination\";\r\n            // \r\n            // FormSetup\r\n            // \r\n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\r\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r\n            this.ClientSize = new System.Drawing.Size(359, 354);\r\n            this.Controls.Add(this.m_buttonUseUiSettings);\r\n            this.Controls.Add(this.m_textboxUseUiSettings);\r\n            this.Controls.Add(this.m_buttonSelectDestinationFolder);\r\n            this.Controls.Add(this.m_textboxFolder);\r\n            this.Controls.Add(this.m_labelSelectDestinationFolder);\r\n            this.Controls.Add(this.m_buttonSaveUiSettings);\r\n            this.Controls.Add(this.m_buttonShowDriverUi);\r\n            this.Controls.Add(this.m_labelUseUiSettings);\r\n            this.Controls.Add(this.m_groupboxCreateUiSetting);\r\n            this.Controls.Add(this.m_groupboxManageSettings);\r\n            this.Controls.Add(this.m_groupboxImageDestination);\r\n            this.Name = \"FormSetup\";\r\n            this.Text = \"Setup TWAIN Scan\";\r\n            this.m_groupboxManageSettings.ResumeLayout(false);\r\n            this.ResumeLayout(false);\r\n            this.PerformLayout();\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n        private System.Windows.Forms.Label m_labelUseUiSettings;\r\n        private System.Windows.Forms.Button m_buttonShowDriverUi;\r\n        private System.Windows.Forms.Button m_buttonSaveUiSettings;\r\n        private System.Windows.Forms.Label m_labelSelectDestinationFolder;\r\n        private System.Windows.Forms.TextBox m_textboxFolder;\r\n        private System.Windows.Forms.Button m_buttonSelectDestinationFolder;\r\n        private System.Windows.Forms.Button m_buttonUseUiSettings;\r\n        private System.Windows.Forms.TextBox m_textboxUseUiSettings;\r\n        private System.Windows.Forms.GroupBox m_groupboxCreateUiSetting;\r\n        private System.Windows.Forms.GroupBox m_groupboxManageSettings;\r\n        private System.Windows.Forms.Button m_buttonDeleteSetting;\r\n        private System.Windows.Forms.GroupBox m_groupboxImageDestination;\r\n    }\r\n}"
  },
  {
    "path": "twaincs/source/twaincsscan/source/FormSetup.cs",
    "content": "﻿///////////////////////////////////////////////////////////////////////////////////////\r\n//\r\n//  TWAINCSScan.FormSetup\r\n//\r\n//  This class helps us configure a TWAIN driver prior to scanning.\r\n//\r\n///////////////////////////////////////////////////////////////////////////////////////\r\n//  Author          Date            Version     Comment\r\n//  M.McLaughlin    21-May-2014     2.0.0.0     64-bit Linux\r\n//  M.McLaughlin    27-Feb-2014     1.1.0.0     ShowImage additions\r\n//  M.McLaughlin    21-Oct-2013     1.0.0.0     Initial Release\r\n///////////////////////////////////////////////////////////////////////////////////////\r\n//  Copyright (C) 2013-2019 Kodak Alaris Inc.\r\n//\r\n//  Permission is hereby granted, free of charge, to any person obtaining a\r\n//  copy of this software and associated documentation files (the \"Software\"),\r\n//  to deal in the Software without restriction, including without limitation\r\n//  the rights to use, copy, modify, merge, publish, distribute, sublicense,\r\n//  and/or sell copies of the Software, and to permit persons to whom the\r\n//  Software is furnished to do so, subject to the following conditions:\r\n//\r\n//  The above copyright notice and this permission notice shall be included in\r\n//  all copies or substantial portions of the Software.\r\n//\r\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\r\n//  THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\r\n//  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\r\n//  DEALINGS IN THE SOFTWARE.\r\n///////////////////////////////////////////////////////////////////////////////////////\r\n\r\nusing System;\r\nusing System.IO;\r\nusing System.Security.Permissions;\r\nusing System.Windows.Forms;\r\nusing TWAINWorkingGroup;\r\n\r\nnamespace TWAINCSScan\r\n{\r\n    /// <summary>\r\n    /// Select the image destination folder.  If supported, allow the user to\r\n    /// create and select Custom DS Data snapshots of the driver, and give\r\n    /// them a way to change the driver settings through the setup form of the\r\n    /// driver's user interface...\r\n    /// </summary>\r\n    public partial class FormSetup : Form\r\n    {\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        // Public Methods...\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        #region Public Methods...\r\n\r\n        /// <summary>\r\n        /// Our constructor...\r\n        /// </summary>\r\n        /// <param name=\"a_twaincstool\"></param>\r\n        [PermissionSet(SecurityAction.LinkDemand, Name = \"FullTrust\", Unrestricted = false)]\r\n        public FormSetup(FormScan a_formscan, ref TWAIN a_twain, string a_szProductDirectory)\r\n        {\r\n            TWAIN.STS sts;\r\n            string szStatus;\r\n            string szCapability;\r\n            string szUsrUiSettings;\r\n\r\n            // Init stuff...\r\n            InitializeComponent();\r\n\r\n            // More init stuff...\r\n            this.FormClosing += new FormClosingEventHandler(FormSetup_FormClosing);\r\n\r\n            // Init more stuff (the order matters).  ApplicationData means the following:\r\n            // Windows:     C:\\Users\\USERNAME\\AppData\\Roaming (or C:\\Documents and Settings\\USERNAME\\Application Data on XP)\r\n            // Linux:       /home/USERNAME/.config (or /root/.config for superuser)\r\n            // Mac OS X:    /Users/USERNAME/.config (or /var/root/.config for superuser)\r\n            m_formscan = a_formscan;\r\n            m_twain = a_twain;\r\n            m_szTwainscanFolder = Path.Combine(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal),\"twain\"),\"twaincsscan\");\r\n            m_szSettingsFolder = Path.Combine(m_szTwainscanFolder,\"settings\");\r\n            m_szSettingsFolder = Path.Combine(m_szSettingsFolder, a_szProductDirectory);\r\n            if (!Directory.Exists(m_szTwainscanFolder))\r\n            {\r\n                try\r\n                {\r\n                    Directory.CreateDirectory(m_szTwainscanFolder);\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    TWAINWorkingGroup.Log.Error(\"exception - \" + exception.Message);\r\n                    m_szTwainscanFolder = Directory.GetCurrentDirectory();\r\n                }\r\n            }\r\n\r\n            // Restore values...\r\n            m_textboxFolder.Text = RestoreFolder();\r\n            m_textboxUseUiSettings.Text = \"\";\r\n\r\n            // Check for support of Custom DS Data...\r\n            szStatus = \"\";\r\n            TWAIN.TW_CAPABILITY twcapability = default(TWAIN.TW_CAPABILITY);\r\n            m_twain.CsvToCapability(ref twcapability, ref szStatus, \"CAP_CUSTOMDSDATA,0,0,0\");\r\n            sts = m_twain.DatCapability(TWAIN.DG.CONTROL, TWAIN.MSG.GETCURRENT, ref twcapability);\r\n            szCapability = m_twain.CapabilityToCsv(twcapability, true);\r\n            if ((sts != TWAIN.STS.SUCCESS) || (!szCapability.EndsWith(\",1\") && !szCapability.EndsWith(\",TRUE\")))\r\n            {\r\n                m_labelUseUiSettings.Enabled = false;\r\n                m_textboxUseUiSettings.Enabled = false;\r\n                m_buttonSaveUiSettings.Enabled = false;\r\n                m_buttonUseUiSettings.Enabled = false;\r\n            }\r\n\r\n            // Restore the last saved snapshot...\r\n            else\r\n            {\r\n                m_textboxUseUiSettings.Text = RestoreSetting();\r\n                if (m_textboxUseUiSettings.Text != \"\")\r\n                {\r\n                    szUsrUiSettings = Path.Combine(m_szSettingsFolder, m_textboxUseUiSettings.Text);\r\n                    if (File.Exists(szUsrUiSettings))\r\n                    {\r\n                        m_formscan.RestoreSnapshot(szUsrUiSettings);\r\n                    }\r\n                    else\r\n                    {\r\n                        m_textboxUseUiSettings.Text = \"\";\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Let the caller know if we can take snapshots...\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public bool IsCustomDsDataSupported()\r\n        {\r\n            return (m_buttonUseUiSettings.Enabled);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Place to put images (empty is okay)...\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public string GetImageFolder()\r\n        {\r\n            return (m_textboxFolder.Text);\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        // Private Methods...\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        #region Private Methods...\r\n\r\n        /// <summary>\r\n        /// Validate...\r\n        /// </summary>\r\n        /// <param name=\"sender\"></param>\r\n        /// <param name=\"e\"></param>\r\n        private void FormSetup_FormClosing(object sender, FormClosingEventArgs e)\r\n        {\r\n            if ((m_textboxFolder.Text != \"\") && !Directory.Exists(m_textboxFolder.Text))\r\n            {\r\n                MessageBox.Show(\"Please enter a valid Destination Folder.\");\r\n                e.Cancel = true;\r\n            }\r\n            if ((m_textboxUseUiSettings.Text != \"\") && !File.Exists(Path.Combine(m_szSettingsFolder,m_textboxUseUiSettings.Text)))\r\n            {\r\n                MessageBox.Show(\"Please enter a valid UI Setting name, or clear the entry.\");\r\n                e.Cancel = true;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Get the folder path...\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        private string RestoreFolder()\r\n        {\r\n            try\r\n            {\r\n                string szSaveSpot = m_szTwainscanFolder;\r\n                if (!Directory.Exists(szSaveSpot))\r\n                {\r\n                    return (\"\");\r\n                }\r\n                string szFile = Path.Combine(szSaveSpot, \"folder\");\r\n                if (File.Exists(szFile))\r\n                {\r\n                    return (File.ReadAllText(szFile));\r\n                }\r\n                return (\"\");\r\n            }\r\n            catch (Exception exception)\r\n            {\r\n                TWAINWorkingGroup.Log.Error(\"exception - \" + exception.Message);\r\n                return (\"\");\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Get the setting...\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        private string RestoreSetting()\r\n        {\r\n            try\r\n            {\r\n                if (!Directory.Exists(m_szSettingsFolder))\r\n                {\r\n                    return (\"\");\r\n                }\r\n                string szFile = Path.Combine(m_szSettingsFolder, \"current\");\r\n                if (File.Exists(szFile))\r\n                {\r\n                    return (File.ReadAllText(szFile));\r\n                }\r\n                return (\"\");\r\n            }\r\n            catch (Exception exception)\r\n            {\r\n                TWAINWorkingGroup.Log.Error(\"exception - \" + exception.Message);\r\n                return (\"\");\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Remember the folder path for the next time the app runs...\r\n        /// </summary>\r\n        /// <param name=\"a_szFolder\"></param>\r\n        private void SaveFolder(string a_szFolder)\r\n        {\r\n            try\r\n            {\r\n                string szSaveSpot = m_szTwainscanFolder;\r\n                if (!Directory.Exists(szSaveSpot))\r\n                {\r\n                    Directory.CreateDirectory(szSaveSpot);\r\n                }\r\n                File.WriteAllText(Path.Combine(szSaveSpot, \"folder\"), a_szFolder);\r\n            }\r\n            catch (Exception exception)\r\n            {\r\n                TWAINWorkingGroup.Log.Error(\"exception - \" + exception.Message);\r\n                // Just let it slide...\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Remember the setting for the next time the app runs...\r\n        /// </summary>\r\n        /// <param name=\"a_szFolder\"></param>\r\n        private void SaveSetting(string a_szFolder)\r\n        {\r\n            try\r\n            {\r\n                if (!Directory.Exists(m_szSettingsFolder))\r\n                {\r\n                    Directory.CreateDirectory(m_szSettingsFolder);\r\n                }\r\n                File.WriteAllText(Path.Combine(m_szSettingsFolder, \"current\"), a_szFolder);\r\n            }\r\n            catch (Exception exception)\r\n            {\r\n                TWAINWorkingGroup.Log.Error(\"exception - \" + exception.Message);\r\n                // Just let it slide...\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        // Private Form Controls...\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        #region Private Form Controls...\r\n\r\n        /// <summary>\r\n        /// Browse for a place to save image files...\r\n        /// </summary>\r\n        /// <param name=\"sender\"></param>\r\n        /// <param name=\"e\"></param>\r\n        private void m_buttonBrowse_Click(object sender, EventArgs e)\r\n        {\r\n            FolderBrowserDialog folderbrowserdialog = new FolderBrowserDialog();\r\n            folderbrowserdialog.SelectedPath = m_textboxFolder.Text;\r\n            folderbrowserdialog.ShowNewFolderButton = true;\r\n            if (folderbrowserdialog.ShowDialog() == DialogResult.OK)\r\n            {\r\n                m_textboxFolder.Text = folderbrowserdialog.SelectedPath;\r\n                SaveFolder(m_textboxFolder.Text);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Delete the setting...\r\n        /// </summary>\r\n        /// <param name=\"sender\"></param>\r\n        /// <param name=\"e\"></param>\r\n        private void m_buttonDeleteSetting_Click(object sender, EventArgs e)\r\n        {\r\n            bool blDeleted;\r\n\r\n            // Nothing to do if it's empty...\r\n            if (m_textboxUseUiSettings.Text == \"\")\r\n            {\r\n                return;\r\n            }\r\n\r\n            // If it's not real, tell the user...\r\n            if (!File.Exists(Path.Combine(m_szSettingsFolder, m_textboxUseUiSettings.Text)))\r\n            {\r\n                MessageBox.Show(\"'\" + m_textboxUseUiSettings.Text + \"' not found...\");\r\n                return;\r\n            }\r\n\r\n            // Get confirmation...\r\n            DialogResult dialogresult = MessageBox.Show(\"Delete '\" + m_textboxUseUiSettings.Text + \"'?\",\"Confirm\",MessageBoxButtons.YesNo);\r\n            if (dialogresult == System.Windows.Forms.DialogResult.No)\r\n            {\r\n                return;\r\n            }\r\n\r\n            // Delete it...\r\n            try\r\n            {\r\n                blDeleted = true;\r\n                File.Delete(Path.Combine(m_szSettingsFolder, m_textboxUseUiSettings.Text));\r\n            }\r\n            catch (Exception exception)\r\n            {\r\n                TWAINWorkingGroup.Log.Error(\"exception - \" + exception.Message);\r\n                blDeleted = false;\r\n                MessageBox.Show(\"Failed to delete setting...\");\r\n            }\r\n\r\n            // Clear the text box...\r\n            if (blDeleted)\r\n            {\r\n                m_textboxUseUiSettings.Text = \"\";\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Save the current driver's settings...\r\n        /// </summary>\r\n        /// <param name=\"sender\"></param>\r\n        /// <param name=\"e\"></param>\r\n        private void m_buttonSaveas_Click(object sender, EventArgs e)\r\n        {\r\n            SaveFileDialog savefiledialog = new SaveFileDialog();\r\n            savefiledialog.InitialDirectory = m_szSettingsFolder;\r\n            savefiledialog.CheckFileExists = false;\r\n            savefiledialog.CheckPathExists = true;\r\n            savefiledialog.Filter = \"Settings|*.settings\";\r\n            if (!Directory.Exists(savefiledialog.InitialDirectory))\r\n            {\r\n                try\r\n                {\r\n                    Directory.CreateDirectory(savefiledialog.InitialDirectory);\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    TWAINWorkingGroup.Log.Error(\"exception - \" + exception.Message);\r\n                    return;\r\n                }\r\n            }\r\n            if (savefiledialog.ShowDialog() == DialogResult.OK)\r\n            {\r\n                m_textboxUseUiSettings.Text = Path.GetFileName(savefiledialog.FileName);\r\n                m_formscan.SaveSnapshot(Path.Combine(m_szSettingsFolder,m_textboxUseUiSettings.Text));\r\n                SaveSetting(m_textboxUseUiSettings.Text);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Bring up the driver's non-scanning UI...\r\n        /// </summary>\r\n        /// <param name=\"sender\"></param>\r\n        /// <param name=\"e\"></param>\r\n        private void m_buttonSetup_Click(object sender, EventArgs e)\r\n        {\r\n            m_formscan.ClearEvents();\r\n            TWAIN.TW_USERINTERFACE twuserinterface = default(TWAIN.TW_USERINTERFACE);\r\n            m_twain.CsvToUserinterface(ref twuserinterface, \"TRUE,FALSE,\" + Handle);\r\n            m_twain.DatUserinterface(TWAIN.DG.CONTROL, TWAIN.MSG.ENABLEDSUIONLY, ref twuserinterface);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Pick the settings for a scan session...\r\n        /// </summary>\r\n        /// <param name=\"sender\"></param>\r\n        /// <param name=\"e\"></param>\r\n        private void m_buttonUseUiSettings_Click(object sender, EventArgs e)\r\n        {\r\n            OpenFileDialog openfiledialog = new OpenFileDialog();\r\n            openfiledialog.InitialDirectory = m_szSettingsFolder;\r\n            openfiledialog.CheckFileExists = true;\r\n            openfiledialog.CheckPathExists = true;\r\n            openfiledialog.Multiselect = false;\r\n            openfiledialog.Filter = \"Settings|*.settings\";\r\n            openfiledialog.FilterIndex = 0;\r\n            if (!Directory.Exists(openfiledialog.InitialDirectory))\r\n            {\r\n                try\r\n                {\r\n                    Directory.CreateDirectory(openfiledialog.InitialDirectory);\r\n                }\r\n                catch (Exception exception)\r\n                {\r\n                    TWAINWorkingGroup.Log.Error(\"exception - \" + exception.Message);\r\n                    MessageBox.Show(\"Unable to create settings folder...'\" + m_szSettingsFolder + \"'\");\r\n                    return;\r\n                }\r\n            }\r\n            if (openfiledialog.ShowDialog() == DialogResult.OK)\r\n            {\r\n                m_textboxUseUiSettings.Text = Path.GetFileName(openfiledialog.FileName);\r\n                m_formscan.RestoreSnapshot(Path.Combine(m_szSettingsFolder, m_textboxUseUiSettings.Text));\r\n                SaveSetting(m_textboxUseUiSettings.Text);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Keep us updated with changes to the save image path...\r\n        /// </summary>\r\n        /// <param name=\"sender\"></param>\r\n        /// <param name=\"e\"></param>\r\n        private void m_textboxFolder_TextChanged(object sender, EventArgs e)\r\n        {\r\n            SaveFolder(m_textboxFolder.Text);\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        // Private Attributes...\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        #region Private Attributes...\r\n\r\n        /// <summary>\r\n        /// The folder we persist data to...\r\n        /// </summary>\r\n        private string m_szTwainscanFolder;\r\n\r\n        /// <summary>\r\n        /// The settings folder...\r\n        /// </summary>\r\n        private string m_szSettingsFolder;\r\n\r\n        /// <summary>\r\n        /// Access to the TWAIN driver...\r\n        /// </summary>\r\n        private TWAIN m_twain;\r\n\r\n        /// <summary>\r\n        /// Access to our main form...\r\n        /// </summary>\r\n        private FormScan m_formscan;\r\n\r\n        #endregion\r\n    }\r\n}\r\n"
  },
  {
    "path": "twaincs/source/twaincsscan/source/FormSetup.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\r\n  <data name=\"m_buttonSelectDestinationFolder.BackgroundImage\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n    <value>\r\n        iVBORw0KGgoAAAANSUhEUgAAACEAAAAdCAIAAACrPpLuAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\r\n        YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAAB7SURBVEhL7c/BCYBADERRK7BlW7KHnOzDuyVEhVFBguxs\r\n        IsTF4d8W8thO31+TxjKPZniu3WXst6bezMlkMqhw8ViRwXZjvmyICO6axlA7wvCXw8DP+RGGvxwGfs6P\r\n        MPzlMPBzfoTh7zfKezICs41z23PIcM40wteGoboCUXnZfH5Gxs8AAAAASUVORK5CYII=\r\n</value>\r\n  </data>\r\n  <data name=\"m_buttonUseUiSettings.BackgroundImage\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n    <value>\r\n        iVBORw0KGgoAAAANSUhEUgAAACEAAAAdCAIAAACrPpLuAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\r\n        YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAAB7SURBVEhL7c/BCYBADERRK7BlW7KHnOzDuyVEhVFBguxs\r\n        IsTF4d8W8thO31+TxjKPZniu3WXst6bezMlkMqhw8ViRwXZjvmyICO6axlA7wvCXw8DP+RGGvxwGfs6P\r\n        MPzlMPBzfoTh7zfKezICs41z23PIcM40wteGoboCUXnZfH5Gxs8AAAAASUVORK5CYII=\r\n</value>\r\n  </data>\r\n</root>"
  },
  {
    "path": "twaincs/source/twaincsscan/source/Program.cs",
    "content": "﻿///////////////////////////////////////////////////////////////////////////////////////\r\n//\r\n//  TWAINCSScan.Program\r\n//\r\n//  Our entry point.\r\n//\r\n///////////////////////////////////////////////////////////////////////////////////////\r\n//  Author          Date            Version     Comment\r\n//  M.McLaughlin    21-May-2014     2.0.0.0     64-bit Linux\r\n//  M.McLaughlin    27-Feb-2014     1.1.0.0     ShowImage additions\r\n//  M.McLaughlin    21-Oct-2013     1.0.0.0     Initial Release\r\n///////////////////////////////////////////////////////////////////////////////////////\r\n//  Copyright (C) 2013-2019 Kodak Alaris Inc.\r\n//\r\n//  Permission is hereby granted, free of charge, to any person obtaining a\r\n//  copy of this software and associated documentation files (the \"Software\"),\r\n//  to deal in the Software without restriction, including without limitation\r\n//  the rights to use, copy, modify, merge, publish, distribute, sublicense,\r\n//  and/or sell copies of the Software, and to permit persons to whom the\r\n//  Software is furnished to do so, subject to the following conditions:\r\n//\r\n//  The above copyright notice and this permission notice shall be included in\r\n//  all copies or substantial portions of the Software.\r\n//\r\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\r\n//  THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\r\n//  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\r\n//  DEALINGS IN THE SOFTWARE.\r\n///////////////////////////////////////////////////////////////////////////////////////\r\n\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Windows.Forms;\r\n\r\nnamespace TWAINCSScan\r\n{\r\n    static class Program\r\n    {\r\n        /// <summary>\r\n        /// The main entry point for the application.\r\n        /// </summary>\r\n        [STAThread]\r\n        static void Main()\r\n        {\r\n            FormScan formscan = null;\r\n            Application.EnableVisualStyles();\r\n            Application.SetCompatibleTextRenderingDefault(false);\r\n            formscan = new FormScan();\r\n            if (!formscan.ExitRequested())\r\n            {\r\n                Application.Run(formscan);\r\n            }\r\n            formscan = null;\r\n            Application.Exit();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "twaincs/source/twaincsscan/source/Properties/AssemblyInfo.cs",
    "content": "﻿///////////////////////////////////////////////////////////////////////////////////////\r\n//\r\n// TWAINCSScan AssemblyInfo\r\n//\r\n///////////////////////////////////////////////////////////////////////////////////////\r\n//  Copyright (C) 2013-2021 Kodak Alaris Inc.\r\n//\r\n//  Permission is hereby granted, free of charge, to any person obtaining a\r\n//  copy of this software and associated documentation files (the \"Software\"),\r\n//  to deal in the Software without restriction, including without limitation\r\n//  the rights to use, copy, modify, merge, publish, distribute, sublicense,\r\n//  and/or sell copies of the Software, and to permit persons to whom the\r\n//  Software is furnished to do so, subject to the following conditions:\r\n//\r\n//  The above copyright notice and this permission notice shall be included in\r\n//  all copies or substantial portions of the Software.\r\n//\r\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\r\n//  THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\r\n//  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\r\n//  DEALINGS IN THE SOFTWARE.\r\n///////////////////////////////////////////////////////////////////////////////////////\r\n\r\nusing System.Reflection;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Runtime.InteropServices;\r\n\r\n// General Information about an assembly is controlled through the following \r\n// set of attributes. Change these attribute values to modify the information\r\n// associated with an assembly.\r\n[assembly: AssemblyTitle(\"TWAINCSScan\")]\r\n[assembly: AssemblyDescription(\"Sample TWAIN application for C#\")]\r\n[assembly: AssemblyConfiguration(\"\")]\r\n[assembly: AssemblyCompany(\"Kodak Alaris Inc.\")]\r\n[assembly: AssemblyProduct(\"TWAINCSScan\")]\r\n[assembly: AssemblyCopyright(\"Copyright © 2013-2020, Kodak Alaris Inc.\")]\r\n[assembly: AssemblyTrademark(\"\")]\r\n[assembly: AssemblyCulture(\"\")]\r\n\r\n// Setting ComVisible to false makes the types in this assembly not visible \r\n// to COM components.  If you need to access a type in this assembly from \r\n// COM, set the ComVisible attribute to true on that type.\r\n[assembly: ComVisible(false)]\r\n\r\n// The following GUID is for the ID of the typelib if this project is exposed to COM\r\n[assembly: Guid(\"95c1ce5e-1b22-4739-a390-30ddda10f984\")]\r\n\r\n// Version information for an assembly consists of the following four values:\r\n//\r\n//      Major Version\r\n//      Minor Version \r\n//      Build Number\r\n//      Revision\r\n//\r\n// You can specify all the values or you can default the Build and Revision Numbers \r\n// by using the '*' as shown below:\r\n[assembly: AssemblyVersion(\"2.5.0.0\")]\r\n[assembly: AssemblyFileVersion(\"2.5.0.0\")]\r\n"
  },
  {
    "path": "twaincs/source/twaincsscan/source/Properties/Resources.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\r\n// <auto-generated>\r\n//     This code was generated by a tool.\r\n//     Runtime Version:4.0.30319.42000\r\n//\r\n//     Changes to this file may cause incorrect behavior and will be lost if\r\n//     the code is regenerated.\r\n// </auto-generated>\r\n//------------------------------------------------------------------------------\r\n\r\nnamespace TWAINCSScan.Properties {\r\n    using System;\r\n    \r\n    \r\n    /// <summary>\r\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\r\n    /// </summary>\r\n    // This class was auto-generated by the StronglyTypedResourceBuilder\r\n    // class via a tool like ResGen or Visual Studio.\r\n    // To add or remove a member, edit your .ResX file then rerun ResGen\r\n    // with the /str option, or rebuild your VS project.\r\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"15.0.0.0\")]\r\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\r\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\r\n    internal class Resources {\r\n        \r\n        private static global::System.Resources.ResourceManager resourceMan;\r\n        \r\n        private static global::System.Globalization.CultureInfo resourceCulture;\r\n        \r\n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\r\n        internal Resources() {\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Returns the cached ResourceManager instance used by this class.\r\n        /// </summary>\r\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\r\n        internal static global::System.Resources.ResourceManager ResourceManager {\r\n            get {\r\n                if (object.ReferenceEquals(resourceMan, null)) {\r\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"TWAINCSScan.Properties.Resources\", typeof(Resources).Assembly);\r\n                    resourceMan = temp;\r\n                }\r\n                return resourceMan;\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Overrides the current thread's CurrentUICulture property for all\r\n        ///   resource lookups using this strongly typed resource class.\r\n        /// </summary>\r\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\r\n        internal static global::System.Globalization.CultureInfo Culture {\r\n            get {\r\n                return resourceCulture;\r\n            }\r\n            set {\r\n                resourceCulture = value;\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "twaincs/source/twaincsscan/source/Properties/Resources.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n</root>"
  },
  {
    "path": "twaincs/source/twaincsscan/source/Properties/Settings.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\r\n// <auto-generated>\r\n//     This code was generated by a tool.\r\n//     Runtime Version:4.0.30319.42000\r\n//\r\n//     Changes to this file may cause incorrect behavior and will be lost if\r\n//     the code is regenerated.\r\n// </auto-generated>\r\n//------------------------------------------------------------------------------\r\n\r\nnamespace TWAINCSScan.Properties {\r\n    \r\n    \r\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\r\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator\", \"15.9.0.0\")]\r\n    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {\r\n        \r\n        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));\r\n        \r\n        public static Settings Default {\r\n            get {\r\n                return defaultInstance;\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "twaincs/source/twaincsscan/source/Properties/Settings.settings",
    "content": "﻿<?xml version='1.0' encoding='utf-8'?>\r\n<SettingsFile xmlns=\"http://schemas.microsoft.com/VisualStudio/2004/01/settings\" CurrentProfile=\"(Default)\">\r\n  <Profiles>\r\n    <Profile Name=\"(Default)\" />\r\n  </Profiles>\r\n  <Settings />\r\n</SettingsFile>\r\n"
  },
  {
    "path": "twaincs/source/twaincsscan/source/app.config",
    "content": "<?xml version=\"1.0\"?>\n<configuration>\n  <startup>\n    <supportedRuntime version=\"v4.5\" />\n    <supportedRuntime version=\"v4.0.30319\" />\n    <supportedRuntime version=\"v4.0\" />\n    <supportedRuntime version=\"v2.0.50727\" />\n  </startup>\n</configuration>\n"
  },
  {
    "path": "twaincs/source/twaincsscan/source/twaincsscan.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <PropertyGroup>\r\n    <ProductVersion>15.0.27428.2005</ProductVersion>\r\n    <ImplicitlyExpandNETStandardFacades>false</ImplicitlyExpandNETStandardFacades>\r\n    <DisableHandlePackageFileConflicts>true</DisableHandlePackageFileConflicts>\r\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\r\n    <Platform Condition=\" '$(Platform)' == '' \">x86</Platform>\r\n    <SchemaVersion>2.0</SchemaVersion>\r\n    <ProjectGuid>{DE8AC167-CFF1-446D-9145-29179CA1B472}</ProjectGuid>\r\n    <OutputType>WinExe</OutputType>\r\n    <AppDesignerFolder>Properties</AppDesignerFolder>\r\n    <RootNamespace>TWAINCSScan</RootNamespace>\r\n    <AssemblyName>twaincsscan</AssemblyName>\r\n    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>\r\n    <FileAlignment>512</FileAlignment>\r\n    <SccProjectName>\r\n    </SccProjectName>\r\n    <SccLocalPath>\r\n    </SccLocalPath>\r\n    <SccAuxPath>\r\n    </SccAuxPath>\r\n    <SccProvider>\r\n    </SccProvider>\r\n    <TargetFrameworkProfile />\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|x86' \">\r\n    <PlatformTarget>x86</PlatformTarget>\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <DebugType>full</DebugType>\r\n    <Optimize>false</Optimize>\r\n    <OutputPath>bin\\x86\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>\r\n    <RunCodeAnalysis>true</RunCodeAnalysis>\r\n    <Prefer32Bit>false</Prefer32Bit>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|x86' \">\r\n    <PlatformTarget>x86</PlatformTarget>\r\n    <DebugType>pdbonly</DebugType>\r\n    <Optimize>true</Optimize>\r\n    <OutputPath>bin\\x86\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n    <RunCodeAnalysis>true</RunCodeAnalysis>\r\n    <Prefer32Bit>false</Prefer32Bit>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|x64'\">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <OutputPath>bin\\x64\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>\r\n    <DebugType>full</DebugType>\r\n    <PlatformTarget>x64</PlatformTarget>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>\r\n    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>\r\n    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>\r\n    <RunCodeAnalysis>true</RunCodeAnalysis>\r\n    <Prefer32Bit>false</Prefer32Bit>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|x64'\">\r\n    <OutputPath>bin\\x64\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <Optimize>true</Optimize>\r\n    <DebugType>pdbonly</DebugType>\r\n    <PlatformTarget>x64</PlatformTarget>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>\r\n    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>\r\n    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>\r\n    <RunCodeAnalysis>true</RunCodeAnalysis>\r\n    <Prefer32Bit>false</Prefer32Bit>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'\">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <OutputPath>bin\\AnyCPU\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>\r\n    <DebugType>full</DebugType>\r\n    <PlatformTarget>AnyCPU</PlatformTarget>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>\r\n    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>\r\n    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>\r\n    <RunCodeAnalysis>true</RunCodeAnalysis>\r\n    <Prefer32Bit>false</Prefer32Bit>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|AnyCPU'\">\r\n    <OutputPath>bin\\AnyCPU\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <Optimize>true</Optimize>\r\n    <DebugType>pdbonly</DebugType>\r\n    <PlatformTarget>AnyCPU</PlatformTarget>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>\r\n    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>\r\n    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>\r\n    <RunCodeAnalysis>true</RunCodeAnalysis>\r\n    <Prefer32Bit>false</Prefer32Bit>\r\n  </PropertyGroup>\r\n  <ItemGroup>\r\n    <Reference Include=\"System\" />\r\n    <Reference Include=\"System.Drawing\" />\r\n    <Reference Include=\"System.Windows.Forms\" />\r\n    <Reference Include=\"TWAIN\">\r\n      <SpecificVersion>False</SpecificVersion>\r\n      <HintPath>..\\..\\bin\\$(Platform)\\$(Configuration)\\TWAIN.dll</HintPath>\r\n    </Reference>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Compile Include=\"FormScan.cs\">\r\n      <SubType>Form</SubType>\r\n    </Compile>\r\n    <Compile Include=\"FormScan.Designer.cs\">\r\n      <DependentUpon>FormScan.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"FormSetup.cs\">\r\n      <SubType>Form</SubType>\r\n    </Compile>\r\n    <Compile Include=\"FormSetup.Designer.cs\">\r\n      <DependentUpon>FormSetup.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"FormSelect.cs\">\r\n      <SubType>Form</SubType>\r\n    </Compile>\r\n    <Compile Include=\"FormSelect.Designer.cs\">\r\n      <DependentUpon>FormSelect.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Program.cs\" />\r\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\r\n    <EmbeddedResource Include=\"FormScan.resx\">\r\n      <DependentUpon>FormScan.cs</DependentUpon>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"FormSelect.resx\">\r\n      <DependentUpon>FormSelect.cs</DependentUpon>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"FormSetup.resx\">\r\n      <DependentUpon>FormSetup.cs</DependentUpon>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Properties\\Resources.resx\">\r\n      <Generator>ResXFileCodeGenerator</Generator>\r\n      <LastGenOutput>Resources.Designer.cs</LastGenOutput>\r\n      <SubType>Designer</SubType>\r\n    </EmbeddedResource>\r\n    <Compile Include=\"Properties\\Resources.Designer.cs\">\r\n      <AutoGen>True</AutoGen>\r\n      <DependentUpon>Resources.resx</DependentUpon>\r\n      <DesignTime>True</DesignTime>\r\n    </Compile>\r\n    <None Include=\"app.config\" />\r\n    <None Include=\"Properties\\Settings.settings\">\r\n      <Generator>SettingsSingleFileGenerator</Generator>\r\n      <LastGenOutput>Settings.Designer.cs</LastGenOutput>\r\n    </None>\r\n    <Compile Include=\"Properties\\Settings.Designer.cs\">\r\n      <AutoGen>True</AutoGen>\r\n      <DependentUpon>Settings.settings</DependentUpon>\r\n      <DesignTimeSharedInput>True</DesignTimeSharedInput>\r\n    </Compile>\r\n  </ItemGroup>\r\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\r\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \r\n       Other similar extension points exist, see Microsoft.Common.targets.\r\n  <Target Name=\"BeforeBuild\">\r\n  </Target>\r\n  <Target Name=\"AfterBuild\">\r\n  </Target>\r\n  -->\r\n</Project>"
  },
  {
    "path": "twaincs/source/twaincstst/source/Main.Designer.cs",
    "content": "﻿namespace TWAINCSTst\r\n{\r\n    partial class FormMain\r\n    {\r\n        /// <summary>\r\n        /// Required designer variable.\r\n        /// </summary>\r\n        private System.ComponentModel.IContainer components = null;\r\n\r\n        #region Windows Form Designer generated code\r\n\r\n        /// <summary>\r\n        /// Required method for Designer support - do not modify\r\n        /// the contents of this method with the code editor.\r\n        /// </summary>\r\n        private void InitializeComponent()\r\n        {\r\n            this.m_richtextboxOutput = new System.Windows.Forms.RichTextBox();\r\n            this.m_richtextboxCapability = new System.Windows.Forms.RichTextBox();\r\n            this.m_buttonScan = new System.Windows.Forms.Button();\r\n            this.m_buttonStop = new System.Windows.Forms.Button();\r\n            this.m_pictureboxImage1 = new System.Windows.Forms.PictureBox();\r\n            this.m_pictureboxImage2 = new System.Windows.Forms.PictureBox();\r\n            this.m_pictureboxImage3 = new System.Windows.Forms.PictureBox();\r\n            this.m_pictureboxImage4 = new System.Windows.Forms.PictureBox();\r\n            this.m_pictureboxImage5 = new System.Windows.Forms.PictureBox();\r\n            this.m_pictureboxImage6 = new System.Windows.Forms.PictureBox();\r\n            this.m_pictureboxImage7 = new System.Windows.Forms.PictureBox();\r\n            this.m_pictureboxImage8 = new System.Windows.Forms.PictureBox();\r\n            this.m_checkboxUseTwain32 = new System.Windows.Forms.CheckBox();\r\n            this.m_checkboxUseCallbacks = new System.Windows.Forms.CheckBox();\r\n            this.m_labelSeperater4 = new System.Windows.Forms.Label();\r\n            this.m_comboboxDG = new System.Windows.Forms.ComboBox();\r\n            this.m_comboboxDAT = new System.Windows.Forms.ComboBox();\r\n            this.m_comboboxMSG = new System.Windows.Forms.ComboBox();\r\n            this.m_buttonSend = new System.Windows.Forms.Button();\r\n            ((System.ComponentModel.ISupportInitialize)(this.m_pictureboxImage1)).BeginInit();\r\n            ((System.ComponentModel.ISupportInitialize)(this.m_pictureboxImage2)).BeginInit();\r\n            ((System.ComponentModel.ISupportInitialize)(this.m_pictureboxImage3)).BeginInit();\r\n            ((System.ComponentModel.ISupportInitialize)(this.m_pictureboxImage4)).BeginInit();\r\n            ((System.ComponentModel.ISupportInitialize)(this.m_pictureboxImage5)).BeginInit();\r\n            ((System.ComponentModel.ISupportInitialize)(this.m_pictureboxImage6)).BeginInit();\r\n            ((System.ComponentModel.ISupportInitialize)(this.m_pictureboxImage7)).BeginInit();\r\n            ((System.ComponentModel.ISupportInitialize)(this.m_pictureboxImage8)).BeginInit();\r\n            this.SuspendLayout();\r\n            // \r\n            // m_richtextboxOutput\r\n            // \r\n            this.m_richtextboxOutput.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \r\n            | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n            this.m_richtextboxOutput.Location = new System.Drawing.Point(11, 425);\r\n            this.m_richtextboxOutput.Name = \"m_richtextboxOutput\";\r\n            this.m_richtextboxOutput.ReadOnly = true;\r\n            this.m_richtextboxOutput.Size = new System.Drawing.Size(809, 117);\r\n            this.m_richtextboxOutput.TabIndex = 4;\r\n            this.m_richtextboxOutput.Text = \"\";\r\n            // \r\n            // m_richtextboxCapability\r\n            // \r\n            this.m_richtextboxCapability.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n            this.m_richtextboxCapability.DetectUrls = false;\r\n            this.m_richtextboxCapability.Location = new System.Drawing.Point(636, 53);\r\n            this.m_richtextboxCapability.Name = \"m_richtextboxCapability\";\r\n            this.m_richtextboxCapability.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.Vertical;\r\n            this.m_richtextboxCapability.Size = new System.Drawing.Size(184, 233);\r\n            this.m_richtextboxCapability.TabIndex = 8;\r\n            this.m_richtextboxCapability.Text = \"\";\r\n            // \r\n            // m_buttonScan\r\n            // \r\n            this.m_buttonScan.Location = new System.Drawing.Point(636, 397);\r\n            this.m_buttonScan.Name = \"m_buttonScan\";\r\n            this.m_buttonScan.Size = new System.Drawing.Size(91, 23);\r\n            this.m_buttonScan.TabIndex = 11;\r\n            this.m_buttonScan.Text = \"Scan\";\r\n            this.m_buttonScan.UseVisualStyleBackColor = true;\r\n            this.m_buttonScan.Click += new System.EventHandler(this.m_buttonScan_Click);\r\n            // \r\n            // m_buttonStop\r\n            // \r\n            this.m_buttonStop.Location = new System.Drawing.Point(729, 397);\r\n            this.m_buttonStop.Name = \"m_buttonStop\";\r\n            this.m_buttonStop.Size = new System.Drawing.Size(91, 23);\r\n            this.m_buttonStop.TabIndex = 12;\r\n            this.m_buttonStop.Text = \"Stop\";\r\n            this.m_buttonStop.UseVisualStyleBackColor = true;\r\n            this.m_buttonStop.Click += new System.EventHandler(this.m_buttonStop_Click);\r\n            // \r\n            // m_pictureboxImage1\r\n            // \r\n            this.m_pictureboxImage1.BackColor = System.Drawing.Color.White;\r\n            this.m_pictureboxImage1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;\r\n            this.m_pictureboxImage1.Location = new System.Drawing.Point(12, 12);\r\n            this.m_pictureboxImage1.Name = \"m_pictureboxImage1\";\r\n            this.m_pictureboxImage1.Size = new System.Drawing.Size(150, 200);\r\n            this.m_pictureboxImage1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;\r\n            this.m_pictureboxImage1.TabIndex = 13;\r\n            this.m_pictureboxImage1.TabStop = false;\r\n            // \r\n            // m_pictureboxImage2\r\n            // \r\n            this.m_pictureboxImage2.BackColor = System.Drawing.Color.White;\r\n            this.m_pictureboxImage2.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;\r\n            this.m_pictureboxImage2.Location = new System.Drawing.Point(168, 12);\r\n            this.m_pictureboxImage2.Name = \"m_pictureboxImage2\";\r\n            this.m_pictureboxImage2.Size = new System.Drawing.Size(150, 200);\r\n            this.m_pictureboxImage2.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;\r\n            this.m_pictureboxImage2.TabIndex = 14;\r\n            this.m_pictureboxImage2.TabStop = false;\r\n            // \r\n            // m_pictureboxImage3\r\n            // \r\n            this.m_pictureboxImage3.BackColor = System.Drawing.Color.White;\r\n            this.m_pictureboxImage3.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;\r\n            this.m_pictureboxImage3.Location = new System.Drawing.Point(324, 12);\r\n            this.m_pictureboxImage3.Name = \"m_pictureboxImage3\";\r\n            this.m_pictureboxImage3.Size = new System.Drawing.Size(150, 200);\r\n            this.m_pictureboxImage3.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;\r\n            this.m_pictureboxImage3.TabIndex = 15;\r\n            this.m_pictureboxImage3.TabStop = false;\r\n            // \r\n            // m_pictureboxImage4\r\n            // \r\n            this.m_pictureboxImage4.BackColor = System.Drawing.Color.White;\r\n            this.m_pictureboxImage4.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;\r\n            this.m_pictureboxImage4.Location = new System.Drawing.Point(480, 12);\r\n            this.m_pictureboxImage4.Name = \"m_pictureboxImage4\";\r\n            this.m_pictureboxImage4.Size = new System.Drawing.Size(150, 200);\r\n            this.m_pictureboxImage4.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;\r\n            this.m_pictureboxImage4.TabIndex = 16;\r\n            this.m_pictureboxImage4.TabStop = false;\r\n            // \r\n            // m_pictureboxImage5\r\n            // \r\n            this.m_pictureboxImage5.BackColor = System.Drawing.Color.White;\r\n            this.m_pictureboxImage5.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;\r\n            this.m_pictureboxImage5.Location = new System.Drawing.Point(12, 218);\r\n            this.m_pictureboxImage5.Name = \"m_pictureboxImage5\";\r\n            this.m_pictureboxImage5.Size = new System.Drawing.Size(150, 200);\r\n            this.m_pictureboxImage5.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;\r\n            this.m_pictureboxImage5.TabIndex = 17;\r\n            this.m_pictureboxImage5.TabStop = false;\r\n            // \r\n            // m_pictureboxImage6\r\n            // \r\n            this.m_pictureboxImage6.BackColor = System.Drawing.Color.White;\r\n            this.m_pictureboxImage6.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;\r\n            this.m_pictureboxImage6.Location = new System.Drawing.Point(168, 218);\r\n            this.m_pictureboxImage6.Name = \"m_pictureboxImage6\";\r\n            this.m_pictureboxImage6.Size = new System.Drawing.Size(150, 200);\r\n            this.m_pictureboxImage6.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;\r\n            this.m_pictureboxImage6.TabIndex = 18;\r\n            this.m_pictureboxImage6.TabStop = false;\r\n            // \r\n            // m_pictureboxImage7\r\n            // \r\n            this.m_pictureboxImage7.BackColor = System.Drawing.Color.White;\r\n            this.m_pictureboxImage7.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;\r\n            this.m_pictureboxImage7.Location = new System.Drawing.Point(324, 218);\r\n            this.m_pictureboxImage7.Name = \"m_pictureboxImage7\";\r\n            this.m_pictureboxImage7.Size = new System.Drawing.Size(150, 200);\r\n            this.m_pictureboxImage7.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;\r\n            this.m_pictureboxImage7.TabIndex = 19;\r\n            this.m_pictureboxImage7.TabStop = false;\r\n            // \r\n            // m_pictureboxImage8\r\n            // \r\n            this.m_pictureboxImage8.BackColor = System.Drawing.Color.White;\r\n            this.m_pictureboxImage8.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;\r\n            this.m_pictureboxImage8.Location = new System.Drawing.Point(480, 218);\r\n            this.m_pictureboxImage8.Name = \"m_pictureboxImage8\";\r\n            this.m_pictureboxImage8.Size = new System.Drawing.Size(150, 200);\r\n            this.m_pictureboxImage8.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;\r\n            this.m_pictureboxImage8.TabIndex = 20;\r\n            this.m_pictureboxImage8.TabStop = false;\r\n            // \r\n            // m_checkboxUseTwain32\r\n            // \r\n            this.m_checkboxUseTwain32.AutoSize = true;\r\n            this.m_checkboxUseTwain32.Location = new System.Drawing.Point(640, 12);\r\n            this.m_checkboxUseTwain32.Name = \"m_checkboxUseTwain32\";\r\n            this.m_checkboxUseTwain32.Size = new System.Drawing.Size(177, 17);\r\n            this.m_checkboxUseTwain32.TabIndex = 27;\r\n            this.m_checkboxUseTwain32.Text = \"Use TWAIN_32 (Windows only)\";\r\n            this.m_checkboxUseTwain32.UseVisualStyleBackColor = true;\r\n            this.m_checkboxUseTwain32.CheckedChanged += new System.EventHandler(this.m_checkboxUseTwain32_CheckedChanged);\r\n            // \r\n            // m_checkboxUseCallbacks\r\n            // \r\n            this.m_checkboxUseCallbacks.AutoSize = true;\r\n            this.m_checkboxUseCallbacks.Location = new System.Drawing.Point(640, 30);\r\n            this.m_checkboxUseCallbacks.Name = \"m_checkboxUseCallbacks\";\r\n            this.m_checkboxUseCallbacks.Size = new System.Drawing.Size(185, 17);\r\n            this.m_checkboxUseCallbacks.TabIndex = 28;\r\n            this.m_checkboxUseCallbacks.Text = \"Use Callbacks (TWAINDSM only)\";\r\n            this.m_checkboxUseCallbacks.UseVisualStyleBackColor = true;\r\n            this.m_checkboxUseCallbacks.CheckedChanged += new System.EventHandler(this.m_checkboxUseCallbacks_CheckedChanged);\r\n            // \r\n            // m_labelSeperater4\r\n            // \r\n            this.m_labelSeperater4.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;\r\n            this.m_labelSeperater4.Location = new System.Drawing.Point(636, 391);\r\n            this.m_labelSeperater4.Name = \"m_labelSeperater4\";\r\n            this.m_labelSeperater4.Size = new System.Drawing.Size(184, 2);\r\n            this.m_labelSeperater4.TabIndex = 30;\r\n            // \r\n            // m_comboboxDG\r\n            // \r\n            this.m_comboboxDG.FormattingEnabled = true;\r\n            this.m_comboboxDG.Location = new System.Drawing.Point(637, 292);\r\n            this.m_comboboxDG.Name = \"m_comboboxDG\";\r\n            this.m_comboboxDG.Size = new System.Drawing.Size(183, 21);\r\n            this.m_comboboxDG.Sorted = true;\r\n            this.m_comboboxDG.TabIndex = 38;\r\n            // \r\n            // m_comboboxDAT\r\n            // \r\n            this.m_comboboxDAT.FormattingEnabled = true;\r\n            this.m_comboboxDAT.Location = new System.Drawing.Point(637, 315);\r\n            this.m_comboboxDAT.Name = \"m_comboboxDAT\";\r\n            this.m_comboboxDAT.Size = new System.Drawing.Size(183, 21);\r\n            this.m_comboboxDAT.Sorted = true;\r\n            this.m_comboboxDAT.TabIndex = 39;\r\n            // \r\n            // m_comboboxMSG\r\n            // \r\n            this.m_comboboxMSG.FormattingEnabled = true;\r\n            this.m_comboboxMSG.Location = new System.Drawing.Point(637, 338);\r\n            this.m_comboboxMSG.Name = \"m_comboboxMSG\";\r\n            this.m_comboboxMSG.Size = new System.Drawing.Size(183, 21);\r\n            this.m_comboboxMSG.Sorted = true;\r\n            this.m_comboboxMSG.TabIndex = 40;\r\n            // \r\n            // m_buttonSend\r\n            // \r\n            this.m_buttonSend.Location = new System.Drawing.Point(729, 362);\r\n            this.m_buttonSend.Name = \"m_buttonSend\";\r\n            this.m_buttonSend.Size = new System.Drawing.Size(91, 23);\r\n            this.m_buttonSend.TabIndex = 41;\r\n            this.m_buttonSend.Text = \"Send\";\r\n            this.m_buttonSend.UseVisualStyleBackColor = true;\r\n            this.m_buttonSend.Click += new System.EventHandler(this.SendDat);\r\n            // \r\n            // FormMain\r\n            // \r\n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\r\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r\n            this.ClientSize = new System.Drawing.Size(826, 554);\r\n            this.Controls.Add(this.m_buttonSend);\r\n            this.Controls.Add(this.m_comboboxMSG);\r\n            this.Controls.Add(this.m_comboboxDAT);\r\n            this.Controls.Add(this.m_comboboxDG);\r\n            this.Controls.Add(this.m_labelSeperater4);\r\n            this.Controls.Add(this.m_checkboxUseCallbacks);\r\n            this.Controls.Add(this.m_checkboxUseTwain32);\r\n            this.Controls.Add(this.m_pictureboxImage8);\r\n            this.Controls.Add(this.m_pictureboxImage7);\r\n            this.Controls.Add(this.m_pictureboxImage6);\r\n            this.Controls.Add(this.m_pictureboxImage5);\r\n            this.Controls.Add(this.m_pictureboxImage4);\r\n            this.Controls.Add(this.m_pictureboxImage3);\r\n            this.Controls.Add(this.m_pictureboxImage2);\r\n            this.Controls.Add(this.m_pictureboxImage1);\r\n            this.Controls.Add(this.m_buttonStop);\r\n            this.Controls.Add(this.m_buttonScan);\r\n            this.Controls.Add(this.m_richtextboxCapability);\r\n            this.Controls.Add(this.m_richtextboxOutput);\r\n            this.MinimumSize = new System.Drawing.Size(842, 592);\r\n            this.Name = \"FormMain\";\r\n            this.Text = \"TWAIN Test Tool (for C#)\";\r\n            ((System.ComponentModel.ISupportInitialize)(this.m_pictureboxImage1)).EndInit();\r\n            ((System.ComponentModel.ISupportInitialize)(this.m_pictureboxImage2)).EndInit();\r\n            ((System.ComponentModel.ISupportInitialize)(this.m_pictureboxImage3)).EndInit();\r\n            ((System.ComponentModel.ISupportInitialize)(this.m_pictureboxImage4)).EndInit();\r\n            ((System.ComponentModel.ISupportInitialize)(this.m_pictureboxImage5)).EndInit();\r\n            ((System.ComponentModel.ISupportInitialize)(this.m_pictureboxImage6)).EndInit();\r\n            ((System.ComponentModel.ISupportInitialize)(this.m_pictureboxImage7)).EndInit();\r\n            ((System.ComponentModel.ISupportInitialize)(this.m_pictureboxImage8)).EndInit();\r\n            this.ResumeLayout(false);\r\n            this.PerformLayout();\r\n\r\n        }\r\n\r\n        #endregion\r\n\r\n        private System.Windows.Forms.RichTextBox m_richtextboxOutput;\r\n        private System.Windows.Forms.RichTextBox m_richtextboxCapability;\r\n        private System.Windows.Forms.Button m_buttonScan;\r\n        private System.Windows.Forms.Button m_buttonStop;\r\n        private System.Windows.Forms.PictureBox m_pictureboxImage1;\r\n        private System.Windows.Forms.PictureBox m_pictureboxImage2;\r\n        private System.Windows.Forms.PictureBox m_pictureboxImage3;\r\n        private System.Windows.Forms.PictureBox m_pictureboxImage4;\r\n        private System.Windows.Forms.PictureBox m_pictureboxImage5;\r\n        private System.Windows.Forms.PictureBox m_pictureboxImage6;\r\n        private System.Windows.Forms.PictureBox m_pictureboxImage7;\r\n        private System.Windows.Forms.PictureBox m_pictureboxImage8;\r\n        private System.Windows.Forms.CheckBox m_checkboxUseTwain32;\r\n        private System.Windows.Forms.CheckBox m_checkboxUseCallbacks;\r\n        private System.Windows.Forms.Label m_labelSeperater4;\r\n        private System.Windows.Forms.ComboBox m_comboboxDG;\r\n        private System.Windows.Forms.ComboBox m_comboboxDAT;\r\n        private System.Windows.Forms.ComboBox m_comboboxMSG;\r\n        private System.Windows.Forms.Button m_buttonSend;\r\n    }\r\n}\r\n\r\n"
  },
  {
    "path": "twaincs/source/twaincstst/source/Main.cs",
    "content": "﻿///////////////////////////////////////////////////////////////////////////////////////\r\n//\r\n// TWAINCSTst.FormMain\r\n//\r\n// This is the main form for a developerment application.  Don't use this code as\r\n// the template for a new app.  Use TWAINCSSCAN instead, it's smaller and easier\r\n// to understand.\r\n//\r\n// This application offers access to all of the standard and custom TWAIN content\r\n// that one can find in a scanner vendor's TWAIN driver.  It's a diagnostic tool,\r\n// that lets one exercise drivers.  It also showcases all of the ways of getting\r\n// and setting driver data.  So while TWAINCSSCAN is the template for a new\r\n// application, this is the reference guide for specific items that a developer\r\n// may want to add to their code.\r\n//\r\n///////////////////////////////////////////////////////////////////////////////////////\r\n//  Author          Date            Version     Comment\r\n//  M.McLaughlin    21-May-2014     2.0.0.0     64-bit Linux\r\n//  M.McLaughlin    27-Feb-2014     1.1.0.0     ShowImage additions\r\n//  M.McLaughlin    21-Oct-2013     1.0.0.0     Initial Release\r\n///////////////////////////////////////////////////////////////////////////////////////\r\n//  Copyright (C) 2013-2019 Kodak Alaris Inc.\r\n//\r\n//  Permission is hereby granted, free of charge, to any person obtaining a\r\n//  copy of this software and associated documentation files (the \"Software\"),\r\n//  to deal in the Software without restriction, including without limitation\r\n//  the rights to use, copy, modify, merge, publish, distribute, sublicense,\r\n//  and/or sell copies of the Software, and to permit persons to whom the\r\n//  Software is furnished to do so, subject to the following conditions:\r\n//\r\n//  The above copyright notice and this permission notice shall be included in\r\n//  all copies or substantial portions of the Software.\r\n//\r\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\r\n//  THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\r\n//  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\r\n//  DEALINGS IN THE SOFTWARE.\r\n///////////////////////////////////////////////////////////////////////////////////////\r\n\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Diagnostics.CodeAnalysis;\r\nusing System.Drawing;\r\nusing System.Drawing.Drawing2D;\r\nusing System.Drawing.Imaging;\r\nusing System.Globalization;\r\nusing System.IO;\r\nusing System.Runtime.InteropServices;\r\nusing System.Security.Permissions;\r\nusing System.Windows.Forms;\r\nusing TWAINWorkingGroup;\r\n\r\nnamespace TWAINCSTst\r\n{\r\n    /// <summary>\r\n    /// Here's a form for us to tinker with.  We're using this to exercise the\r\n    /// TWAIN object.\r\n    /// </summary>\r\n    public partial class FormMain : Form, IMessageFilter, IDisposable\r\n    {\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        // Public Functions...\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        #region Public Functions...\r\n\r\n        /// <summary>\r\n        /// Init our form, and our TWAIN class.  You might want to consider\r\n        /// moving TWAIN into its own thread, or even running it from a\r\n        /// separate process, so that the main application is always responsive\r\n        /// no matter what's going on in the driver...\r\n        /// </summary>\r\n        public FormMain()\r\n        {\r\n            ContextMenu contextmenu;\r\n            MenuItem menuitem;\r\n\r\n            // Init our form...\r\n            InitializeComponent();\r\n\r\n            // Open the log in our working folder, and say hi...\r\n            TWAINWorkingGroup.Log.Open(\"TWAINCSTst\", \".\", 1);\r\n            TWAINWorkingGroup.Log.Info(\"TWAINCSTst v\" + System.Reflection.Assembly.GetEntryAssembly().GetName().Version.ToString());\r\n\r\n            // Make sure we cleanup if unexpectedly closed...\r\n            this.FormClosing += new FormClosingEventHandler(FormMain_FormClosing);\r\n\r\n            // This next bit establishes the rules for the various DSM's on the\r\n            // various operating systems.\r\n\r\n            // Windows controls...\r\n            if (TWAIN.GetPlatform() == TWAIN.Platform.WINDOWS)\r\n            {\r\n                // Choose between TWAIN_32 and TWAINDSM, note that we always default\r\n                // to the open source TWAIN DSM...\r\n                m_checkboxUseTwain32.Enabled = (TWAIN.GetMachineWordBitSize() == 32);\r\n                m_checkboxUseCallbacks.Enabled = true;\r\n                m_checkboxUseTwain32.Checked = false;\r\n                m_checkboxUseCallbacks.Checked = true;\r\n            }\r\n\r\n            // Linux controls...\r\n            else if (TWAIN.GetPlatform() == TWAIN.Platform.LINUX)\r\n            {\r\n                // We don't give the user control between the DSM versions, because\r\n                // the 64-bit problem is handled as seamlessly as possible...\r\n                m_checkboxUseTwain32.Enabled = false;\r\n                m_checkboxUseCallbacks.Enabled = false;\r\n                m_checkboxUseTwain32.Checked = false;\r\n                m_checkboxUseCallbacks.Checked = true;\r\n            }\r\n\r\n            // Mac OS X controls...\r\n            else if (TWAIN.GetPlatform() == TWAIN.Platform.MACOSX)\r\n            {\r\n                // Choose between /System/Library/Frameworks/TWAIN.framework and\r\n                // /Library/Frameworks/TWAINDSM.framework, note that we always default\r\n                // to the open source TWAIN DSM...\r\n                m_checkboxUseTwain32.Enabled = true;\r\n                m_checkboxUseCallbacks.Enabled = false;\r\n                m_checkboxUseTwain32.Checked = false;\r\n                m_checkboxUseCallbacks.Checked = true;\r\n            }\r\n\r\n            // Autoscroll the text in our output box...\r\n            m_richtextboxOutput.HideSelection = false;\r\n            m_richtextboxOutput.SelectionProtected = false;\r\n\r\n            // Init other stuff...\r\n            m_twain = null;\r\n            m_intptrHwnd = Handle;\r\n\r\n            // Init our image controls...\r\n            InitImage();\r\n\r\n            // Load our triplet dropdown...\r\n            List<string> aszDat = new List<string>();\r\n            List<string> aszMsg = new List<string>();\r\n            foreach (string szDat in (string[])Enum.GetNames(typeof(TWAIN.DAT))) aszDat.Add(\"DAT_\" + szDat);\r\n            foreach (string szMsg in (string[])Enum.GetNames(typeof(TWAIN.MSG))) aszMsg.Add(\"MSG_\" + szMsg);\r\n            this.m_comboboxDG.Items.AddRange(new string[] { \"DG_AUDIO\", \"DG_CONTROL\", \"DG_IMAGE\" });\r\n            this.m_comboboxDAT.Items.AddRange(aszDat.ToArray());\r\n            this.m_comboboxMSG.Items.AddRange(aszMsg.ToArray());\r\n\r\n            // Init our triplet dropdown...\r\n            AutoDropdown(\"\", \"\", \"\");\r\n\r\n            // Context menu for our value box...\r\n            contextmenu = new ContextMenu();\r\n            menuitem = new MenuItem(\"Copy\");\r\n            menuitem.Click += new EventHandler(richtextboxcapability_Copy);\r\n            contextmenu.MenuItems.Add(menuitem);\r\n            menuitem = new MenuItem(\"Paste\");\r\n            menuitem.Click += new EventHandler(richtextboxcapability_Paste);\r\n            contextmenu.MenuItems.Add(menuitem);\r\n            m_richtextboxCapability.ContextMenu = contextmenu;\r\n            contextmenu = null;\r\n\r\n            // Context menu for our output box...\r\n            contextmenu = new ContextMenu();\r\n            menuitem = new MenuItem(\"Copy\");\r\n            menuitem.Click += new EventHandler(richtextboxoutput_Copy);\r\n            contextmenu.MenuItems.Add(menuitem);\r\n            menuitem = new MenuItem(\"Paste\");\r\n            menuitem.Click += new EventHandler(richtextboxoutput_Paste);\r\n            contextmenu.MenuItems.Add(menuitem);\r\n            m_richtextboxOutput.ContextMenu = contextmenu;\r\n            contextmenu = null;\r\n\r\n            // Set the capbility box to our app info...\r\n            m_richtextboxCapability.Text =\r\n                \"TWAIN Working Group,\" +\r\n                \"TWAIN Sharp,\" +\r\n                \"TWAIN Sharp Test App,\" +\r\n                \"2,\" +\r\n                \"4,\" +\r\n                \"0x20000003,\" +\r\n                \"USA,\" +\r\n                \"testing...,\" +\r\n                \"ENGLISH_USA\";\r\n        }\r\n\r\n        /// <summary>\r\n        /// Call the form's filter function to catch stuff like MSG.XFERREADY...\r\n        /// </summary>\r\n        /// <param name=\"a_message\">Message to process</param>\r\n        /// <returns>Result of the processing</returns>\r\n        [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]\r\n        public bool PreFilterMessage(ref Message a_message)\r\n        {\r\n            if (m_twain != null)\r\n            {\r\n                return (m_twain.PreFilterMessage(a_message.HWnd, a_message.Msg, a_message.WParam, a_message.LParam));\r\n            }\r\n            return (true);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Our scan callback event, used to drive the engine when scanning...\r\n        /// </summary>\r\n        public delegate void ScanCallbackEvent();\r\n\r\n        /// <summary>\r\n        /// Our event handler for the scan callback event.  This will be\r\n        /// called once by ScanCallbackTrigger on receipt of an event\r\n        /// like MSG_XFERREADY, and then will be reissued on every call\r\n        /// into ScanCallback until we're done and get back to state 4.\r\n        ///  \r\n        /// This helps to make sure we're always running in the context\r\n        /// of FormMain on Windows, which is critical if we want drivers\r\n        /// to work properly.  It also gives a way to break up the calls\r\n        /// so the message pump is still reponsive.\r\n        /// </summary>\r\n        /// <param name=\"sender\"></param>\r\n        /// <param name=\"e\"></param>\r\n        private void ScanCallbackEventHandler(object sender, EventArgs e)\r\n        {\r\n            ScanCallback((m_twain == null) ? true : (m_twain.GetState() <= TWAIN.STATE.S3));\r\n        }\r\n\r\n        /// <summary>\r\n        /// Rollback the TWAIN state to whatever is requested...\r\n        /// </summary>\r\n        /// <param name=\"a_state\"></param>\r\n        public void Rollback(TWAIN.STATE a_state)\r\n        {\r\n            string szTwmemref = \"\";\r\n            string szStatus = \"\";\r\n            TWAIN.STS sts;\r\n\r\n            // Make sure we have something to work with...\r\n            if (m_twain == null)\r\n            {\r\n                return;\r\n            }\r\n\r\n            // Walk the states, we don't care about the status returns.  Basically,\r\n            // these need to work, or we're guaranteed to hang...\r\n\r\n            // 7 --> 6\r\n            if ((m_twain.GetState() == TWAIN.STATE.S7) && (a_state < TWAIN.STATE.S7))\r\n            {\r\n                szTwmemref = \"0,0\";\r\n                szStatus = \"\";\r\n                sts = Send(\"DG_CONTROL\", \"DAT_PENDINGXFERS\", \"MSG_ENDXFER\", ref szTwmemref, ref szStatus);\r\n                szStatus = (szStatus == \"\") ? sts.ToString() : (sts.ToString() + \" - \" + szStatus);\r\n                WriteTriplet(\"DG_CONTROL\", \"DAT_PENDINGXFERS\", \"MSG_ENDXFER\", szStatus + ((szTwmemref == \"\") ? \"\" : (Environment.NewLine + szTwmemref)));\r\n            }\r\n\r\n            // 6 --> 5\r\n            if ((m_twain.GetState() == TWAIN.STATE.S6) && (a_state < TWAIN.STATE.S6))\r\n            {\r\n                szTwmemref = \"0,0\";\r\n                szStatus = \"\";\r\n                sts = Send(\"DG_CONTROL\", \"DAT_PENDINGXFERS\", \"MSG_RESET\", ref szTwmemref, ref szStatus);\r\n                szStatus = (szStatus == \"\") ? sts.ToString() : (sts.ToString() + \" - \" + szStatus);\r\n                WriteTriplet(\"DG_CONTROL\", \"DAT_PENDINGXFERS\", \"MSG_RESET\", szStatus + ((szTwmemref == \"\") ? \"\" : (Environment.NewLine + szTwmemref)));\r\n            }\r\n\r\n            // 5 --> 4\r\n            if ((m_twain.GetState() == TWAIN.STATE.S5) && (a_state < TWAIN.STATE.S5))\r\n            {\r\n                szTwmemref = \"0,0,\" + m_intptrHwnd;\r\n                szStatus = \"\";\r\n                sts = Send(\"DG_CONTROL\", \"DAT_USERINTERFACE\", \"MSG_DISABLEDS\", ref szTwmemref, ref szStatus);\r\n                szStatus = (szStatus == \"\") ? sts.ToString() : (sts.ToString() + \" - \" + szStatus);\r\n                WriteTriplet(\"DG_CONTROL\", \"DAT_USERINTERFACE\", \"MSG_DISABLEDS\", szStatus + ((szTwmemref == \"\") ? \"\" : (Environment.NewLine + szTwmemref)));\r\n                ClearEvents();\r\n            }\r\n\r\n            // 4 --> 3\r\n            if ((m_twain.GetState() == TWAIN.STATE.S4) && (a_state < TWAIN.STATE.S4))\r\n            {\r\n                if (!m_checkboxUseCallbacks.Checked)\r\n                {\r\n                    Application.RemoveMessageFilter(this);\r\n                }\r\n                szTwmemref = m_twain.GetDsIdentity();\r\n                szStatus = \"\";\r\n                sts = Send(\"DG_CONTROL\", \"DAT_IDENTITY\", \"MSG_CLOSEDS\", ref szTwmemref, ref szStatus);\r\n                szStatus = (szStatus == \"\") ? sts.ToString() : (sts.ToString() + \" - \" + szStatus);\r\n                WriteTriplet(\"DG_CONTROL\", \"DAT_IDENTITY\", \"MSG_CLOSEDS\", szStatus + ((szTwmemref == \"\") ? \"\" : (Environment.NewLine + szTwmemref)));\r\n            }\r\n\r\n            // 3 --> 2\r\n            if ((m_twain.GetState() == TWAIN.STATE.S3) && (a_state < TWAIN.STATE.S3))\r\n            {\r\n                szTwmemref = m_intptrHwnd.ToString();\r\n                szStatus = \"\";\r\n                sts = Send(\"DG_CONTROL\", \"DAT_PARENT\", \"MSG_CLOSEDSM\", ref szTwmemref, ref szStatus);\r\n                szStatus = (szStatus == \"\") ? sts.ToString() : (sts.ToString() + \" - \" + szStatus);\r\n                WriteTriplet(\"DG_CONTROL\", \"DAT_PARENT\", \"MSG_CLOSEDSM\", szStatus + ((szTwmemref == \"\") ? \"\" : (Environment.NewLine + szTwmemref)));\r\n            }\r\n\r\n            // 2 --> 1\r\n            if ((m_twain.GetState() == TWAIN.STATE.S2) && (a_state < TWAIN.STATE.S2))\r\n            {\r\n                m_twain.Dispose();\r\n                m_twain = null;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Our scanning callback function.  We appeal directly to the supporting\r\n        /// TWAIN object.  This way we don't have to maintain some kind of a loop\r\n        /// inside of the application, which is the source of most problems that\r\n        /// developers run into.\r\n        /// \r\n        /// While it looks scary at first, there's really not a lot going on in\r\n        /// here.  We do some sanity checks, we watch for certain kinds of events,\r\n        /// we support the four methods of transferring images, and we dump out\r\n        /// some meta-data about the transferred image.  However, because it does\r\n        /// look scary I dropped in some region pragmas to break things up...\r\n        /// </summary>\r\n        /// <param name=\"a_blClosing\">We're shutting down</param>\r\n        /// <returns>TWAIN status</returns>\r\n        private TWAIN.STS ScanCallbackTrigger(bool a_blClosing)\r\n        {\r\n            BeginInvoke(new MethodInvoker(delegate { ScanCallbackEventHandler(this, new EventArgs()); }));\r\n            return (TWAIN.STS.SUCCESS);\r\n        }\r\n        private TWAIN.STS ScanCallback(bool a_blClosing)\r\n        {\r\n            string szTwmemref = \"\";\r\n            string szStatus = \"\";\r\n            TWAIN.STS sts;\r\n\r\n            // Scoot...\r\n            if (m_twain == null)\r\n            {\r\n                return (TWAIN.STS.FAILURE);\r\n            }\r\n\r\n            // We're superfluous...\r\n            if (m_twain.GetState() <= TWAIN.STATE.S4)\r\n            {\r\n                return (TWAIN.STS.SUCCESS);\r\n            }\r\n\r\n            // We're leaving...\r\n            if (a_blClosing)\r\n            {\r\n                return (TWAIN.STS.SUCCESS);\r\n            }\r\n\r\n            // Do this in the right thread, we'll usually be in the\r\n            // right spot, save maybe on the first call...\r\n            if (this.InvokeRequired)\r\n            {\r\n                return\r\n                (\r\n                    (TWAIN.STS)Invoke\r\n                    (\r\n                        (Func<TWAIN.STS>)delegate\r\n                        {\r\n                            return (ScanCallback(a_blClosing));\r\n                        }\r\n                    )\r\n                );\r\n            }\r\n\r\n            // Handle DAT_NULL/MSG_XFERREADY...\r\n            if (m_twain.IsMsgXferReady() && !m_blXferReadySent)\r\n            {\r\n                m_blXferReadySent = true;\r\n\r\n                // What transfer mechanism are we using?\r\n                szTwmemref = \"ICAP_XFERMECH,0,0,0\";\r\n                szStatus = \"\";\r\n                sts = Send(\"DG_CONTROL\", \"DAT_CAPABILITY\", \"MSG_GETCURRENT\", ref szTwmemref, ref szStatus);\r\n                szStatus = (szStatus == \"\") ? sts.ToString() : (sts.ToString() + \" - \" + szStatus);\r\n                WriteTriplet(\"DG_CONTROL\", \"DAT_SETUPMEMXFER\", \"MSG_GET\", szStatus + ((szTwmemref == \"\") ? \"\" : (Environment.NewLine + szTwmemref)));\r\n                if (szTwmemref.EndsWith(\"TWSX_NATIVE\")) m_twsxXferMech = TWAIN.TWSX.NATIVE;\r\n                else if (szTwmemref.EndsWith(\"TWSX_MEMORY\")) m_twsxXferMech = TWAIN.TWSX.MEMORY;\r\n                else if (szTwmemref.EndsWith(\"TWSX_FILE\")) m_twsxXferMech = TWAIN.TWSX.FILE;\r\n                else if (szTwmemref.EndsWith(\"TWSX_MEMFILE\")) m_twsxXferMech = TWAIN.TWSX.MEMFILE;\r\n\r\n                // Memory and memfile transfers need this...\r\n                if ((m_twsxXferMech == TWAIN.TWSX.MEMORY) || (m_twsxXferMech == TWAIN.TWSX.MEMFILE))\r\n                {\r\n                    // Get the amount of memory needed...\r\n                    szTwmemref = \"0,0,0\";\r\n                    szStatus = \"\";\r\n                    sts = Send(\"DG_CONTROL\", \"DAT_SETUPMEMXFER\", \"MSG_GET\", ref szTwmemref, ref szStatus);\r\n                    TWAIN.CsvToSetupmemxfer(ref m_twsetupmemxfer, szTwmemref);\r\n                    szStatus = (szStatus == \"\") ? sts.ToString() : (sts.ToString() + \" - \" + szStatus);\r\n                    WriteTriplet(\"DG_CONTROL\", \"DAT_SETUPMEMXFER\", \"MSG_GET\", szStatus + ((szTwmemref == \"\") ? \"\" : (Environment.NewLine + szTwmemref)));\r\n                    if ((sts != TWAIN.STS.SUCCESS) || (m_twsetupmemxfer.Preferred == 0))\r\n                    {\r\n                        m_blXferReadySent = false;\r\n                        if (!m_blDisableDsSent)\r\n                        {\r\n                            m_blDisableDsSent = true;\r\n                            Rollback(TWAIN.STATE.S4);\r\n                        }\r\n                    }\r\n\r\n                    // Allocate the transfer memory (with a little extra to protect ourselves)...\r\n                    m_intptrXfer = Marshal.AllocHGlobal((int)m_twsetupmemxfer.Preferred + 65536);\r\n                    if (m_intptrXfer == IntPtr.Zero)\r\n                    {\r\n                        m_blDisableDsSent = true;\r\n                        Rollback(TWAIN.STATE.S4);\r\n                    }\r\n                }\r\n            }\r\n\r\n            // Handle DAT_NULL/MSG_CLOSEDSREQ...\r\n            if (m_twain.IsMsgCloseDsReq() && !m_blDisableDsSent)\r\n            {\r\n                m_blDisableDsSent = true;\r\n                Rollback(TWAIN.STATE.S4);\r\n            }\r\n\r\n            // Handle DAT_NULL/MSG_CLOSEDSOK...\r\n            if (m_twain.IsMsgCloseDsOk() && !m_blDisableDsSent)\r\n            {\r\n                m_blDisableDsSent = true;\r\n                Rollback(TWAIN.STATE.S4);\r\n            }\r\n\r\n            // This is where the statemachine runs that transfers and optionally\r\n            // saves the images to disk (it also displays them).  It'll go back\r\n            // and forth between states 6 and 7 until an error occurs, or until\r\n            // we run out of images...\r\n            if (m_blXferReadySent && !m_blDisableDsSent)\r\n            {\r\n                switch (m_twsxXferMech)\r\n                {\r\n                    default:\r\n                    case TWAIN.TWSX.NATIVE:\r\n                        CaptureNativeImages();\r\n                        break;\r\n\r\n                    case TWAIN.TWSX.MEMORY:\r\n                        CaptureMemImages();\r\n                        break;\r\n\r\n                    case TWAIN.TWSX.FILE:\r\n                        CaptureFileImages();\r\n                        break;\r\n\r\n                    case TWAIN.TWSX.MEMFILE:\r\n                        CaptureMemfileImages();\r\n                        break;\r\n                }\r\n            }\r\n\r\n            // Trigger the next event, this is where things all chain together.\r\n            // We need begininvoke to prevent blockking, so that we don't get\r\n            // backed up into a messy kind of recursion.  We need DoEvents,\r\n            // because if things really start moving fast it's really hard for\r\n            // application events, like button clicks to break through...\r\n            Application.DoEvents();\r\n            BeginInvoke(new MethodInvoker(delegate { ScanCallbackEventHandler(this, new EventArgs()); }));\r\n\r\n            // All done...\r\n            return (TWAIN.STS.SUCCESS);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Go through the sequence needed to capture images using DAT_IMAGENATIVEXFER...\r\n        /// </summary>\r\n        private void CaptureNativeImages()\r\n        {\r\n            string szTwmemref = \"\";\r\n            string szStatus = \"\";\r\n            IntPtr intptrHandle = IntPtr.Zero;\r\n            IntPtr intptrPtr = IntPtr.Zero;\r\n            TWAIN.STS sts;\r\n            TWAIN.TW_PENDINGXFERS twpendingxfers = default(TWAIN.TW_PENDINGXFERS);\r\n\r\n            // Dispatch on the state...\r\n            switch (m_twain.GetState())\r\n            {\r\n                // Not a good state, just scoot...\r\n                default:\r\n                    return;\r\n\r\n                // We're on our way out...\r\n                case TWAIN.STATE.S5:\r\n                    m_blDisableDsSent = true;\r\n                    Rollback(TWAIN.STATE.S4);\r\n                    return;\r\n\r\n                // Native transfers...\r\n                case TWAIN.STATE.S6:\r\n                    szTwmemref = \"0\";\r\n                    szStatus = \"\";\r\n                    sts = Send(\"DG_IMAGE\", \"DAT_IMAGENATIVEXFER\", \"MSG_GET\", ref szTwmemref, ref szStatus);\r\n                    if (!string.IsNullOrEmpty(szTwmemref))\r\n                    {\r\n                        UInt64 u64Handle;\r\n                        if (UInt64.TryParse(szTwmemref, out u64Handle))\r\n                        {\r\n                            intptrHandle = (IntPtr)u64Handle;\r\n                        }\r\n                    }\r\n                    szStatus = (szStatus == \"\") ? sts.ToString() : (sts.ToString() + \" - \" + szStatus);\r\n                    WriteTriplet(\"DG_IMAGE\", \"DAT_IMAGENATIVEXFER\", \"MSG_GET\", szStatus + ((szTwmemref == \"\") ? \"\" : (Environment.NewLine + szTwmemref)));\r\n                    break;\r\n            }\r\n\r\n            // Handle problems...\r\n            if (sts != TWAIN.STS.XFERDONE)\r\n            {\r\n                m_blDisableDsSent = true;\r\n                Rollback(TWAIN.STATE.S4);\r\n                return;\r\n            }\r\n\r\n            // Ruh-roh...\r\n            if (intptrHandle == IntPtr.Zero)\r\n            {\r\n                m_blDisableDsSent = true;\r\n                Rollback(TWAIN.STATE.S4);\r\n                return;\r\n            }\r\n\r\n            // If we saw XFERDONE we can save the image, display it,\r\n            // end the transfer, and see if we have more images...\r\n            if (sts == TWAIN.STS.XFERDONE)\r\n            {\r\n                // Bump up our image counter, this always grows for the\r\n                // life of the entire session...\r\n                m_iImageCount += 1;\r\n\r\n                // Get our pointer...\r\n                intptrPtr = m_twain.DsmMemLock(intptrHandle);\r\n                if (intptrPtr == IntPtr.Zero)\r\n                {\r\n                    m_blDisableDsSent = true;\r\n                    Rollback(TWAIN.STATE.S4);\r\n                    return;\r\n                }\r\n\r\n                // Turn our image pointer into a byte array...\r\n                int iHeaderBytes;\r\n                byte[] abImage = m_twain.NativeToByteArray(intptrPtr, true, out iHeaderBytes);\r\n\r\n                // Unlock and free the memory we got from the scanner...\r\n                m_twain.DsmMemUnlock(intptrHandle);\r\n                m_twain.DsmMemFree(ref intptrHandle);\r\n\r\n                // Save the image to disk, if we're doing that...\r\n                /*\r\n                if (!string.IsNullOrEmpty(m_formsetup.GetImageFolder()))\r\n                {\r\n                    // Create the directory, if needed...\r\n                    if (!Directory.Exists(m_formsetup.GetImageFolder()))\r\n                    {\r\n                        try\r\n                        {\r\n                            Directory.CreateDirectory(m_formsetup.GetImageFolder());\r\n                        }\r\n                        catch (Exception exception)\r\n                        {\r\n                            TWAINWorkingGroup.Log.Error(\"CreateDirectory failed - \" + exception.Message);\r\n                        }\r\n                    }\r\n\r\n                    // Write it out...\r\n                    string szFilename = Path.Combine(m_formsetup.GetImageFolder(), \"img\" + string.Format(\"{0:D6}\", m_iImageCount));\r\n                    TWAIN.WriteImageFile(szFilename, m_intptrImage, m_iImageBytes, out szFilename);\r\n                }\r\n                */\r\n\r\n                // Turn the byte array into a stream...\r\n                MemoryStream memorystream = new MemoryStream(abImage);\r\n                Bitmap bitmap = (Bitmap)Image.FromStream(memorystream);\r\n\r\n                // Display the image...\r\n\r\n                // Display the image...\r\n                switch (m_iCurrentPictureBox)\r\n                {\r\n                    default:\r\n                    case 0:\r\n                        LoadImage(ref m_pictureboxImage1, ref m_graphics1, ref m_bitmapGraphic1, bitmap);\r\n                        break;\r\n                    case 1:\r\n                        LoadImage(ref m_pictureboxImage2, ref m_graphics2, ref m_bitmapGraphic2, bitmap);\r\n                        break;\r\n                    case 2:\r\n                        LoadImage(ref m_pictureboxImage3, ref m_graphics3, ref m_bitmapGraphic3, bitmap);\r\n                        break;\r\n                    case 3:\r\n                        LoadImage(ref m_pictureboxImage4, ref m_graphics4, ref m_bitmapGraphic4, bitmap);\r\n                        break;\r\n                    case 4:\r\n                        LoadImage(ref m_pictureboxImage5, ref m_graphics5, ref m_bitmapGraphic5, bitmap);\r\n                        break;\r\n                    case 5:\r\n                        LoadImage(ref m_pictureboxImage6, ref m_graphics6, ref m_bitmapGraphic6, bitmap);\r\n                        break;\r\n                    case 6:\r\n                        LoadImage(ref m_pictureboxImage7, ref m_graphics7, ref m_bitmapGraphic7, bitmap);\r\n                        break;\r\n                    case 7:\r\n                        LoadImage(ref m_pictureboxImage8, ref m_graphics8, ref m_bitmapGraphic8, bitmap);\r\n                        break;\r\n                }\r\n\r\n                // Next picture box...\r\n                if (++m_iCurrentPictureBox >= 8)\r\n                {\r\n                    m_iCurrentPictureBox = 0;\r\n                }\r\n\r\n                // Cleanup...\r\n                bitmap.Dispose();\r\n                memorystream = null; // disposed by the bitmap\r\n                abImage = null;\r\n\r\n                // End the transfer...\r\n                szTwmemref = \"0,0\";\r\n                szStatus = \"\";\r\n                sts = Send(\"DG_CONTROL\", \"DAT_PENDINGXFERS\", \"MSG_ENDXFER\", ref szTwmemref, ref szStatus);\r\n                TWAIN.CsvToPendingXfers(ref twpendingxfers, szTwmemref);\r\n                szStatus = (szStatus == \"\") ? sts.ToString() : (sts.ToString() + \" - \" + szStatus);\r\n                WriteTriplet(\"DG_CONTROL\", \"DAT_PENDINGXFERS\", \"MSG_ENDXFER\", szStatus + ((szTwmemref == \"\") ? \"\" : (Environment.NewLine + szTwmemref)));\r\n\r\n                // Looks like we're done!\r\n                if (twpendingxfers.Count == 0)\r\n                {\r\n                    m_blDisableDsSent = true;\r\n                    Rollback(TWAIN.STATE.S4);\r\n                    return;\r\n                }\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Go through the sequence needed to capture images using DAT_IMAGEMEMXFER...\r\n        /// </summary>\r\n        private void CaptureMemImages()\r\n        {\r\n            string szTwmemref = \"\";\r\n            string szStatus = \"\";\r\n            TWAIN.STS sts;\r\n            TWAIN.TW_IMAGEINFO twimageinfo = default(TWAIN.TW_IMAGEINFO);\r\n            TWAIN.TW_IMAGEMEMXFER twimagememxfer = default(TWAIN.TW_IMAGEMEMXFER);\r\n            TWAIN.TW_PENDINGXFERS twpendingxfers = default(TWAIN.TW_PENDINGXFERS);\r\n\r\n            // Dispatch on the state...\r\n            switch (m_twain.GetState())\r\n            {\r\n                // Not a good state, just scoot...\r\n                default:\r\n                    return;\r\n\r\n                // We're on our way out...\r\n                case TWAIN.STATE.S5:\r\n                    m_blDisableDsSent = true;\r\n                    Rollback(TWAIN.STATE.S4);\r\n                    return;\r\n\r\n                // Memory transfers...\r\n                case TWAIN.STATE.S6:\r\n                case TWAIN.STATE.S7:\r\n                    szTwmemref = \"0,0,0,0,0,0,0,\" + ((int)TWAIN.TWMF.APPOWNS | (int)TWAIN.TWMF.POINTER) + \",\" + m_twsetupmemxfer.Preferred + \",\" + m_intptrXfer;\r\n                    szStatus = \"\";\r\n                    sts = Send(\"DG_IMAGE\", \"DAT_IMAGEMEMXFER\", \"MSG_GET\", ref szTwmemref, ref szStatus);\r\n                    TWAIN.CsvToImagememxfer(ref twimagememxfer, szTwmemref);\r\n                    szStatus = (szStatus == \"\") ? sts.ToString() : (sts.ToString() + \" - \" + szStatus);\r\n                    WriteTriplet(\"DG_IMAGE\", \"DAT_IMAGEMEMXFER\", \"MSG_GET\", szStatus + ((szTwmemref == \"\") ? \"\" : (Environment.NewLine + szTwmemref)));\r\n                    break;\r\n            }\r\n\r\n            // Handle problems...\r\n            if ((sts != TWAIN.STS.SUCCESS) && (sts != TWAIN.STS.XFERDONE))\r\n            {\r\n                m_blDisableDsSent = true;\r\n                Rollback(TWAIN.STATE.S4);\r\n                return;\r\n            }\r\n\r\n            // Allocate or grow the image memory...\r\n            if (m_intptrImage == IntPtr.Zero)\r\n            {\r\n                m_intptrImage = Marshal.AllocHGlobal((int)twimagememxfer.BytesWritten);\r\n            }\r\n            else\r\n            {\r\n                m_intptrImage = Marshal.ReAllocHGlobal(m_intptrImage, (IntPtr)(m_iImageBytes + twimagememxfer.BytesWritten));\r\n            }\r\n\r\n            // Ruh-roh...\r\n            if (m_intptrImage == IntPtr.Zero)\r\n            {\r\n                m_blDisableDsSent = true;\r\n                Rollback(TWAIN.STATE.S4);\r\n                return;\r\n            }\r\n\r\n            // Copy into the buffer, and bump up our byte tally...\r\n            TWAIN.MemCpy(m_intptrImage + m_iImageBytes, m_intptrXfer, (int)twimagememxfer.BytesWritten);\r\n            m_iImageBytes += (int)twimagememxfer.BytesWritten;\r\n\r\n            // If we saw XFERDONE we can save the image, display it,\r\n            // end the transfer, and see if we have more images...\r\n            if (sts == TWAIN.STS.XFERDONE)\r\n            {\r\n                // Bump up our image counter, this always grows for the\r\n                // life of the entire session...\r\n                m_iImageCount += 1;\r\n\r\n                // Get the image info...\r\n                szTwmemref = \"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\";\r\n                szStatus = \"\";\r\n                sts = Send(\"DG_IMAGE\", \"DAT_IMAGEINFO\", \"MSG_GET\", ref szTwmemref, ref szStatus);\r\n                TWAIN.CsvToImageinfo(ref twimageinfo, szTwmemref);\r\n                szStatus = (szStatus == \"\") ? sts.ToString() : (sts.ToString() + \" - \" + szStatus);\r\n                WriteTriplet(\"DG_IMAGE\", \"DAT_IMAGEINFO\", \"MSG_GET\", szStatus + ((szTwmemref == \"\") ? \"\" : (Environment.NewLine + szTwmemref)));\r\n\r\n                // Add the appropriate header...\r\n\r\n                // Bitonal uncompressed...\r\n                if (((TWAIN.TWPT)twimageinfo.PixelType == TWAIN.TWPT.BW) && ((TWAIN.TWCP)twimageinfo.Compression == TWAIN.TWCP.NONE))\r\n                {\r\n                    TWAIN.TiffBitonalUncompressed tiffbitonaluncompressed;\r\n                    tiffbitonaluncompressed = new TWAIN.TiffBitonalUncompressed((uint)twimageinfo.ImageWidth, (uint)twimageinfo.ImageLength, (uint)twimageinfo.XResolution.Whole, (uint)m_iImageBytes);\r\n                    m_intptrImage = Marshal.ReAllocHGlobal(m_intptrImage, (IntPtr)(Marshal.SizeOf(tiffbitonaluncompressed) + m_iImageBytes));\r\n                    TWAIN.MemMove((IntPtr)((UInt64)m_intptrImage + (UInt64)Marshal.SizeOf(tiffbitonaluncompressed)), m_intptrImage, m_iImageBytes);\r\n                    Marshal.StructureToPtr(tiffbitonaluncompressed, m_intptrImage, true);\r\n                    m_iImageBytes += (int)Marshal.SizeOf(tiffbitonaluncompressed);\r\n                }\r\n\r\n                // Bitonal GROUP4...\r\n                else if (((TWAIN.TWPT)twimageinfo.PixelType == TWAIN.TWPT.BW) && ((TWAIN.TWCP)twimageinfo.Compression == TWAIN.TWCP.GROUP4))\r\n                {\r\n                    TWAIN.TiffBitonalG4 tiffbitonalg4;\r\n                    tiffbitonalg4 = new TWAIN.TiffBitonalG4((uint)twimageinfo.ImageWidth, (uint)twimageinfo.ImageLength, (uint)twimageinfo.XResolution.Whole, (uint)m_iImageBytes);\r\n                    m_intptrImage = Marshal.ReAllocHGlobal(m_intptrImage, (IntPtr)(Marshal.SizeOf(tiffbitonalg4) + m_iImageBytes));\r\n                    TWAIN.MemMove((IntPtr)((UInt64)m_intptrImage + (UInt64)Marshal.SizeOf(tiffbitonalg4)), m_intptrImage, m_iImageBytes);\r\n                    Marshal.StructureToPtr(tiffbitonalg4, m_intptrImage, true);\r\n                    m_iImageBytes += (int)Marshal.SizeOf(tiffbitonalg4);\r\n                }\r\n\r\n                // Gray uncompressed...\r\n                else if (((TWAIN.TWPT)twimageinfo.PixelType == TWAIN.TWPT.GRAY) && ((TWAIN.TWCP)twimageinfo.Compression == TWAIN.TWCP.NONE))\r\n                {\r\n                    TWAIN.TiffGrayscaleUncompressed tiffgrayscaleuncompressed;\r\n                    tiffgrayscaleuncompressed = new TWAIN.TiffGrayscaleUncompressed((uint)twimageinfo.ImageWidth, (uint)twimageinfo.ImageLength, (uint)twimageinfo.XResolution.Whole, (uint)m_iImageBytes);\r\n                    m_intptrImage = Marshal.ReAllocHGlobal(m_intptrImage, (IntPtr)(Marshal.SizeOf(tiffgrayscaleuncompressed) + m_iImageBytes));\r\n                    TWAIN.MemMove((IntPtr)((UInt64)m_intptrImage + (UInt64)Marshal.SizeOf(tiffgrayscaleuncompressed)), m_intptrImage, m_iImageBytes);\r\n                    Marshal.StructureToPtr(tiffgrayscaleuncompressed, m_intptrImage, true);\r\n                    m_iImageBytes += (int)Marshal.SizeOf(tiffgrayscaleuncompressed);\r\n                }\r\n\r\n                // Gray JPEG...\r\n                else if (((TWAIN.TWPT)twimageinfo.PixelType == TWAIN.TWPT.GRAY) && ((TWAIN.TWCP)twimageinfo.Compression == TWAIN.TWCP.JPEG))\r\n                {\r\n                    // No work to be done, we'll output JPEG...\r\n                }\r\n\r\n                // RGB uncompressed...\r\n                else if (((TWAIN.TWPT)twimageinfo.PixelType == TWAIN.TWPT.RGB) && ((TWAIN.TWCP)twimageinfo.Compression == TWAIN.TWCP.NONE))\r\n                {\r\n                    TWAIN.TiffColorUncompressed tiffcoloruncompressed;\r\n                    tiffcoloruncompressed = new TWAIN.TiffColorUncompressed((uint)twimageinfo.ImageWidth, (uint)twimageinfo.ImageLength, (uint)twimageinfo.XResolution.Whole, (uint)m_iImageBytes);\r\n                    m_intptrImage = Marshal.ReAllocHGlobal(m_intptrImage, (IntPtr)(Marshal.SizeOf(tiffcoloruncompressed) + m_iImageBytes));\r\n                    TWAIN.MemMove((IntPtr)((UInt64)m_intptrImage + (UInt64)Marshal.SizeOf(tiffcoloruncompressed)), m_intptrImage, m_iImageBytes);\r\n                    Marshal.StructureToPtr(tiffcoloruncompressed, m_intptrImage, true);\r\n                    m_iImageBytes += (int)Marshal.SizeOf(tiffcoloruncompressed);\r\n                }\r\n\r\n                // RGB JPEG...\r\n                else if (((TWAIN.TWPT)twimageinfo.PixelType == TWAIN.TWPT.RGB) && ((TWAIN.TWCP)twimageinfo.Compression == TWAIN.TWCP.JPEG))\r\n                {\r\n                    // No work to be done, we'll output JPEG...\r\n                }\r\n\r\n                // Oh well...\r\n                else\r\n                {\r\n                    TWAINWorkingGroup.Log.Error(\"unsupported format <\" + twimageinfo.PixelType + \",\" + twimageinfo.Compression + \">\");\r\n                    m_blDisableDsSent = true;\r\n                    Rollback(TWAIN.STATE.S4);\r\n                    return;\r\n                }\r\n\r\n                // Save the image to disk, if we're doing that...\r\n                /*\r\n                if (!string.IsNullOrEmpty(m_formsetup.GetImageFolder()))\r\n                {\r\n                    // Create the directory, if needed...\r\n                    if (!Directory.Exists(m_formsetup.GetImageFolder()))\r\n                    {\r\n                        try\r\n                        {\r\n                            Directory.CreateDirectory(m_formsetup.GetImageFolder());\r\n                        }\r\n                        catch (Exception exception)\r\n                        {\r\n                            TWAINWorkingGroup.Log.Error(\"CreateDirectory failed - \" + exception.Message);\r\n                        }\r\n                    }\r\n\r\n                    // Write it out...\r\n                    string szFilename = Path.Combine(m_formsetup.GetImageFolder(), \"img\" + string.Format(\"{0:D6}\", m_iImageCount));\r\n                    TWAIN.WriteImageFile(szFilename, m_intptrImage, m_iImageBytes, out szFilename);\r\n                }\r\n                */\r\n\r\n                // Turn the image into a byte array, and free the original memory...\r\n                byte[] abImage = new byte[m_iImageBytes];\r\n                Marshal.Copy(m_intptrImage, abImage, 0, m_iImageBytes);\r\n                Marshal.FreeHGlobal(m_intptrImage);\r\n                m_intptrImage = IntPtr.Zero;\r\n                m_iImageBytes = 0;\r\n\r\n                // Turn the byte array into a stream...\r\n                MemoryStream memorystream = new MemoryStream(abImage);\r\n                Bitmap bitmap = (Bitmap)Image.FromStream(memorystream);\r\n\r\n                // Display the image...\r\n\r\n                // Display the image...\r\n                switch (m_iCurrentPictureBox)\r\n                {\r\n                    default:\r\n                    case 0:\r\n                        LoadImage(ref m_pictureboxImage1, ref m_graphics1, ref m_bitmapGraphic1, bitmap);\r\n                        break;\r\n                    case 1:\r\n                        LoadImage(ref m_pictureboxImage2, ref m_graphics2, ref m_bitmapGraphic2, bitmap);\r\n                        break;\r\n                    case 2:\r\n                        LoadImage(ref m_pictureboxImage3, ref m_graphics3, ref m_bitmapGraphic3, bitmap);\r\n                        break;\r\n                    case 3:\r\n                        LoadImage(ref m_pictureboxImage4, ref m_graphics4, ref m_bitmapGraphic4, bitmap);\r\n                        break;\r\n                    case 4:\r\n                        LoadImage(ref m_pictureboxImage5, ref m_graphics5, ref m_bitmapGraphic5, bitmap);\r\n                        break;\r\n                    case 5:\r\n                        LoadImage(ref m_pictureboxImage6, ref m_graphics6, ref m_bitmapGraphic6, bitmap);\r\n                        break;\r\n                    case 6:\r\n                        LoadImage(ref m_pictureboxImage7, ref m_graphics7, ref m_bitmapGraphic7, bitmap);\r\n                        break;\r\n                    case 7:\r\n                        LoadImage(ref m_pictureboxImage8, ref m_graphics8, ref m_bitmapGraphic8, bitmap);\r\n                        break;\r\n                }\r\n\r\n                // Next picture box...\r\n                if (++m_iCurrentPictureBox >= 8)\r\n                {\r\n                    m_iCurrentPictureBox = 0;\r\n                }\r\n\r\n                // Cleanup...\r\n                bitmap.Dispose();\r\n                memorystream = null; // disposed by the bitmap\r\n                abImage = null;\r\n\r\n                // End the transfer...\r\n                szTwmemref = \"0,0\";\r\n                szStatus = \"\";\r\n                sts = Send(\"DG_CONTROL\", \"DAT_PENDINGXFERS\", \"MSG_ENDXFER\", ref szTwmemref, ref szStatus);\r\n                TWAIN.CsvToPendingXfers(ref twpendingxfers, szTwmemref);\r\n                szStatus = (szStatus == \"\") ? sts.ToString() : (sts.ToString() + \" - \" + szStatus);\r\n                WriteTriplet(\"DG_CONTROL\", \"DAT_PENDINGXFERS\", \"MSG_ENDXFER\", szStatus + ((szTwmemref == \"\") ? \"\" : (Environment.NewLine + szTwmemref)));\r\n\r\n                // Looks like we're done!\r\n                if (twpendingxfers.Count == 0)\r\n                {\r\n                    m_blDisableDsSent = true;\r\n                    Rollback(TWAIN.STATE.S4);\r\n                    return;\r\n                }\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Go through the sequence needed to capture images using DAT_IMAGEFILEXFER...\r\n        /// </summary>\r\n        private void CaptureFileImages()\r\n        {\r\n            string szTwmemref = \"\";\r\n            string szStatus = \"\";\r\n            string szFilename = \"\";\r\n            TWAIN.STS sts;\r\n            TWAIN.TW_IMAGEINFO twimageinfo = default(TWAIN.TW_IMAGEINFO);\r\n            TWAIN.TW_PENDINGXFERS twpendingxfers = default(TWAIN.TW_PENDINGXFERS);\r\n\r\n            // Dispatch on the state...\r\n            switch (m_twain.GetState())\r\n            {\r\n                // Not a good state, just scoot...\r\n                default:\r\n                    return;\r\n\r\n                // We're on our way out...\r\n                case TWAIN.STATE.S5:\r\n                    m_blDisableDsSent = true;\r\n                    Rollback(TWAIN.STATE.S4);\r\n                    return;\r\n\r\n                // Memory transfers...\r\n                case TWAIN.STATE.S6:\r\n                    // Get the image info...\r\n                    szTwmemref = \"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\";\r\n                    szStatus = \"\";\r\n                    sts = Send(\"DG_IMAGE\", \"DAT_IMAGEINFO\", \"MSG_GET\", ref szTwmemref, ref szStatus);\r\n                    TWAIN.CsvToImageinfo(ref twimageinfo, szTwmemref);\r\n                    szStatus = (szStatus == \"\") ? sts.ToString() : (sts.ToString() + \" - \" + szStatus);\r\n                    WriteTriplet(\"DG_IMAGE\", \"DAT_IMAGEINFO\", \"MSG_GET\", szStatus + ((szTwmemref == \"\") ? \"\" : (Environment.NewLine + szTwmemref)));\r\n\r\n                    // Pick an image file format...\r\n                    if (twimageinfo.Compression == (ushort)TWAIN.TWCP.JPEG)\r\n                    {\r\n                        szFilename = \"C:/twain/image.jpg\";\r\n                        szTwmemref = szFilename + \",TWFF_JFIF,0\";\r\n                    }\r\n                    else\r\n                    {\r\n                        szFilename = \"C:/twain/image.tif\";\r\n                        szTwmemref = szFilename + \",TWFF_TIFF,0\";\r\n                    }\r\n                    szStatus = \"\";\r\n                    sts = Send(\"DG_CONTROL\", \"DAT_SETUPFILEXFER\", \"MSG_SET\", ref szTwmemref, ref szStatus);\r\n                    szStatus = (szStatus == \"\") ? sts.ToString() : (sts.ToString() + \" - \" + szStatus);\r\n                    WriteTriplet(\"DG_CONTROL\", \"DAT_SETUPFILEXFER\", \"MSG_SET\", szStatus + ((szTwmemref == \"\") ? \"\" : (Environment.NewLine + szTwmemref)));\r\n\r\n                    // Transfer stuff...\r\n                    szTwmemref = \"\";\r\n                    szStatus = \"\";\r\n                    sts = Send(\"DG_IMAGE\", \"DAT_IMAGEFILEXFER\", \"MSG_GET\", ref szTwmemref, ref szStatus);\r\n                    szStatus = (szStatus == \"\") ? sts.ToString() : (sts.ToString() + \" - \" + szStatus);\r\n                    WriteTriplet(\"DG_IMAGE\", \"DAT_IMAGEFILEXFER\", \"MSG_GET\", szStatus + ((szTwmemref == \"\") ? \"\" : (Environment.NewLine + szTwmemref)));\r\n                    break;\r\n            }\r\n\r\n            // Handle problems...\r\n            if (sts != TWAIN.STS.XFERDONE)\r\n            {\r\n                m_blDisableDsSent = true;\r\n                Rollback(TWAIN.STATE.S4);\r\n                return;\r\n            }\r\n\r\n            // Bump up our image counter, this always grows for the\r\n            // life of the entire session...\r\n            m_iImageCount += 1;\r\n\r\n            // Read the file...\r\n            Bitmap bitmap = new Bitmap(szFilename);\r\n\r\n            // Display the image...\r\n\r\n            // Display the image...\r\n            switch (m_iCurrentPictureBox)\r\n            {\r\n                default:\r\n                case 0:\r\n                    LoadImage(ref m_pictureboxImage1, ref m_graphics1, ref m_bitmapGraphic1, bitmap);\r\n                    break;\r\n                case 1:\r\n                    LoadImage(ref m_pictureboxImage2, ref m_graphics2, ref m_bitmapGraphic2, bitmap);\r\n                    break;\r\n                case 2:\r\n                    LoadImage(ref m_pictureboxImage3, ref m_graphics3, ref m_bitmapGraphic3, bitmap);\r\n                    break;\r\n                case 3:\r\n                    LoadImage(ref m_pictureboxImage4, ref m_graphics4, ref m_bitmapGraphic4, bitmap);\r\n                    break;\r\n                case 4:\r\n                    LoadImage(ref m_pictureboxImage5, ref m_graphics5, ref m_bitmapGraphic5, bitmap);\r\n                    break;\r\n                case 5:\r\n                    LoadImage(ref m_pictureboxImage6, ref m_graphics6, ref m_bitmapGraphic6, bitmap);\r\n                    break;\r\n                case 6:\r\n                    LoadImage(ref m_pictureboxImage7, ref m_graphics7, ref m_bitmapGraphic7, bitmap);\r\n                    break;\r\n                case 7:\r\n                    LoadImage(ref m_pictureboxImage8, ref m_graphics8, ref m_bitmapGraphic8, bitmap);\r\n                    break;\r\n            }\r\n\r\n            // Next picture box...\r\n            if (++m_iCurrentPictureBox >= 8)\r\n            {\r\n                m_iCurrentPictureBox = 0;\r\n            }\r\n\r\n            // Cleanup...\r\n            bitmap.Dispose();\r\n\r\n            // End the transfer...\r\n            szTwmemref = \"0,0\";\r\n            szStatus = \"\";\r\n            sts = Send(\"DG_CONTROL\", \"DAT_PENDINGXFERS\", \"MSG_ENDXFER\", ref szTwmemref, ref szStatus);\r\n            TWAIN.CsvToPendingXfers(ref twpendingxfers, szTwmemref);\r\n            szStatus = (szStatus == \"\") ? sts.ToString() : (sts.ToString() + \" - \" + szStatus);\r\n            WriteTriplet(\"DG_CONTROL\", \"DAT_PENDINGXFERS\", \"MSG_ENDXFER\", szStatus + ((szTwmemref == \"\") ? \"\" : (Environment.NewLine + szTwmemref)));\r\n\r\n            // Looks like we're done!\r\n            if (twpendingxfers.Count == 0)\r\n            {\r\n                m_blDisableDsSent = true;\r\n                Rollback(TWAIN.STATE.S4);\r\n                return;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Go through the sequence needed to capture images using DAT_IMAGEMEMFILEXFER...\r\n        /// </summary>\r\n        private void CaptureMemfileImages()\r\n        {\r\n            string szTwmemref = \"\";\r\n            string szStatus = \"\";\r\n            TWAIN.STS sts;\r\n            TWAIN.TW_IMAGEINFO twimageinfo = default(TWAIN.TW_IMAGEINFO);\r\n            TWAIN.TW_IMAGEMEMXFER twimagememxfer = default(TWAIN.TW_IMAGEMEMXFER);\r\n            TWAIN.TW_PENDINGXFERS twpendingxfers = default(TWAIN.TW_PENDINGXFERS);\r\n\r\n            // Dispatch on the state...\r\n            switch (m_twain.GetState())\r\n            {\r\n                // Not a good state, just scoot...\r\n                default:\r\n                    return;\r\n\r\n                // We're on our way out...\r\n                case TWAIN.STATE.S5:\r\n                    m_blDisableDsSent = true;\r\n                    Rollback(TWAIN.STATE.S4);\r\n                    return;\r\n\r\n                // Memory transfers...\r\n                case TWAIN.STATE.S6:\r\n                    // Get the image info...\r\n                    szTwmemref = \"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\";\r\n                    szStatus = \"\";\r\n                    sts = Send(\"DG_IMAGE\", \"DAT_IMAGEINFO\", \"MSG_GET\", ref szTwmemref, ref szStatus);\r\n                    TWAIN.CsvToImageinfo(ref twimageinfo, szTwmemref);\r\n                    szStatus = (szStatus == \"\") ? sts.ToString() : (sts.ToString() + \" - \" + szStatus);\r\n                    WriteTriplet(\"DG_IMAGE\", \"DAT_IMAGEINFO\", \"MSG_GET\", szStatus + ((szTwmemref == \"\") ? \"\" : (Environment.NewLine + szTwmemref)));\r\n\r\n                    // Pick an image file format...\r\n                    if (twimageinfo.Compression == (ushort)TWAIN.TWCP.JPEG)\r\n                    {\r\n                        szTwmemref = \"C:/twain/image.jpg,TWFF_JFIF,0\";\r\n                    }\r\n                    else\r\n                    {\r\n                        szTwmemref = \"C:/twain/image.tif,TWFF_TIFF,0\";\r\n                    }\r\n                    szStatus = \"\";\r\n                    sts = Send(\"DG_CONTROL\", \"DAT_SETUPFILEXFER\", \"MSG_SET\", ref szTwmemref, ref szStatus);\r\n                    szStatus = (szStatus == \"\") ? sts.ToString() : (sts.ToString() + \" - \" + szStatus);\r\n                    WriteTriplet(\"DG_CONTROL\", \"DAT_SETUPFILEXFER\", \"MSG_SET\", szStatus + ((szTwmemref == \"\") ? \"\" : (Environment.NewLine + szTwmemref)));\r\n\r\n                    // Transfer stuff...\r\n                    szTwmemref = \"0,0,0,0,0,0,0,\" + ((int)TWAIN.TWMF.APPOWNS | (int)TWAIN.TWMF.POINTER) + \",\" + m_twsetupmemxfer.Preferred + \",\" + m_intptrXfer;\r\n                    szStatus = \"\";\r\n                    sts = Send(\"DG_IMAGE\", \"DAT_IMAGEMEMFILEXFER\", \"MSG_GET\", ref szTwmemref, ref szStatus);\r\n                    TWAIN.CsvToImagememxfer(ref twimagememxfer, szTwmemref);\r\n                    szStatus = (szStatus == \"\") ? sts.ToString() : (sts.ToString() + \" - \" + szStatus);\r\n                    WriteTriplet(\"DG_IMAGE\", \"DAT_IMAGEMEMFILEXFER\", \"MSG_GET\", szStatus + ((szTwmemref == \"\") ? \"\" : (Environment.NewLine + szTwmemref)));\r\n                    break;\r\n\r\n                case TWAIN.STATE.S7:\r\n                    szTwmemref = \"0,0,0,0,0,0,0,\" + ((int)TWAIN.TWMF.APPOWNS | (int)TWAIN.TWMF.POINTER) + \",\" + m_twsetupmemxfer.Preferred + \",\" + m_intptrXfer;\r\n                    szStatus = \"\";\r\n                    sts = Send(\"DG_IMAGE\", \"DAT_IMAGEMEMFILEXFER\", \"MSG_GET\", ref szTwmemref, ref szStatus);\r\n                    TWAIN.CsvToImagememxfer(ref twimagememxfer, szTwmemref);\r\n                    szStatus = (szStatus == \"\") ? sts.ToString() : (sts.ToString() + \" - \" + szStatus);\r\n                    WriteTriplet(\"DG_IMAGE\", \"DAT_IMAGEMEMFILEXFER\", \"MSG_GET\", szStatus + ((szTwmemref == \"\") ? \"\" : (Environment.NewLine + szTwmemref)));\r\n                    break;\r\n            }\r\n\r\n            // Handle problems...\r\n            if ((sts != TWAIN.STS.SUCCESS) && (sts != TWAIN.STS.XFERDONE))\r\n            {\r\n                m_blDisableDsSent = true;\r\n                Rollback(TWAIN.STATE.S4);\r\n                return;\r\n            }\r\n\r\n            // Allocate or grow the image memory...\r\n            if (m_intptrImage == IntPtr.Zero)\r\n            {\r\n                m_intptrImage = Marshal.AllocHGlobal((int)twimagememxfer.BytesWritten);\r\n            }\r\n            else\r\n            {\r\n                m_intptrImage = Marshal.ReAllocHGlobal(m_intptrImage, (IntPtr)(m_iImageBytes + twimagememxfer.BytesWritten));\r\n            }\r\n\r\n            // Ruh-roh...\r\n            if (m_intptrImage == IntPtr.Zero)\r\n            {\r\n                m_blDisableDsSent = true;\r\n                Rollback(TWAIN.STATE.S4);\r\n                return;\r\n            }\r\n\r\n            // Copy into the buffer, and bump up our byte tally...\r\n            TWAIN.MemCpy(m_intptrImage + m_iImageBytes, m_intptrXfer, (int)twimagememxfer.BytesWritten);\r\n            m_iImageBytes += (int)twimagememxfer.BytesWritten;\r\n\r\n            // If we saw XFERDONE we can save the image, display it,\r\n            // end the transfer, and see if we have more images...\r\n            if (sts == TWAIN.STS.XFERDONE)\r\n            {\r\n                // Bump up our image counter, this always grows for the\r\n                // life of the entire session...\r\n                m_iImageCount += 1;\r\n\r\n                // Save the image to disk, if we're doing that...\r\n                /*\r\n                if (!string.IsNullOrEmpty(m_formsetup.GetImageFolder()))\r\n                {\r\n                    // Create the directory, if needed...\r\n                    if (!Directory.Exists(m_formsetup.GetImageFolder()))\r\n                    {\r\n                        try\r\n                        {\r\n                            Directory.CreateDirectory(m_formsetup.GetImageFolder());\r\n                        }\r\n                        catch (Exception exception)\r\n                        {\r\n                            TWAINWorkingGroup.Log.Error(\"CreateDirectory failed - \" + exception.Message);\r\n                        }\r\n                    }\r\n\r\n                    // Write it out...\r\n                    string szFilename = Path.Combine(m_formsetup.GetImageFolder(), \"img\" + string.Format(\"{0:D6}\", m_iImageCount));\r\n                    TWAIN.WriteImageFile(szFilename, m_intptrImage, m_iImageBytes, out szFilename);\r\n                }\r\n                */\r\n\r\n                // Turn the image into a byte array, and free the original memory...\r\n                byte[] abImage = new byte[m_iImageBytes];\r\n                Marshal.Copy(m_intptrImage, abImage, 0, m_iImageBytes);\r\n                Marshal.FreeHGlobal(m_intptrImage);\r\n                m_intptrImage = IntPtr.Zero;\r\n                m_iImageBytes = 0;\r\n\r\n                // Turn the byte array into a stream...\r\n                MemoryStream memorystream = new MemoryStream(abImage);\r\n                Bitmap bitmap = (Bitmap)Image.FromStream(memorystream);\r\n\r\n                // Display the image...\r\n\r\n                // Display the image...\r\n                switch (m_iCurrentPictureBox)\r\n                {\r\n                    default:\r\n                    case 0:\r\n                        LoadImage(ref m_pictureboxImage1, ref m_graphics1, ref m_bitmapGraphic1, bitmap);\r\n                        break;\r\n                    case 1:\r\n                        LoadImage(ref m_pictureboxImage2, ref m_graphics2, ref m_bitmapGraphic2, bitmap);\r\n                        break;\r\n                    case 2:\r\n                        LoadImage(ref m_pictureboxImage3, ref m_graphics3, ref m_bitmapGraphic3, bitmap);\r\n                        break;\r\n                    case 3:\r\n                        LoadImage(ref m_pictureboxImage4, ref m_graphics4, ref m_bitmapGraphic4, bitmap);\r\n                        break;\r\n                    case 4:\r\n                        LoadImage(ref m_pictureboxImage5, ref m_graphics5, ref m_bitmapGraphic5, bitmap);\r\n                        break;\r\n                    case 5:\r\n                        LoadImage(ref m_pictureboxImage6, ref m_graphics6, ref m_bitmapGraphic6, bitmap);\r\n                        break;\r\n                    case 6:\r\n                        LoadImage(ref m_pictureboxImage7, ref m_graphics7, ref m_bitmapGraphic7, bitmap);\r\n                        break;\r\n                    case 7:\r\n                        LoadImage(ref m_pictureboxImage8, ref m_graphics8, ref m_bitmapGraphic8, bitmap);\r\n                        break;\r\n                }\r\n\r\n                // Next picture box...\r\n                if (++m_iCurrentPictureBox >= 8)\r\n                {\r\n                    m_iCurrentPictureBox = 0;\r\n                }\r\n\r\n                // Cleanup...\r\n                bitmap.Dispose();\r\n                memorystream = null; // disposed by the bitmap\r\n                abImage = null;\r\n\r\n                // End the transfer...\r\n                szTwmemref = \"0,0\";\r\n                szStatus = \"\";\r\n                sts = Send(\"DG_CONTROL\", \"DAT_PENDINGXFERS\", \"MSG_ENDXFER\", ref szTwmemref, ref szStatus);\r\n                TWAIN.CsvToPendingXfers(ref twpendingxfers, szTwmemref);\r\n                szStatus = (szStatus == \"\") ? sts.ToString() : (sts.ToString() + \" - \" + szStatus);\r\n                WriteTriplet(\"DG_CONTROL\", \"DAT_PENDINGXFERS\", \"MSG_ENDXFER\", szStatus + ((szTwmemref == \"\") ? \"\" : (Environment.NewLine + szTwmemref)));\r\n\r\n                // Looks like we're done!\r\n                if (twpendingxfers.Count == 0)\r\n                {\r\n                    m_blDisableDsSent = true;\r\n                    Rollback(TWAIN.STATE.S4);\r\n                    return;\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        // Private Functions, miscellaneous functions...\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        #region Private Functions...\r\n\r\n        /// <summary>\r\n        /// Cleanup, pulled from the designer...\r\n        /// </summary>\r\n        /// <param name=\"a_blDisposing\">true if we need to clean up managed resources</param>\r\n        [SuppressMessage(\"Microsoft.Security\", \"CA2123:OverrideLinkDemandsShouldBeIdenticalToBase\")]\r\n        [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]\r\n        protected override void Dispose(bool a_blDisposing)\r\n        {\r\n            // Free managed resources...\r\n            if (a_blDisposing)\r\n            {\r\n                // Clean our components...\r\n                if (components != null)\r\n                {\r\n                    components.Dispose();\r\n                }\r\n\r\n                // Cleanup...\r\n                if (m_twain != null)\r\n                {\r\n                    m_twain.Dispose();\r\n                    m_twain = null;\r\n                }\r\n                if (m_bitmapGraphic1 != null)\r\n                {\r\n                    m_bitmapGraphic1.Dispose();\r\n                    m_bitmapGraphic1 = null;\r\n                }\r\n                if (m_bitmapGraphic2 != null)\r\n                {\r\n                    m_bitmapGraphic2.Dispose();\r\n                    m_bitmapGraphic2 = null;\r\n                }\r\n                if (m_bitmapGraphic3 != null)\r\n                {\r\n                    m_bitmapGraphic3.Dispose();\r\n                    m_bitmapGraphic3 = null;\r\n                }\r\n                if (m_bitmapGraphic4 != null)\r\n                {\r\n                    m_bitmapGraphic4.Dispose();\r\n                    m_bitmapGraphic4 = null;\r\n                }\r\n                if (m_bitmapGraphic5 != null)\r\n                {\r\n                    m_bitmapGraphic5.Dispose();\r\n                    m_bitmapGraphic5 = null;\r\n                }\r\n                if (m_bitmapGraphic6 != null)\r\n                {\r\n                    m_bitmapGraphic6.Dispose();\r\n                    m_bitmapGraphic6 = null;\r\n                }\r\n                if (m_bitmapGraphic7 != null)\r\n                {\r\n                    m_bitmapGraphic7.Dispose();\r\n                    m_bitmapGraphic7 = null;\r\n                }\r\n                if (m_bitmapGraphic8 != null)\r\n                {\r\n                    m_bitmapGraphic8.Dispose();\r\n                    m_bitmapGraphic8 = null;\r\n                }\r\n                if (m_brushBackground != null)\r\n                {\r\n                    m_brushBackground.Dispose();\r\n                    m_brushBackground = null;\r\n                }\r\n            }\r\n\r\n            // Do the base...\r\n            base.Dispose(a_blDisposing);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Make sure we clean up on a surprise close...\r\n        /// </summary>\r\n        /// <param name=\"sender\">Originator</param>\r\n        /// <param name=\"e\">Arguments</param>\r\n        private void FormMain_FormClosing(object sender, FormClosingEventArgs e)\r\n        {\r\n            SetMessageFilter(false);\r\n            m_blClosing = true;\r\n            if (m_twain != null)\r\n            {\r\n                Rollback(TWAIN.STATE.S1);\r\n            }\r\n            CleanImage();\r\n            TWAINWorkingGroup.Log.Close();\r\n        }\r\n\r\n        /// <summary>\r\n        /// Copy data from a richtextbox...\r\n        /// </summary>\r\n        /// <param name=\"sender\">Originator</param>\r\n        /// <param name=\"e\">Arguments</param>\r\n        private void richtextboxcapability_Copy(object sender, EventArgs e)\r\n        {\r\n            Clipboard.SetData(DataFormats.Text, m_richtextboxCapability.SelectedText);\r\n        }\r\n        private void richtextboxoutput_Copy(object sender, EventArgs e)\r\n        {\r\n            Clipboard.SetData(DataFormats.Text, m_richtextboxOutput.SelectedText);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Paste data to a richtextbox...\r\n        /// </summary>\r\n        /// <param name=\"sender\">Originator</param>\r\n        /// <param name=\"e\">Arguments</param>\r\n        private void richtextboxcapability_Paste(object sender, EventArgs e)\r\n        {\r\n            if (Clipboard.ContainsText(TextDataFormat.Text))\r\n            {\r\n                m_richtextboxCapability.SelectedText = Clipboard.GetData(DataFormats.Text).ToString();\r\n            }\r\n        }\r\n        private void richtextboxoutput_Paste(object sender, EventArgs e)\r\n        {\r\n            if (Clipboard.ContainsText(TextDataFormat.Text))\r\n            {\r\n                m_richtextboxOutput.SelectedText = Clipboard.GetData(DataFormats.Text).ToString();\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Initialize the picture boxes and the graphics to support them, we're\r\n        /// doing this to maximize performance during scanner...\r\n        /// </summary>\r\n        private void InitImage()\r\n        {\r\n            // Make sure our picture boxes don't do much work...\r\n            m_pictureboxImage1.SizeMode = PictureBoxSizeMode.Normal;\r\n            m_pictureboxImage2.SizeMode = PictureBoxSizeMode.Normal;\r\n            m_pictureboxImage3.SizeMode = PictureBoxSizeMode.Normal;\r\n            m_pictureboxImage4.SizeMode = PictureBoxSizeMode.Normal;\r\n            m_pictureboxImage5.SizeMode = PictureBoxSizeMode.Normal;\r\n            m_pictureboxImage6.SizeMode = PictureBoxSizeMode.Normal;\r\n            m_pictureboxImage7.SizeMode = PictureBoxSizeMode.Normal;\r\n            m_pictureboxImage8.SizeMode = PictureBoxSizeMode.Normal;\r\n\r\n            m_bitmapGraphic1 = new Bitmap(m_pictureboxImage1.Width, m_pictureboxImage1.Height, PixelFormat.Format32bppPArgb);\r\n            m_graphics1 = Graphics.FromImage(m_bitmapGraphic1);\r\n            m_graphics1.CompositingMode = CompositingMode.SourceCopy;\r\n            m_graphics1.CompositingQuality = CompositingQuality.HighSpeed;\r\n            m_graphics1.InterpolationMode = InterpolationMode.Low;\r\n            m_graphics1.PixelOffsetMode = PixelOffsetMode.HighSpeed;\r\n            m_graphics1.SmoothingMode = SmoothingMode.HighSpeed;\r\n\r\n            m_bitmapGraphic2 = new Bitmap(m_pictureboxImage2.Width, m_pictureboxImage2.Height, PixelFormat.Format32bppPArgb);\r\n            m_graphics2 = Graphics.FromImage(m_bitmapGraphic2);\r\n            m_graphics2.CompositingMode = CompositingMode.SourceCopy;\r\n            m_graphics2.CompositingQuality = CompositingQuality.HighSpeed;\r\n            m_graphics2.InterpolationMode = InterpolationMode.Low;\r\n            m_graphics2.PixelOffsetMode = PixelOffsetMode.HighSpeed;\r\n            m_graphics2.SmoothingMode = SmoothingMode.HighSpeed;\r\n\r\n            m_bitmapGraphic3 = new Bitmap(m_pictureboxImage3.Width, m_pictureboxImage3.Height, PixelFormat.Format32bppPArgb);\r\n            m_graphics3 = Graphics.FromImage(m_bitmapGraphic3);\r\n            m_graphics3.CompositingMode = CompositingMode.SourceCopy;\r\n            m_graphics3.CompositingQuality = CompositingQuality.HighSpeed;\r\n            m_graphics3.InterpolationMode = InterpolationMode.Low;\r\n            m_graphics3.PixelOffsetMode = PixelOffsetMode.HighSpeed;\r\n            m_graphics3.SmoothingMode = SmoothingMode.HighSpeed;\r\n\r\n            m_bitmapGraphic4 = new Bitmap(m_pictureboxImage4.Width, m_pictureboxImage4.Height, PixelFormat.Format32bppPArgb);\r\n            m_graphics4 = Graphics.FromImage(m_bitmapGraphic4);\r\n            m_graphics4.CompositingMode = CompositingMode.SourceCopy;\r\n            m_graphics4.CompositingQuality = CompositingQuality.HighSpeed;\r\n            m_graphics4.InterpolationMode = InterpolationMode.Low;\r\n            m_graphics4.PixelOffsetMode = PixelOffsetMode.HighSpeed;\r\n            m_graphics4.SmoothingMode = SmoothingMode.HighSpeed;\r\n\r\n            m_bitmapGraphic5 = new Bitmap(m_pictureboxImage5.Width, m_pictureboxImage5.Height, PixelFormat.Format32bppPArgb);\r\n            m_graphics5 = Graphics.FromImage(m_bitmapGraphic5);\r\n            m_graphics5.CompositingMode = CompositingMode.SourceCopy;\r\n            m_graphics5.CompositingQuality = CompositingQuality.HighSpeed;\r\n            m_graphics5.InterpolationMode = InterpolationMode.Low;\r\n            m_graphics5.PixelOffsetMode = PixelOffsetMode.HighSpeed;\r\n            m_graphics5.SmoothingMode = SmoothingMode.HighSpeed;\r\n\r\n            m_bitmapGraphic6 = new Bitmap(m_pictureboxImage6.Width, m_pictureboxImage6.Height, PixelFormat.Format32bppPArgb);\r\n            m_graphics6 = Graphics.FromImage(m_bitmapGraphic6);\r\n            m_graphics6.CompositingMode = CompositingMode.SourceCopy;\r\n            m_graphics6.CompositingQuality = CompositingQuality.HighSpeed;\r\n            m_graphics6.InterpolationMode = InterpolationMode.Low;\r\n            m_graphics6.PixelOffsetMode = PixelOffsetMode.HighSpeed;\r\n            m_graphics6.SmoothingMode = SmoothingMode.HighSpeed;\r\n\r\n            m_bitmapGraphic7 = new Bitmap(m_pictureboxImage7.Width, m_pictureboxImage7.Height, PixelFormat.Format32bppPArgb);\r\n            m_graphics7 = Graphics.FromImage(m_bitmapGraphic7);\r\n            m_graphics7.CompositingMode = CompositingMode.SourceCopy;\r\n            m_graphics7.CompositingQuality = CompositingQuality.HighSpeed;\r\n            m_graphics7.InterpolationMode = InterpolationMode.Low;\r\n            m_graphics7.PixelOffsetMode = PixelOffsetMode.HighSpeed;\r\n            m_graphics7.SmoothingMode = SmoothingMode.HighSpeed;\r\n\r\n            m_bitmapGraphic8 = new Bitmap(m_pictureboxImage8.Width, m_pictureboxImage8.Height, PixelFormat.Format32bppPArgb);\r\n            m_graphics8 = Graphics.FromImage(m_bitmapGraphic8);\r\n            m_graphics8.CompositingMode = CompositingMode.SourceCopy;\r\n            m_graphics8.CompositingQuality = CompositingQuality.HighSpeed;\r\n            m_graphics8.InterpolationMode = InterpolationMode.Low;\r\n            m_graphics8.PixelOffsetMode = PixelOffsetMode.HighSpeed;\r\n            m_graphics8.SmoothingMode = SmoothingMode.HighSpeed;\r\n\r\n            m_brushBackground = new SolidBrush(Color.White);\r\n            m_rectangleBackground = new Rectangle(0, 0, m_bitmapGraphic1.Width, m_bitmapGraphic1.Height);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Free resources...\r\n        /// </summary>\r\n        private void CleanImage()\r\n        {\r\n            // This is weird, but it works, make sure we don't have any\r\n            // garbage laying around before we cleanup and leave.  This\r\n            // avoids nasty \"Invalid window device\" messages on Mac...\r\n            System.GC.Collect();\r\n            System.GC.WaitForPendingFinalizers();\r\n\r\n            if (!m_pictureboxImage1.IsDisposed)\r\n            {\r\n                m_pictureboxImage1.Dispose();\r\n            }\r\n            if (m_graphics1 != null)\r\n            {\r\n                m_graphics1.Dispose();\r\n                m_graphics1 = null;\r\n            }\r\n            if (m_bitmapGraphic1 != null)\r\n            {\r\n                m_bitmapGraphic1.Dispose();\r\n                m_bitmapGraphic1 = null;\r\n            }\r\n\r\n            if (!m_pictureboxImage2.IsDisposed)\r\n            {\r\n                m_pictureboxImage2.Dispose();\r\n            }\r\n            if (m_graphics2 != null)\r\n            {\r\n                m_graphics2.Dispose();\r\n                m_graphics2 = null;\r\n            }\r\n            if (m_bitmapGraphic2 != null)\r\n            {\r\n                m_bitmapGraphic2.Dispose();\r\n                m_bitmapGraphic2 = null;\r\n            }\r\n\r\n            if (!m_pictureboxImage3.IsDisposed)\r\n            {\r\n                m_pictureboxImage3.Dispose();\r\n            }\r\n            if (m_graphics3 != null)\r\n            {\r\n                m_graphics3.Dispose();\r\n                m_graphics3 = null;\r\n            }\r\n            if (m_bitmapGraphic3 != null)\r\n            {\r\n                m_bitmapGraphic3.Dispose();\r\n                m_bitmapGraphic3 = null;\r\n            }\r\n\r\n            if (!m_pictureboxImage4.IsDisposed)\r\n            {\r\n                m_pictureboxImage4.Dispose();\r\n            }\r\n            if (m_graphics4 != null)\r\n            {\r\n                m_graphics4.Dispose();\r\n                m_graphics4 = null;\r\n            }\r\n            if (m_bitmapGraphic4 != null)\r\n            {\r\n                m_bitmapGraphic4.Dispose();\r\n                m_bitmapGraphic4 = null;\r\n            }\r\n\r\n            if (!m_pictureboxImage5.IsDisposed)\r\n            {\r\n                m_pictureboxImage5.Dispose();\r\n            }\r\n            if (m_graphics5 != null)\r\n            {\r\n                m_graphics5.Dispose();\r\n                m_graphics5 = null;\r\n            }\r\n            if (m_bitmapGraphic5 != null)\r\n            {\r\n                m_bitmapGraphic5.Dispose();\r\n                m_bitmapGraphic5 = null;\r\n            }\r\n\r\n            if (!m_pictureboxImage6.IsDisposed)\r\n            {\r\n                m_pictureboxImage6.Dispose();\r\n            }\r\n            if (m_graphics6 != null)\r\n            {\r\n                m_graphics6.Dispose();\r\n                m_graphics6 = null;\r\n            }\r\n            if (m_bitmapGraphic6 != null)\r\n            {\r\n                m_bitmapGraphic6.Dispose();\r\n                m_bitmapGraphic6 = null;\r\n            }\r\n\r\n            if (!m_pictureboxImage7.IsDisposed)\r\n            {\r\n                m_pictureboxImage7.Dispose();\r\n            }\r\n            if (m_graphics7 != null)\r\n            {\r\n                m_graphics7.Dispose();\r\n                m_graphics7 = null;\r\n            }\r\n            if (m_bitmapGraphic7 != null)\r\n            {\r\n                m_bitmapGraphic7.Dispose();\r\n                m_bitmapGraphic7 = null;\r\n            }\r\n\r\n            if (!m_pictureboxImage8.IsDisposed)\r\n            {\r\n                m_pictureboxImage8.Dispose();\r\n            }\r\n            if (m_graphics8 != null)\r\n            {\r\n                m_graphics8.Dispose();\r\n                m_graphics8 = null;\r\n            }\r\n            if (m_bitmapGraphic8 != null)\r\n            {\r\n                m_bitmapGraphic8.Dispose();\r\n                m_bitmapGraphic8 = null;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Load an image into a picture box, maintain its aspect ratio...\r\n        /// </summary>\r\n        /// <param name=\"a_picturebox\">The picture box we're drawing to</param>\r\n        /// <param name=\"a_graphics\">The graphics backing the picture box</param>\r\n        /// <param name=\"a_bitmapGraphic\">Characteristics of the target</param>\r\n        /// <param name=\"a_bitmap\">The source image</param>\r\n        private void LoadImage(ref PictureBox a_picturebox, ref Graphics a_graphics, ref Bitmap a_bitmapGraphic, Bitmap a_bitmap)\r\n        {\r\n            // We want to maintain the aspect ratio...\r\n            double fRatioWidth = (double)a_bitmapGraphic.Size.Width / (double)a_bitmap.Width;\r\n            double fRatioHeight = (double)a_bitmapGraphic.Size.Height / (double)a_bitmap.Height;\r\n            double fRatio = (fRatioWidth < fRatioHeight) ? fRatioWidth : fRatioHeight;\r\n            int iWidth = (int)(a_bitmap.Width * fRatio);\r\n            int iHeight = (int)(a_bitmap.Height * fRatio);\r\n\r\n            // Display the image...\r\n            a_graphics.FillRectangle(m_brushBackground, m_rectangleBackground);\r\n            a_graphics.DrawImage(a_bitmap, new Rectangle(((int)a_bitmapGraphic.Width - iWidth)/2, ((int)a_bitmapGraphic.Height - iHeight)/2, iWidth, iHeight));\r\n            a_picturebox.Image = a_bitmapGraphic;\r\n            a_picturebox.Update();\r\n        }\r\n\r\n        /// <summary>\r\n        /// Turn message filtering on or off...\r\n        /// </summary>\r\n        /// <param name=\"a_blAdd\">True to turn it on</param>\r\n        private void SetMessageFilter(bool a_blAdd)\r\n        {\r\n            if (a_blAdd)\r\n            {\r\n                Application.AddMessageFilter(this);\r\n            }\r\n            else\r\n            {\r\n                Application.RemoveMessageFilter(this);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Debugging output that we can monitor...\r\n        /// </summary>\r\n        /// <param name=\"a_szOutput\">Text to display to the user</param>\r\n        private void WriteOutput(string a_szOutput)\r\n        {\r\n            // We're leaving...\r\n            if (m_blClosing)\r\n            {\r\n                return;\r\n            }\r\n\r\n            // Let us be called from any thread.  We don't care if a_szOutput changes\r\n            // on the fly (it's incredibly unlikely that it will), so we're not going\r\n            // to wait for the thread to finish...\r\n            if (this.InvokeRequired)\r\n            {\r\n                BeginInvoke(new MethodInvoker(delegate() { WriteOutput(a_szOutput); }));\r\n                return;\r\n            }\r\n\r\n            // Display the text...\r\n            m_richtextboxOutput.AppendText(a_szOutput);\r\n            m_richtextboxOutput.SelectionStart = m_richtextboxOutput.Text.Length;\r\n            m_richtextboxOutput.Refresh();\r\n        }\r\n\r\n        /// <summary>\r\n        /// Write a triplet message...\r\n        /// </summary>\r\n        /// <param name=\"a_szDg\">Data group</param>\r\n        /// <param name=\"a_szDat\">Data argument type</param>\r\n        /// <param name=\"a_szMsg\">Operation</param>\r\n        /// <param name=\"a_szOutput\">Text</param>\r\n        private void WriteTriplet(string a_szDg, string a_szDat, string a_szMsg, string a_szOutput)\r\n        {\r\n            string szDg;\r\n            string szDat;\r\n            string szMsg;\r\n\r\n            // Let us be called from any thread.  We don't care if a_szOutput changes\r\n            // on the fly (it's incredibly unlikely that it will), so we're not going\r\n            // to wait for the thread to finish...\r\n            if (this.InvokeRequired)\r\n            {\r\n                BeginInvoke(new MethodInvoker(delegate() { WriteTriplet(a_szDg, a_szDat, a_szMsg, a_szOutput); }));\r\n                return;\r\n            }\r\n\r\n            // Build the triplet...\r\n            szDg = a_szDg.StartsWith(\"DG_\") ? a_szDg : \"DG_\" + a_szDg;\r\n            szDat = a_szDat.StartsWith(\"DAT_\") ? a_szDat : \"DAT_\" + a_szDat;\r\n            szMsg = a_szMsg.StartsWith(\"MSG_\") ? a_szMsg : \"MSG_\" + a_szMsg;\r\n\r\n            // Display the triplet...\r\n            m_richtextboxOutput.SelectionStart = m_richtextboxOutput.Text.Length;\r\n            m_richtextboxOutput.SelectionColor = Color.Blue;\r\n            m_richtextboxOutput.AppendText(Environment.NewLine + a_szDg + \"/\" + a_szDat + \"/\" + a_szMsg + \": \");\r\n            m_richtextboxOutput.SelectionStart = m_richtextboxOutput.Text.Length;\r\n\r\n            // Display the text...\r\n            m_richtextboxOutput.SelectionStart = m_richtextboxOutput.Text.Length;\r\n            m_richtextboxOutput.SelectionColor = Color.Black;\r\n            m_richtextboxOutput.AppendText(a_szOutput + Environment.NewLine);\r\n            m_richtextboxOutput.SelectionStart = m_richtextboxOutput.Text.Length;\r\n            m_richtextboxOutput.Refresh();\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        // Private Send Triplets, the Send button is used to issue TWAIN triplets\r\n        // to the Data Source Manager, this section covers all the supported\r\n        // combinations...\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        #region Private Send Triplets...\r\n\r\n        /// <summary>\r\n        /// Automatically change our dropdown values to reduce user frustration,\r\n        /// we do this to save a step when it's pretty obvious what the user\r\n        /// will typically want to do next.  For instance, if they've just opened\r\n        /// the DSM they probably want to start enumerating TWAIN drivers...\r\n        /// </summary>\r\n        /// <param name=\"a_szDg\">Data group</param>\r\n        /// <param name=\"a_szDat\">Data Argument type</param>\r\n        /// <param name=\"a_szMsg\">Operation</param>\r\n        private void AutoDropdown(string a_szDg, string a_szDat, string a_szMsg)\r\n        {\r\n            // We're initializing...\r\n            if ((a_szDg == \"\") && (a_szDat == \"\") && (a_szMsg == \"\"))\r\n            {\r\n                m_comboboxDG.SelectedItem = \"DG_CONTROL\";\r\n                m_comboboxDAT.SelectedItem = \"DAT_PARENT\";\r\n                m_comboboxMSG.SelectedItem = \"MSG_OPENDSM\";\r\n                m_richtextboxCapability.Text =\r\n                    \"TWAIN Working Group,\" +\r\n                    \"TWAIN Sharp,\" +\r\n                    \"TWAIN Sharp Test App,\" +\r\n                    \"2,\" +\r\n                    \"4,\" +\r\n                    \"0x20000003,\" +\r\n                    \"USA,\" +\r\n                    \"testing...,\" +\r\n                    \"ENGLISH_USA\";\r\n            }\r\n\r\n            // After OPENDSM we have a choice, based on the DSM that was used...\r\n            else if ((a_szDg == \"DG_CONTROL\") && (a_szDat == \"DAT_PARENT\") && (a_szMsg == \"MSG_OPENDSM\"))\r\n            {\r\n                string[] aszAppIdentity = CSV.Parse(m_twain.GetAppIdentity());\r\n                int iSupportedGroups;\r\n                int.TryParse(aszAppIdentity[8], NumberStyles.HexNumber, CultureInfo.InvariantCulture, out iSupportedGroups);\r\n                if ((iSupportedGroups & ((int)TWAIN.DG.DSM2 | (int)TWAIN.DG.APP2)) == ((int)TWAIN.DG.DSM2 | (int)TWAIN.DG.APP2))\r\n                {\r\n                    m_comboboxDG.SelectedItem = \"DG_CONTROL\";\r\n                    m_comboboxDAT.SelectedItem = \"DAT_ENTRYPOINT\";\r\n                    m_comboboxMSG.SelectedItem = \"MSG_GET\";\r\n                }\r\n                else\r\n                {\r\n                    m_comboboxDG.SelectedItem = \"DG_CONTROL\";\r\n                    m_comboboxDAT.SelectedItem = \"DAT_IDENTITY\";\r\n                    m_comboboxMSG.SelectedItem = \"MSG_GETFIRST\";\r\n                }\r\n                m_richtextboxCapability.Text = \"\";\r\n            }\r\n\r\n            // After an ENTRYPOINT, switch to GETFIRST...\r\n            else if ((a_szDg == \"DG_CONTROL\") && (a_szDat == \"DAT_ENTRYPOINT\") && (a_szMsg == \"MSG_GET\"))\r\n            {\r\n                m_comboboxDG.SelectedItem = \"DG_CONTROL\";\r\n                m_comboboxDAT.SelectedItem = \"DAT_IDENTITY\";\r\n                m_comboboxMSG.SelectedItem = \"MSG_GETFIRST\";\r\n                m_richtextboxCapability.Text = \"\";\r\n            }\r\n\r\n            // When we CLOSEDSM, go back to OPENDSM...\r\n            else if ((a_szDg == \"DG_CONTROL\") && (a_szDat == \"DAT_PARENT\") && (a_szMsg == \"MSG_CLOSEDSM\"))\r\n            {\r\n                m_comboboxDG.SelectedItem = \"DG_CONTROL\";\r\n                m_comboboxDAT.SelectedItem = \"DAT_PARENT\";\r\n                m_comboboxMSG.SelectedItem = \"MSG_OPENDSM\";\r\n                m_richtextboxCapability.Text =\r\n                    \"TWAIN Working Group,\" +\r\n                    \"TWAIN Sharp,\" +\r\n                    \"TWAIN Sharp Test App,\" +\r\n                    \"2,\" +\r\n                    \"4,\" +\r\n                    \"0x20000003,\" +\r\n                    \"USA,\" +\r\n                    \"testing...,\" +\r\n                    \"ENGLISH_USA\";\r\n            }\r\n\r\n            // After a GETFIRST, switch to GETNEXT...\r\n            else if ((a_szDg == \"DG_CONTROL\") && (a_szDat == \"DAT_IDENTITY\") && (a_szMsg == \"MSG_GETFIRST\"))\r\n            {\r\n                m_comboboxDG.SelectedItem = \"DG_CONTROL\";\r\n                m_comboboxDAT.SelectedItem = \"DAT_IDENTITY\";\r\n                m_comboboxMSG.SelectedItem = \"MSG_GETNEXT\";\r\n            }\r\n\r\n            // After an OPENDS, changing to CAPABILITY seems most useful...\r\n            else if ((a_szDg == \"DG_CONTROL\") && (a_szDat == \"DAT_IDENTITY\") && (a_szMsg == \"MSG_OPENDS\"))\r\n            {\r\n                m_comboboxDG.SelectedItem = \"DG_CONTROL\";\r\n                m_comboboxDAT.SelectedItem = \"DAT_CAPABILITY\";\r\n                m_comboboxMSG.SelectedItem = \"MSG_GETCURRENT\";\r\n                m_richtextboxCapability.Text = \"\";\r\n            }\r\n\r\n            // After a CLOSEDS, switch to CLOSEDSM...\r\n            else if ((a_szDg == \"DG_CONTROL\") && (a_szDat == \"DAT_IDENTITY\") && (a_szMsg == \"MSG_CLOSEDS\"))\r\n            {\r\n                m_comboboxDG.SelectedItem = \"DG_CONTROL\";\r\n                m_comboboxDAT.SelectedItem = \"DAT_PARENT\";\r\n                m_comboboxMSG.SelectedItem = \"MSG_CLOSEDSM\";\r\n            }\r\n\r\n            // After a GETFIRSTFILE, switch to GETNEXTFILE...\r\n            else if ((a_szDg == \"DG_CONTROL\") && (a_szDat == \"DAT_FILESYSTEM\") && (a_szMsg == \"MSG_GETFIRSTFILE\"))\r\n            {\r\n                m_comboboxDG.SelectedItem = \"DG_CONTROL\";\r\n                m_comboboxDAT.SelectedItem = \"DAT_FILESYSTEM\";\r\n                m_comboboxMSG.SelectedItem = \"MSG_GETNEXTFILE\";\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Send the requested command...\r\n        /// </summary>\r\n        /// <param name=\"sender\">Originator</param>\r\n        /// <param name=\"e\">Arguments</param>\r\n        private void SendDat(object sender, EventArgs e)\r\n        {\r\n            string szDg;\r\n            string szDat;\r\n            string szMsg;\r\n\r\n            // The Data Group selected by the user, this can be a drop down item or a\r\n            // hex value (with or without the leading 0x)...\r\n            if (m_comboboxDG.SelectedItem != null)\r\n            {\r\n                szDg = (string)m_comboboxDG.SelectedItem;\r\n            }\r\n            else\r\n            {\r\n                szDg = m_comboboxDG.Text;\r\n            }\r\n\r\n            // The Data Argument Type selected by the user, this can be a drop down\r\n            // item or a hex value (with or without the leading 0x)...\r\n            if (m_comboboxDAT.SelectedItem != null)\r\n            {\r\n                szDat = (string)m_comboboxDAT.SelectedItem;\r\n            }\r\n            else\r\n            {\r\n                szDat = m_comboboxDAT.Text;\r\n            }\r\n\r\n            // The Message selected by the user, this can be a drop down item or a\r\n            // hex value (with or without the leading 0x)...\r\n            if (m_comboboxMSG.SelectedItem != null)\r\n            {\r\n                szMsg = (string)m_comboboxMSG.SelectedItem;\r\n            }\r\n            else\r\n            {\r\n                szMsg = m_comboboxMSG.Text;\r\n            }\r\n\r\n            // Handle creation and destruction of our image capture object...\r\n            if (   (szDg == \"DG_CONTROL\")\r\n                && (szDat == \"DAT_PARENT\")\r\n                && ((szMsg == \"MSG_OPENDSM\") || (szMsg == \"MSG_CLOSEDSM\")))\r\n            {\r\n                ManageTWAIN(szDg, szDat, szMsg);\r\n                return;\r\n            }\r\n\r\n            // Validate...\r\n            if (m_twain == null)\r\n            {\r\n                WriteTriplet(szDg, szDat, szMsg, \"(DSM is not open)\");\r\n                return;\r\n            }\r\n\r\n            // Look for an @-command...\r\n            /*\r\n            if (m_twaincstoolkit.AtCommand(m_richtextboxCapability.Text))\r\n            {\r\n                return;\r\n            }\r\n            */\r\n\r\n            // Everything else can go to TWAIN...\r\n            string szResult;\r\n            string szTwmemref;\r\n            TWAIN.STS sts;\r\n\r\n            // Grab the data from the cap box...\r\n            szTwmemref = m_richtextboxCapability.Text;\r\n\r\n            // Issue the command to TWAIN...\r\n            szResult = \"\";\r\n            sts = Send(szDg, szDat, szMsg, ref szTwmemref, ref szResult);\r\n\r\n            // If the command succeeded, then update the cap box with the result...\r\n            m_richtextboxCapability.Text = szTwmemref;\r\n\r\n            // Tweak the result...\r\n            if (szResult == \"\")\r\n            {\r\n                szResult = sts.ToString();\r\n            }\r\n            else\r\n            {\r\n                szResult = sts.ToString() + \" - \" + szResult;\r\n            }\r\n\r\n            // And write what happened to the output box...\r\n            if (szTwmemref == \"\")\r\n            {\r\n                WriteTriplet(szDg, szDat, szMsg, szResult);\r\n            }\r\n            else\r\n            {\r\n                WriteTriplet(szDg, szDat, szMsg, szResult + Environment.NewLine + szTwmemref);\r\n            }\r\n\r\n            // Convenience settings, we do these to make it less painful\r\n            // to work with the dropdown interface.  I've got them all\r\n            // here, even though some are currently being handled inside\r\n            // of other functions, like SendDatParent...\r\n            if (sts == TWAIN.STS.SUCCESS)\r\n            {\r\n                AutoDropdown(szDg, szDat, szMsg);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Send a command to the currently loaded DSM...\r\n        /// </summary>\r\n        /// <param name=\"a_functionarguments\">tokenized command and anything needed</param>\r\n        /// <returns>true to quit</returns>\r\n        private TWAIN.STS Send(string a_szDg, string a_szDat, string a_szMsg, ref string a_szTwmemref, ref string a_szResult)\r\n        {\r\n            int iDg;\r\n            int iDat;\r\n            int iMsg;\r\n            TWAIN.STS sts;\r\n            TWAIN.DG dg = TWAIN.DG.MASK;\r\n            TWAIN.DAT dat = TWAIN.DAT.NULL;\r\n            TWAIN.MSG msg = TWAIN.MSG.NULL;\r\n\r\n            // Init stuff...\r\n            iDg = 0;\r\n            iDat = 0;\r\n            iMsg = 0;\r\n            sts = TWAIN.STS.BADPROTOCOL;\r\n            a_szResult = \"\";\r\n\r\n            // Validate at the top level...\r\n            if (m_twain == null)\r\n            {\r\n                WriteOutput(\"***ERROR*** - dsmload wasn't run, so we is having no braims\");\r\n                return (TWAIN.STS.SEQERROR);\r\n            }\r\n\r\n            // Look for DG...\r\n            if (!a_szDg.ToLowerInvariant().StartsWith(\"dg_\"))\r\n            {\r\n                WriteOutput(\"Unrecognized dg - <\" + a_szDg + \">\");\r\n                return (TWAIN.STS.BADPROTOCOL);\r\n            }\r\n            else\r\n            {\r\n                // Look for hex number (take anything)...\r\n                if (a_szDg.ToLowerInvariant().StartsWith(\"dg_0x\"))\r\n                {\r\n                    if (!int.TryParse(a_szDg.ToLowerInvariant().Substring(3), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out iDg))\r\n                    {\r\n                        WriteOutput(\"Badly constructed dg - <\" + a_szDg + \">\");\r\n                        return (TWAIN.STS.BADPROTOCOL);\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    if (!Enum.TryParse(a_szDg.ToUpperInvariant().Substring(3), out dg))\r\n                    {\r\n                        WriteOutput(\"Unrecognized dg - <\" + a_szDg + \">\");\r\n                        return (TWAIN.STS.BADPROTOCOL);\r\n                    }\r\n                    iDg = (int)dg;\r\n                }\r\n            }\r\n\r\n            // Look for DAT...\r\n            if (!a_szDat.ToLowerInvariant().StartsWith(\"dat_\"))\r\n            {\r\n                WriteOutput(\"Unrecognized dat - <\" + a_szDat + \">\");\r\n                return (TWAIN.STS.BADPROTOCOL);\r\n            }\r\n            else\r\n            {\r\n                // Look for hex number (take anything)...\r\n                if (a_szDat.ToLowerInvariant().StartsWith(\"dat_0x\"))\r\n                {\r\n                    if (!int.TryParse(a_szDat.ToLowerInvariant().Substring(4), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out iDat))\r\n                    {\r\n                        WriteOutput(\"Badly constructed dat - <\" + a_szDat + \">\");\r\n                        return (TWAIN.STS.BADPROTOCOL);\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    if (!Enum.TryParse(a_szDat.ToUpperInvariant().Substring(4), out dat))\r\n                    {\r\n                        WriteOutput(\"Unrecognized dat - <\" + a_szDat + \">\");\r\n                        return (TWAIN.STS.BADPROTOCOL);\r\n                    }\r\n                    iDat = (int)dat;\r\n                }\r\n            }\r\n\r\n            // Look for MSG...\r\n            if (!a_szMsg.ToLowerInvariant().StartsWith(\"msg_\"))\r\n            {\r\n                WriteOutput(\"Unrecognized msg - <\" + a_szMsg + \">\");\r\n                return (TWAIN.STS.BADPROTOCOL);\r\n            }\r\n            else\r\n            {\r\n                // Look for hex number (take anything)...\r\n                if (a_szMsg.ToLowerInvariant().StartsWith(\"msg_0x\"))\r\n                {\r\n                    if (!int.TryParse(a_szMsg.ToLowerInvariant().Substring(4), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out iMsg))\r\n                    {\r\n                        WriteOutput(\"Badly constructed dat - <\" + a_szMsg + \">\");\r\n                        return (TWAIN.STS.BADPROTOCOL);\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    if (!Enum.TryParse(a_szMsg.ToUpperInvariant().Substring(4), out msg))\r\n                    {\r\n                        WriteOutput(\"Unrecognized msg - <\" + a_szMsg + \">\");\r\n                        return (TWAIN.STS.BADPROTOCOL);\r\n                    }\r\n                    iMsg = (int)msg;\r\n                }\r\n            }\r\n\r\n            // Send the command...\r\n            switch (iDat)\r\n            {\r\n                // Ruh-roh, since we can't marshal it, we have to return an error,\r\n                // it would be nice to have a solution for this, but that will need\r\n                // a dynamic marshalling system...\r\n                default:\r\n                    sts = TWAIN.STS.BADPROTOCOL;\r\n                    break;\r\n\r\n                // DAT_AUDIOFILEXFER...\r\n                case (int)TWAIN.DAT.AUDIOFILEXFER:\r\n                    {\r\n                        sts = m_twain.DatAudiofilexfer((TWAIN.DG)iDg, (TWAIN.MSG)iMsg);\r\n                        a_szTwmemref = \"\";\r\n                    }\r\n                    break;\r\n\r\n                // DAT_AUDIOINFO..\r\n                case (int)TWAIN.DAT.AUDIOINFO:\r\n                    {\r\n                        TWAIN.TW_AUDIOINFO twaudioinfo = default(TWAIN.TW_AUDIOINFO);\r\n                        sts = m_twain.DatAudioinfo((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twaudioinfo);\r\n                        a_szTwmemref = TWAIN.AudioinfoToCsv(twaudioinfo);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_AUDIONATIVEXFER..\r\n                case (int)TWAIN.DAT.AUDIONATIVEXFER:\r\n                    {\r\n                        IntPtr intptr = IntPtr.Zero;\r\n                        sts = m_twain.DatAudionativexfer((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref intptr);\r\n                        a_szTwmemref = intptr.ToString();\r\n                    }\r\n                    break;\r\n\r\n                // DAT_CALLBACK...\r\n                case (int)TWAIN.DAT.CALLBACK:\r\n                    {\r\n                        TWAIN.TW_CALLBACK twcallback = default(TWAIN.TW_CALLBACK);\r\n                        TWAIN.CsvToCallback(ref twcallback, a_szTwmemref);\r\n                        sts = m_twain.DatCallback((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twcallback);\r\n                        a_szTwmemref = TWAIN.CallbackToCsv(twcallback);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_CALLBACK2...\r\n                case (int)TWAIN.DAT.CALLBACK2:\r\n                    {\r\n                        TWAIN.TW_CALLBACK2 twcallback2 = default(TWAIN.TW_CALLBACK2);\r\n                        TWAIN.CsvToCallback2(ref twcallback2, a_szTwmemref);\r\n                        sts = m_twain.DatCallback2((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twcallback2);\r\n                        a_szTwmemref = TWAIN.Callback2ToCsv(twcallback2);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_CAPABILITY...\r\n                case (int)TWAIN.DAT.CAPABILITY:\r\n                    {\r\n                        // Skip symbols for msg_querysupport, otherwise 0 gets turned into false, also\r\n                        // if the command fails the return value is whatever was sent into us, which\r\n                        // matches the experience one should get with C/C++...\r\n                        string szStatus = \"\";\r\n                        TWAIN.TW_CAPABILITY twcapability = default(TWAIN.TW_CAPABILITY);\r\n                        m_twain.CsvToCapability(ref twcapability, ref szStatus, a_szTwmemref);\r\n                        sts = m_twain.DatCapability((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twcapability);\r\n                        if ((sts == TWAIN.STS.SUCCESS) || (sts == TWAIN.STS.CHECKSTATUS))\r\n                        {\r\n                            // Convert the data to CSV...\r\n                            a_szTwmemref = m_twain.CapabilityToCsv(twcapability, ((TWAIN.MSG)iMsg != TWAIN.MSG.QUERYSUPPORT));\r\n                            // Free the handle if the driver created it...\r\n                            switch ((TWAIN.MSG)iMsg)\r\n                            {\r\n                                default: break;\r\n                                case TWAIN.MSG.GET:\r\n                                case TWAIN.MSG.GETCURRENT:\r\n                                case TWAIN.MSG.GETDEFAULT:\r\n                                case TWAIN.MSG.QUERYSUPPORT:\r\n                                case TWAIN.MSG.RESET:\r\n                                    m_twain.DsmMemFree(ref twcapability.hContainer);\r\n                                    break;\r\n                            }\r\n                        }\r\n                    }\r\n                    break;\r\n\r\n                // DAT_CIECOLOR..\r\n                case (int)TWAIN.DAT.CIECOLOR:\r\n                    {\r\n                        //TWAIN.TW_CIECOLOR twciecolor = default(TWAIN.TW_CIECOLOR);\r\n                        //sts = m_twain.DatCiecolor((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twciecolor);\r\n                        //a_szTwmemref = m_twain.CiecolorToCsv(twciecolor);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_CUSTOMDSDATA...\r\n                case (int)TWAIN.DAT.CUSTOMDSDATA:\r\n                    {\r\n                        TWAIN.TW_CUSTOMDSDATA twcustomdsdata = default(TWAIN.TW_CUSTOMDSDATA);\r\n                        m_twain.CsvToCustomdsdata(ref twcustomdsdata, a_szTwmemref);\r\n                        sts = m_twain.DatCustomdsdata((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twcustomdsdata);\r\n                        a_szTwmemref = m_twain.CustomdsdataToCsv(twcustomdsdata);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_DEVICEEVENT...\r\n                case (int)TWAIN.DAT.DEVICEEVENT:\r\n                    {\r\n                        TWAIN.TW_DEVICEEVENT twdeviceevent = default(TWAIN.TW_DEVICEEVENT);\r\n                        sts = m_twain.DatDeviceevent((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twdeviceevent);\r\n                        a_szTwmemref = TWAIN.DeviceeventToCsv(twdeviceevent);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_ENTRYPOINT...\r\n                case (int)TWAIN.DAT.ENTRYPOINT:\r\n                    {\r\n                        TWAIN.TW_ENTRYPOINT twentrypoint = default(TWAIN.TW_ENTRYPOINT);\r\n                        twentrypoint.Size = (uint)Marshal.SizeOf(twentrypoint);\r\n                        sts = m_twain.DatEntrypoint((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twentrypoint);\r\n                        a_szTwmemref = TWAIN.EntrypointToCsv(twentrypoint);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_EVENT...\r\n                case (int)TWAIN.DAT.EVENT:\r\n                    {\r\n                        TWAIN.TW_EVENT twevent = default(TWAIN.TW_EVENT);\r\n                        sts = m_twain.DatEvent((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twevent);\r\n                        a_szTwmemref = TWAIN.EventToCsv(twevent);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_EXTIMAGEINFO...\r\n                case (int)TWAIN.DAT.EXTIMAGEINFO:\r\n                    {\r\n                        TWAIN.TW_EXTIMAGEINFO twextimageinfo = default(TWAIN.TW_EXTIMAGEINFO);\r\n                        TWAIN.CsvToExtimageinfo(ref twextimageinfo, a_szTwmemref);\r\n                        sts = m_twain.DatExtimageinfo((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twextimageinfo);\r\n                        a_szTwmemref = TWAIN.ExtimageinfoToCsv(twextimageinfo);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_FILESYSTEM...\r\n                case (int)TWAIN.DAT.FILESYSTEM:\r\n                    {\r\n                        TWAIN.TW_FILESYSTEM twfilesystem = default(TWAIN.TW_FILESYSTEM);\r\n                        TWAIN.CsvToFilesystem(ref twfilesystem, a_szTwmemref);\r\n                        sts = m_twain.DatFilesystem((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twfilesystem);\r\n                        a_szTwmemref = TWAIN.FilesystemToCsv(twfilesystem);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_FILTER...\r\n                case (int)TWAIN.DAT.FILTER:\r\n                    {\r\n                        //TWAIN.TW_FILTER twfilter = default(TWAIN.TW_FILTER);\r\n                        //m_twain.CsvToFilter(ref twfilter, a_szTwmemref);\r\n                        //sts = m_twain.DatFilter((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twfilter);\r\n                        //a_szTwmemref = m_twain.FilterToCsv(twfilter);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_GRAYRESPONSE...\r\n                case (int)TWAIN.DAT.GRAYRESPONSE:\r\n                    {\r\n                        //TWAIN.TW_GRAYRESPONSE twgrayresponse = default(TWAIN.TW_GRAYRESPONSE);\r\n                        //m_twain.CsvToGrayresponse(ref twgrayresponse, a_szTwmemref);\r\n                        //sts = m_twain.DatGrayresponse((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twgrayresponse);\r\n                        //a_szTwmemref = m_twain.GrayresponseToCsv(twgrayresponse);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_ICCPROFILE...\r\n                case (int)TWAIN.DAT.ICCPROFILE:\r\n                    {\r\n                        TWAIN.TW_MEMORY twmemory = default(TWAIN.TW_MEMORY);\r\n                        sts = m_twain.DatIccprofile((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twmemory);\r\n                        a_szTwmemref = TWAIN.IccprofileToCsv(twmemory);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_IDENTITY...\r\n                case (int)TWAIN.DAT.IDENTITY:\r\n                    {\r\n                        TWAIN.TW_IDENTITY twidentity = default(TWAIN.TW_IDENTITY);\r\n                        switch (iMsg)\r\n                        {\r\n                            default:\r\n                                break;\r\n                            case (int)TWAIN.MSG.SET:\r\n                            case (int)TWAIN.MSG.OPENDS:\r\n                                TWAIN.CsvToIdentity(ref twidentity, a_szTwmemref);\r\n                                break;\r\n                        }\r\n                        sts = m_twain.DatIdentity((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twidentity);\r\n                        a_szTwmemref = TWAIN.IdentityToCsv(twidentity);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_IMAGEFILEXFER...\r\n                case (int)TWAIN.DAT.IMAGEFILEXFER:\r\n                    {\r\n                        sts = m_twain.DatImagefilexfer((TWAIN.DG)iDg, (TWAIN.MSG)iMsg);\r\n                        a_szTwmemref = \"\";\r\n                    }\r\n                    break;\r\n\r\n                // DAT_IMAGEINFO...\r\n                case (int)TWAIN.DAT.IMAGEINFO:\r\n                    {\r\n                        TWAIN.TW_IMAGEINFO twimageinfo = default(TWAIN.TW_IMAGEINFO);\r\n                        TWAIN.CsvToImageinfo(ref twimageinfo, a_szTwmemref);\r\n                        sts = m_twain.DatImageinfo((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twimageinfo);\r\n                        a_szTwmemref = TWAIN.ImageinfoToCsv(twimageinfo);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_IMAGELAYOUT...\r\n                case (int)TWAIN.DAT.IMAGELAYOUT:\r\n                    {\r\n                        TWAIN.TW_IMAGELAYOUT twimagelayout = default(TWAIN.TW_IMAGELAYOUT);\r\n                        TWAIN.CsvToImagelayout(ref twimagelayout, a_szTwmemref);\r\n                        sts = m_twain.DatImagelayout((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twimagelayout);\r\n                        a_szTwmemref = TWAIN.ImagelayoutToCsv(twimagelayout);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_IMAGEMEMFILEXFER...\r\n                case (int)TWAIN.DAT.IMAGEMEMFILEXFER:\r\n                    {\r\n                        TWAIN.TW_IMAGEMEMXFER twimagememxfer = default(TWAIN.TW_IMAGEMEMXFER);\r\n                        TWAIN.CsvToImagememxfer(ref twimagememxfer, a_szTwmemref);\r\n                        sts = m_twain.DatImagememfilexfer((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twimagememxfer);\r\n                        a_szTwmemref = TWAIN.ImagememxferToCsv(twimagememxfer);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_IMAGEMEMXFER...\r\n                case (int)TWAIN.DAT.IMAGEMEMXFER:\r\n                    {\r\n                        TWAIN.TW_IMAGEMEMXFER twimagememxfer = default(TWAIN.TW_IMAGEMEMXFER);\r\n                        TWAIN.CsvToImagememxfer(ref twimagememxfer, a_szTwmemref);\r\n                        sts = m_twain.DatImagememxfer((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twimagememxfer);\r\n                        a_szTwmemref = TWAIN.ImagememxferToCsv(twimagememxfer);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_IMAGENATIVEXFER...\r\n                case (int)TWAIN.DAT.IMAGENATIVEXFER:\r\n                    {\r\n                        IntPtr intptrBitmapHandle = IntPtr.Zero;\r\n                        sts = m_twain.DatImagenativexferHandle((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref intptrBitmapHandle);\r\n                        a_szTwmemref = intptrBitmapHandle.ToString();\r\n                    }\r\n                    break;\r\n\r\n                // DAT_JPEGCOMPRESSION...\r\n                case (int)TWAIN.DAT.JPEGCOMPRESSION:\r\n                    {\r\n                        //TWAIN.TW_JPEGCOMPRESSION twjpegcompression = default(TWAIN.TW_JPEGCOMPRESSION);\r\n                        //m_twain.CsvToJpegcompression(ref twjpegcompression, a_szTwmemref);\r\n                        //sts = m_twain.DatJpegcompression((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twjpegcompression);\r\n                        //a_szTwmemref = m_twain.JpegcompressionToCsv(twjpegcompression);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_METRICS...\r\n                case (int)TWAIN.DAT.METRICS:\r\n                    {\r\n                        TWAIN.TW_METRICS twmetrics = default(TWAIN.TW_METRICS);\r\n                        twmetrics.SizeOf = (uint)Marshal.SizeOf(twmetrics);\r\n                        sts = m_twain.DatMetrics((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twmetrics);\r\n                        a_szTwmemref = TWAIN.MetricsToCsv(twmetrics);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_PALETTE8...\r\n                case (int)TWAIN.DAT.PALETTE8:\r\n                    {\r\n                        //TWAIN.TW_PALETTE8 twpalette8 = default(TWAIN.TW_PALETTE8);\r\n                        //m_twain.CsvToPalette8(ref twpalette8, a_szTwmemref);\r\n                        //sts = m_twain.DatPalette8((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twpalette8);\r\n                        //a_szTwmemref = m_twain.Palette8ToCsv(twpalette8);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_PARENT...\r\n                case (int)TWAIN.DAT.PARENT:\r\n                    {\r\n                        sts = m_twain.DatParent((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref m_intptrHwnd);\r\n                        a_szTwmemref = \"\";\r\n                    }\r\n                    break;\r\n\r\n                // DAT_PASSTHRU...\r\n                case (int)TWAIN.DAT.PASSTHRU:\r\n                    {\r\n                        TWAIN.TW_PASSTHRU twpassthru = default(TWAIN.TW_PASSTHRU);\r\n                        TWAIN.CsvToPassthru(ref twpassthru, a_szTwmemref);\r\n                        sts = m_twain.DatPassthru((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twpassthru);\r\n                        a_szTwmemref = TWAIN.PassthruToCsv(twpassthru);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_PENDINGXFERS...\r\n                case (int)TWAIN.DAT.PENDINGXFERS:\r\n                    {\r\n                        TWAIN.TW_PENDINGXFERS twpendingxfers = default(TWAIN.TW_PENDINGXFERS);\r\n                        sts = m_twain.DatPendingxfers((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twpendingxfers);\r\n                        a_szTwmemref = TWAIN.PendingxfersToCsv(twpendingxfers);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_RGBRESPONSE...\r\n                case (int)TWAIN.DAT.RGBRESPONSE:\r\n                    {\r\n                        //TWAIN.TW_RGBRESPONSE twrgbresponse = default(TWAIN.TW_RGBRESPONSE);\r\n                        //m_twain.CsvToRgbresponse(ref twrgbresponse, a_szTwmemref);\r\n                        //sts = m_twain.DatRgbresponse((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twrgbresponse);\r\n                        //a_szTwmemref = m_twain.RgbresponseToCsv(twrgbresponse);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_SETUPFILEXFER...\r\n                case (int)TWAIN.DAT.SETUPFILEXFER:\r\n                    {\r\n                        TWAIN.TW_SETUPFILEXFER twsetupfilexfer = default(TWAIN.TW_SETUPFILEXFER);\r\n                        TWAIN.CsvToSetupfilexfer(ref twsetupfilexfer, a_szTwmemref);\r\n                        sts = m_twain.DatSetupfilexfer((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twsetupfilexfer);\r\n                        a_szTwmemref = TWAIN.SetupfilexferToCsv(twsetupfilexfer);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_SETUPMEMXFER...\r\n                case (int)TWAIN.DAT.SETUPMEMXFER:\r\n                    {\r\n                        TWAIN.TW_SETUPMEMXFER twsetupmemxfer = default(TWAIN.TW_SETUPMEMXFER);\r\n                        sts = m_twain.DatSetupmemxfer((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twsetupmemxfer);\r\n                        a_szTwmemref = TWAIN.SetupmemxferToCsv(twsetupmemxfer);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_STATUS...\r\n                case (int)TWAIN.DAT.STATUS:\r\n                    {\r\n                        TWAIN.TW_STATUS twstatus = default(TWAIN.TW_STATUS);\r\n                        sts = m_twain.DatStatus((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twstatus);\r\n                        a_szTwmemref = TWAIN.StatusToCsv(twstatus);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_STATUSUTF8...\r\n                case (int)TWAIN.DAT.STATUSUTF8:\r\n                    {\r\n                        TWAIN.TW_STATUSUTF8 twstatusutf8 = default(TWAIN.TW_STATUSUTF8);\r\n                        sts = m_twain.DatStatusutf8((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twstatusutf8);\r\n                        a_szTwmemref = m_twain.Statusutf8ToCsv(twstatusutf8);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_TWAINDIRECT...\r\n                case (int)TWAIN.DAT.TWAINDIRECT:\r\n                    {\r\n                        TWAIN.TW_TWAINDIRECT twtwaindirect = default(TWAIN.TW_TWAINDIRECT);\r\n                        TWAIN.CsvToTwaindirect(ref twtwaindirect, a_szTwmemref);\r\n                        sts = m_twain.DatTwaindirect((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twtwaindirect);\r\n                        a_szTwmemref = TWAIN.TwaindirectToCsv(twtwaindirect);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_USERINTERFACE...\r\n                case (int)TWAIN.DAT.USERINTERFACE:\r\n                    {\r\n                        TWAIN.TW_USERINTERFACE twuserinterface = default(TWAIN.TW_USERINTERFACE);\r\n                        m_twain.CsvToUserinterface(ref twuserinterface, a_szTwmemref);\r\n                        sts = m_twain.DatUserinterface((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref twuserinterface);\r\n                        a_szTwmemref = TWAIN.UserinterfaceToCsv(twuserinterface);\r\n                    }\r\n                    break;\r\n\r\n                // DAT_XFERGROUP...\r\n                case (int)TWAIN.DAT.XFERGROUP:\r\n                    {\r\n                        uint uXferGroup = 0;\r\n                        sts = m_twain.DatXferGroup((TWAIN.DG)iDg, (TWAIN.MSG)iMsg, ref uXferGroup);\r\n                        a_szTwmemref = string.Format(\"0x{0:X}\", uXferGroup);\r\n                    }\r\n                    break;\r\n            }\r\n\r\n            // All done...\r\n            return (sts);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Create and destroy TWAIN, as needed...\r\n        /// </summary>\r\n        /// <param name=\"a_szDg\">Data group</param>\r\n        /// <param name=\"a_szDat\">Data argument type</param>\r\n        /// <param name=\"a_szMsg\">Operation</param>\r\n        private void ManageTWAIN(string a_szDg, string a_szDat, string a_szMsg)\r\n        {\r\n            TWAIN.RunInUiThreadDelegate runinuithreaddelegate = RunInUiThread;\r\n\r\n            // Handle MSG_OPENDSM...\r\n            if (a_szMsg == \"MSG_OPENDSM\")\r\n            {\r\n                // Init stuff...\r\n                m_blClosing = false;\r\n\r\n                // Validate...\r\n                if (m_twain == null)\r\n                {\r\n                    try\r\n                    {\r\n                        string[] aszTwidentity = m_richtextboxCapability.Text.Split(',');\r\n                        if ((aszTwidentity == null) || (aszTwidentity.Length < 9))\r\n                        {\r\n                            m_twain = new TWAIN\r\n                            (\r\n                                \"TWAIN Working Group\",\r\n                                \"TWAIN Open Source\",\r\n                                \"TWAIN CS Test\",\r\n                                (ushort)TWAIN.TWON_PROTOCOL.MAJOR,\r\n                                (ushort)TWAIN.TWON_PROTOCOL.MINOR,\r\n                                (uint)(TWAIN.DG.APP2 | TWAIN.DG.CONTROL | TWAIN.DG.IMAGE),\r\n                                TWAIN.TWCY.USA,\r\n                                \"TWAIN CS Test\",\r\n                                TWAIN.TWLG.ENGLISH_USA,\r\n                                2,\r\n                                4,\r\n                                m_checkboxUseTwain32.Checked,\r\n                                m_checkboxUseCallbacks.Checked,\r\n                                DeviceEventCallback,\r\n                                ScanCallbackTrigger,\r\n                                runinuithreaddelegate,\r\n                                this.Handle\r\n                            );\r\n\r\n                            // Prep for TWAIN events...\r\n                            SetMessageFilter(true);\r\n\r\n                        }\r\n                        else\r\n                        {\r\n                            TWAIN.TWCY twcy = TWAIN.TWCY.USA;\r\n                            TWAIN.TWLG twlg = TWAIN.TWLG.ENGLISH_USA;\r\n                            Enum.TryParse<TWAIN.TWCY>(aszTwidentity[6], out twcy);\r\n                            Enum.TryParse<TWAIN.TWLG>(aszTwidentity[8], out twlg);\r\n                            m_twain = new TWAIN\r\n                            (\r\n                                aszTwidentity[0],\r\n                                aszTwidentity[1],\r\n                                aszTwidentity[2],\r\n                                ushort.Parse(aszTwidentity[3]),\r\n                                ushort.Parse(aszTwidentity[4]),\r\n                                (uint)(TWAIN.DG.APP2 | TWAIN.DG.CONTROL | TWAIN.DG.IMAGE),\r\n                                twcy,\r\n                                aszTwidentity[7],\r\n                                twlg,\r\n                                2,\r\n                                4,\r\n                                m_checkboxUseTwain32.Checked,\r\n                                m_checkboxUseCallbacks.Checked,\r\n                                DeviceEventCallback,\r\n                                ScanCallbackTrigger,\r\n                                runinuithreaddelegate,\r\n                                this.Handle\r\n                            );\r\n\r\n                            // Prep for TWAIN events...\r\n                            SetMessageFilter(true);\r\n                        }\r\n                    }\r\n                    catch (Exception exception)\r\n                    {\r\n                        TWAINWorkingGroup.Log.Error(\"exception - \" + exception.Message);\r\n                        WriteTriplet(a_szDg, a_szDat, a_szMsg, \"(unable to start, clear the data window and try again)\");\r\n                        m_twain = null;\r\n                        return;\r\n                    }\r\n                }\r\n\r\n                // Open the DSM...\r\n                string szTwmemref = m_intptrHwnd.ToString();\r\n                string szStatus = \"\";\r\n                TWAIN.STS sts = Send(\"DG_CONTROL\", \"DAT_PARENT\", \"MSG_OPENDSM\", ref szTwmemref, ref szStatus);\r\n                WriteTriplet(\"DG_CONTROL\", \"DAT_PARENT\", \"MSG_OPENDSM\", sts.ToString() + Environment.NewLine + m_intptrHwnd.ToString());\r\n\r\n                // Fix our controls...\r\n                if (TWAIN.GetPlatform() == TWAIN.Platform.WINDOWS)\r\n                {\r\n                    m_checkboxUseTwain32.Enabled = false;\r\n                    m_checkboxUseCallbacks.Enabled = false;\r\n                }\r\n\r\n                // Help the user...\r\n                AutoDropdown(a_szDg, a_szDat, a_szMsg);\r\n            }\r\n\r\n            // Handle MSG_CLOSEDSM...\r\n            else if (a_szMsg == \"MSG_CLOSEDSM\")\r\n            {\r\n                // Issue the command...\r\n                m_blClosing = true;\r\n                Rollback(TWAIN.STATE.S1);\r\n\r\n                // Fix our controls...\r\n                if (TWAIN.GetPlatform() == TWAIN.Platform.WINDOWS)\r\n                {\r\n                    m_checkboxUseTwain32.Enabled = (TWAIN.GetMachineWordBitSize() == 32);\r\n                    m_checkboxUseCallbacks.Enabled = true;\r\n                }\r\n\r\n                // Help the user...\r\n                AutoDropdown(a_szDg, a_szDat, a_szMsg);\r\n            }\r\n\r\n            // Handle anything else...\r\n            else\r\n            {\r\n                WriteTriplet(a_szDg, a_szDat, a_szMsg, TWAIN.STS.BADPROTOCOL.ToString());\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Our callback for device events.  This is where we catch and\r\n        /// report that a device event has been detected.  Obviously,\r\n        /// we're not doing much with it.  A real application would\r\n        /// probably take some kind of action...\r\n        /// </summary>\r\n        /// <returns>TWAIN status</returns>\r\n        private TWAIN.STS DeviceEventCallback()\r\n        {\r\n            string szTwmemref = \"\";\r\n            string szStatus = \"\";\r\n            TWAIN.STS sts;\r\n            TWAIN.TW_DEVICEEVENT twdeviceevent;\r\n\r\n            // Drain the event queue...\r\n            while (true)\r\n            {\r\n                // Try to get an event...\r\n                twdeviceevent = default(TWAIN.TW_DEVICEEVENT);\r\n                szTwmemref = TWAIN.DeviceeventToCsv(twdeviceevent);\r\n                sts = Send(\"DG_CONTROL\", \"DAT_DEVICEEVENT\", \"MSG_GET\", ref szTwmemref, ref szStatus);\r\n                if (sts != TWAIN.STS.SUCCESS)\r\n                {\r\n                    break;\r\n                }\r\n\r\n                // Report on what we got...\r\n                szStatus = (szStatus == \"\") ? sts.ToString() : (sts.ToString() + \" - \" + szStatus);\r\n                WriteOutput(\"*** DeviceEvent ***\" + Environment.NewLine);\r\n                WriteTriplet(\"DG_CONTROL\", \"DAT_PENDINGXFERS\", \"MSG_ENDXFER\", szStatus + ((szTwmemref == \"\") ? \"\" : (Environment.NewLine + szTwmemref)));\r\n            }\r\n\r\n            // Return a status, in case we ever need it for anything...\r\n            return (TWAIN.STS.SUCCESS);\r\n        }\r\n\r\n        /// <summary>\r\n        /// TWAIN needs help, if we want it to run stuff in our main\r\n        /// UI thread...\r\n        /// </summary>\r\n        /// <param name=\"control\">the control to run in</param>\r\n        /// <param name=\"code\">the code to run</param>\r\n        public void RunInUiThread(Action a_action)\r\n        {\r\n            RunInUiThread(this, a_action);\r\n        }\r\n        static public void RunInUiThread(Object a_object, Action a_action)\r\n        {\r\n            Control control = (Control)a_object;\r\n            if (control.InvokeRequired)\r\n            {\r\n                control.Invoke(new FormMain.RunInUiThreadDelegate(RunInUiThread), new object[] { a_object, a_action });\r\n                return;\r\n            }\r\n            a_action();\r\n        }\r\n\r\n        /// <summary>\r\n        /// Close the Data Source...\r\n        /// </summary>\r\n        /// <param name=\"a_dg\">Data group</param>\r\n        /// <param name=\"a_dat\">Data argument type</param>\r\n        /// <param name=\"a_msg\">Operation</param>\r\n        private void m_buttonCloseDS_Click(string a_szDg, string a_szDat, string a_szMsg)\r\n        {\r\n            if (m_twain != null)\r\n            {\r\n                Rollback(TWAIN.STATE.S3);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Start a scanning session...\r\n        /// </summary>\r\n        /// <param name=\"sender\">Originator</param>\r\n        /// <param name=\"e\">Arguments</param>\r\n        private void m_buttonScan_Click(object sender, EventArgs e)\r\n        {\r\n            string szTwmemref;\r\n            string szStatus;\r\n            TWAIN.STS sts;\r\n            Bitmap bitmap = new Bitmap(m_pictureboxImage1.Width, m_pictureboxImage1.Height);\r\n\r\n            // Reset the picture boxes...\r\n            m_iCurrentPictureBox = 0;\r\n            LoadImage(ref m_pictureboxImage1, ref m_graphics1, ref m_bitmapGraphic1, bitmap);\r\n            LoadImage(ref m_pictureboxImage2, ref m_graphics2, ref m_bitmapGraphic2, bitmap);\r\n            LoadImage(ref m_pictureboxImage3, ref m_graphics3, ref m_bitmapGraphic3, bitmap);\r\n            LoadImage(ref m_pictureboxImage4, ref m_graphics4, ref m_bitmapGraphic4, bitmap);\r\n            LoadImage(ref m_pictureboxImage5, ref m_graphics5, ref m_bitmapGraphic5, bitmap);\r\n            LoadImage(ref m_pictureboxImage6, ref m_graphics6, ref m_bitmapGraphic6, bitmap);\r\n            LoadImage(ref m_pictureboxImage7, ref m_graphics7, ref m_bitmapGraphic7, bitmap);\r\n            LoadImage(ref m_pictureboxImage8, ref m_graphics8, ref m_bitmapGraphic8, bitmap);\r\n\r\n            // Request a scan session...\r\n            ClearEvents();\r\n            szTwmemref = \"0,0,\" + m_intptrHwnd;\r\n            szStatus = \"\";\r\n            sts = Send(\"DG_CONTROL\", \"DAT_USERINTERFACE\", \"MSG_ENABLEDS\", ref szTwmemref, ref szStatus);\r\n            WriteTriplet(\"DG_CONTROL\", \"DAT_USERINTERFACE\", \"MSG_ENABLEDS\", sts.ToString());\r\n        }\r\n\r\n        /// <summary>\r\n        /// Clear our event list, and reset our event...\r\n        /// </summary>\r\n\r\n        public void ClearEvents()\r\n        {\r\n            m_blXferReadySent = false;\r\n            m_blDisableDsSent = false;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Stop scanning...\r\n        /// </summary>\r\n        /// <param name=\"sender\">Originator</param>\r\n        /// <param name=\"e\">Arguments</param>\r\n        private void m_buttonStop_Click(object sender, EventArgs e)\r\n        {\r\n            if (m_twain != null)\r\n            {\r\n                string szTwmemref = \"0,0\";\r\n                string szStatus = \"\";\r\n                TWAIN.STS sts = Send(\"DG_CONTROL\", \"DAT_PENDINGXFERS\", \"MSG_STOPFEEDER\", ref szTwmemref, ref szStatus);\r\n                szStatus = (szStatus == \"\") ? sts.ToString() : (sts.ToString() + \" - \" + szStatus);\r\n                WriteTriplet(\"DG_CONTROL\", \"DAT_PENDINGXFERS\", \"MSG_STOPFEEDER\", szStatus + ((szTwmemref == \"\") ? \"\" : (Environment.NewLine + szTwmemref)));\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// React to a change to the selection of TWAIN_32.DLL...\r\n        /// </summary>\r\n        /// <param name=\"sender\">Originator</param>\r\n        /// <param name=\"e\">Arguments</param>\r\n        private void m_checkboxUseTwain32_CheckedChanged(object sender, EventArgs e)\r\n        {\r\n            // TWAIN_32.DLL om Windows doesn't support callbacks, but the\r\n            // legacy stuff on Linux and MacOsX does; in fact that's all\r\n            // they support...\r\n            if (m_checkboxUseTwain32.Checked)\r\n            {\r\n                if (TWAIN.GetPlatform() == TWAIN.Platform.WINDOWS)\r\n                {\r\n                    m_checkboxUseCallbacks.Checked = false;\r\n                }\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// React to a chance to the selection of callbacks...\r\n        /// </summary>\r\n        /// <param name=\"sender\">Originator</param>\r\n        /// <param name=\"e\">Arguments</param>\r\n        private void m_checkboxUseCallbacks_CheckedChanged(object sender, EventArgs e)\r\n        {\r\n            // TWAIN_32.DLL doesn't support callbacks...\r\n            if (m_checkboxUseCallbacks.Checked)\r\n            {\r\n                m_checkboxUseTwain32.Checked = false;\r\n            }\r\n        }\r\n\r\n        #endregion\r\n\r\n\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        // Private Attributes...\r\n        ///////////////////////////////////////////////////////////////////////////////\r\n        #region Private Attributes...\r\n\r\n        /// <summary>\r\n        /// Our interface to TWAIN...\r\n        /// </summary>\r\n        private TWAIN m_twain;\r\n        private IntPtr m_intptrHwnd;\r\n        private bool m_blDisableDsSent = false;\r\n        private bool m_blXferReadySent = false;\r\n        private IntPtr m_intptrXfer = IntPtr.Zero;\r\n        private IntPtr m_intptrImage = IntPtr.Zero;\r\n        private int m_iImageBytes = 0;\r\n        private TWAIN.TWSX m_twsxXferMech;\r\n        private TWAIN.TW_SETUPMEMXFER m_twsetupmemxfer;\r\n\r\n        /// <summary>\r\n        /// The picture box we're currently displaying into...\r\n        /// </summary>\r\n        private int m_iCurrentPictureBox;\r\n\r\n        // Let us know when we're shutting down...\r\n        private bool m_blClosing;\r\n\r\n        // The brush we use for the image background...\r\n        private Brush m_brushBackground;\r\n\r\n        // The rectangle we use to fill the background...\r\n        private Rectangle m_rectangleBackground;\r\n\r\n        // Bitmaps and graphics used to display images during scanning...\r\n        private Bitmap m_bitmapGraphic1;\r\n        private Bitmap m_bitmapGraphic2;\r\n        private Bitmap m_bitmapGraphic3;\r\n        private Bitmap m_bitmapGraphic4;\r\n        private Bitmap m_bitmapGraphic5;\r\n        private Bitmap m_bitmapGraphic6;\r\n        private Bitmap m_bitmapGraphic7;\r\n        private Bitmap m_bitmapGraphic8;\r\n        private Graphics m_graphics1;\r\n        private Graphics m_graphics2;\r\n        private Graphics m_graphics3;\r\n        private Graphics m_graphics4;\r\n        private Graphics m_graphics5;\r\n        private Graphics m_graphics6;\r\n        private Graphics m_graphics7;\r\n        private Graphics m_graphics8;\r\n        private int m_iImageCount = 0;\r\n\r\n        /// <summary>\r\n        /// We use this to run code in the context of the caller's UI thread...\r\n        /// </summary>\r\n        /// <param name=\"a_object\">object (really a control)</param>\r\n        /// <param name=\"a_action\">code to run</param>\r\n        public delegate void RunInUiThreadDelegate(Object a_object, Action a_action);\r\n\r\n        #endregion\r\n    }\r\n}\r\n"
  },
  {
    "path": "twaincs/source/twaincstst/source/Main.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n</root>"
  },
  {
    "path": "twaincs/source/twaincstst/source/Program.cs",
    "content": "﻿///////////////////////////////////////////////////////////////////////////////////////\r\n//\r\n//  TWAINCSTst.Program\r\n//\r\n//  Our main entry point...\r\n//\r\n///////////////////////////////////////////////////////////////////////////////////////\r\n//  Author          Date            Version     Comment\r\n//  M.McLaughlin    21-May-2014     2.0.0.0     64-bit Linux\r\n//  M.McLaughlin    27-Feb-2014     1.1.0.0     ShowImage additions\r\n//  M.McLaughlin    21-Oct-2013     1.0.0.0     Initial Release\r\n///////////////////////////////////////////////////////////////////////////////////////\r\n//  Copyright (C) 2013-2019 Kodak Alaris Inc.\r\n//\r\n//  Permission is hereby granted, free of charge, to any person obtaining a\r\n//  copy of this software and associated documentation files (the \"Software\"),\r\n//  to deal in the Software without restriction, including without limitation\r\n//  the rights to use, copy, modify, merge, publish, distribute, sublicense,\r\n//  and/or sell copies of the Software, and to permit persons to whom the\r\n//  Software is furnished to do so, subject to the following conditions:\r\n//\r\n//  The above copyright notice and this permission notice shall be included in\r\n//  all copies or substantial portions of the Software.\r\n//\r\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\r\n//  THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\r\n//  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\r\n//  DEALINGS IN THE SOFTWARE.\r\n///////////////////////////////////////////////////////////////////////////////////////\r\n\r\nusing System;\r\nusing System.Windows.Forms;\r\n\r\nnamespace TWAINCSTst\r\n{\r\n    static class Program\r\n    {\r\n        /// <summary>\r\n        /// The main entry point for the application.\r\n        /// </summary>\r\n        [STAThread]\r\n        static void Main()\r\n        {\r\n            Application.EnableVisualStyles();\r\n            Application.SetCompatibleTextRenderingDefault(false);\r\n            Application.Run(new FormMain());\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "twaincs/source/twaincstst/source/Properties/AssemblyInfo.cs",
    "content": "﻿///////////////////////////////////////////////////////////////////////////////////////\r\n//\r\n// TWAINCSTst AssemblyInfo\r\n//\r\n///////////////////////////////////////////////////////////////////////////////////////\r\n//  Copyright (C) 2013-2021 Kodak Alaris Inc.\r\n//\r\n//  Permission is hereby granted, free of charge, to any person obtaining a\r\n//  copy of this software and associated documentation files (the \"Software\"),\r\n//  to deal in the Software without restriction, including without limitation\r\n//  the rights to use, copy, modify, merge, publish, distribute, sublicense,\r\n//  and/or sell copies of the Software, and to permit persons to whom the\r\n//  Software is furnished to do so, subject to the following conditions:\r\n//\r\n//  The above copyright notice and this permission notice shall be included in\r\n//  all copies or substantial portions of the Software.\r\n//\r\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\r\n//  THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\r\n//  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\r\n//  DEALINGS IN THE SOFTWARE.\r\n///////////////////////////////////////////////////////////////////////////////////////\r\n\r\nusing System.Reflection;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Runtime.InteropServices;\r\n\r\n// General Information about an assembly is controlled through the following \r\n// set of attributes. Change these attribute values to modify the information\r\n// associated with an assembly.\r\n[assembly: AssemblyTitle(\"TWAINCSTst\")]\r\n[assembly: AssemblyDescription(\"Diagnostic TWAIN Application for C#\")]\r\n[assembly: AssemblyConfiguration(\"\")]\r\n[assembly: AssemblyCompany(\"Kodak Alaris Inc.\")]\r\n[assembly: AssemblyProduct(\"TWAINCSTst\")]\r\n[assembly: AssemblyCopyright(\"Copyright © 2013-2020, Kodak Alaris Inc.\")]\r\n[assembly: AssemblyTrademark(\"\")]\r\n[assembly: AssemblyCulture(\"\")]\r\n\r\n// Setting ComVisible to false makes the types in this assembly not visible \r\n// to COM components.  If you need to access a type in this assembly from \r\n// COM, set the ComVisible attribute to true on that type.\r\n[assembly: ComVisible(false)]\r\n\r\n// The following GUID is for the ID of the typelib if this project is exposed to COM\r\n[assembly: Guid(\"1b424eff-90ab-4e15-863d-884b513fe3c4\")]\r\n\r\n// Version information for an assembly consists of the following four values:\r\n//\r\n//      Major Version\r\n//      Minor Version \r\n//      Build Number\r\n//      Revision\r\n//\r\n// You can specify all the values or you can default the Build and Revision Numbers \r\n// by using the '*' as shown below:\r\n[assembly: AssemblyVersion(\"2.5.0.0\")]\r\n[assembly: AssemblyFileVersion(\"2.5.0.0\")]\r\n"
  },
  {
    "path": "twaincs/source/twaincstst/source/Properties/Resources.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\r\n// <auto-generated>\r\n//     This code was generated by a tool.\r\n//     Runtime Version:4.0.30319.269\r\n//\r\n//     Changes to this file may cause incorrect behavior and will be lost if\r\n//     the code is regenerated.\r\n// </auto-generated>\r\n//------------------------------------------------------------------------------\r\n\r\nnamespace TWAINCSTst.Properties\r\n{\r\n\r\n\r\n    /// <summary>\r\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\r\n    /// </summary>\r\n    // This class was auto-generated by the StronglyTypedResourceBuilder\r\n    // class via a tool like ResGen or Visual Studio.\r\n    // To add or remove a member, edit your .ResX file then rerun ResGen\r\n    // with the /str option, or rebuild your VS project.\r\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"4.0.0.0\")]\r\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\r\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\r\n    internal class Resources\r\n    {\r\n\r\n        private static global::System.Resources.ResourceManager resourceMan;\r\n\r\n        private static global::System.Globalization.CultureInfo resourceCulture;\r\n\r\n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\r\n        internal Resources()\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        ///   Returns the cached ResourceManager instance used by this class.\r\n        /// </summary>\r\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\r\n        internal static global::System.Resources.ResourceManager ResourceManager\r\n        {\r\n            get\r\n            {\r\n                if ((resourceMan == null))\r\n                {\r\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"TWAINCSTst.Properties.Resources\", typeof(Resources).Assembly);\r\n                    resourceMan = temp;\r\n                }\r\n                return resourceMan;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        ///   Overrides the current thread's CurrentUICulture property for all\r\n        ///   resource lookups using this strongly typed resource class.\r\n        /// </summary>\r\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\r\n        internal static global::System.Globalization.CultureInfo Culture\r\n        {\r\n            get\r\n            {\r\n                return resourceCulture;\r\n            }\r\n            set\r\n            {\r\n                resourceCulture = value;\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "twaincs/source/twaincstst/source/Properties/Resources.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n</root>"
  },
  {
    "path": "twaincs/source/twaincstst/source/Properties/Settings.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\r\n// <auto-generated>\r\n//     This code was generated by a tool.\r\n//     Runtime Version:4.0.30319.269\r\n//\r\n//     Changes to this file may cause incorrect behavior and will be lost if\r\n//     the code is regenerated.\r\n// </auto-generated>\r\n//------------------------------------------------------------------------------\r\n\r\nnamespace TWAINCSTst.Properties\r\n{\r\n\r\n\r\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\r\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator\", \"10.0.0.0\")]\r\n    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase\r\n    {\r\n\r\n        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));\r\n\r\n        public static Settings Default\r\n        {\r\n            get\r\n            {\r\n                return defaultInstance;\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "twaincs/source/twaincstst/source/Properties/Settings.settings",
    "content": "﻿<?xml version='1.0' encoding='utf-8'?>\r\n<SettingsFile xmlns=\"http://schemas.microsoft.com/VisualStudio/2004/01/settings\" CurrentProfile=\"(Default)\">\r\n  <Profiles>\r\n    <Profile Name=\"(Default)\" />\r\n  </Profiles>\r\n  <Settings />\r\n</SettingsFile>\r\n"
  },
  {
    "path": "twaincs/source/twaincstst/source/Properties/Settings1.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\r\n// <auto-generated>\r\n//     This code was generated by a tool.\r\n//     Runtime Version:4.0.30319.42000\r\n//\r\n//     Changes to this file may cause incorrect behavior and will be lost if\r\n//     the code is regenerated.\r\n// </auto-generated>\r\n//------------------------------------------------------------------------------\r\n\r\nnamespace twaincstst.Properties {\r\n    \r\n    \r\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\r\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator\", \"15.9.0.0\")]\r\n    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {\r\n        \r\n        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));\r\n        \r\n        public static Settings Default {\r\n            get {\r\n                return defaultInstance;\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "twaincs/source/twaincstst/source/app.config",
    "content": "﻿<?xml version=\"1.0\"?>\r\n<configuration>\r\n  <startup>\r\n    <supportedRuntime version=\"v4.5\" />\r\n    <supportedRuntime version=\"v4.0.30319\" />\r\n    <supportedRuntime version=\"v4.0\" />\r\n    <supportedRuntime version=\"v2.0.50727\" />\r\n  </startup>\r\n</configuration>\r\n"
  },
  {
    "path": "twaincs/source/twaincstst/source/twaincstst.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <PropertyGroup>\r\n    <ProductVersion>15.0.27428.2005</ProductVersion>\r\n    <ImplicitlyExpandNETStandardFacades>false</ImplicitlyExpandNETStandardFacades>\r\n    <DisableHandlePackageFileConflicts>true</DisableHandlePackageFileConflicts>\r\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\r\n    <Platform Condition=\" '$(Platform)' == '' \">x86</Platform>\r\n    <ProjectGuid>{7D3F078C-BAE8-4975-9EBA-F162ABD64BBD}</ProjectGuid>\r\n    <OutputType>WinExe</OutputType>\r\n    <NoStandardLibraries>false</NoStandardLibraries>\r\n    <AssemblyName>twaincstst</AssemblyName>\r\n    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>\r\n    <TargetFrameworkProfile>\r\n    </TargetFrameworkProfile>\r\n    <FileAlignment>512</FileAlignment>\r\n    <SccProjectName>\r\n    </SccProjectName>\r\n    <SccLocalPath>\r\n    </SccLocalPath>\r\n    <SccAuxPath>\r\n    </SccAuxPath>\r\n    <SccProvider>\r\n    </SccProvider>\r\n    <PublishUrl>publish\\</PublishUrl>\r\n    <Install>true</Install>\r\n    <InstallFrom>Disk</InstallFrom>\r\n    <UpdateEnabled>false</UpdateEnabled>\r\n    <UpdateMode>Foreground</UpdateMode>\r\n    <UpdateInterval>7</UpdateInterval>\r\n    <UpdateIntervalUnits>Days</UpdateIntervalUnits>\r\n    <UpdatePeriodically>false</UpdatePeriodically>\r\n    <UpdateRequired>false</UpdateRequired>\r\n    <MapFileExtensions>true</MapFileExtensions>\r\n    <ApplicationRevision>0</ApplicationRevision>\r\n    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>\r\n    <IsWebBootstrapper>false</IsWebBootstrapper>\r\n    <UseApplicationTrust>false</UseApplicationTrust>\r\n    <BootstrapperEnabled>true</BootstrapperEnabled>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|x86' \">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <DebugType>full</DebugType>\r\n    <Optimize>false</Optimize>\r\n    <OutputPath>bin\\x86\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n    <PlatformTarget>x86</PlatformTarget>\r\n    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>\r\n    <RunCodeAnalysis>true</RunCodeAnalysis>\r\n    <Prefer32Bit>false</Prefer32Bit>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|x86' \">\r\n    <DebugType>pdbonly</DebugType>\r\n    <Optimize>true</Optimize>\r\n    <OutputPath>bin\\x86\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n    <PlatformTarget>x86</PlatformTarget>\r\n    <RunCodeAnalysis>true</RunCodeAnalysis>\r\n    <Prefer32Bit>false</Prefer32Bit>\r\n  </PropertyGroup>\r\n  <PropertyGroup>\r\n    <RootNamespace>twaincstst</RootNamespace>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|x64'\">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <OutputPath>bin\\x64\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <DebugType>full</DebugType>\r\n    <PlatformTarget>x64</PlatformTarget>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>\r\n    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>\r\n    <RunCodeAnalysis>true</RunCodeAnalysis>\r\n    <Prefer32Bit>false</Prefer32Bit>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|x64'\">\r\n    <OutputPath>bin\\x64\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <Optimize>true</Optimize>\r\n    <DebugType>pdbonly</DebugType>\r\n    <PlatformTarget>x64</PlatformTarget>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>\r\n    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>\r\n    <RunCodeAnalysis>true</RunCodeAnalysis>\r\n    <Prefer32Bit>false</Prefer32Bit>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'\">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <OutputPath>bin\\AnyCPU\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <DebugType>full</DebugType>\r\n    <PlatformTarget>AnyCPU</PlatformTarget>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>\r\n    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>\r\n    <RunCodeAnalysis>true</RunCodeAnalysis>\r\n    <Prefer32Bit>false</Prefer32Bit>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|AnyCPU'\">\r\n    <OutputPath>bin\\AnyCPU\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <Optimize>true</Optimize>\r\n    <DebugType>pdbonly</DebugType>\r\n    <PlatformTarget>AnyCPU</PlatformTarget>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>\r\n    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>\r\n    <RunCodeAnalysis>true</RunCodeAnalysis>\r\n    <Prefer32Bit>false</Prefer32Bit>\r\n  </PropertyGroup>\r\n  <ItemGroup>\r\n    <Reference Include=\"System\" />\r\n    <Reference Include=\"System.Drawing\" />\r\n    <Reference Include=\"System.Windows.Forms\" />\r\n    <Reference Include=\"TWAIN\">\r\n      <SpecificVersion>False</SpecificVersion>\r\n      <HintPath>..\\..\\bin\\$(Platform)\\$(Configuration)\\TWAIN.dll</HintPath>\r\n    </Reference>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Compile Include=\"Main.cs\">\r\n      <SubType>Form</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Main.Designer.cs\">\r\n      <DependentUpon>Main.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Program.cs\" />\r\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\r\n    <Compile Include=\"Properties\\Resources.Designer.cs\" />\r\n    <Compile Include=\"Properties\\Settings.Designer.cs\" />\r\n    <Compile Include=\"Properties\\Settings1.Designer.cs\">\r\n      <AutoGen>True</AutoGen>\r\n      <DesignTimeSharedInput>True</DesignTimeSharedInput>\r\n      <DependentUpon>Settings.settings</DependentUpon>\r\n    </Compile>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <EmbeddedResource Include=\"Main.resx\">\r\n      <DependentUpon>Main.cs</DependentUpon>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Properties\\Resources.resx\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"app.config\" />\r\n    <None Include=\"Properties\\Settings.settings\">\r\n      <Generator>SettingsSingleFileGenerator</Generator>\r\n      <LastGenOutput>Settings1.Designer.cs</LastGenOutput>\r\n    </None>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <BootstrapperPackage Include=\"Microsoft.Net.Client.3.5\">\r\n      <Visible>False</Visible>\r\n      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>\r\n      <Install>false</Install>\r\n    </BootstrapperPackage>\r\n    <BootstrapperPackage Include=\"Microsoft.Net.Framework.3.5.SP1\">\r\n      <Visible>False</Visible>\r\n      <ProductName>.NET Framework 3.5 SP1</ProductName>\r\n      <Install>true</Install>\r\n    </BootstrapperPackage>\r\n    <BootstrapperPackage Include=\"Microsoft.Windows.Installer.3.1\">\r\n      <Visible>False</Visible>\r\n      <ProductName>Windows Installer 3.1</ProductName>\r\n      <Install>true</Install>\r\n    </BootstrapperPackage>\r\n  </ItemGroup>\r\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSHARP.Targets\" />\r\n  <ProjectExtensions>\r\n    <VisualStudio AllowExistingFolder=\"true\" />\r\n  </ProjectExtensions>\r\n  <PropertyGroup>\r\n    <PostBuildEvent>\r\n    </PostBuildEvent>\r\n  </PropertyGroup>\r\n</Project>"
  }
]