<?xml version="1.0" ?>
<informationTable xsi:schemaLocation="http://www.sec.gov/edgar/document/thirteenf/informationtable eis_13FDocument.xsd" xmlns="http://www.sec.gov/edgar/document/thirteenf/informationtable" xmlns:n1="http://www.sec.gov/edgar/document/thirteenf/informationtable" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <infoTable>
    <nameOfIssuer>ACI Worldwide</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>004498101</cusip>
    <value>12635543</value>
    <shrsOrPrnAmt>
      <sshPrnamt>468330</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>450000</Sole>
      <Shared>0</Shared>
      <None>18330</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>AeroVironment</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>008073108</cusip>
    <value>134615634</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1468641</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>765049</Sole>
      <Shared>0</Shared>
      <None>703592</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Alarm.Com Holdings</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>011642105</cusip>
    <value>9504328</value>
    <shrsOrPrnAmt>
      <sshPrnamt>189028</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>580</Sole>
      <Shared>0</Shared>
      <None>188448</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ANSYS</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>03662Q105</cusip>
    <value>97935053</value>
    <shrsOrPrnAmt>
      <sshPrnamt>294276</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>123775</Sole>
      <Shared>0</Shared>
      <None>170501</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Apple</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>037833100</cusip>
    <value>217008</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1316</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>0</Sole>
      <Shared>0</Shared>
      <None>1316</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>AspenTech</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>29109X106</cusip>
    <value>2942582</value>
    <shrsOrPrnAmt>
      <sshPrnamt>12857</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>0</Sole>
      <Shared>0</Shared>
      <None>12857</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Azenta</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>114340102</cusip>
    <value>20933116</value>
    <shrsOrPrnAmt>
      <sshPrnamt>469142</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>211001</Sole>
      <Shared>0</Shared>
      <None>258141</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Bio Techne</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>09073M104</cusip>
    <value>65793695</value>
    <shrsOrPrnAmt>
      <sshPrnamt>886827</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>363689</Sole>
      <Shared>0</Shared>
      <None>523138</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Blackbaud</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>09227Q100</cusip>
    <value>34111608</value>
    <shrsOrPrnAmt>
      <sshPrnamt>492231</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>167958</Sole>
      <Shared>0</Shared>
      <None>324273</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Cerence</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>156727109</cusip>
    <value>22108656</value>
    <shrsOrPrnAmt>
      <sshPrnamt>787065</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>310088</Sole>
      <Shared>0</Shared>
      <None>476977</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Charles River Labs</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>159864107</cusip>
    <value>35318500</value>
    <shrsOrPrnAmt>
      <sshPrnamt>175000</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>136000</Sole>
      <Shared>0</Shared>
      <None>39000</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Cognex</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>192422103</cusip>
    <value>78371104</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1581657</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>742736</Sole>
      <Shared>0</Shared>
      <None>838921</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Cognyte Software</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>M25133105</cusip>
    <value>16664816</value>
    <shrsOrPrnAmt>
      <sshPrnamt>4915875</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1396487</Sole>
      <Shared>0</Shared>
      <None>3519388</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>CommVault Systems</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>204166102</cusip>
    <value>30944634</value>
    <shrsOrPrnAmt>
      <sshPrnamt>545376</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>318261</Sole>
      <Shared>0</Shared>
      <None>227115</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Costar Group</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>22160N109</cusip>
    <value>57935898</value>
    <shrsOrPrnAmt>
      <sshPrnamt>841480</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>347299</Sole>
      <Shared>0</Shared>
      <None>494181</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>CyberArk Software</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>M2682V108</cusip>
    <value>128629099</value>
    <shrsOrPrnAmt>
      <sshPrnamt>869233</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>377245</Sole>
      <Shared>0</Shared>
      <None>491988</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>DexCom</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>252131107</cusip>
    <value>34020292</value>
    <shrsOrPrnAmt>
      <sshPrnamt>292824</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>6522</Sole>
      <Shared>0</Shared>
      <None>286302</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Dolby Laboratories</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>25659T107</cusip>
    <value>6688813</value>
    <shrsOrPrnAmt>
      <sshPrnamt>78305</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>0</Sole>
      <Shared>0</Shared>
      <None>78305</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Dorman Products</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>258278100</cusip>
    <value>13635981</value>
    <shrsOrPrnAmt>
      <sshPrnamt>158080</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>140000</Sole>
      <Shared>0</Shared>
      <None>18080</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>FactSet Research</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>303075105</cusip>
    <value>97803921</value>
    <shrsOrPrnAmt>
      <sshPrnamt>235621</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>92628</Sole>
      <Shared>0</Shared>
      <None>142993</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Forrester Research</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>346563109</cusip>
    <value>4522530</value>
    <shrsOrPrnAmt>
      <sshPrnamt>139800</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>12000</Sole>
      <Shared>0</Shared>
      <None>127800</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Fortinet</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>34959E109</cusip>
    <value>226487372</value>
    <shrsOrPrnAmt>
      <sshPrnamt>3407875</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1714073</Sole>
      <Shared>0</Shared>
      <None>1693802</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Forward Air</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>349853101</cusip>
    <value>6919593</value>
    <shrsOrPrnAmt>
      <sshPrnamt>64213</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>0</Sole>
      <Shared>0</Shared>
      <None>64213</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Franklin Electric</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>353514102</cusip>
    <value>2352500</value>
    <shrsOrPrnAmt>
      <sshPrnamt>25000</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>0</Sole>
      <Shared>0</Shared>
      <None>25000</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Gentex</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>371901109</cusip>
    <value>66468604</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2371338</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1152193</Sole>
      <Shared>0</Shared>
      <None>1219145</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Globant S.A.</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>L44385109</cusip>
    <value>391164</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2385</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>0</Sole>
      <Shared>0</Shared>
      <None>2385</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Graham</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>384556106</cusip>
    <value>317190</value>
    <shrsOrPrnAmt>
      <sshPrnamt>24250</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>0</Sole>
      <Shared>0</Shared>
      <None>24250</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Guidewire Software</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>40171V100</cusip>
    <value>33769647</value>
    <shrsOrPrnAmt>
      <sshPrnamt>411574</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>119701</Sole>
      <Shared>0</Shared>
      <None>291873</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Haemonetics</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>405024100</cusip>
    <value>6702336</value>
    <shrsOrPrnAmt>
      <sshPrnamt>80995</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>10000</Sole>
      <Shared>0</Shared>
      <None>70995</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ICON PLC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>G4705A100</cusip>
    <value>140209233</value>
    <shrsOrPrnAmt>
      <sshPrnamt>656441</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>375600</Sole>
      <Shared>0</Shared>
      <None>280841</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>IDEXX Lab</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>45168D104</cusip>
    <value>181780080</value>
    <shrsOrPrnAmt>
      <sshPrnamt>363502</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>179808</Sole>
      <Shared>0</Shared>
      <None>183694</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Illumina</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>452327109</cusip>
    <value>53009307</value>
    <shrsOrPrnAmt>
      <sshPrnamt>227948</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>109734</Sole>
      <Shared>0</Shared>
      <None>118214</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Jack Henry &amp; Associates</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>426281101</cusip>
    <value>72975459</value>
    <shrsOrPrnAmt>
      <sshPrnamt>484179</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>233120</Sole>
      <Shared>0</Shared>
      <None>251059</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Kornit Digital</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>M6372Q113</cusip>
    <value>42429628</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2191613</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1021263</Sole>
      <Shared>0</Shared>
      <None>1170350</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Kratos Defense</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>50077B207</cusip>
    <value>15970106</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1184726</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>734000</Sole>
      <Shared>0</Shared>
      <None>450726</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>LiveRamp Holdings</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>53815P108</cusip>
    <value>20533432</value>
    <shrsOrPrnAmt>
      <sshPrnamt>936317</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>614000</Sole>
      <Shared>0</Shared>
      <None>322317</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Manhattan Assocs</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>562750109</cusip>
    <value>204386670</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1319901</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>716358</Sole>
      <Shared>0</Shared>
      <None>603543</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Medpace Holdings</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>58506q109</cusip>
    <value>80435943</value>
    <shrsOrPrnAmt>
      <sshPrnamt>427737</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>175497</Sole>
      <Shared>0</Shared>
      <None>252240</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Merit Medical Systems</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>589889104</cusip>
    <value>13491068</value>
    <shrsOrPrnAmt>
      <sshPrnamt>182435</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>130000</Sole>
      <Shared>0</Shared>
      <None>52435</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Monolithic Power Systems</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>609839105</cusip>
    <value>3583866</value>
    <shrsOrPrnAmt>
      <sshPrnamt>7160</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>0</Sole>
      <Shared>0</Shared>
      <None>7160</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Morningstar</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>617700109</cusip>
    <value>37368890</value>
    <shrsOrPrnAmt>
      <sshPrnamt>184056</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>113367</Sole>
      <Shared>0</Shared>
      <None>70689</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>National Instruments</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>636518102</cusip>
    <value>30697114</value>
    <shrsOrPrnAmt>
      <sshPrnamt>585711</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>10646</Sole>
      <Shared>0</Shared>
      <None>575065</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>NICE</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>653656108</cusip>
    <value>121423169</value>
    <shrsOrPrnAmt>
      <sshPrnamt>530487</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>235263</Sole>
      <Shared>0</Shared>
      <None>295224</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>O'Reilly Automotive</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>67103H107</cusip>
    <value>636735</value>
    <shrsOrPrnAmt>
      <sshPrnamt>750</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>0</Sole>
      <Shared>0</Shared>
      <None>750</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>OraSure Tech</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>68554V108</cusip>
    <value>13922992</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2301321</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1735000</Sole>
      <Shared>0</Shared>
      <None>566321</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Paycom Software</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>70432V102</cusip>
    <value>32757077</value>
    <shrsOrPrnAmt>
      <sshPrnamt>107750</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>28539</Sole>
      <Shared>0</Shared>
      <None>79211</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Qualys</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>74758T303</cusip>
    <value>91137909</value>
    <shrsOrPrnAmt>
      <sshPrnamt>700953</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>309599</Sole>
      <Shared>0</Shared>
      <None>391354</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>QuidelOrtho</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>219798105</cusip>
    <value>13571258</value>
    <shrsOrPrnAmt>
      <sshPrnamt>152332</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>99000</Sole>
      <Shared>0</Shared>
      <None>53332</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>RBC Bearings</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>75524b104</cusip>
    <value>48533980</value>
    <shrsOrPrnAmt>
      <sshPrnamt>208542</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>16644</Sole>
      <Shared>0</Shared>
      <None>191898</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Repligen</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>759916109</cusip>
    <value>29041595</value>
    <shrsOrPrnAmt>
      <sshPrnamt>172497</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>19001</Sole>
      <Shared>0</Shared>
      <None>153496</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ResMed</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>761152107</cusip>
    <value>113652963</value>
    <shrsOrPrnAmt>
      <sshPrnamt>518987</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>250841</Sole>
      <Shared>0</Shared>
      <None>268146</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>SEI Investments</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>784117103</cusip>
    <value>27412446</value>
    <shrsOrPrnAmt>
      <sshPrnamt>476324</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>317700</Sole>
      <Shared>0</Shared>
      <None>158624</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Spdr S&amp;P 500 Series 1</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>78462F103</cusip>
    <value>878142</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2145</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>0</Sole>
      <Shared>0</Shared>
      <None>2145</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>SPS Commerce</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>78463m107</cusip>
    <value>27166665</value>
    <shrsOrPrnAmt>
      <sshPrnamt>178376</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>3023</Sole>
      <Shared>0</Shared>
      <None>175353</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>STAAR Surgical</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>852312305</cusip>
    <value>9250304</value>
    <shrsOrPrnAmt>
      <sshPrnamt>144649</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>6344</Sole>
      <Shared>0</Shared>
      <None>138305</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Tradeweb Markets</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>892672106</cusip>
    <value>24621131</value>
    <shrsOrPrnAmt>
      <sshPrnamt>311581</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>6716</Sole>
      <Shared>0</Shared>
      <None>304865</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Trimble</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>896239100</cusip>
    <value>19972020</value>
    <shrsOrPrnAmt>
      <sshPrnamt>381000</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>359000</Sole>
      <Shared>0</Shared>
      <None>22000</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Tyler Technologies</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>902252105</cusip>
    <value>1532399</value>
    <shrsOrPrnAmt>
      <sshPrnamt>4321</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>0</Sole>
      <Shared>0</Shared>
      <None>4321</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Varonis Systems</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>922280102</cusip>
    <value>335893</value>
    <shrsOrPrnAmt>
      <sshPrnamt>12914</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>0</Sole>
      <Shared>0</Shared>
      <None>12914</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Veeva Systems</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>922475108</cusip>
    <value>62189941</value>
    <shrsOrPrnAmt>
      <sshPrnamt>338375</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>163767</Sole>
      <Shared>0</Shared>
      <None>174608</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Verint Systems</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>92343X100</cusip>
    <value>57351090</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1540040</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>905678</Sole>
      <Shared>0</Shared>
      <None>634362</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Zebra Technologies</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>989207105</cusip>
    <value>349800</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1100</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>0</Sole>
      <Shared>0</Shared>
      <None>1100</None>
    </votingAuthority>
  </infoTable>
</informationTable>
