<!--

Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed
under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either express or implied. See the License for the
specific language governing permissions and limitations under the License.

-->
<form action="" method="post">
  <h2>Change Password</h2>
  <fieldset>
    <table summary=""><tbody><tr>
      <th><label>New Password:</label></th>
      <td><input type="password" name="password" size="24" /></td>
    </tr><tr>
      <th><label>Verify New Password:</label></th>
      <td><input type="password" name="verify_password" size="24" /></td>
    </tr>
    </tbody></table>
  </fieldset>
  <div class="buttons">
    <button type="submit">Login</button>
    <button type="button" class="cancel">Cancel</button>
  </div>
</form>
