From 7dc2e6ceaaf74ff2cd8b6a8a3964097cffe1f475 Mon Sep 17 00:00:00 2001
From: neil_a_wilson <neil_a_wilson@localhost>
Date: Thu, 31 Aug 2006 00:40:49 +0000
Subject: [PATCH] Add initial MakeLDIF support for generating entries based on a template. This can be used to either write the generated entries to LDIF, or to import them directly into the server. This code is not yet feature-complete, nor is it 100% compatible with the version of MakeLDIF provided with SLAMD, but it is functional enough for use in a large number of situations.
---
opends/src/server/org/opends/server/tools/makeldif/PresenceTag.java | 218
opends/resource/MakeLDIF/states | 51
opends/src/server/org/opends/server/tools/makeldif/Template.java | 393
opends/resource/MakeLDIF/example.template | 34
opends/resource/MakeLDIF/first.names | 8605 ++++++++++++++++
opends/src/server/org/opends/server/tools/ImportLDIF.java | 97
opends/src/server/org/opends/server/tools/makeldif/SequentialTag.java | 257
opends/src/server/org/opends/server/tools/makeldif/TagResult.java | 166
opends/src/server/org/opends/server/tools/makeldif/DNTag.java | 234
opends/src/server/org/opends/server/tools/makeldif/LastNameTag.java | 138
opends/src/server/org/opends/server/tools/makeldif/IfAbsentTag.java | 229
opends/src/server/org/opends/server/types/AttributeType.java | 50
opends/resource/MakeLDIF/last.names | 13419 +++++++++++++++++++++++++
opends/src/server/org/opends/server/tools/makeldif/UnderscoreParentDNTag.java | 146
opends/src/server/org/opends/server/tools/makeldif/MakeLDIFInputStreamThread.java | 92
opends/src/server/org/opends/server/tools/makeldif/Branch.java | 450
opends/src/server/org/opends/server/tools/makeldif/IfPresentTag.java | 229
opends/src/server/org/opends/server/tools/makeldif/RDNTag.java | 172
opends/src/server/org/opends/server/tools/makeldif/ParentDNTag.java | 138
opends/src/server/org/opends/server/tools/makeldif/MakeLDIFException.java | 95
opends/src/server/org/opends/server/tools/makeldif/GUIDTag.java | 164
opends/src/server/org/opends/server/tools/makeldif/EntryWriter.java | 68
opends/src/server/org/opends/server/tools/makeldif/StaticTextTag.java | 172
opends/src/server/org/opends/server/tools/makeldif/TemplateEntry.java | 332
opends/resource/MakeLDIF/cities | 232
opends/resource/MakeLDIF/streets | 74
opends/src/server/org/opends/server/tools/makeldif/FirstNameTag.java | 138
opends/src/server/org/opends/server/tools/makeldif/MakeLDIFInputStream.java | 293
opends/src/server/org/opends/server/types/LDIFImportConfig.java | 23
opends/src/server/org/opends/server/tools/makeldif/RandomTag.java | 696 +
opends/src/server/org/opends/server/tools/makeldif/TemplateFile.java | 1759 +++
opends/src/server/org/opends/server/messages/ToolMessages.java | 1029 +
opends/src/server/org/opends/server/tools/makeldif/FileTag.java | 268
opends/src/server/org/opends/server/tools/makeldif/Tag.java | 137
opends/src/server/org/opends/server/tools/makeldif/TemplateLine.java | 136
opends/build.xml | 5
opends/resource/bin/makeldif.bat | 57
opends/src/server/org/opends/server/tools/makeldif/TemplateValue.java | 108
opends/src/server/org/opends/server/tools/makeldif/UnderscoreDNTag.java | 241
opends/resource/bin/makeldif.sh | 75
opends/src/server/org/opends/server/tools/makeldif/AttributeValueTag.java | 272
opends/src/server/org/opends/server/config/ConfigConstants.java | 9
opends/src/server/org/opends/server/tools/makeldif/MakeLDIF.java | 424
43 files changed, 31,901 insertions(+), 24 deletions(-)
diff --git a/opends/build.xml b/opends/build.xml
index 4d50924..82a03cb 100644
--- a/opends/build.xml
+++ b/opends/build.xml
@@ -412,6 +412,7 @@
<mkdir dir="${pdir}/config" />
<mkdir dir="${pdir}/config/schema" />
<mkdir dir="${pdir}/config/messages" />
+ <mkdir dir="${pdir}/config/MakeLDIF" />
<mkdir dir="${pdir}/db" />
<mkdir dir="${pdir}/changelogDb" />
<mkdir dir="${pdir}/ldif" />
@@ -444,6 +445,10 @@
<fileset dir="${resource.dir}/messages" />
</copy>
+ <copy todir="${pdir}/config/MakeLDIF">
+ <fileset dir="${resource.dir}/MakeLDIF" />
+ </copy>
+
<copy todir="${pdir}/legal-notices">
<fileset dir="${resource.dir}/legal-notices" />
</copy>
diff --git a/opends/resource/MakeLDIF/cities b/opends/resource/MakeLDIF/cities
new file mode 100644
index 0000000..78f740e
--- /dev/null
+++ b/opends/resource/MakeLDIF/cities
@@ -0,0 +1,232 @@
+Abilene
+Albany
+Albuquerque
+Alexandria
+Alpena
+Altoona
+Amarillo
+Anchorage
+Anniston
+Ardmore
+Atlanta
+Augusta
+Austin
+Bakersfield
+Baltimore
+Bangor
+Baton Rouge
+Beaumont
+Bend
+Billings
+Biloxi
+Binghamton
+Birmingham
+Bismarck
+Bloomington
+Bluefield
+Boise
+Boston
+Bowling Green
+Bryan
+Buffalo
+Burlington
+Butte
+Cadillac
+Casper
+Cedar Rapids
+Champaign
+Charleston
+Charlotte
+Charlottesville
+Chattanooga
+Cheyenne
+Chicago
+Chico
+Cincinnati
+Clarksburg
+Cleveland
+College Station
+Colorado Springs
+Columbia
+Columbus
+Corpus Christi
+Dallas
+Davenport
+Dayton
+Denver
+Des Moines
+Detroit
+Dothan
+Duluth
+Durham
+Eau Claire
+Elmira
+El Paso
+Erie
+Eugene
+Eureka
+Evansville
+Fairbanks
+Fargo
+Flint
+Florence
+Fort Myers
+Fort Smith
+Fort Wayne
+Fort Worth
+Fresno
+Gainesville
+Glendive
+Grand Junction
+Grand Rapids
+Great Falls
+Green Bay
+Greenville
+Hampton Roads
+Harlingen
+Harrisburg
+Harrisonburg
+Hartford
+Hattiesburg
+Helena
+Honolulu
+Houston
+Huntington
+Huntsville
+Idaho Falls
+Indianapolis
+Jackson
+Jacksonville
+Jefferson City
+Johnstown
+Jonesboro
+Joplin
+Kansas City
+Kirksville
+Klamath Falls
+Knoxville
+La Crosse
+Lafayette
+Lake Charles
+Lansing
+Laredo
+Las Vegas
+Lawton
+Lexington
+Lima
+Lincoln
+Little Rock
+Los Angeles
+Louisville
+Lubbock
+Lynchburg
+Macon
+Madison
+Mankato
+Marquette
+Mason City
+Medford
+Memphis
+Meridian
+Miami
+Milwaukee
+Minneapolis
+Missoula
+Mobile
+Moline
+Monroe
+Monterey Bay Area
+Montgomery
+Naples
+Nashville
+New Haven
+New Orleans
+New York
+North Platte
+Odessa
+Oklahoma City
+Omaha
+Orlando
+Ottumwa
+Paducah
+Palm Springs
+Panama City
+Parkersburg
+Pensacola
+Peoria
+Philadelphia
+Phoenix
+Pittsburgh
+Pocatello
+Port Arthur
+Portland
+Presque Isle
+Providence
+Pueblo
+Quincy
+Raleigh
+Rapid City
+Redding
+Reno
+Rhinelander
+Richmond
+Riverton
+Roanoke
+Rochester
+Rockford
+Sacramento
+Saginaw
+Saint Joseph
+Saint Louis
+Saint Paul
+Salem
+Salisbury
+Salt Lake City
+San Angelo
+San Antonio
+San Diego
+Santa Barbara
+Santa Fe
+Savannah
+Scranton
+Seattle
+Shreveport
+Sioux City
+Sioux Falls
+South Bend
+Spartanburg
+Spokane
+Springfield
+Steubenville
+Superior
+Syracuse
+Tallahassee
+Tampa Bay
+Terre Haute
+Toledo
+Topeka
+Traverse City
+Tucson
+Tulsa
+Tupelo
+Tuscaloosa
+Twin Falls
+Tyler
+Urbana
+Utica
+Victoria
+Waterloo
+Watertown
+Wausau
+Weston
+West Palm Beach
+Wheeling
+Wichita
+Wichita Falls
+Wichita FallsLawton
+Wilkes Barre
+Wilmington
+Winston
+Youngstown
+Yuma
+Zanesville
diff --git a/opends/resource/MakeLDIF/example.template b/opends/resource/MakeLDIF/example.template
new file mode 100644
index 0000000..5ae7f86
--- /dev/null
+++ b/opends/resource/MakeLDIF/example.template
@@ -0,0 +1,34 @@
+define suffix=dc=example,dc=com
+define maildomain=example.com
+define numusers=10001
+
+branch: [suffix]
+
+branch: ou=People,[suffix]
+subordinateTemplate: person:[numusers]
+
+template: person
+rdnAttr: uid
+objectClass: top
+objectClass: person
+objectClass: organizationalPerson
+objectClass: inetOrgPerson
+givenName: <first>
+sn: <last>
+cn: {givenName} {sn}
+initials: {givenName:1}<random:chars:ABCDEFGHIJKLMNOPQRSTUVWXYZ:1>{sn:1}
+employeeNumber: <sequential:0>
+uid: user.{employeeNumber}
+mail: {uid}@[maildomain]
+userPassword: password
+telephoneNumber: <random:telephone>
+homePhone: <random:telephone>
+pager: <random:telephone>
+mobile: <random:telephone>
+street: <random:numeric:5> <file:streets> Street
+l: <file:cities>
+st: <file:states>
+postalCode: <random:numeric:5>
+postalAddress: {cn}${street}${l}, {st} {postalCode}
+description: This is the description for {cn}.
+
diff --git a/opends/resource/MakeLDIF/first.names b/opends/resource/MakeLDIF/first.names
new file mode 100644
index 0000000..0b2179b
--- /dev/null
+++ b/opends/resource/MakeLDIF/first.names
@@ -0,0 +1,8605 @@
+Aaccf
+Aaren
+Aarika
+Aaron
+Aartjan
+Abagael
+Abagail
+Abahri
+Abbas
+Abbe
+Abbey
+Abbi
+Abbie
+Abby
+Abbye
+Abdalla
+Abdallah
+Abdul
+Abdullah
+Abe
+Abel
+Abigael
+Abigail
+Abigale
+Abra
+Abraham
+Abu
+Access
+Accounting
+Achal
+Achamma
+Action
+Ada
+Adah
+Adaline
+Adam
+Adan
+Adara
+Adda
+Addi
+Addia
+Addie
+Addons
+Addy
+Adel
+Adela
+Adelaida
+Adelaide
+Adele
+Adelheid
+Adelia
+Adelice
+Adelina
+Adelind
+Adeline
+Adella
+Adelle
+Adena
+Adeniyi
+Adey
+Adi
+Adiana
+Adie
+Adina
+Aditya
+Admin
+Adnan
+Adora
+Adore
+Adoree
+Adorne
+Adrea
+Adri
+Adria
+Adriaens
+Adrian
+Adriana
+Adriane
+Adrianna
+Adrianne
+Adrie
+Adrien
+Adriena
+Adrienne
+Advance
+Aeriel
+Aeriela
+Aeriell
+Afif
+Afke
+Afton
+Afzal
+Ag
+Agace
+Agata
+Agatha
+Agathe
+Agenia
+Aggi
+Aggie
+Aggy
+Agna
+Agnella
+Agnes
+Agnese
+Agnesse
+Agneta
+Agnola
+Agretha
+Ahmad
+Ahmed
+Ahmet
+Aida
+Aidan
+Aideen
+Aiden
+Aigneis
+Aila
+Aile
+Ailee
+Aileen
+Ailene
+Ailey
+Aili
+Ailina
+Ailis
+Ailsun
+Ailyn
+Aime
+Aimee
+Aimil
+Aindrea
+Ainslee
+Ainsley
+Ainslie
+Air
+Ajay
+Ajit
+Ajmal
+Ajoy
+Akemi
+Akihiko
+Akin
+Akio
+Akira
+Akram
+Akshay
+Al
+Aladin
+Alain
+Alaine
+Alameda
+Alan
+Alana
+Alanah
+Alane
+Alanna
+Alasdair
+Alastair
+Alayne
+Alb
+Albert
+Alberta
+Albertina
+Albertine
+Albina
+Albrecht
+Aldo
+Alec
+Alecia
+Aleda
+Aleece
+Aleen
+Alejandra
+Alejandrina
+Alena
+Alene
+Alese
+Alessandra
+Aleta
+Alethea
+Alev
+Alex
+Alexa
+Alexander
+Alexandra
+Alexandrina
+Alexandru
+Alexi
+Alexia
+Alexina
+Alexine
+Alexis
+Alf
+Alfi
+Alfie
+Alfons
+Alfonso
+Alfonzo
+Alfred
+Alfreda
+Alfredo
+Alfy
+Ali
+Alia
+Alica
+Alice
+Alicea
+Alicia
+Alida
+Alidia
+Alie
+Alika
+Alikee
+Alina
+Aline
+Alis
+Alisa
+Alisha
+Alison
+Alissa
+Alisun
+Alix
+Aliza
+Alka
+Alkarim
+Alla
+Allan
+Alleen
+Allegra
+Allen
+Allene
+Alli
+Allianora
+Allie
+Allina
+Allis
+Allisan
+Allison
+Allissa
+Allister
+Allix
+Allsun
+Allx
+Ally
+Allyce
+Allyn
+Allys
+Allyson
+Alma
+Almeda
+Almeria
+Almerinda
+Almeta
+Almira
+Almire
+Alnoor
+Aloise
+Aloisia
+Alok
+Alora
+Aloysia
+Alp
+Alparslan
+Alphen
+Alphonso
+Alpine
+Alstine
+Alta
+Altay
+Althea
+Alvaro
+Alvera
+Alverta
+Alvin
+Alvina
+Alvinia
+Alvira
+Alwyn
+Aly
+Alyce
+Alyda
+Alys
+Alysa
+Alyse
+Alysia
+Alyson
+Alyss
+Alyssa
+Amabel
+Amabelle
+Amalea
+Amalee
+Amaleta
+Amalia
+Amalie
+Amalita
+Amalle
+Amand
+Amanda
+Amandi
+Amandie
+Amandip
+Amando
+Amandy
+Amant
+Amara
+Amargo
+Amarjit
+Amata
+Amato
+Amber
+Amberly
+Ambur
+Ame
+Amelia
+Amelie
+Amelina
+Ameline
+Amelita
+America
+Ami
+Amie
+Amii
+Amil
+Amina
+Amir
+Amit
+Amitie
+Amity
+Amjad
+Ammamaria
+Ammar
+Amnish
+Amnon
+Amos
+Amour
+Amparo
+Amrik
+Amrish
+Amy
+Amye
+An
+Ana
+Anabal
+Anabel
+Anabella
+Anabelle
+Anader
+Analiese
+Analise
+Anallese
+Anallise
+Anand
+Anantha
+Anastasia
+Anastasie
+Anastassia
+Anatola
+Anatoli
+Anatoly
+Anda
+Andaree
+Andee
+Andeee
+Anderea
+Anders
+Anderson
+Andi
+Andie
+Andra
+Andras
+Andre
+Andrea
+Andreana
+Andreas
+Andree
+Andrei
+Andrejs
+Andres
+Andrew
+Andria
+Andriana
+Andriette
+Andromache
+Andrzej
+Andy
+Anestassia
+Anet
+Anett
+Anetta
+Anette
+Ange
+Angel
+Angela
+Angele
+Angeles
+Angelia
+Angelica
+Angelie
+Angeliek
+Angelika
+Angelina
+Angeline
+Angelique
+Angelita
+Angelle
+Angelo
+Angie
+Angil
+Angus
+Angy
+Anhtuan
+Ania
+Anibal
+Anica
+Aniko
+Anil
+Anissa
+Anita
+Anitra
+Anja
+Anjanette
+Anje
+Anjela
+Anker
+Anki
+Ankie
+Anky
+Ann
+Ann-Hoon
+Ann-Lorrain
+Ann-Marie
+Anna
+Anna-Marie
+Anna-diana
+Anna-diane
+Anna-maria
+Annabal
+Annabel
+Annabela
+Annabell
+Annabella
+Annabelle
+Annadiana
+Annadiane
+Annalee
+Annaliese
+Annalise
+Annamaria
+Annamarie
+Annarbor
+Anne
+Anne Marie
+Anne-Lise
+Anne-Marie
+Anne-corinne
+Annecorinne
+Anneke
+Anneliese
+Annelise
+Annemarie
+Annemarijke
+Annemie
+Annet
+Annetta
+Annette
+Anni
+Annice
+Annick
+Annie
+Annis
+Annissa
+Annmaria
+Annmarie
+Annnora
+Annora
+Anny
+Ans
+Anselma
+Ansley
+Anstice
+Anthe
+Anthea
+Anthia
+Anthiathia
+Anthony
+Antoine
+Antoinette
+Anton
+Anton-Phuoc
+Antonella
+Antonetta
+Antoni
+Antonia
+Antonie
+Antonietta
+Antonina
+Antonio
+Anup
+Anurag
+Anver
+Anwar
+Anya
+Aparna
+Api-Ecm
+Apollo
+Appolonia
+April
+Aprilette
+Apryle
+Apurve
+Ara
+Arabel
+Arabela
+Arabele
+Arabella
+Arabelle
+Arch
+Archie
+Arda
+Ardath
+Ardavan
+Ardeen
+Ardelia
+Ardelis
+Ardella
+Ardelle
+Arden
+Ardene
+Ardenia
+Ardie
+Ardine
+Ardis
+Ardisj
+Ardith
+Ardra
+Ardyce
+Ardys
+Ardyth
+Aretha
+Ari
+Ariadne
+Ariana
+Aridatha
+Ariel
+Ariela
+Ariella
+Arielle
+Arif
+Arina
+Aris
+Aristides
+Arjun
+Arlan
+Arlana
+Arlee
+Arleen
+Arlen
+Arlena
+Arlene
+Arleta
+Arlette
+Arleyne
+Arlie
+Arliene
+Arlina
+Arlinda
+Arline
+Arluene
+Arly
+Arlyn
+Arlyne
+Armand
+Armando
+Armelle
+Armin
+Armine
+Arn
+Arne
+Arnett
+Arnie
+Arnis
+Arno
+Arnold
+Arsavir
+Arshad
+Art
+Arthur
+Arts
+Arturo
+Arun
+Aruna
+Arvin
+Arvind
+Aryn
+Arzu
+Asan
+Asghar
+Ash
+Ashely
+Ashia
+Ashien
+Ashil
+Ashla
+Ashlan
+Ashlee
+Ashleigh
+Ashlen
+Ashley
+Ashli
+Ashlie
+Ashly
+Ashok
+Ashoka
+Ashraf
+Ashu
+Asia
+Asif
+Asmar
+Asnat
+Astra
+Astrid
+Astrix
+Atalanta
+Athar
+Athena
+Athene
+Atique
+Atl
+Atl-Sales
+Atlanta
+Atlante
+Atmane
+Atsuo
+Atsushi
+Atta
+Attilio
+Attilla
+Atul
+Auberta
+Aubine
+Aubree
+Aubrette
+Aubrey
+Aubrie
+Aubry
+Audi
+Audie
+Audivox
+Audra
+Audre
+Audrey
+Audrie
+Audry
+Audrye
+Audy
+Augusta
+Auguste
+Augustin
+Augustina
+Augustine
+Augusto
+Aundrea
+Aura
+Aurea
+Aurel
+Aurelea
+Aurelia
+Aurelie
+Auria
+Aurie
+Aurilia
+Aurlie
+Auro
+Auroora
+Aurora
+Aurore
+Austin
+Austina
+Austine
+Auto
+Ava
+Avaz
+Avedis
+Aveline
+Averil
+Averyl
+Avie
+Avinash
+Avis
+Aviva
+Avivah
+Avril
+Avrit
+Avtar
+Axel
+Ayako
+Ayaz
+Aybars
+Ayda
+Ayn
+Azam
+Azar
+Azhar
+Aziz
+Azmeena
+Azmina
+Azra
+Bab
+Babak
+Babara
+Babb
+Babbette
+Babbie
+Babette
+Babita
+Babs
+Bachittar
+Badri
+Baets
+Baha
+Bahadir
+Bahram
+Bailey
+Baines
+Bakel
+Bakoury
+Bal
+Balaji
+Balakrishna
+Baldev
+Baljinder
+Bam
+Bambi
+Bambie
+Bamby
+Bang
+Bao
+BaoMinh
+Barb
+Barbabra
+Barbara
+Barbara-anne
+Barbaraanne
+Barbe
+Barbee
+Barbette
+Barbey
+Barbi
+Barbie
+Barbra
+Barby
+Bari
+Baris
+Barlas
+Barnes
+Barney
+Barrie
+Barry
+Barsha
+Bart
+Barton
+Baruk
+Base
+Basheer
+Basia
+Basil
+Bassam
+Bathsheba
+Batsheva
+Bawn
+Bcs
+Bcspatch
+Bea
+Beana
+Beata
+Beate
+Beatrice
+Beatrisa
+Beatrix
+Beatriz
+Beau
+Beaumont
+Beb
+Bebe
+Becca
+Becka
+Becki
+Beckie
+Becky
+Bedford
+Bee
+Begum
+Behdad
+Behnam
+Behrouz
+Behzad
+Beilul
+Beitris
+Bekki
+Bel
+Bela
+Belen
+Belia
+Belicia
+Belinda
+Belissa
+Belita
+Bell
+Bella
+Bellanca
+Belle
+Belleville
+Bellina
+Bello
+Belva
+Belvia
+Ben
+Bendite
+Benedetta
+Benedicta
+Benedikta
+Benefits
+Benetta
+Bengt
+Benita
+Benjamin
+Benne
+Bennesa
+Bennet
+Bennett
+Benni
+Bennie
+Benny
+Benoit
+Benoite
+Benthem
+Bep
+Beppie
+Berangere
+Berenice
+Beret
+Berger
+Berget
+Berna
+Bernadene
+Bernadette
+Bernadina
+Bernadine
+Bernard
+Bernardina
+Bernardine
+Bernardo
+Bernd
+Bernelle
+Berneta
+Bernete
+Bernetta
+Bernette
+Bernhard
+Berni
+Bernice
+Bernie
+Bernita
+Berny
+Berri
+Berrie
+Berry
+Bert
+Berta
+Berte
+Bertha
+Berthe
+Berti
+Bertie
+Bertina
+Bertine
+Berton
+Bertrand
+Berty
+Beryl
+Beryle
+Bess
+Bessie
+Bessy
+Beth
+Bethanne
+Bethany
+Bethena
+Bethina
+Betsey
+Betsy
+Betta
+Bette
+Bette-ann
+Betteann
+Betteanne
+Betti
+Bettie
+Bettina
+Bettine
+Bettink
+Betty
+Betty-Ann
+Betty-Anne
+Bettye
+Beulah
+Bev
+Beverie
+Beverlee
+Beverley
+Beverlie
+Beverly
+Bevvy
+Bevyn
+Bhagvat
+Bhal
+Bhanu
+Bharat
+Bhupendra
+Bhupinder
+Bianca
+Bianka
+Bibbie
+Bibby
+Bibbye
+Bibi
+Biddie
+Biddy
+Bidget
+Bihari
+Bijan
+Bili
+Bill
+Billi
+Billie
+Billy
+Billye
+Bin
+Bina
+Bing
+Binh
+Binni
+Binnie
+Binny
+Biplab
+Bird
+Birdie
+Birendra
+Birgit
+Birgitta
+Birgitte
+Birmingham
+Biswajit
+Bjorn
+Blaine
+Blair
+Blaire
+Blaise
+Blake
+Blakelee
+Blakeley
+Blanca
+Blanch
+Blancha
+Blanche
+Blinni
+Blinnie
+Blinny
+Bliss
+Blisse
+Blithe
+Blondell
+Blondelle
+Blondie
+Blondy
+Blythe
+Bnr
+Bnrecad
+Bnrtor
+Bo
+Bob
+Bobb
+Bobbe
+Bobbee
+Bobbette
+Bobbi
+Bobbie
+Bobby
+Bobbye
+Bobette
+Bobina
+Bobine
+Bobinette
+Bodo
+Boer
+Bogdan
+Bonita
+Bonnar
+Bonnee
+Bonni
+Bonnibelle
+Bonnie
+Bonny
+Bora
+Boris
+Bosiljka
+Bqb
+Brad
+Bradley
+Brahmananda
+Bram
+Bran
+Brana
+Brand
+Brandais
+Brande
+Brandea
+Brandi
+Brandice
+Brandie
+Brandise
+Brandon
+Brandy
+Brant
+Breanne
+Brear
+Brechtje
+Bree
+Breena
+Bregitte
+Brekel
+Bren
+Brena
+Brend
+Brenda
+Brendan
+Brenn
+Brenna
+Brennan
+Brent
+Brenton
+Bret
+Breton
+Brett
+Bria
+Brian
+Briana
+Brianna
+Brianne
+Bride
+Bridget
+Bridgette
+Bridie
+Brien
+Brier
+Brietta
+Brigid
+Brigida
+Brigit
+Brigitta
+Brigitte
+Brina
+Briney
+Brinn
+Brinna
+Briny
+Brit
+Brita
+Britney
+Britni
+Britt
+Britta
+Brittan
+Brittaney
+Brittani
+Brittany
+Britte
+Britteny
+Brittne
+Brittney
+Brittni
+Brock
+Brook
+Brooke
+Brooks
+Bruce
+Brunhilda
+Brunhilde
+Bruno
+Bryan
+Bryana
+Bryant
+Bryce
+Bryn
+Bryna
+Brynn
+Brynna
+Brynne
+Bryon
+Bse
+Buck
+Bucklin
+Bud
+Buda
+Buddy
+Budi
+Bue
+Buffy
+Buford
+Bui
+Building
+Bulent
+Bulletin
+Bunni
+Bunnie
+Bunny
+Burgess
+Burt
+Burton
+Business
+Buster
+Butch
+Bvworks
+Byron
+Cacilia
+Cacilie
+Cad
+Cahra
+Caine
+Cairistiona
+Caitlin
+Caitrin
+Cal
+Calida
+Calla
+Calley
+Calli
+Callida
+Callie
+Cally
+Calvin
+Calypso
+Cam
+Camala
+Camel
+Camella
+Camellia
+Cameron
+Camey
+Cami
+Camila
+Camile
+Camilla
+Camille
+Camino
+Cammi
+Cammie
+Cammy
+Canadian
+Candace
+Candee
+Candi
+Candice
+Candida
+Candide
+Candie
+Candis
+Candra
+Candy
+Cang
+Cantrell
+Canute
+Caprice
+Car
+Cara
+Caralie
+Career
+Careers
+Caren
+Carena
+Caresa
+Caressa
+Caresse
+Carey
+Cari
+Caria
+Caridad
+Carie
+Caril
+Carilyn
+Carin
+Carina
+Carine
+Cariotta
+Carissa
+Carita
+Caritta
+Cark
+Carl
+Carla
+Carlee
+Carleen
+Carlen
+Carlene
+Carley
+Carlie
+Carlin
+Carlina
+Carline
+Carling
+Carlis
+Carlisle
+Carlita
+Carlo
+Carlos
+Carlota
+Carlotta
+Carlton
+Carly
+Carlye
+Carlyn
+Carlynn
+Carlynne
+Carm
+Carma
+Carmel
+Carmela
+Carmelia
+Carmelina
+Carmelita
+Carmella
+Carmelle
+Carmelo
+Carmen
+Carmencita
+Carmina
+Carmine
+Carmita
+Carmody
+Carmon
+Caro
+Carol
+Carol-jean
+Carola
+Carolan
+Carolann
+Carole
+Carolee
+Carolien
+Carolin
+Carolina
+Caroline
+Caroljean
+Carolle
+Carolyn
+Carolyne
+Carolynn
+Caron
+Carran
+Carree
+Carri
+Carrie
+Carrissa
+Carroll
+Carry
+Carson
+Carsten
+Cart
+Carter
+Cary
+Caryl
+Caryn
+Casandra
+Casey
+Casi
+Casie
+Cass
+Cassandra
+Cassandre
+Cassandry
+Cassaundra
+Cassey
+Cassi
+Cassie
+Cassondra
+Cassy
+Cat
+Catarina
+Cate
+Caterina
+Catha
+Cathal
+Catharina
+Catharine
+Cathe
+Cathee
+Catherin
+Catherina
+Catherine
+Cathi
+Cathie
+Cathleen
+Cathlene
+Cathrin
+Cathrine
+Cathryn
+Cathy
+Cathyleen
+Cati
+Catie
+Catina
+Catja
+Catlaina
+Catlee
+Catlin
+Catrina
+Catriona
+Caty
+Cavin
+Caye
+Cayla
+Caz
+Cecco
+Cecelia
+Cecil
+Cecile
+Ceciley
+Cecilia
+Cecilla
+Cecily
+Cedric
+Cefee
+Ceil
+Cele
+Celene
+Celesta
+Celeste
+Celestia
+Celestina
+Celestine
+Celestyn
+Celestyna
+Celia
+Celie
+Celina
+Celinda
+Celine
+Celinka
+Celisse
+Celka
+Celle
+Celyne
+Cen
+Ceriel
+Cesar
+Cesare
+Cesya
+Cezary
+Chabane
+Chabert
+Chad
+Chahram
+Chai
+Chak-Hong
+Champathon
+Chan
+Chand
+Chanda
+Chandal
+Chander
+Chandra
+Chandrakant
+Chandran
+Chanh
+Channa
+Chantal
+Chantalle
+Charangit
+Charee
+Charene
+Charil
+Charin
+Charis
+Charissa
+Charisse
+Charita
+Charity
+Charla
+Charlean
+Charleen
+Charlena
+Charlene
+Charles
+Charleton
+Charley
+Charlie
+Charline
+Charlot
+Charlotta
+Charlotte
+Charlsey
+Charly
+Charmain
+Charmaine
+Charman
+Charmane
+Charmian
+Charmine
+Charmion
+Charo
+Charyl
+Chastity
+Chatri
+Chau
+Chawki
+Chee-Yin
+Chee-Yong
+Chellappan
+Chelsae
+Chelsea
+Chelsey
+Chelsie
+Chelsy
+Chen
+Chen-Chen
+Chen-Jung
+Cheng
+Cher
+Chere
+Cherey
+Cheri
+Cherianne
+Cherice
+Cherida
+Cherie
+Cherilyn
+Cherilynn
+Cherin
+Cherise
+Cherish
+Cherlyn
+Cherri
+Cherrita
+Cherry
+Chery
+Cherye
+Cheryl
+Cheslie
+Chesteen
+Chester
+Chet
+Cheuk
+Chi
+Chi-Keung
+Chi-Kwan
+Chi-Man
+Chi-Vien
+Chi-Yin
+Chi-ho
+Chiarra
+Chick
+Chickie
+Chicky
+Chie
+Chin
+ChinFui
+Ching-Long
+Chip
+Chiquia
+Chiquita
+Chitra
+Chiu
+Chlo
+Chloe
+Chloette
+Chloris
+Cho
+Cho-Kuen
+Cho-Lun
+Chocs
+Chok
+Chong
+Chong-Lai
+Choon-Lin
+Chris
+Chrissie
+Chrissy
+Christa
+Christabel
+Christabella
+Christal
+Christalle
+Christan
+Christean
+Christel
+Christelle
+Christen
+Christer
+Christi
+Christian
+Christiana
+Christiane
+Christianne
+Christie
+Christie-Anne
+Christin
+Christina
+Christine
+Christoph
+Christophe
+Christopher
+Christy
+Christye
+Christyna
+Chrysa
+Chrysler
+Chrystal
+Chryste
+Chrystel
+Chu-Chay
+Chuan
+Chuck
+Chun
+Chung
+Chung-Cheung
+Chung-Wo
+Chung-Yo
+Chungsik
+Chunmeng
+Chye-Lian
+Ciaran
+Cicely
+Cicily
+Ciel
+Cilka
+Cinda
+Cindee
+Cindelyn
+Cinderella
+Cindi
+Cindie
+Cindra
+Cindy
+Cinnamon
+Ciriaco
+Cissiee
+Cissy
+Clair
+Claire
+Clara
+Clarabelle
+Clare
+Clarence
+Claresta
+Clareta
+Claretta
+Clarette
+Clarey
+Clari
+Claribel
+Clarice
+Clarie
+Clarinda
+Clarine
+Clarissa
+Clarisse
+Clarita
+Clark
+Clarke
+Clary
+Class
+Claude
+Claudelle
+Claudetta
+Claudette
+Claudia
+Claudie
+Claudina
+Claudine
+Claus
+Clay
+Clayton
+Clea
+Clem
+Clemence
+Clement
+Clemente
+Clementia
+Clementina
+Clementine
+Clemie
+Clemmie
+Clemmy
+Cleo
+Cleopatra
+Clerissa
+Clestell
+Cleto
+Cleve
+Cleveland
+Clevon
+Cliff
+Clifford
+Clifton
+Clint
+Clinton
+Clio
+Clive
+Clo
+Cloe
+Cloris
+Clotilda
+Clovis
+Clyde
+Co
+Co-Op
+Cocos
+Code
+Codee
+Codi
+Codie
+Cody
+Coila
+Cole
+Coleen
+Coleman
+Colene
+Coletta
+Colette
+Colin
+Colleen
+Collen
+Collete
+Collette
+Colli
+Collie
+Colline
+Colly
+Colm
+Colman
+Con
+Concetta
+Concettina
+Conchita
+Concordia
+Condell
+Cong
+Conni
+Connie
+Conny
+Conrad
+Conserving
+Consolata
+Constance
+Constancia
+Constancy
+Constanta
+Constantia
+Constantin
+Constantina
+Constantine
+Consuela
+Consuelo
+Conway
+Cookie
+Cooney
+Coop
+Cooper
+Coord
+Coors
+Cora
+Corabel
+Corabella
+Corabelle
+Coral
+Coralie
+Coraline
+Coralyn
+Cordelia
+Cordelie
+Cordey
+Cordi
+Cordie
+Cordula
+Cordy
+Core
+Coreen
+Corella
+Corena
+Corenda
+Corene
+Coretta
+Corette
+Corey
+Cori
+Corie
+Corilla
+Corina
+Corine
+Corinna
+Corinne
+Coriss
+Corissa
+Corkstown
+Corliss
+Corly
+Cornel
+Cornela
+Cornelia
+Cornelis
+Cornelius
+Cornelle
+Cornie
+Corny
+Correna
+Correy
+Corri
+Corrianne
+Corrie
+Corrina
+Corrine
+Corrinne
+Corry
+Cortland
+Cortney
+Cory
+Cosetta
+Cosette
+Cosimo
+Cosola
+Costanza
+Costas
+Costas-Dinos
+Count
+Coursdev
+Coursey
+Court
+Courtenay
+Courtnay
+Courtney
+Craig
+Crawford
+Crin
+Cris
+Crissie
+Crissy
+Crista
+Cristabel
+Cristal
+Cristen
+Cristi
+Cristian
+Cristiane
+Cristie
+Cristin
+Cristina
+Cristine
+Cristionna
+Cristofaro
+Cristy
+Croix
+Crysta
+Crystal
+CrystalBay
+Crystie
+Cthrine
+Cubical
+Cubicle
+Cuong
+Curt
+Curtis
+Cuthbert
+Cyb
+Cybil
+Cybill
+Cycelia
+Cymbre
+Cynde
+Cyndi
+Cyndia
+Cyndie
+Cyndy
+Cynethia
+Cynthea
+Cynthia
+Cynthie
+Cynthy
+Cynthya
+Cyril
+Cyrine
+Cyrus
+Czes
+D'Anne
+Dacey
+Dacia
+Dacie
+Dacy
+Dae
+Dael
+Daffi
+Daffie
+Daffy
+Dagmar
+Dahlia
+Daile
+Daisey
+Daisi
+Daisie
+Daisy
+Dale
+Dalenna
+Dalia
+Dalila
+Dalip
+Dallas
+Daloris
+Dalton
+Damara
+Damaris
+Damian
+Damien
+Damil
+Damita
+Damon
+Dan
+Dana
+Danell
+Danella
+Danette
+Dani
+Dania
+Danial
+Danica
+Danice
+Daniel
+Daniela
+Daniele
+Daniella
+Danielle
+Danika
+Danila
+Danilo
+Danit
+Danita
+Danna
+Danni
+Dannie
+Danny
+Dannye
+Dante
+Dany
+Danya
+Danyelle
+Danyette
+Daphene
+Daphine
+Daphna
+Daphne
+Dara
+Darb
+Darbie
+Darby
+Darcee
+Darcey
+Darci
+Darcie
+Darcy
+Darda
+Dareen
+Darell
+Darelle
+Dari
+Daria
+Darice
+Darina
+Darko
+Darla
+Darleen
+Darlene
+Darline
+Darlleen
+Darnell
+Daron
+Darrel
+Darrell
+Darrelle
+Darren
+Darrin
+Darrol
+Darry
+Darryl
+Darsey
+Darsie
+Darwin
+Darya
+Daryl
+Daryn
+Dasha
+Dasi
+Dasie
+Dasya
+Dat
+Data
+Datas
+Datha
+Dau
+Daune
+Dave
+Daveen
+Daveta
+David
+Davida
+Davina
+Davinder
+Davine
+Davis
+Davita
+Dawn
+Dawna
+Daya
+Dayle
+Dayna
+Dayton
+Ddene
+De
+De-Anna
+DeAnne
+DeWayne
+Dean
+Deana
+Deane
+Deann
+Deanna
+Dear
+Deb
+Debadeep
+Debbi
+Debbie
+Debby
+Debee
+Debera
+Debi
+Debor
+Debora
+Deborah
+Debra
+Declan
+Dede
+Dedie
+Dedra
+Dee
+Dee dee
+DeeAnn
+Deeanne
+Deedee
+Deena
+Deepak
+Deerdre
+Deeyn
+Dehlia
+Deidre
+Deina
+Deirdre
+Del
+Dela
+Delancey
+Delbert
+Delcina
+Delcine
+Delfin
+Delia
+Delila
+Delilah
+Delinda
+Delisle
+Dell
+Della
+Delle
+Delly
+Delmar
+Delora
+Delores
+Deloria
+Deloris
+Delphine
+Delphinia
+Demet
+Demeter
+Demetra
+Demetre
+Demetri
+Demetria
+Demetris
+Demi
+Den
+Dena
+Deni
+Denice
+Deniece
+Denis
+Denise
+Denna
+Denni
+Dennie
+Dennis
+Denny
+Denver
+Deny
+Denys
+Denyse
+Denzil
+Deonne
+Dept
+Der
+Der-Chang
+Derek
+Deri
+Derick
+Derin
+Dermot
+Derrick
+Derrik
+Deryck
+Des
+Desdemona
+Design
+Desirae
+Desire
+Desiree
+Desiri
+Desmond
+Detlef
+Detlev
+Dev
+Deva
+Devan
+Devi
+Devin
+Devina
+Devinne
+Devon
+Devondra
+Devonna
+Devonne
+Devora
+Dewey
+Dewi
+Dexter
+Dhansukh
+Dhanvinder
+Dhawal
+Dhiraj
+Dhiren
+Di
+Dia-Edin
+Diahann
+Diamond
+Dian
+Diana
+Diandra
+Diane
+Diane-marie
+Dianemarie
+Diann
+Dianna
+Dianne
+Diannne
+Dick
+Dickens
+Dicky
+Didani
+Didar
+Didi
+Didier
+Dido
+Diego
+Dien
+Diena
+Dierdre
+Dieter
+Dieuwertje
+Digby
+Diju
+Dilip
+Dilpreet
+Dimitra
+Dimitri
+Dimitrios
+Dina
+Dinah
+Dineke
+Dinesh
+Dinh
+Dinker
+Dinnie
+Dinny
+Dino
+Dion
+Dione
+Dionis
+Dionne
+Dirk
+Dis
+Discover
+Dita
+Divina
+Divine
+Dix
+Dixie
+Djenana
+Djordje
+Dnadoc
+Dniren
+Dnsproj
+Do
+Doc
+Dode
+Dodi
+Dodie
+Dody
+Doe
+Doll
+Dolley
+Dolli
+Dollie
+Dolly
+Dolores
+Dolorita
+Doloritas
+Domenic
+Domenick
+Domenico
+Domeniga
+Dominga
+Domini
+Dominic
+Dominica
+Dominique
+Don
+Dona
+Donal
+Donald
+Donall
+Donella
+Donelle
+Donetta
+Donia
+Donica
+Donielle
+Donita
+Donn
+Donna
+Donnajean
+Donnamarie
+Donnette
+Donni
+Donnice
+Donnie
+Donny
+Donovan
+Door
+Doortje
+Dora
+Doralia
+Doralin
+Doralyn
+Doralynn
+Doralynne
+Dore
+Doreen
+Dorelia
+Dorella
+Dorelle
+Dorena
+Dorene
+Doretta
+Dorette
+Dorey
+Dori
+Doria
+Dorian
+Dorice
+Dorie
+Dorin
+Dorine
+Doris
+Dorisa
+Dorise
+Dorita
+Doro
+Dorolice
+Dorolisa
+Dorotea
+Doroteya
+Dorothea
+Dorothee
+Dorothy
+Dorree
+Dorreen
+Dorri
+Dorrie
+Dorris
+Dorry
+Dorthea
+Dorthy
+Dory
+Dosi
+Dot
+Doti
+Dotti
+Dottie
+Dotty
+Doug
+Douglas
+Douglass
+Dowell
+Doyle
+Dpn
+Dpnis
+Dpnlab
+Drago
+Dre
+Dreddy
+Dredi
+Drew
+Drieka
+Drona
+Dru
+Druci
+Drucie
+Drucill
+Drucy
+Drudy
+Drusi
+Drusie
+Drusilla
+Drusy
+Du-Tuan
+Duane
+Duc
+Duke
+Dulce
+Dulcea
+Dulci
+Dulcia
+Dulciana
+Dulcie
+Dulcine
+Dulcinea
+Dulcy
+Duljit
+Dulsea
+Duncan
+Dung
+Duong
+Dupuy
+Duquette
+Durali
+Durantaye
+Duryonna
+Dusan
+Dusty
+Dutch
+Duy
+Dvm
+Dvs
+Dwain
+Dwaine
+Dwayne
+Dwight
+Dyan
+Dyana
+Dyane
+Dyann
+Dyanna
+Dyanne
+Dyke
+Dyna
+Dynah
+Dzung
+Eachelle
+Eada
+Eadie
+Eadith
+Ealasaid
+Eamon
+Eamonn
+Earl
+Earle
+Earnest
+Eartha
+Easter
+Eastreg
+Eba
+Ebba
+Eben
+Ebonee
+Ebony
+Ebrahim
+Ecocafe
+Ed
+Eda
+Eddi
+Eddie
+Eddy
+Ede
+Edee
+Edel
+Edeline
+Eden
+Edgar
+Edi
+Edie
+Edin
+Edita
+Edith
+Editha
+Edithe
+Ediva
+Edlene
+Edmond
+Edmund
+Edmundo
+Edmx
+Edna
+Edouard
+Edric
+Eduardo
+Edward
+Edwin
+Edwina
+Edy
+Edyta
+Edyth
+Edythe
+Efdal
+Effie
+Ehab
+Ehi
+Eiji
+Eileen
+Eilis
+Eimile
+Eirena
+Eirik
+Ekaterina
+Eladio
+Elaina
+Elaine
+Elana
+Elane
+Elayne
+Elbert
+Elberta
+Elbertina
+Elbertine
+Elda
+Eldon
+Eleanor
+Eleanora
+Eleanore
+Electra
+Eleen
+Elena
+Elene
+Eleni
+Elenore
+Eleonora
+Eleonore
+Elex
+Elfie
+Elfreda
+Elfrida
+Elfrieda
+Elga
+Elhamy
+Elianora
+Elianore
+Elias
+Elicia
+Elie
+Eliezer
+Eline
+Elinor
+Elinore
+Elio
+Eliot
+Elisa
+Elisabet
+Elisabeth
+Elisabetta
+Elise
+Elisha
+Elissa
+Elita
+Eliza
+Elizabet
+Elizabeth
+Elizalde
+Elka
+Elke
+Ella
+Elladine
+Elle
+Elleke
+Ellen
+Ellene
+Ellette
+Elli
+Ellie
+Elliot
+Elliott
+Ellis
+Ellissa
+Ellwood
+Elly
+Ellyn
+Ellynn
+Elmar
+Elmer
+Elmira
+Elna
+Elnora
+Elnore
+Eloisa
+Eloise
+Elonore
+Elora
+Elpida
+Els
+Elsa
+Elsbeth
+Else
+Elset
+Elsey
+Elsi
+Elsie
+Elsinore
+Elspeth
+Elsy
+Elton
+Eluned
+Elva
+Elvera
+Elvert
+Elvina
+Elvira
+Elwira
+Elwood
+Elwyn
+Elyn
+Elyse
+Elysee
+Elysha
+Elysia
+Elyssa
+Elza
+Elzbieta
+Em
+Ema
+Emad
+Emalee
+Emalia
+Emanuel
+Emelda
+Emelia
+Emelina
+Emeline
+Emelita
+Emelyne
+Emer
+Emera
+Emerson
+Emery
+Emil
+Emilda
+Emile
+Emilee
+Emili
+Emilia
+Emilie
+Emiline
+Emilio
+Emily
+Emlyn
+Emlynn
+Emlynne
+Emma
+Emmalee
+Emmaline
+Emmalyn
+Emmalynn
+Emmalynne
+Emmanuel
+Emmeline
+Emmey
+Emmi
+Emmie
+Emmy
+Emmye
+Emogene
+Emory
+Emp
+Empdb
+Emr
+Emran
+Emyle
+Emylee
+Ende
+Eng
+Engbert
+Engin
+Engracia
+Enid
+Enis
+Enrica
+Enrichetta
+Enrico
+Enrika
+Enriqueta
+Enver
+Envoy
+Enzo
+Eoin
+Eolanda
+Eolande
+Ephraim
+Eran
+Erda
+Erdem
+Erena
+Erhard
+Eric
+Erica
+Erich
+Ericha
+Erick
+Ericka
+Erik
+Erika
+Erin
+Erina
+Erinn
+Erinna
+Erkan
+Erle
+Erlene
+Erma
+Ermengarde
+Ermentrude
+Ermina
+Erminia
+Erminie
+Ermo
+Erna
+Ernaline
+Ernest
+Ernesta
+Ernestine
+Ernesto
+Ernie
+Erning
+Ernst
+Errol
+Ertan
+Ertha
+Erv
+Ervin
+Erwin
+Eryn
+Erzsebet
+Es
+Esam
+Esko
+Esma
+Esmail
+Esmaria
+Esme
+Esmeralda
+Esmond
+Essa
+Essam
+Essie
+Essy
+Esta
+Estel
+Estele
+Estell
+Estella
+Estelle
+Ester
+Esther
+Estrella
+Estrellita
+Etas
+Ethan
+Ethel
+Ethelda
+Ethelin
+Ethelind
+Etheline
+Ethelyn
+Ethyl
+Etienne
+Etta
+Etti
+Ettie
+Etty
+Eudora
+Eugene
+Eugenia
+Eugenie
+Eugine
+Eula
+Eulalie
+Eunice
+Euphemia
+Eustacia
+Eva
+Evaleen
+Evan
+Evangelia
+Evangelin
+Evangelina
+Evangeline
+Evangelo
+Evania
+Evanne
+Evans
+Eve
+Eveleen
+Evelien
+Evelina
+Eveline
+Evelyn
+Everett
+Everette
+Evert
+Evette
+Evey
+Evie
+Evita
+Evona
+Evonne
+Evvie
+Evvy
+Evy
+Ewen
+Ext
+Eyde
+Eydie
+Eyk
+Ezella
+Ezmeralda
+Fabien
+Fabienne
+Fadi
+Fady
+Fae
+Fahim
+Fai
+Faina
+Fairy
+Faith
+Faiz
+Faizal
+Fallon
+Famke
+Fan
+Fanchette
+Fanchon
+Fancie
+Fancy
+Fanechka
+Fania
+Fanni
+Fannie
+Fanny
+Fanya
+Far
+Fara
+Farag
+Farah
+Farand
+Fares
+Farhad
+Farhan
+Fariba
+Fariborz
+Farica
+Farid
+Farooq
+Farouk
+Farra
+Farrah
+Farrand
+Farrukh
+Farshid
+Faruk
+Farzad
+Farzin
+Fast
+Fastmer
+Fastowl
+Fatima
+Faun
+Faunie
+Faustina
+Faustine
+Fausto
+Fawn
+Fawne
+Fawnia
+Fay
+Faydra
+Faye
+Fayette
+Fayina
+Fayma
+Fayre
+Fayth
+Faythe
+Faz
+Fearless
+Federica
+Fedora
+Fei
+Fei-Yin
+Fekri
+Felecia
+Felicdad
+Felice
+Felicia
+Felicity
+Felicle
+Felipa
+Felipe
+Felisha
+Felita
+Felix
+Feliza
+Felton
+Femke
+Fenelia
+Feng
+Feodora
+Ferdinand
+Ferdinanda
+Ferdinande
+Fereidoon
+Feridoun
+Fern
+Fernand
+Fernanda
+Fernande
+Fernandina
+Fernando
+Ferne
+Fey
+Feynman
+Fiann
+Fianna
+Fidela
+Fidelia
+Fidelity
+Field
+Fifi
+Fifine
+Fikre
+Fil
+Filia
+Filibert
+Filide
+Filion
+Filippa
+Fima
+Fina
+Finance
+Fintan
+Fiona
+Fionan
+Fionna
+Fionnula
+Fiore
+Fiorenze
+Firat
+Fitness
+Fitz
+Fitzgerald
+Fitzroy
+Fleet
+Fletcher
+Fleur
+Fleurette
+Flo
+Flor
+Flora
+Florance
+Flore
+Florella
+Florence
+Florencia
+Florentia
+Florenza
+Florette
+Flori
+Floria
+Florida
+Florie
+Florina
+Florinda
+Florine
+Floris
+Florri
+Florrie
+Florry
+Flory
+Flossi
+Flossie
+Flossy
+Floyd
+Flss
+Flying
+Foad
+Focus
+Follick
+Fonnie
+Fons
+Forrest
+Foster
+Fotini
+Fouad
+Four
+Fox
+Fqa
+Fran
+Franc
+France
+Francene
+Frances
+Francesca
+Francine
+Francis
+Francisca
+Francisco
+Franciska
+Franco
+Francois
+Francoise
+Francyne
+Frank
+Franka
+Franki
+Frankie
+Franklin
+Franklyn
+Franky
+Franni
+Frannie
+Franny
+Frantisek
+Franz
+Franza
+Fraser
+Frayda
+Fred
+Freda
+Freddi
+Freddie
+Freddy
+Fredelia
+Frederic
+Frederica
+Frederick
+Fredericka
+Frederika
+Frederique
+Fredi
+Fredia
+Fredra
+Fredrika
+Freek
+Freeman
+Freida
+Freya
+Frieda
+Friederike
+Frinel
+Fritz
+Froukje
+Fscocos
+Fu-Shin
+Fulvia
+Fung
+Furrukh
+Fuzal
+Fwp
+Fwpas
+Fwpreg
+Gaal
+Gabbey
+Gabbi
+Gabbie
+Gabe
+Gabey
+Gabi
+Gabie
+Gabriel
+Gabriela
+Gabriell
+Gabriella
+Gabrielle
+Gabriellia
+Gabrila
+Gaby
+Gae
+Gael
+Gaetan
+Gaffney
+Gahn
+Gail
+Gailya
+Gajendra
+Gale
+Galen
+Galina
+Gama
+Ganesh
+Gant
+Garan
+Gareth
+Garland
+Garnet
+Garnette
+Garney
+Garo
+Garry
+Garth
+Gary
+Gaston
+Gates
+Gateway
+Gavin
+Gavra
+Gavrielle
+Gay
+Gaye
+Gayel
+Gayl
+Gayla
+Gayle
+Gayleen
+Gaylene
+Gaynor
+Gayronza
+Ge
+Gedas
+Gee
+Gee-Meng
+Geer
+Geetha
+Geety
+Geir
+Gelais
+Gelya
+Gen
+Gena
+Gene
+General
+Geneva
+Genevieve
+Genevra
+Genga
+Genia
+Genna
+Genni
+Gennie
+Gennifer
+Genny
+Genovera
+Genowefa
+Genvieve
+Geoff
+Geoffrey
+Georganne
+George
+GeorgeAnn
+Georgeanna
+Georgeanne
+Georgena
+Georges
+Georgeta
+Georgetta
+Georgette
+Georgia
+Georgiana
+Georgianna
+Georgianne
+Georgie
+Georgina
+Georgine
+Ger
+Gerald
+Geralda
+Geraldine
+Geralene
+Gerard
+Gerardjan
+Gerardo
+Gerben
+Gerber
+Gerda
+Gerhard
+Gerhardine
+Geri
+Gerianna
+Gerianne
+Gerladina
+Germ
+Germain
+Germaine
+Germana
+Gernot
+Gerrard
+Gerri
+Gerrie
+Gerrilee
+Gerrit
+Gerry
+Gert
+Gerta
+Gerti
+Gertie
+Gertrud
+Gertruda
+Gertrude
+Gertrudis
+Gerty
+Geza
+Ghassan
+Ghassem
+Gheorghe
+Ghislain
+Ghislaine
+Gia
+Giacinta
+Giambattista
+Giampaolo
+Giana
+Giang
+Gianina
+Gianna
+Gib
+Gigi
+Gihan
+Gil
+Gilbert
+Gilberta
+Gilberte
+Gilbertina
+Gilbertine
+Gilda
+Gilemette
+Giles
+Gill
+Gillan
+Gilles
+Gilli
+Gillian
+Gillie
+Gilligan
+Gilly
+Gin
+Gina
+Ginelle
+Ginette
+Ginevra
+Ginger
+Gini
+Ginn
+Ginni
+Ginnie
+Ginnifer
+Ginny
+Gino
+Gint
+Gio
+Giorgia
+Giovanna
+Giovanni
+Gipsy
+Giralda
+Giri
+Girish
+Gisela
+Gisele
+Gisella
+Giselle
+Gita
+Giuditta
+Giulia
+Giulietta
+Giuseppe
+Giustina
+Gizela
+Glad
+Gladi
+Gladys
+Glass
+Gleda
+Glen
+Glenda
+Glendon
+Glenine
+Glenn
+Glenna
+Glennie
+Glennis
+Glori
+Gloria
+Gloriana
+Gloriane
+Glornia
+Glory
+Glyn
+Glynda
+Glynis
+Glynn
+Glynnis
+Gnni
+Go
+Godfrey
+Godiva
+Goel
+Gokal
+Gokul
+Gokul-Chandra
+Golda
+Goldarina
+Goldi
+Goldia
+Goldie
+Goldina
+Goldwyn
+Goldy
+Gopal
+Goran
+Gord
+Gorde
+Gordie
+Gordon
+Gordy
+Goska
+Goutam
+Grace
+Gracia
+Gracie
+Graciela
+Gracinda
+Gracomda
+Grady
+Graeme
+Graham
+Grame
+Grant
+Grantley
+Grason
+Grata
+Gratia
+Gratiana
+Gray
+Grayce
+Grazia
+Greer
+Greet
+Greg
+Gregg
+Gregory
+Greta
+Gretal
+Gretchen
+Grete
+Gretel
+Grethel
+Gretna
+Gretta
+Grey
+Grier
+Griet
+Grietje
+Griselda
+Grissel
+Grover
+Grzegorz
+Guanyun
+Gudrun
+Guendolen
+Guenevere
+Guenna
+Guenther
+Guglielma
+Gui
+Guido
+Guilford
+Guillema
+Guillemette
+Guillermo
+Guinevere
+Guinna
+Gunars
+Guner
+Gunfer
+Gunilla
+Gunnar
+Gunter
+Guo-Qiang
+Gupta
+Gurcharan
+Gurdip
+Gurjinder
+Gurjit
+Gurmeet
+Gursharan
+Gurvinder
+Gus
+Gusella
+Gussi
+Gussie
+Gussy
+Gusta
+Gusti
+Gustie
+Gusty
+Guy
+Guylain
+Guylaine
+Gwen
+Gwenda
+Gwendolen
+Gwendolin
+Gwendolyn
+Gweneth
+Gwenette
+Gwenneth
+Gwenni
+Gwennie
+Gwenny
+Gwennyth
+Gwenora
+Gwenore
+Gwyn
+Gwyneth
+Gwynith
+Gwynne
+Gypsy
+Gyula
+Gzl
+Ha
+Habeeb
+Habib
+Hack-Hoo
+Hadi
+Hadria
+Hady
+Hafeezah
+Haggar
+Hai
+Haig
+Hailee
+Haily
+Hakan
+Hal
+Hala
+Haleigh
+Halette
+Haley
+Hali
+Halie
+Halimeda
+Halina
+Hall
+Halley
+Halli
+Hallie
+Hally
+Hamid
+Hamilton
+Hamzeh
+Han
+Han-Co
+Han-Van
+Hana
+Hanco
+Handoko
+Hang-Tong
+Hanh
+Hanhb
+Hanja
+Hank
+Hanna
+Hannah
+Hanneke
+Hanni
+Hannie
+Hannis
+Hanns
+Hanny
+Hans
+Happy
+Hardyal
+Hareton
+Hari
+Harinder
+Harish
+Harlene
+Harley
+Harli
+Harlie
+Harm
+Harmi
+Harmonia
+Harmonie
+Harmony
+Harold
+Haroon
+Harpal
+Harper
+Harpreet
+Harri
+Harrie
+Harriet
+Harriett
+Harrietta
+Harriette
+Harriot
+Harriott
+Harrison
+Harry
+Hartley
+Haruko
+Harvey
+Hasler
+Hassan
+Haste
+Hatti
+Hattie
+Hatty
+Hayden
+Hayley
+Hazel
+Hazem
+He
+Heath
+Heather
+Hector
+Heda
+Hedda
+Heddi
+Heddie
+Heddy
+Hedi
+Hedvig
+Hedvige
+Hedwig
+Hedwiga
+Hedy
+Heida
+Heidi
+Heidie
+Heike
+Heino
+Heinz
+Helaina
+Helaine
+Heleen
+Helen
+Helen-elizabeth
+Helena
+Helene
+Helenelizabeth
+Helenka
+Helga
+Helge
+Hellen
+Helli
+Hellmut
+Helma
+Helmut
+Helmuth
+Heloise
+Helsa
+Helyn
+Hemant
+Hendra
+Hendrik
+Hendrika
+Hengameh
+Henk
+Henka
+Hennie
+Hennrietta
+Henny
+Henri
+Henrie
+Henrieta
+Henrietta
+Henriette
+Henrika
+Henry
+Henryetta
+Hensley
+Hephzibah
+Heping
+Hera
+Herb
+Herbert
+Herbie
+Herman
+Hermann
+Hermia
+Hermien
+Hermina
+Hermine
+Herminia
+Hermione
+Hermon
+Hernan
+Hernandez
+Herre
+Herronald
+Herschel
+Herta
+Hertha
+Herve
+Hesham
+Hester
+Hesther
+Hestia
+Hetti
+Hettie
+Hetty
+Hewlet
+Hideki
+Hideo
+Hien
+Hilary
+Hilda
+Hildagard
+Hildagarde
+Hilde
+Hildegaard
+Hildegarde
+Hildy
+Hillary
+Hilliard
+Hilliary
+Hilmi
+Himanshu
+Hin-Wai
+Hinda
+Hing
+Hing-Fai
+Hiren
+Hiroki
+Hiroko
+Hirooki
+Hiroshi
+Hitoshi
+Ho
+Hoa
+Hoa-Van
+Hoang
+Hock
+Hodge
+Hoekstra
+Hoi-Kin
+Hojjat
+Holli
+Hollie
+Holly
+Holly-anne
+Hollyanne
+Holst
+Homa
+Homayoon
+Homer
+Hon-Kong
+Honey
+Hongzhi
+Honor
+Honoria
+Hoog
+Hooi-Lee
+Hope
+Hor-Lam
+Horacio
+Horatia
+Horatio
+Horst
+Hortense
+Hortensia
+Hossein
+Hot
+Hotline
+Houman
+Housseini
+How
+How-Kee
+Howard
+Howden
+Howie
+Hoy
+Hpone
+Hq
+Hqs
+Hr
+Hrdata
+Hrinfo
+Hsieh
+Hsin-shi
+Hsing-Ju
+Htd
+Huan
+Huan-yu
+Hubert
+Hudai
+Huelsman
+Hugh
+Hugo
+Huguette
+Hui
+Huib
+Hukam
+Hulda
+Hulst
+Humberto
+Humphrey
+Hung
+HungQuoc
+Hunter
+Huong
+Huppert
+HuuLiem
+Huub
+Huy
+Huyen
+Hwei-Ling
+Hyacinth
+Hyacintha
+Hyacinthe
+Hyacinthia
+Hyacinthie
+Hynda
+Hynek
+Hyung
+Iain
+Ian
+Ianthe
+Ibbie
+Ibby
+Ibrahim
+Ichiro
+Icy
+Icylyn
+Ida
+Idalia
+Idalina
+Idaline
+Idell
+Idelle
+Idette
+Idris
+Idt
+Idus
+Ifti
+Ignace
+Ignatius
+Igor
+Ihor
+Ijff
+Ike
+Ikram
+Ilan
+Ilda
+Ileana
+Ileane
+Ilene
+Ilise
+Ilka
+Illa
+Illinois
+Ilona
+Ilsa
+Ilse
+Ilya
+Ilysa
+Ilyse
+Ilyssa
+Imelda
+Imogen
+Imogene
+Imojean
+Imre
+Imtaz
+Imtiaz
+Ina
+Inam
+Inanc
+Ind
+Inderjit
+Indiana
+Indira
+Indy
+Ineke
+Ines
+Inesita
+Inessa
+Inez
+Inga
+Ingaberg
+Ingaborg
+Inge
+Ingeberg
+Ingeborg
+Ingemar
+Inger
+Ingres
+Ingrid
+Ingunna
+Inm
+Inna
+Inquire
+Ioan
+Ioana
+Iolande
+Iolanthe
+Iona
+Iormina
+Ira
+Iraj
+Irc
+Ireland
+Irena
+Irene
+Irice
+Irina
+Iris
+Irish
+Irita
+Irma
+Irv
+Irvin
+Irving
+Isa
+Isaac
+Isabeau
+Isabel
+Isabelita
+Isabell
+Isabella
+Isabelle
+Isadora
+Isahella
+Iseabal
+Ishan
+Isidora
+Isin
+Isis
+Isl
+Ismail
+Isobel
+Isoft
+Israel
+Issam
+Issi
+Issie
+Issy
+Italo
+Iteam
+Iteke
+Its-Eng
+Iva
+Ivan
+Ivett
+Ivette
+Ivie
+Ivo
+Ivona
+Ivonne
+Ivor
+Ivory
+Ivy
+Iwan
+Iwona
+Iws
+Iyun
+Izabel
+Izak
+Izumi
+Izuru
+Izzy
+J-Francois
+JR
+Jaan
+Jabir
+Jacalyn
+Jacek
+Jacenta
+Jacinda
+Jacinta
+Jacintha
+Jacinthe
+Jack
+Jackelyn
+Jacki
+Jackie
+Jacklin
+Jacklyn
+Jackquelin
+Jackqueline
+Jackson
+Jacky
+Jaclin
+Jaclyn
+Jacob
+Jacque
+Jacquelin
+Jacqueline
+Jacquelyn
+Jacquelynn
+Jacquenetta
+Jacquenette
+Jacques
+Jacquetta
+Jacquette
+Jacqui
+Jacquie
+Jacynth
+Jacynthe
+Jada
+Jade
+Jae
+Jaffer
+Jag
+Jagat
+Jagdev
+Jagdish
+Jagjeet
+Jagjit
+Jagriti
+Jai
+Jaime
+Jaimie
+Jaine
+Jak
+Jake
+Jamal
+Jaman
+James
+JamesMichael
+Jami
+Jamie
+Jamima
+Jamin
+Jamison
+Jammie
+Jan
+Jana
+Janaya
+Janaye
+Jandy
+Jane
+Janean
+Janeczka
+Janeen
+Janel
+Janela
+Janell
+Janella
+Janelle
+Janene
+Janenna
+Janessa
+Janet
+Janeta
+Janetta
+Janette
+Janeva
+Janey
+Jania
+Janice
+Janick
+Janie
+Janifer
+Janina
+Janine
+Janio
+Janis
+Janith
+Janka
+Jann
+Janna
+Jannel
+Jannelle
+Janos
+Janot
+Janson
+Janusz
+Jany
+Jap
+Japan
+Jaquelin
+Jaquelyn
+Jaquenetta
+Jaquenette
+Jaquith
+Jasbinder
+Jashvant
+Jasmin
+Jasmina
+Jasmine
+Jason
+Jaspreet
+Jastinder
+Jasver
+Jatinder
+Javad
+Javed
+Javier
+Jawad
+Jawaid
+Jay
+Jaya
+Jayant
+Jayendra
+Jayesh
+Jayme
+Jaymee
+Jayne
+Jaynell
+Jaynie
+Jazmin
+Jderek
+Jean
+Jean-Bernard
+Jean-Claude
+Jean-Denis
+Jean-Francois
+Jean-Guy
+Jean-Jacques
+Jean-Louis
+Jean-Luc
+Jean-Marc
+Jean-Marie
+Jean-Michel
+Jean-Normand
+Jean-Paul
+Jean-Pierre
+Jean-Robert
+Jean-Roch
+Jean-Yves
+Jeana
+Jeane
+Jeanelle
+Jeanette
+Jeanice
+Jeanie
+Jeanine
+Jeanna
+Jeanne
+Jeannette
+Jeannie
+Jeannine
+Jeannot
+Jed
+Jeff
+Jeffery
+Jeffrey
+Jehanna
+Jelene
+Jemie
+Jemima
+Jemimah
+Jemmie
+Jemmy
+Jen
+Jena
+Jenda
+Jenelle
+Jeni
+Jenica
+Jeniece
+Jenifer
+Jeniffer
+Jenilee
+Jenine
+Jenn
+Jenna
+Jennee
+Jennette
+Jenni
+Jennica
+Jennie
+Jennifer
+Jennilee
+Jennine
+Jenny
+Jenson
+Jerald
+Jeralee
+Jere
+Jeremy
+Jeri
+Jermaine
+Jeroen
+Jerome
+Jerrie
+Jerrilee
+Jerrilyn
+Jerrine
+Jerry
+Jerrylee
+Jerzy
+Jess
+Jessa
+Jessalin
+Jessalyn
+Jessamine
+Jessamyn
+Jesse
+Jesselyn
+Jessi
+Jessica
+Jessie
+Jessika
+Jessy
+Jester
+Jesus
+Jet
+Jewel
+Jewell
+Jewelle
+Jey
+Jian
+Jianli
+Jill
+Jillana
+Jillane
+Jillayne
+Jilleen
+Jillene
+Jilli
+Jillian
+Jillie
+Jilly
+Jim
+Jimmie
+Jimmy
+Jimson
+Jin
+Jin-Yun
+Jinann
+Jing
+Jinny
+Jiri
+Jirina
+Jo
+Jo ann
+Jo-Ann
+Jo-Marie
+Jo-anne
+JoAnne
+JoDee
+JoLee
+Joachim
+Joan
+Joana
+Joane
+Joanie
+Joann
+Joanna
+Joannah
+Joannes
+Joannie
+Joao
+Joaquin
+Jobey
+Jobi
+Jobie
+Jobina
+Joby
+Jobye
+Jobyna
+Jocelin
+Joceline
+Jocelyn
+Jocelyne
+Jochem
+Jock
+Jodi
+Jodie
+Jodine
+Jody
+Joe
+Joeann
+Joel
+Joela
+Joelie
+Joell
+Joella
+Joelle
+Joellen
+Joelly
+Joellyn
+Joelynn
+Joeri
+Joete
+Joey
+Johan
+Johann
+Johanna
+Johannah
+Johanne
+John
+John-Jr
+John-Paul
+John-Sr
+Johna
+Johnath
+Johnathan
+Johnette
+Johnna
+Johnnie
+Johnny
+Joice
+Joji
+Jojo
+Joke
+Jolanda
+Joleen
+Jolene
+Joletta
+Joli
+Jolie
+Joline
+Joly
+Jolyn
+Jolynn
+Jon
+Jonathan
+Jonell
+Jonelle
+Joni
+Jonie
+Jonis
+Jonthan
+Joo-Euin
+Joo-Geok
+Joon
+Jooran
+Jordain
+Jordan
+Jordana
+Jordanna
+Jorey
+Jorge
+Jori
+Jorie
+Jorrie
+Jorry
+Jos
+Josanne
+Joscelin
+Jose
+Josee
+Josef
+Josefa
+Josefina
+Joseph
+Josepha
+Josephina
+Josephine
+Josey
+Joshi
+Joshua
+Josi
+Josie
+Josine
+Josselyn
+Jossine
+Josy
+Jourdan
+Joy
+Joya
+Joyan
+Joyann
+Joyce
+Joycelin
+Joydeep
+Joye
+Joyous
+Jozef
+Jozsef
+Jsandye
+Juan
+Juana
+Juanita
+Jud
+Jude
+Judi
+Judie
+Judith
+Juditha
+Judy
+Judye
+Juergen
+Juieta
+Juile
+Julee
+Jules
+Juli
+Julia
+Julian
+Juliana
+Juliane
+Juliann
+Julianna
+Julianne
+Julie
+JulieAnne
+Julien
+Julienne
+Juliet
+Julieta
+Julietta
+Juliette
+Julina
+Juline
+Julio
+Julissa
+Julita
+Julius
+Jun
+June
+Junette
+Jung
+Junia
+Junie
+Junina
+Junk
+Juozas
+Jurek
+Jurg
+Jurgen
+Justin
+Justina
+Justine
+Justinn
+Justino
+Jutta
+Jyoti
+Kac
+Kacey
+Kacie
+Kacy
+Kaela
+Kah-Ming
+Kai
+Kai-Ming
+Kai-Wai
+Kaia
+Kaiching
+Kaila
+Kaile
+Kailey
+Kaitlin
+Kaitlyn
+Kaitlynn
+Kaja
+Kakalina
+Kaki
+Kala
+Kalai
+Kaleena
+Kali
+Kalie
+Kalila
+Kalina
+Kalinda
+Kalindi
+Kalle
+Kalli
+Kally
+Kalpit
+Kalvin
+Kalyan
+Kam
+Kam-Suen
+Kamal
+Kaman
+Kambhampati
+Kambiz
+Kameko
+Kamil
+Kamila
+Kamilah
+Kamillah
+Kaminsky
+Kamlesh
+Kamran
+Kamyar
+Kana
+Kanata
+Kandace
+Kandy
+Kang-Yuan
+Kania
+Kannan
+Kanu
+Kanya
+Kapsch
+Kara
+Kara-lynn
+Karalee
+Karalynn
+Karam
+Karan
+Kare
+Karee
+Karel
+Karen
+Karena
+Kari
+Karia
+Karie
+Karil
+Karilynn
+Karim
+Karin
+Karina
+Karine
+Kariotta
+Karisa
+Karissa
+Karita
+Karl
+Karla
+Karlee
+Karleen
+Karlen
+Karlene
+Karlie
+Karlon
+Karlotta
+Karlotte
+Karly
+Karlyn
+Karmen
+Karna
+Karol
+Karola
+Karole
+Karolien
+Karolina
+Karoline
+Karoly
+Karon
+Karrah
+Karrie
+Karry
+Kartik
+Kary
+Karyl
+Karylin
+Karyn
+Kas
+Kasey
+Kasifa
+Kasper
+Kass
+Kassandra
+Kassem
+Kassey
+Kassi
+Kassia
+Kassie
+Kast
+Kat
+Kata
+Katalin
+Katarina
+Kataryna
+Kate
+Katee
+Katerina
+Katerine
+Katey
+Kath
+Katha
+Katharina
+Katharine
+Katharyn
+Kathe
+Katherin
+Katherina
+Katherine
+Katheryn
+Kathi
+Kathie
+Kathleen
+Kathlin
+Kathrerine
+Kathrine
+Kathryn
+Kathryne
+Kathy
+Kathye
+Kati
+Katie
+Katina
+Katine
+Katinka
+Katja
+Katleen
+Katlin
+Katrina
+Katrine
+Katrinka
+Katsumi
+Katsunori
+Katti
+Kattie
+Katuscha
+Katusha
+Katy
+Katya
+Kaushik
+Kay
+Kaycee
+Kaye
+Kayla
+Kayle
+Kaylee
+Kayley
+Kaylil
+Kaylyn
+Kaz
+Kazem
+Kazuhiko
+Kazuhito
+Kazuko
+Kazuo
+Kazuyuki
+Kedah
+Kee
+Keeley
+Keelia
+Keely
+Keep
+Kees
+Keith
+Kelcey
+Kelci
+Kelcie
+Kelcy
+Kelila
+Kellen
+Kelley
+Kelli
+Kellia
+Kellie
+Kellina
+Kellsie
+Kelly
+Kellyann
+Kelsey
+Kelsi
+Kelsy
+Keltouma
+Kelvin
+Kelwin
+Kem
+Kemal
+Kemp
+Ken
+Kendall
+Kendra
+Kendre
+Kenji
+Kenna
+Kenneth
+Kennon
+Kenny
+Kent
+Kentaro
+Kenyon
+Keri
+Keriann
+Kerianne
+Kerri
+Kerri-Ann
+Kerrie
+Kerrill
+Kerrin
+Kerry
+Kerstin
+Kesley
+Keslie
+Kessel
+Kessia
+Kessiah
+Kessley
+Ketan
+Ketti
+Kettie
+Ketty
+Keven
+Kevin
+Kevina
+Kevyn
+Keys
+Khai
+Khalid
+Khalil
+Khamdy
+Khanh
+Khosro
+Khue
+Khurshid
+Ki
+Kiah
+Kial
+Kiam
+Kiele
+Kiem
+Kien
+Kien-Nghiep
+Kiennghiep
+Kieran
+Kieron
+Kiersten
+Kiet
+Kikelia
+Kiki
+Kiley
+Kim
+Kim-Minh
+Kim-Tram
+Kimberlee
+Kimberley
+Kimberli
+Kimberly
+Kimberlyn
+Kimbra
+Kimihiko
+Kimiko
+Kimio
+Kimmi
+Kimmie
+Kimmy
+Kin
+Kin-Wai
+Kin-Yee
+King-Haut
+Kingsley
+Kinman
+Kinna
+Kip
+Kipp
+Kippie
+Kippy
+Kira
+Kirbee
+Kirbie
+Kirby
+Kiri
+Kirit
+Kirk
+Kirsten
+Kirsteni
+Kirsti
+Kirstie
+Kirstin
+Kirstyn
+Kirtikumar
+Kishor
+Kishore
+Kissee
+Kissiah
+Kissie
+Kit
+Kitson
+Kitt
+Kitti
+Kittie
+Kitty
+Kiyoon
+Kizzee
+Kizzie
+Kjell
+Klaas
+Klara
+Klarika
+Klarrisa
+Klaus
+Klazien
+Klazina
+Klink
+Knut
+Ko
+Koen
+Koji
+Kok-khiang
+Koko
+Kollen
+Konrad
+Konstance
+Konstanze
+Koo
+Kora
+Koral
+Koralle
+Koray
+Kordula
+Kore
+Korella
+Koren
+Koressa
+Kori
+Korie
+Korney
+Korrie
+Korry
+Kostas
+Kouji
+Krier
+Krinda
+Kris
+Krishan
+Krishna
+Krishnamurthy
+Krissie
+Krissy
+Krista
+Kristal
+Kristan
+Kriste
+Kristel
+Kristen
+Kristi
+Kristie
+Kristien
+Kristin
+Kristina
+Kristine
+Kristopher
+Kristy
+Kristyn
+Krysta
+Krystal
+Krystalle
+Krystle
+Krystn
+Krystyna
+Krzysztof
+Ktusn
+Kuang-Tsan
+Kue
+Kui
+Kui-Soon
+Kuldip
+Kum-Meng
+Kumar
+Kung
+Kunie
+Kunitaka
+Kurt
+Kusum
+Kuswara
+Kwan
+Kwei-San
+Kwing
+Kwok
+Kwok-Lan
+Kwok-Wa
+Kwong
+Ky
+Kyla
+Kyle
+Kylen
+Kylie
+Kylila
+Kylynn
+Kym
+Kynthia
+Kyoko
+Kyong
+Kyrstin
+Lurette
+LLoyd
+La
+La verne
+Lab
+Labfive
+Lac
+Lacee
+Lacey
+Lachu
+Lacie
+Lacy
+Ladan
+Ladell
+Ladonna
+Laetitia
+Lai
+Laina
+Laine
+Lainey
+Lalit
+Lalitha
+Lamar
+Lan
+Lana
+Lanae
+Lance
+Lane
+Lanette
+Laney
+Lang
+Lani
+Lanie
+Lanita
+Lanna
+Lanni
+Lanny
+Lapkin
+Laquinta
+Lara
+Laraine
+Lari
+Larina
+Larine
+Larisa
+Larissa
+Lark
+Larkin
+Larry
+Lars
+Larue
+Lary
+Larysa
+Laryssa
+Las
+Laser
+Lashonda
+Laslo
+Latashia
+Laten
+Latia
+Latisha
+Latonya
+Latrena
+Latrina
+Laura
+Lauraine
+Laural
+Lauralee
+Laure
+Lauree
+Laureen
+Laurel
+Laurella
+Lauren
+Laurena
+Laurence
+Laurene
+Laurent
+Lauretta
+Laurette
+Lauri
+Laurianne
+Laurice
+Laurie
+Laurna
+Laury
+Lauryn
+Lavena
+Laverna
+Laverne
+Lavina
+Lavinia
+Lavinie
+Lavonda
+Lawrence
+Layananda
+Layla
+Layne
+Layney
+Laz
+Lazlo
+Le
+LeRoy
+Lea
+Leah
+Leandra
+Leann
+Leanna
+Leanne
+Leanor
+Leanora
+Leaton
+Lebbie
+Lecien
+Leda
+Leddy
+Lee
+Lee-Anne
+Leeann
+Leeanne
+Leecia
+Leela
+Leelah
+Leena
+Leendert
+Leesa
+Leese
+Leeuwen
+Legra
+Lei-See
+Leia
+Leif
+Leigh
+Leigha
+Leighann
+Leil
+Leila
+Leilah
+Leisa
+Leisha
+Leita
+Lela
+Lelah
+Leland
+Lelia
+Len
+Lena
+Lendon
+Lenee
+Lenette
+Leni
+Lenka
+Lenna
+Lennart
+Lenny
+Leno
+Lenora
+Lenore
+Leny
+Leo
+Leodora
+Leoine
+Leola
+Leoline
+Leon
+Leona
+Leonanie
+Leonard
+Leonardo
+Leonas
+Leone
+Leonelle
+Leonida
+Leonie
+Leonor
+Leonora
+Leonore
+Leontine
+Leontyne
+Leora
+Les
+Leshia
+Lesia
+Lesley
+Lesli
+Leslie
+Lesly
+Lester
+Lesya
+Leta
+Lethia
+Leticia
+Letisha
+Letitia
+Letizia
+Letta
+Letti
+Lettie
+Letty
+Leung
+Levent
+Levy
+Lew
+Lewis
+Lex
+Lexi
+Lexie
+Lexine
+Lexis
+Lexy
+Leyla
+Leyton
+Lezlee
+Lezlie
+Li
+Li-Ming
+Lia
+Liam
+Lian
+Lian-Hong
+Liana
+Liane
+Lianna
+Lianne
+Lib
+Libbey
+Libbi
+Libbie
+Libby
+Libor
+Licha
+Lida
+Lidia
+Lidio
+Liduine
+Liem
+Liesa
+Liesbeth
+Liese
+Lil
+Lila
+Lilah
+Lilas
+Lili
+Lilia
+Lilian
+Liliana
+Liliane
+Lilias
+Lilin
+Lilith
+Lilla
+Lilli
+Lillian
+Lillie
+Lillien
+Lillis
+Lilllie
+Lilly
+Lily
+Lilyan
+Lin
+Lina
+Lincoln
+Lind
+Linda
+Linda-Joy
+Lindi
+Lindie
+Lindsay
+Lindsey
+Lindsy
+Lindy
+Line
+Linea
+Linell
+Linet
+Lineth
+Linette
+Ling-Yue
+Ling-Zhong
+Lingyan
+Linh
+Linn
+Linnea
+Linnell
+Linnet
+Linnie
+Lino
+Linzie
+Linzy
+Lionel
+Liping
+Lira
+Lisa
+Lisabeth
+Lisbeth
+Lise
+Lisetta
+Lisette
+Lisha
+Lishe
+Lissa
+Lissi
+Lissie
+Lissy
+Lita
+Liuka
+Liv
+Liva
+Livia
+Liviu
+Livvie
+Livvy
+Livvyy
+Livy
+Liz
+Liza
+Lizabeth
+Lizbeth
+Lizette
+Lizz
+Lizzie
+Lizzy
+Ljiljana
+Ljilyana
+Loan
+Loay
+Loc
+Lodovico
+Loella
+Loes
+Loesje
+Logan
+Logntp
+Lois
+Loise
+Lola
+Loleta
+Lolita
+Lolly
+Lon
+Lona
+Lonee
+Long
+Longdist
+Loni
+Lonna
+Lonneke
+Lonni
+Lonnie
+Loon
+Lope
+Lora
+Lora-Lee
+Lorain
+Loraine
+Loralee
+Loralie
+Loralyn
+Lorcan
+Loree
+Loreen
+Lorelei
+Lorelle
+Loren
+Lorena
+Lorene
+Lorenza
+Lorenzo
+Loreta
+Loretta
+Lorettalorna
+Lorette
+Lori
+Loria
+Lorianna
+Lorianne
+Lorie
+Lorilee
+Lorilyn
+Lorinda
+Lorine
+Loris
+Lorita
+Lorletha
+Lorna
+Lorne
+Lorraine
+Lorrayne
+Lorrel
+Lorri
+Lorrie
+Lorrin
+Lorry
+Lory
+Los
+Lothar
+Lotta
+Lotte
+Lotti
+Lottie
+Lotty
+Lou
+LouAnn
+Louella
+Louie
+Louis
+Louis-Philippe
+Louis-Rene
+Louisa
+Louise
+Louisette
+Lourdes
+Loutitia
+Lovina
+Lowell
+Lowietje
+Lowry
+Lpo
+Lrc
+Lsi
+Lsiunix
+Lu
+Luan
+Luann
+Lubomir
+Lubomyr
+Luc
+Lucas
+Luce
+Luci
+Lucia
+Luciana
+Luciano
+Lucie
+Lucien
+Lucienne
+Lucila
+Lucilia
+Lucille
+Lucina
+Lucinda
+Lucine
+Lucita
+Lucky
+Lucretia
+Lucy
+Ludovico
+Ludovika
+Luella
+Luelle
+Luigi
+Luis
+Luisa
+Luise
+Lujanka
+Luke
+Lula
+Lulita
+Lulu
+Luong
+Luping
+Lura
+Lurleen
+Lurlene
+Lurline
+Lusa
+Luther
+Luuk
+Luz
+Ly-Khanh
+Lyda
+Lydda-June
+Lydia
+Lydie
+Lyle
+Lyman
+Lyn
+Lynda
+Lynde
+Lyndel
+Lyndell
+Lyndia
+Lyndon
+Lyndsay
+Lyndsey
+Lyndsie
+Lyndy
+Lyne
+Lynea
+Lynelle
+Lynett
+Lynette
+Lynn
+Lynna
+Lynne
+Lynnea
+Lynnell
+Lynnelle
+Lynnet
+Lynnett
+Lynnette
+Lynsey
+Lynwood
+Lyse
+Lyssa
+Lysy
+Maaike
+Maala
+Maarten
+Mab
+Mabel
+Mabelle
+Mable
+Mac
+Mace
+Maciej
+Mack
+Mada
+Madalena
+Madalene
+Madalyn
+Madan
+Maddalena
+Maddi
+Maddie
+Maddy
+Madel
+Madelaine
+Madeleine
+Madelena
+Madelene
+Madelin
+Madelina
+Madeline
+Madella
+Madelle
+Madelon
+Madelyn
+Madge
+Madlen
+Madlin
+Madonna
+Mady
+Mae
+Maegan
+Mag
+Magda
+Magdaia
+Magdalen
+Magdalena
+Magdalene
+Magdi
+Magdy
+Maged
+Maggee
+Maggi
+Maggie
+Maggy
+Magnolia
+Mahala
+Mahalia
+Mahboob
+Mahendra
+Mahesh
+Mahlon
+Mahmood
+Mahmoud
+Mahmut
+Mahshad
+Mai
+Maia
+Maible
+Maid
+Maidisn
+Maidlab
+Maidsir
+Maidxpm
+Maier
+Maiga
+Maighdiln
+Mail
+Mainoo
+Maint
+Mair
+Maire
+Maisey
+Maisie
+Maitilde
+Maitreya
+Majid
+Makam
+Makary
+Makiko
+Mal
+Mala
+Malanie
+Malaysia
+Malcolm
+Malena
+Malethia
+Malgosia
+Malia
+Malik
+Malina
+Malinda
+Malinde
+Malissa
+Malissia
+Mallik
+Mallissa
+Mallorie
+Mallory
+Malorie
+Malory
+Malva
+Malvina
+Malynda
+Mame
+Mami
+Mamie
+Mamoru
+Man
+Man-Fai
+Manami
+Manas
+Manda
+Mandana
+Mandi
+Mandie
+Mandy
+Manfred
+Manh
+Manhatten
+Mani
+Manijeh
+Manimozhi
+Manish
+Manjinder
+Manjit
+Manmohan
+Manny
+Manoj
+Manon
+Manou
+Manouch
+Mansukha
+Mansum
+Manuel
+Manuela
+Manya
+Mara
+Marabel
+Marc
+Marc-Andre
+Marc-Antoine
+Marce
+Marcel
+Marcela
+Marcelia
+Marcella
+Marcelle
+Marcellina
+Marcelline
+Marcelo
+March
+Marchelle
+Marci
+Marcia
+Marcie
+Marcile
+Marcille
+Marco
+Marcos
+Marcus
+Marcy
+Mardi
+Mareah
+Marek
+Marella
+Maren
+Marena
+Maressa
+Marg
+Marga
+Margalit
+Margalo
+Margaret
+Margareta
+Margarete
+Margaretha
+Margarethe
+Margaretta
+Margarette
+Margariet
+Margarita
+Margaux
+Marge
+Margeaux
+Margery
+Marget
+Margette
+Margi
+Margie
+Margit
+Margo
+Margot
+Margret
+Margriet
+Marguerita
+Marguerite
+Margy
+Mari
+Maria
+Mariaelena
+Mariam
+Marian
+Mariana
+Mariann
+Marianna
+Marianne
+Maribel
+Maribelle
+Maribeth
+Marice
+Maridel
+Marie
+Marie-Andree
+Marie-Josee
+Marie-Luce
+Marie-Nadine
+Marie-ann
+Marie-jeanne
+Marieann
+Mariejeanne
+Marieka
+Marieke
+Mariel
+Mariele
+Marielle
+Mariellen
+Mariesara
+Mariet
+Marietta
+Mariette
+Marigold
+Marijke
+Marijo
+Marika
+Marilee
+Marilin
+Marillin
+Marilyn
+Marilynn
+Marilynne
+Marin
+Marina
+Marinette
+Marinna
+Mario
+Marion
+Mariquilla
+Maris
+Marisa
+Marisca
+Mariska
+Marissa
+Marit
+Marita
+Maritsa
+Mariya
+Marj
+Marja
+Marjan
+Marje
+Marjet
+Marji
+Marjie
+Marjo
+Marjoke
+Marjolein
+Marjorie
+Marjory
+Marjy
+Mark
+Marketa
+Marko
+Markus
+Marla
+Marlaine
+Marlane
+Marleah
+Marlee
+Marleen
+Marlena
+Marlene
+Marley
+Marlie
+Marlies
+Marlin
+Marline
+Marlo
+Marloes
+Marlon
+Marlyn
+Marlyne
+Marna
+Marne
+Marney
+Marni
+Marnia
+Marnie
+Maroun
+Marquita
+Marriet
+Marrilee
+Marris
+Marrissa
+Marscha
+Marsh
+Marsha
+Marshal
+Marshall
+Marsie
+Marsiella
+Marta
+Martelle
+Martguerita
+Martha
+Marthe
+Marthena
+Marti
+Martica
+Martie
+Martijn
+Martin
+Martina
+Martine
+Martino
+Martita
+Marty
+Martynne
+Marv
+Marvell
+Marvette
+Marvin
+Marwan
+Mary
+Mary-Ann
+Mary-Ellen
+Mary-Jane
+Mary-Jo
+Mary-Michelle
+Mary-Pat
+MaryKay
+MaryLou
+MaryLynn
+Marya
+Maryam
+Maryann
+Maryanna
+Maryanne
+Marybelle
+Marybeth
+Maryellen
+Maryjane
+Maryjo
+Maryl
+Marylee
+Marylin
+Marylinda
+Marylynne
+Maryrose
+Marys
+Marysa
+Maryse
+Maryvonne
+Masa
+Masahiro
+Masamichi
+Masha
+Maskell
+Maso
+Mason
+Masood
+Massoud
+Mat
+Matelda
+Materkowski
+Mathew
+Mathilda
+Mathilde
+Matilda
+Matilde
+Mats
+Matt
+Matthew
+Matti
+Mattie
+Matty
+Maud
+Maude
+Maudie
+Maura
+Maure
+Maureen
+Maureene
+Maurene
+Maurice
+Mauricio
+Maurijn
+Maurine
+Maurise
+Maurita
+Maurizia
+Mauro
+Maury
+Mavis
+Mavra
+Max
+Maxey
+Maxi
+Maxie
+Maxine
+Maxy
+May
+Mayasandra
+Maybelle
+Maycel
+Maye
+Mayeul
+Maylynn
+Maynard
+Maynie
+Mayumi
+McGee
+Mccauley
+Me
+Mead
+Meade
+Meagan
+Meaghan
+Meara
+Mechelle
+Medria
+Meena
+Meer
+Meeting
+Meg
+Megan
+Megen
+Meggi
+Meggie
+Meggy
+Meghan
+Meghann
+Megumi
+Mehboob
+Mehdi
+Mehetabel
+Mehmet
+Mehmud
+Mehrzad
+Mei
+Mel
+Mela
+Melamie
+Melania
+Melanie
+Melantha
+Melany
+Melba
+Melbourne
+Melek
+Melesa
+Melessa
+Melford
+Melhem
+Melicent
+Melina
+Melinda
+Melinde
+Melinie
+Melisa
+Melisande
+Melisandra
+Melisenda
+Melisent
+Melissa
+Melisse
+Melita
+Melitta
+Mella
+Melli
+Mellicent
+Mellie
+Mellisa
+Mellisent
+Melloney
+Melly
+Melodee
+Melodie
+Melody
+Melonie
+Melony
+Melosa
+Melva
+Melvin
+Melynda
+Mendel
+Mentor
+Mer
+Merb
+Mercedes
+Mercer
+Merci
+Mercie
+Mercy
+Merdia
+Meredith
+Meredithe
+Meriann
+Meridel
+Meridian
+Meridith
+Meriel
+Merilee
+Meriline
+Merilyn
+Meris
+Merissa
+Merl
+Merla
+Merle
+Merlin
+Merlina
+Merline
+Merna
+Merola
+Merralee
+Merridie
+Merrie
+Merrielle
+Merrile
+Merrilee
+Merrili
+Merrill
+Merrily
+Merry
+Mersey
+Merunix
+Merv
+Mervin
+Mervyn
+Meryl
+Message
+Mesut
+Meta
+Meter
+Methi
+Metrics
+Metyn
+Mewa
+Mfgeng
+Mia
+Micaela
+Micah
+Michael
+Michael-Morgan
+Michaela
+Michaelina
+Michaeline
+Michaella
+Michal
+Micheal
+Michel
+Michele
+Michelina
+Micheline
+Michell
+Michelle
+Michie
+Michiel
+Michigan
+Michiko
+Mick
+Mickey
+Micki
+Mickie
+Micky
+Mico
+Micro
+Mid
+Midge
+Miep
+Mietek
+Migdalia
+Mignon
+Mignonne
+Miguel
+Miguela
+Miguelita
+Mihaela
+Mihai
+Mika
+Mikaela
+Mike
+Mikelis
+Mikhail
+Mikihito
+Miklos
+Mil
+Mila
+Milan
+Mildred
+Mildrid
+Milena
+Miles
+Milicent
+Milissent
+Milka
+Millard
+Milli
+Millicent
+Millie
+Millisent
+Millo
+Milly
+Milo
+Milou
+Milt
+Milton
+Milzie
+Mimi
+Min
+Mina
+Minda
+Mindy
+Minerva
+Minetta
+Minette
+Ming
+Ming-Chang
+Ming-Ming
+Minh-Phuc
+Minhwi
+Minna
+Minnaminnie
+Minne
+Minnesota
+Minni
+Minnie
+Minnnie
+Minny
+Minoru
+Minta
+Miof mela
+Miquela
+Mira
+Mirabel
+Mirabella
+Mirabelle
+Miran
+Miranda
+Mireielle
+Mireille
+Mirella
+Mirelle
+Miriam
+Mirilla
+Miriya
+Mirjam
+Mirna
+Miro
+Miroslav
+Misbah
+Misha
+Miss
+Missagh
+Missie
+Missy
+Mister
+Misti
+Misty
+Mitch
+Mitchell
+Mitesh
+Mitsuko
+Mitzi
+Miwa
+Miwako
+Miyuki
+Mkt
+Mo
+Modesta
+Modestia
+Modestine
+Modesty
+Moe
+Moel
+Mohamad
+Mohamed
+Mohammad
+Mohammed
+Mohan
+Mohd
+Moina
+Moira
+Moises
+Moll
+Mollee
+Molli
+Mollie
+Molly
+Mommy
+Mona
+Monah
+Monica
+Moniek
+Monika
+Monique
+Monling
+Monroe
+Monte
+Monteene
+Montreal
+Monty
+Moon
+Mora
+Moray
+Moreen
+Morena
+Morgan
+Morgana
+Morganica
+Morganne
+Morgen
+Moria
+Moris
+Morissa
+Morley
+Morna
+Morrie
+Morris
+Mort
+Moselle
+Moshe
+Mot
+Motaz
+Mougy
+Mouna
+Mounir
+Moveline
+Moyna
+Moyra
+Mozelle
+Mrugesh
+Muffin
+Mufi
+Mufinella
+Muhammad
+Muinck
+Muire
+Mukul
+Mukund
+Mun-Hang
+Munaz
+Muni
+Munir
+Murat
+Mureil
+Murial
+Muriel
+Murielle
+Murray
+Murry
+Mustafa
+Mustapha
+My
+Myla
+Myra
+Myrah
+Myranda
+Myriam
+Myrilla
+Myrle
+Myrlene
+Myrna
+Myron
+Myrta
+Myrthille
+Myrtia
+Myrtice
+Myrtie
+Myrtille
+Myrtle
+Mysore
+Nabil
+Nachum
+Nad
+Nada
+Nadean
+Nadeem
+Nadeen
+Nader
+Nadia
+Nadim
+Nadine
+Nadir
+Nadiya
+Nady
+Nadya
+Nagaraj
+Nahum
+Naile
+Naim
+Naima
+Naji
+Najib
+Nakina
+Nalani
+Nalin
+Nam
+Nam-Kiet
+Nam-Soo
+Namrata
+Nan
+Nana
+Nananne
+Nance
+Nancee
+Nancey
+Nanci
+Nancie
+Nancy
+Nandita
+Nando
+Nanete
+Nanette
+Nang
+Nani
+Nanice
+Nanine
+Nannette
+Nanni
+Nannie
+Nanny
+Nanon
+Naohiko
+Naoma
+Naomi
+Nara
+Naren
+Narendra
+Naresh
+Nari
+Narida
+Nariko
+Narinder
+Narrima
+Naser
+Nash
+Nashib
+Nashir
+Nashville
+Nasser
+Nat
+Nata
+Natala
+Natalee
+Natalie
+Natalina
+Nataline
+Nataly
+Natalya
+Natascha
+Natasha
+Natasja
+Natassia
+Natassja
+Nath
+Nathalia
+Nathalie
+Nathan
+Nathaniel
+National
+Natividad
+Natka
+Natty
+Natver
+Naval
+Naveen
+Nawa
+Nayan
+Nayneshkumar
+Nazi
+Nazib
+Neal
+Neala
+Ned
+Neda
+Nedda
+Nedi
+Neely
+Neena
+Neetu
+Neil
+Neila
+Neile
+Neill
+Neilla
+Neille
+Nel
+Nelda
+Nelia
+Nelie
+Nell
+Nelle
+Nelleke
+Nelli
+Nellie
+Nelly
+Nelson
+Nenad
+Nerissa
+Nerita
+Nermana
+Nert
+Nerta
+Nerte
+Nerti
+Nertie
+Nerty
+Ness
+Nessa
+Nessi
+Nessie
+Nessy
+Nesta
+Neste
+Netas
+Netta
+Netti
+Nettie
+Nettle
+Netty
+Nevein
+Nevil
+Neville
+Nevsa
+New
+Newell
+Newton
+Neysa
+Nga
+Ngai
+Ngan
+Nguyen
+Nguyet
+Nha
+Nhien
+Nhut
+Nial
+Niall
+Nic
+Nichol
+Nicholas
+Nichole
+Nicholle
+Nick
+Nicki
+Nickie
+Nicky
+Nico
+Nicol
+Nicola
+Nicolas
+Nicole
+Nicolea
+Nicolette
+Nicoli
+Nicolina
+Nicoline
+Nicolle
+Niek
+Niel
+Nigel
+Nijen
+Nik
+Nikaniki
+Nike
+Niki
+Nikki
+Nikkie
+Nikky
+Nikolaos
+Nikoletta
+Nikolia
+Nikos
+Nill
+Nils
+Nina
+Ninetta
+Ninette
+Ning
+Ninnetta
+Ninnette
+Ninno
+Ninon
+Nir
+Nirmal
+Nishith
+Nissa
+Nisse
+Nissie
+Nissy
+Nita
+Nitin
+Nixie
+Niz
+Nj
+Noami
+Nobuko
+Nobutaka
+Node
+Noel
+Noelani
+Noell
+Noella
+Noelle
+Noellyn
+Noelyn
+Noemi
+Noeschka
+Nola
+Nolana
+Nolie
+Nollie
+Nomi
+Nona
+Nonah
+Nong
+Noni
+Nonie
+Nonna
+Nonnah
+Nooshin
+Nopi
+Nora
+Norah
+Noraly
+Norbert
+Norcal
+Norean
+Noreen
+Norel
+Norene
+Norikatsu
+Norikazu
+Noriko
+Norina
+Norine
+Norio
+Norm
+Norma
+Norman
+Normand
+Norri
+Norrie
+Norry
+Norstar
+Norton
+Norvie
+Noslab
+Notley
+Noubar
+Nova
+Novelia
+Novene
+Noyes
+Nuno
+Nuntel
+Nurettin
+Nurhan
+Nuri
+Nuvit
+Nydia
+Nyssa
+Octavia
+Octavio
+Odele
+Odelia
+Odelinda
+Odella
+Odelle
+Odessa
+Odetta
+Odette
+Odile
+Odilia
+Odille
+Ofelia
+Ofella
+Ofilia
+Oguz
+Ohio
+OJ
+Okan
+Okey
+Oksana
+Ola
+Olav
+Ole
+Oleesa
+Olenka
+Olga
+Olia
+Olimpia
+Olive
+Oliver
+Olivette
+Olivia
+Olivie
+Oliy
+Ollie
+Olly
+Olusola
+Olva
+Olwen
+Olympe
+Olympia
+Olympie
+Omar
+Omayma
+Omer
+Ondrea
+Oneida
+Onette
+Onge
+Onida
+Oona
+Oorschot
+Opal
+Opalina
+Opaline
+Open
+Oper
+Ophelia
+Ophelie
+Opto
+Ora
+Oral
+Oralee
+Oralia
+Oralie
+Oralla
+Oralle
+Orden
+Orel
+Orelee
+Orelia
+Orelie
+Orella
+Orelle
+Oren
+Orenzo
+Oriana
+Orie
+Orlando
+Orly
+Orlyn
+Orsa
+Orsola
+Ortensia
+Oryal
+Osama
+Oscar
+Osiris
+Osmond
+Ossama
+Otakar
+Otfried
+Otha
+Othelia
+Othella
+Othilia
+Othilie
+Ott
+Ottawa
+Ottcsr
+Otter
+Ottilie
+Oue
+Ovila
+Owen
+Ozay
+Ozlem
+Pac
+Pacific
+Padma
+Padraig
+Padriac
+Page
+Paige
+Painterson
+Pak
+Pak-Jong
+Pal
+Palme
+Palmer
+Paloma
+Pam
+Pamela
+Pamelina
+Pamella
+Pammi
+Pammie
+Pammy
+Panch
+Pandora
+Pankaj
+Pankesh
+Panos
+Pansie
+Pansy
+Paola
+Paolina
+Papagena
+Paper
+Papers
+Paqs
+Par
+Pardeep
+Pardip
+Pardo
+Parham
+Parker
+Parkinson
+Parks
+Parminder
+Parnell
+Pars
+Partap
+Partha
+Partick
+Parveen
+Parvin
+Parviz
+Pas
+Pascal
+Pascale
+Pasiedb
+Pat
+Patadm
+Patch
+Patches
+Patching
+Patchit
+Patience
+Patra
+Patrica
+Patrice
+Patricia
+Patrick
+Patrizia
+Patsy
+Patt
+Patti
+Pattie
+Patty
+Paul
+Paula
+Paule
+Pauletta
+Paulette
+Pauli
+Paulie
+Paulien
+Paulina
+Pauline
+Paulinus
+Paulita
+Paulo
+Paulus
+Pauly
+Pavia
+Pavla
+Pawel
+Payroll
+Pcta
+Pde
+Peach
+Pearl
+Pearla
+Pearle
+Pearline
+Peder
+Pedro
+Peg
+Pegeen
+Peggi
+Peggie
+Peggy
+Pei-Chien
+Pelly
+Pen
+Penang
+Penelopa
+Penelope
+Peng
+Peng-David
+Penni
+Pennie
+Penny
+Pension
+Pepi
+Pepita
+Per
+Percy
+Peri
+Peria
+Perl
+Perla
+Perle
+Perri
+Perrin
+Perrine
+Perry
+Persis
+Pet
+Peta
+Petar
+Pete
+Peter
+Petr
+Petra
+Petre
+Petri
+Petrina
+Petronella
+Petronia
+Petronilla
+Petronille
+Petter
+Petunia
+Pey-Kee
+Phaedra
+Phaidra
+Phan
+Phat
+Phebe
+Phedra
+Phelia
+Phil
+Philip
+Philipa
+Philippa
+Philippe
+Philippine
+Philis
+Phillida
+Phillie
+Phillip
+Phillis
+Philly
+Philomena
+Phoebe
+Phoenix
+Phu
+Phuoc
+Phuong
+Phyl
+Phylis
+Phyllida
+Phyllis
+Phyllys
+Phylys
+Pia
+Pic
+Pick
+Pier
+Pierette
+Piero
+Pierre
+Pierre-Alain
+Pierre-Andre
+Pierre-Henri
+Pierre-Marc
+Pierre-Yves
+Pierrette
+Pierrick
+Pieter
+Pietra
+Pinakin
+Pinder
+Pinecrest
+Ping
+Ping-Kong
+Piotr
+Piper
+Pippa
+Pippy
+Pirooz
+Piroska
+Pit
+Pittsburgh
+Pivert
+Piyush
+Po
+Poh-Soon
+Pojanart
+Poldi
+Polly
+Pollyanna
+Pooh
+Poppy
+Porfirio
+Portia
+Poulos
+Powell
+Power
+Prab
+Prabir
+Pradeep
+Pradip
+Pradyumn
+Prafula
+Prakash
+Pramod
+Prams
+Prashant
+Pratibha
+Praveen
+Prayson
+Prem
+Preston
+Previn
+Pricing
+Print
+Priore
+Pris
+Prisca
+Priscella
+Priscilla
+Prissie
+Pritchard
+Priti
+Prity
+Priya
+Problems
+Pru
+Prudence
+Prudi
+Prudy
+Prue
+Pryor
+Pui-Wah
+Pulak
+Puneet
+Puran
+Purnam
+Purvee
+Qainfo
+Qainsp
+Quality
+Quan
+Quang
+Quang-Trung
+Queenie
+Quentin
+Querida
+Quinn
+Quinta
+Quintana
+Quintilla
+Quintina
+Quoc
+Quoc-Vu
+Quon
+Quyen
+Quynh
+Rachael
+Rachel
+Rachele
+Rachelle
+Radames
+Radford
+Radha
+Radio
+Radomir
+Radoslav
+Rae
+Raeann
+Raf
+Rafa
+Rafael
+Rafaela
+Rafaelia
+Rafaelita
+Raffi
+Rafi
+Rafiq
+Raghuvir
+Ragu
+Ragui
+Rahal
+Rahel
+Raina
+Raine
+Rainer
+Raj
+Rajan
+Rajani
+Rajeev
+Rajesh
+Rajinderpal
+Rajiv
+Raju
+Rakel
+Rakesh
+Rakhuma
+Raleigh
+Ralina
+Ralph
+Ram
+Rama
+Ramakant
+Raman
+Ramana
+Ramanamurthy
+Ramanand
+Ramaprakash
+Ramesh
+Ramez
+Ramin
+Ramiz
+Ramniklal
+Ramon
+Ramona
+Ramonda
+Ramses
+Ran-Joo
+Rana
+Rand
+Randa
+Randal
+Randall
+Randee
+Randene
+Randhir
+Randi
+Randie
+Randolph
+Randy
+Ranea
+Ranee
+Ranga
+Rani
+Rania
+Ranice
+Ranique
+Ranjit
+Rank
+Ranna
+Ransom
+Ranson
+Ranvir
+Rao
+Raouf
+Raoul
+Raphaela
+Raquel
+Raquela
+Rashid
+Rashmi
+Rasia
+Rasla
+Raudres
+Raul
+Raven
+Ravi
+Ravinder
+Ray
+Raychel
+Raye
+Raymond
+Rayna
+Raynald
+Raynell
+Rayshell
+Raz
+Rch
+Rchisn
+Rchlab
+Rea
+Reagan
+Real
+Reba
+Rebbecca
+Rebe
+Rebeca
+Rebecca
+Rebecka
+Rebeka
+Rebekah
+Rebekkah
+Rec
+Redgie
+Ree
+Reeba
+Reed
+Reena
+Reese
+Reeta
+Reeva
+Reg
+Regan
+Reggi
+Reggie
+Regina
+Reginald
+Regine
+Regis
+Reid
+Reiko
+Reina
+Reind
+Reine
+Reinhard
+Reinhold
+Rejean
+Rejeanne
+Remi
+Remington
+Remo
+Remy
+Ren
+Rena
+Renae
+Renata
+Renate
+Renato
+Rene
+Rene-Alain
+Renee
+Renell
+Renelle
+Renie
+Rennie
+Renny
+Reno
+Renu
+Reta
+Retha
+Reuben
+Reva
+Revkah
+Rex
+Rey
+Reyaud
+Reyna
+Reynold
+Reza
+Reznechek
+Rhea
+Rheal
+Rheba
+Rheta
+Rhett
+Rhetta
+Rhiamon
+Rhianna
+Rhianon
+Rhoda
+Rhodia
+Rhodie
+Rhody
+Rhona
+Rhonda
+Ri
+Ria
+Riane
+Riannon
+Rianon
+Riaz
+Ric
+Rica
+Ricardo
+Ricca
+Rich
+Richard
+Richardo
+Richardson
+Richelle
+Richie
+Rici
+Rick
+Rickey
+Ricki
+Rickie
+Rickrd
+Ricky
+Rico
+Riekie
+Rieni
+Rigby
+Rigel
+Rigoberto
+Rijn
+Rijos
+Rijswijk
+Riki
+Rikki
+Rilla
+Rima
+Rina
+Ringo
+Rini
+Rio
+Risa
+Rita
+Riva
+Rivalee
+Rivi
+Rivkah
+Rivy
+Riyad
+Riyaz
+Rizwan
+Rizzo
+Roana
+Roanna
+Roanne
+Rob
+Robb
+Robbi
+Robbie
+Robbin
+Robby
+Robbyn
+Robena
+Robenia
+Robert
+Roberta
+Roberto
+Robertson
+Robin
+Robina
+Robinet
+Robinett
+Robinetta
+Robinette
+Robinia
+Roby
+Robyn
+Rocco
+Roch
+Rochell
+Rochella
+Rochelle
+Rochette
+Rocio
+Rocke
+Rocky
+Rod
+Roda
+Roddy
+Roderick
+Rodger
+Rodi
+Rodie
+Rodina
+Rodney
+Rodrigo
+Rodrigus
+Roe
+Roel
+Roelof
+Rogelio
+Roger
+Rohit
+Rois
+Rojer
+Roland
+Rolande
+Rolando
+Rolf
+Rollie
+Rollo
+Rolly
+Roly
+Roman
+Romano
+Romina
+Rommel
+Romola
+Romona
+Romonda
+Romulus
+Romy
+Ron
+Rona
+Ronald
+Ronalda
+Ronan
+Ronda
+Ronen
+Rong-Chin
+Roni-Jean
+Ronica
+Ronn
+Ronna
+Ronneke
+Ronni
+Ronnica
+Ronnie
+Ronny
+Roobbie
+Roque
+Rora
+Rori
+Rorie
+Rory
+Ros
+Rosa
+Rosabel
+Rosabella
+Rosabelle
+Rosaleen
+Rosalia
+Rosalie
+Rosalind
+Rosalinda
+Rosalinde
+Rosaline
+Rosalyn
+Rosalynd
+Rosamond
+Rosamund
+Rosana
+Rosanna
+Rosanne
+Rosario
+Roscoe
+Rose
+RoseAnne
+Roseann
+Roseanna
+Roselia
+Roselin
+Roseline
+Rosella
+Roselle
+Rosemaria
+Rosemarie
+Rosemary
+Rosemonde
+Rosene
+Rosetta
+Rosette
+Roshelle
+Rosie
+Rosina
+Rosita
+Roslyn
+Rosmunda
+Ross
+Rosy
+Roupen
+Row
+Rowan
+Rowe
+Rowena
+Roxana
+Roxane
+Roxanna
+Roxanne
+Roxi
+Roxie
+Roxine
+Roxy
+Roy
+Roya
+Royal
+Royce
+Roz
+Rozalia
+Rozalie
+Rozalin
+Rozamond
+Rozanna
+Rozanne
+Roze
+Rozele
+Rozella
+Rozelle
+Rozett
+Rozina
+Ru
+Ruben
+Rubetta
+Rubi
+Rubia
+Rubie
+Rubin
+Rubina
+Ruby
+Ruchel
+Ruchi
+Rudie
+Rudolf
+Rudolph
+Rudy
+Rueben
+Rui
+Rui-Yuan
+Rungroj
+Ruperta
+Rurick
+Russ
+Russel
+Russell
+Rustu
+Rusty
+Ruth
+Ruthann
+Ruthanne
+Ruthe
+Ruthi
+Ruthie
+Ruthy
+Ruud
+Ryann
+Rycca
+Ryman
+Ryoung
+Ryszard
+Saba
+Sabah
+Sabina
+Sabine
+Sabra
+Sabrina
+Sabuson
+Sacha
+Sachiko
+Sacto
+Sada
+Sadan
+Sadella
+Sadie
+Sadru
+Sadye
+Saeed
+Saeid
+Sage
+Saibal
+Said
+Saidee
+Saied
+Sait
+Sal
+Salah
+Salaidh
+Saleem
+Saleh
+Sales
+Salim
+Salina
+Salis
+Sallee
+Salli
+Sallie
+Sally
+Sallyann
+Sallyanne
+Saloma
+Salome
+Salomi
+Salvador
+Salvatore
+Sam
+Saman
+Samantha
+Samara
+Samaria
+Sameh
+Sami
+Samia
+Samir
+Sammie
+Sammy
+Samual
+Samuel
+Sanae
+Sanchez
+Sande
+Sandeep
+Sandhya
+Sandi
+Sandie
+Sandra
+Sandrine
+Sandro
+Sandy
+Sandye
+Sang-Maun
+Sangman
+Sanja
+Sanjay
+Sanjeet
+Sanjeev
+Sanjoy
+Santiago
+Sapphira
+Sapphire
+Sara
+Sara-ann
+Saraann
+Sarah
+Sarajane
+Sarangarajan
+Sarath
+Saree
+Sarena
+Sarene
+Sarette
+Sari
+Sarina
+Sarine
+Sarita
+Saroj
+Sascha
+Sasha
+Sashenka
+Sask
+Saskia
+Sastry
+Saswata
+Sati
+Satoshi
+Sattar
+Satyajit
+Saudra
+Saul
+Saumitra
+Saundra
+Savina
+Savita
+Sayed
+Sayeeda
+Sayla
+Sayre
+Scarlet
+Scarlett
+Schaffer
+Schell
+Schouwen
+Schyndel
+Scot
+Scott
+Scottie
+Scotty
+Scovill
+Scpbuild
+Scpiivo
+Scptest
+Seamus
+Sean
+Seana
+Seang
+Seanna
+Sebastian
+Sedat
+Sedigheh
+Seelan
+Seema
+Seiji
+Seiko
+Sejal
+Seka
+Sela
+Selcuk
+Selena
+Selene
+Selestina
+Selia
+Selie
+Selim
+Selime
+Selina
+Selinda
+Seline
+Sella
+Selle
+Selma
+Selva
+Selvaraj
+Selwyn
+Semmler
+Sena
+Sephira
+Seraphine
+Serban
+Serdar
+Serena
+Serene
+Serge
+Sergei
+Sergio
+Sergiu
+Seth
+Setsuko
+Seungchul
+Seven
+Severin
+Sey-Ping
+Seyar
+Seyfollah
+Seyma
+Shabbir
+Shae
+Shafiq
+Shafique
+Shahab
+Shahid
+Shahram
+Shahriar
+Shahrokh
+Shaib
+Shaibal
+Shailendra
+Shailesh
+Shailin
+Shaina
+Shaine
+Shaji
+Shaker
+Shakoor
+Shalna
+Shalne
+Shama
+Shamim
+Shamshad
+Shamsia
+Shan
+Shana
+Shanda
+Shandee
+Shandeigh
+Shandie
+Shandra
+Shandy
+Shane
+Shani
+Shanie
+Shankar
+Shanna
+Shannah
+Shannen
+Shannon
+Shanon
+Shanta
+Shantee
+Shanti
+Shara
+Sharad
+Sharai
+Sharee
+Shari
+Sharia
+Sharity
+Sharl
+Sharla
+Sharleen
+Sharlene
+Sharline
+Sharon
+Sharona
+Sharone
+Sharri
+Sharron
+Sharyl
+Sharyn
+Shashank
+Shashi
+Shaughan
+Shaukat
+Shaun
+Shauna
+Shaw
+Shawn
+Shawna
+Shawnee
+Shay
+Shayla
+Shaylah
+Shaylyn
+Shaylynn
+Shayna
+Shayne
+Shea
+Sheba
+Shedman
+Sheela
+Sheelagh
+Sheelah
+Sheena
+Sheeree
+Sheila
+Sheila-kathryn
+Sheilah
+Sheilakathryn
+Sheileagh
+Shekar
+Shekhar
+Shel
+Shela
+Shelagh
+Shelba
+Shelbi
+Shelby
+Sheldon
+Shelia
+Shell
+Shelley
+Shelli
+Shellie
+Shelly
+Shelton
+Shen-Zhi
+Shena
+Shep
+Sher
+Sheree
+Sheri
+Sheri-Lynn
+Sheridan
+Sherie
+Sherill
+Sherilyn
+Sherline
+Sherman
+Sherrel
+Sherri
+Sherrie
+Sherrill
+Sherry
+Sherrye
+Sherryl
+Sherwood
+Sherwyn
+Sherye
+Sheryl
+Shiela
+Shigeki
+Shigeru
+Shih-Dar
+Shila
+Shilla
+Shina
+Shing-Cheong
+Shing-Chi
+Shingcheon
+Shinichi
+Shinichiro
+Shir
+Shirene
+Shirin
+Shirish
+Shirl
+Shirlee
+Shirleen
+Shirlene
+Shirley
+Shirley-Ann
+Shirline
+Shiroshi
+Shiu
+Shiv
+Shiva
+Shivdarsan
+Shlomo
+Shobana
+Shoeb
+Shoji
+Shona
+Shorwan
+Shoshana
+Shoshanna
+Shou
+Shou-Mei
+Shouli
+Shuang
+Shuichi
+Shuji
+Shunhui
+Shunro
+Shuo
+Shuqing
+Shutterbug
+Shya-Yun
+Shyam
+Shyoko
+Siamack
+Siamak
+Siana
+Sianna
+Sib
+Sibbie
+Sibby
+Sibeal
+Sibel
+Sibella
+Sibelle
+Sibilla
+Sibley
+Sibyl
+Sibylla
+Sibylle
+Sichao
+Sickle
+Sid
+Sidney
+Sidone
+Sidoney
+Sidonia
+Sidonnie
+Sieber
+Siew
+Siew-Kiat
+Sig
+Siggy
+Sigrid
+Siham
+Sik-Yin
+Sika
+Sil
+Sile
+Sileas
+Silva
+Silvana
+Silvester
+Silvestro
+Silvia
+Silvie
+Simen
+Simeon
+Simhan
+Simon
+Simon-Cheuk
+Simon-Pui-Lok
+Simona
+Simone
+Simonette
+Simonne
+Simulation
+Sindee
+Sing-Pin
+Sinh
+Siobhan
+Sioux
+Siouxie
+Sir
+Sisely
+Sisile
+Sissela
+Sissie
+Sissy
+Siu-Ling
+Siu-Man
+Siusan
+Siva
+Skiclub
+Skip
+Skipper
+Skippy
+Sky
+Skyler
+Sluis
+Smita
+Smith
+Snair
+Snehal
+Sofeya
+Sofia
+Sofie
+Sohail
+Sohale
+Sohayla
+Sol
+Solita
+Solomon
+Somsak
+Son
+Sonbol
+Sondra
+Sonia
+Sonja
+Sonni
+Sonnie
+Sonnnie
+Sonny
+Sono
+Sonoe
+Sonya
+Sophey
+Sophi
+Sophia
+Sophie
+Sophronia
+Sorcha
+Sorin
+Sosanna
+Sotos
+Souheil
+Souphalack
+Souza
+Soyeh
+Soyong
+Spence
+Spencer
+Spenser
+Spicer
+Spiros
+Srinivas
+Sriranjani
+Sriv
+StClair
+Stace
+Stacee
+Stacey
+Staci
+Stacia
+Stacie
+Stacy
+Stafani
+Stan
+Stanislas
+Stanislaw
+Stanley
+Star
+Starla
+Starlene
+Starlet
+Starlin
+Starr
+Stars
+Starsdps
+Stateson
+Steen
+Stefa
+Stefan
+Stefania
+Stefanie
+Stefano
+Steffane
+Steffen
+Steffi
+Steffie
+Steinar
+Stella
+Stepha
+Stephan
+Stephana
+Stephane
+Stephani
+Stephanie
+Stephannie
+Stephany
+Stephen
+Stephenie
+Stephi
+Stephie
+Stephine
+Stergios
+Sterling
+Stesha
+Stevana
+Steve
+Steven
+Stevena
+Stew
+Stewart
+Stirling
+Stock
+Stoddard
+Stone
+Storm
+Stormi
+Stormie
+Stormy
+Stu
+Stuart
+Student
+Su
+Suat
+Subhash
+Subhashini
+Subhra
+Subi
+Subra
+Subramaniam
+Subu
+Sucha
+Sudesh
+Sue
+Sue-May
+Sueanne
+Suellen
+Suha
+Suhas
+Suk-Yin
+Sukey
+Sukhendu
+Sukhwant
+Suki
+Sula
+Sule
+Sultan
+Sundaram
+Sunil
+Sunning
+Sunny
+Sunshine
+Supriya
+Surendra
+Suria
+Surinder
+Survey
+Surya
+Susan
+Susana
+Susanetta
+Susann
+Susanna
+Susannah
+Susanne
+Susette
+Susi
+Susie
+Susil
+Susy
+Suvanee
+Suzan
+Suzane
+Suzann
+Suzanna
+Suzanne
+Suzette
+Suzi
+Suzie
+Suzy
+Svend
+Svenn-Erik
+Svr
+Swact
+Swandi
+Swd
+Swee-Joo
+Sybil
+Sybila
+Sybilla
+Sybille
+Sybyl
+Syd
+Sydel
+Sydelle
+Sydney
+Syed
+Syl
+Sylva
+Sylvain
+Sylvia
+Sylvie
+Sylvio
+Symen
+Synful
+Sys
+Syyed
+Tab
+Tabatha
+Tabbatha
+Tabbi
+Tabbie
+Tabbitha
+Tabby
+Tabina
+Tabitha
+Tac
+Tad
+Tadayuki
+Tadeusz
+Tae
+Taffy
+Tahir
+Tai
+Tai-Jen
+Taiwana
+Tak
+Tak-Wai
+Takako
+Takashi
+Takehiko
+Takis
+Talia
+Tallia
+Tallie
+Tallou
+Tallulah
+Tally
+Talya
+Talyah
+Tam
+Tamar
+Tamara
+Tamarah
+Tamarra
+Tamera
+Tami
+Tamiko
+Tamma
+Tammara
+Tammi
+Tammie
+Tammy
+Tamqrah
+Tamra
+Tan
+Tana
+Tandi
+Tandie
+Tandy
+Tanhya
+Tani
+Tania
+Tanitansy
+Tansy
+Tanya
+Tao
+Tap
+Tape
+Tara
+Tarah
+Tarik
+Tariq
+Taro
+Tarra
+Tarrah
+Tarte
+Tarus
+Taryn
+Taryna
+Tas
+Tash
+Tasha
+Tasia
+Tat
+Tata
+Tate
+Tatiana
+Tatiania
+Tats
+Tatsman
+Tatsuya
+Tatum
+Tatyana
+Tavis
+Tawauna
+Tawei
+Tawnya
+Tawsha
+Tayeb
+Tc
+Tchangid
+Tdr
+Te-Wei
+Team
+Tec
+Tech
+Technical
+Ted
+Tedda
+Teddi
+Teddie
+Teddy
+Tedi
+Tedra
+Teena
+Teetwo
+Tehchi
+Teiichi
+Teirtza
+Tej
+Tele
+Tenney
+Teodora
+Tera
+Terence
+Teresa
+Terese
+Teresina
+Teresita
+Teressa
+Terez
+Teri
+Teriann
+Terra
+Terrell
+Terrence
+Terri
+Terri-jo
+Terrie
+Terrijo
+Terrill
+Terry
+Terrye
+Tersina
+Teruko
+Terza
+Tesa
+Tesfagaber
+Tess
+Tessa
+Tessi
+Tessie
+Tessty
+Tessy
+Tetsumo
+Tetsuo
+Tetsuya
+Tetsuyuki
+Tex
+Teymour
+Thad
+Thaddeus
+Thakor
+Thalia
+Thane
+Thang
+Thanh
+Thanh-Ha
+Thanh-Hoa
+Thanh-Hung
+Thanh-Quoc
+Thanh-Son
+Thanh-Tinh
+Thanos
+Thayne
+The
+Thea
+Theadora
+Theda
+Thedora
+Thekla
+Thelma
+Theo
+Theodor
+Theodora
+Theodore
+Theodosia
+Theresa
+Therese
+Theresina
+Theresita
+Theressa
+Therine
+Thi
+Thi-cuc
+Thia
+Thierry
+Thieu
+Thinh
+Thoai
+Thom
+Thomas
+Thomasa
+Thomasin
+Thomasina
+Thomasine
+Thompson
+Thomson
+Thor
+Thornton
+Thrift
+Thuan
+Thuong
+Thuthuy
+Thuy
+Tian
+Tianbao
+Tibor
+Tidwell
+Tien
+Tiena
+Tierney
+Tiertza
+Tiff
+Tiffani
+Tiffanie
+Tiffany
+Tiffi
+Tiffie
+Tiffy
+Tiina
+Tilak
+Tilda
+Tildi
+Tildie
+Tildy
+Tillie
+Tilly
+Tilmon
+Tim
+Timi
+Timm
+Timmi
+Timmie
+Timmy
+Timothea
+Timothy
+Tin
+Tina
+Tine
+Tineke
+Ting
+Tini
+Tino
+Tiny
+Tiong-Hoe
+Tiphani
+Tiphanie
+Tiphany
+Tish
+Tisha
+Tobe
+Tobey
+Tobi
+Toby
+Tobye
+Tod
+Todd
+Toinette
+Tom
+Toma
+Tomas
+Tomasina
+Tomasine
+Tomasz
+Tomi
+Tommi
+Tommie
+Tommy
+Tomoyoshi
+Tomy
+Toney
+Toni
+Tonia
+Tonie
+Tonu
+Tony
+Tonya
+Tonye
+Tootsie
+Torcac
+Torey
+Tori
+Torie
+Torre
+Torrie
+Tory
+Tosca
+Toshi
+Toshihiro
+Toshinari
+Toss
+Tova
+Tove
+Toyanne
+Toyoji
+Tracee
+Tracey
+Traci
+Tracie
+Tracy
+Tran
+Trang
+Travis
+Trees
+Trenna
+Trent
+Tres
+Tresa
+Trescha
+Tresrch
+Tressa
+Trev
+Trever
+Trevor
+Trey
+Tri
+Tricci
+Tricia
+Tricord
+Trina
+Trinh
+Trish
+Trisha
+Trista
+Tristano
+Trix
+Trixi
+Trixie
+Trixy
+Troy
+Tru-Fu
+Truda
+Trude
+Trudey
+Trudi
+Trudie
+Trudy
+Trula
+Truman
+Truus
+Tsing
+Tsugio
+Tsuyoshi
+Tu
+Tuan
+Tuesday
+Tuhina
+Tulip
+Tun-Lin
+Tung
+Tuoi
+Turgay
+Turkey
+Turus
+Tushar
+Twana
+Twiggy
+Twila
+Twyla
+Txp
+Ty
+Tybi
+Tybie
+Tyke
+Tyler
+Tyne
+Tyronda
+Tzung
+Uday
+Udaya
+Ula
+Ulf
+Ulla
+Ulrica
+Ulrika
+Ulrikaumeko
+Ulrike
+Umakanth
+Umeko
+Umesh
+Una
+Una-Mae
+Unreg
+Upen
+Uri
+Ursa
+Ursala
+Ursola
+Ursula
+Ursulina
+Ursuline
+Usa
+Usman
+Usrouter
+Uswrsd
+Uta
+Utah
+Utilla
+Utpala
+Uunko
+Vac-man
+Vadi
+Vahe
+Vahid
+Val
+Valaree
+Valaria
+Vale
+Valeda
+Valencia
+Valene
+Valenka
+Valentia
+Valentina
+Valentine
+Valera
+Valeria
+Valerie
+Valery
+Valerye
+Valida
+Valina
+Valinda
+Valli
+Vallie
+Vallier
+Vallipuram
+Vally
+Valma
+Valry
+Van
+Van-King
+Vance
+Vanda
+Vanessa
+Vania
+Vanity
+Vanna
+Vanni
+Vannie
+Vanny
+Vanya
+Varennes
+Vasan
+Vassilis
+Vasu
+Vaughn
+Vax
+Ved
+Veda
+Veen
+Veena
+Veleta
+Velma
+Velvet
+Ven
+Veneice
+Venita
+Venkat
+Venkatakrishna
+Venkataraman
+Venus
+Vera
+Veradis
+Vere
+Verena
+Verene
+Verghese
+Veriee
+Verile
+Verina
+Verinder
+Verine
+Verla
+Verlyn
+Vern
+Verna
+Vernice
+Vernon
+Veronica
+Veronika
+Veronike
+Veronique
+Vesna
+Vevay
+Vi
+Vic
+Vicente
+Vicheara
+Vick
+Vicki
+Vickie
+Vicky
+Victor
+Victoria
+Vicuong
+Vida
+Vidya
+Viera
+Vijai
+Vijay
+Vijayalaks
+Vijya
+Vikas
+Viki
+Vikki
+Vikky
+Viktor
+Viktoria
+Vilas
+Vilhelm
+Vilhelmina
+Vilis
+Vilma
+Vilok
+Vimal
+Vimi
+Vin
+Vina
+Vinay
+Vince
+Vincent
+Vincente
+Vincenzo
+Vinh
+Vinita
+Vinni
+Vinnie
+Vinny
+Vino
+Vinod
+Viola
+Violante
+Viole
+Violet
+Violetta
+Violette
+Vipi
+Viqar
+Virgie
+Virgil
+Virgina
+Virginia
+Virginie
+Vishwa
+Vispy
+Vita
+Vital
+Vithit
+Vitia
+Vito
+Vitoria
+Vittoria
+Vittorio
+Viv
+Viva
+Vivek
+Vivi
+Vivia
+Vivian
+Viviana
+Viviane
+Vivianna
+Vivianne
+Vivie
+Vivien
+Viviene
+Vivienne
+Viviyan
+Vivyan
+Vivyanne
+Vlad
+Vladimir
+Vlado
+Vm
+Vmbackup
+Vmchange
+Vmcord
+Vo
+Vonni
+Vonnie
+Vonny
+Voort
+Vradmin
+Vries
+Vrinda
+Vrouwerff
+Vu
+VuHoan
+VuQuoc
+Vyky
+Vyza
+Wade
+Wai
+Wai-Bun
+Wai-Chau
+Wai-Hung
+Wai-Leung
+Wai-Man
+Wai-ching
+Waichi
+Waja
+Wakako
+Wallace
+Walley
+Wallie
+Wallis
+Walliw
+Wally
+Walt
+Walter
+Walton
+Waly
+Wan
+Wanda
+Wandie
+Wandis
+Waneta
+Wanids
+Wannell
+Warden
+Wargnier
+Warren
+Warwick
+Wassim
+Waverly
+Wayne
+Weber
+Wee-Lin
+Wee-Seng
+Wee-Thong
+Weilin
+Weiping
+Weitzel
+Weldon
+Wen
+Wen-Kai
+Wenda
+Wendel
+Wendeline
+Wendell
+Wendi
+Wendie
+Wendy
+Wendye
+Wenona
+Wenonah
+Wenxi
+Weringh
+Werner
+Wes
+Wesley
+Whitfield
+Whitney
+Wiebe
+Wiebren
+Wiele
+Wiesje
+Wieslaw
+Wieslawa
+Wil
+Wilbur
+Wileen
+Wilf
+Wilford
+Wilfred
+Wilhelmina
+Wilhelmine
+Wilhelmus
+Wilie
+Wilkin
+Will
+Willa
+Willabella
+Willamina
+Willard
+Willeke
+Willetta
+Willette
+Willi
+William
+Willie
+Willis
+Willow
+Willy
+Willyt
+Wilma
+Wilmer
+Wilmette
+Wilmont
+Wilona
+Wilone
+Wilow
+Wilson
+Wilton
+Win
+Windowing
+Windy
+Wing
+Wing-Ki
+Wing-Man
+Wini
+Winifred
+Winna
+Winnah
+Winne
+Winni
+Winnie
+Winnifred
+Winny
+Winona
+Winonah
+Winston
+Witold
+Wits
+Witte
+Wladyslaw
+Woei-Peng
+Wojciech
+Wolfgang
+Wonda
+Wong
+Woodline
+Woodson
+Woody
+Woon
+Wray
+Wren
+Wrennie
+Wylma
+Wylo
+Wynn
+Wynne
+Wynnie
+Wynny
+Xantippe
+Xavier
+Xaviera
+Xena
+Xenia
+Xi-Nam
+Xiao-Ming
+Xiaofeng
+Xiaojing
+Xiaomei
+Xu
+Xuan-Lien
+Xuong
+Xylia
+Xylina
+Yalcin
+Yalonda
+Yan-Zhen
+Yannick
+Yannis
+Yao
+Yarlanda
+Yasar
+Yaser
+Yasmeen
+Yasmin
+Yate
+Yatish
+Yau-Fun
+Yavar
+Yavuz
+Yawar
+Yc
+Yee-Ning
+Yehuda
+Yeirnie
+Yelena
+Yen
+Yetta
+Yettie
+Yetty
+Yeung
+Yevette
+Yih
+Yihban
+YikHon
+Ying
+Ylaine
+Ynes
+Ynez
+Yoda
+Yodha
+Yogesh
+Yogi
+Yokan
+Yoke
+Yoke-Kee
+Yoko
+Yolanda
+Yolande
+Yolane
+Yolanthe
+Yong
+Yongli
+Yonik
+Yoram
+Yoshi
+Yoshiaki
+Yoshiko
+Yoshimitsu
+Yosuf
+Youji
+Young-June
+Yousef
+Youssef
+Youwen
+Yovonnda
+Ysabel
+Yu
+Yu-Chung
+Yu-Hung
+Yu-Kai
+Yuan
+Yudy
+Yue-Min
+Yueh
+Yueli
+Yuen
+Yuen-Pui
+Yueping
+Yuji
+Yuk-Wha
+Yukihiko
+Yukinaga
+Yukinobu
+Yuko
+Yuksel
+Yukuo
+Yumi
+Yung
+Yuri
+Yussuf
+Yutaka
+Yvan
+Yves
+Yvet
+Yvette
+Yvon
+Yvonne
+Zabrina
+Zack
+Zafar
+Zafer
+Zahara
+Zahid
+Zahir
+Zahirul
+Zahra
+Zaihua
+Zainab
+Zalee
+Zan
+Zandra
+Zaneta
+Zanni
+Zara
+Zarah
+Zarella
+Zaria
+Zarla
+Zarrin
+Zaven
+Zbignew
+Zbigniew
+Zdenek
+Zdenka
+Zdenko
+Zea
+Zeb
+Zehir-Charlie
+Zehra
+Zein
+Zeina
+Zelda
+Zeljko
+Zelma
+Zena
+Zenia
+Zere
+Zero
+Zhanna
+Zhengyu
+Zia
+Ziad
+Zilvia
+Zino
+Zita
+Zitella
+Zoe
+Zoel
+Zoenka
+Zofia
+Zohar
+Zola
+Zoltan
+Zonda
+Zondra
+Zongyi
+Zonnya
+Zora
+Zorah
+Zorana
+Zorina
+Zorine
+Zouheir
+Zsa zsa
+Zsazsa
+Zuben
+Zulema
+Zulfikar
+Zuzana
+Zyg
+Zygmunt
diff --git a/opends/resource/MakeLDIF/last.names b/opends/resource/MakeLDIF/last.names
new file mode 100644
index 0000000..a7f9d60
--- /dev/null
+++ b/opends/resource/MakeLDIF/last.names
@@ -0,0 +1,13419 @@
+Amar
+Atp
+Atpco
+Atrc
+Aalders
+Aasen
+Abadines
+Abazari
+Abbatantuono
+Abbate
+Abbie
+Abbott
+Abdalla
+Abdo
+Abdollahi
+Abdou
+Abdul-Nour
+Abdulla
+Abdullah
+Abe
+Abedi
+Abel
+Abell
+Abella
+Abello
+Abelow
+Abernathy
+Abernethy
+Abi-Aad
+Abou-Arrage
+Abou-Ezze
+Aboul-Magd
+Aboussouan
+Abovyan
+Abraham
+Abrahim
+Abrams
+Absi
+Acelvari
+Acharyya
+Achcar
+Achille
+Achkar
+Ackaouy
+Acker
+Acklin
+Ackwood
+Acree
+Acres
+Acs
+Actionteam
+Acton
+Aczel
+Adair
+Adam
+Adamczyk
+Adamkowski
+Adamo
+Adamowicz
+Adams
+Adamski
+Adamson
+Adamyk
+Adcock
+Adcox
+Addetia
+Addison
+Addona
+Adeney
+Aderhold
+Adey
+Adhem
+Adimari
+Adjangba
+Adkinson
+Adler
+Admin
+Admin-mtv
+Administration
+Administrator
+Adolfie
+Adolph
+Adornato
+Adorno
+Adriaansen
+Aery
+Afkham
+Afkham-ebrahimi
+Agarwal
+Aggarwal
+Aghi
+Aghili
+Agily
+Agnew
+Agnihotri
+Agostino
+Aguiar
+Aguilar
+Aguinsky
+Aguirre
+Ahad
+Ahdieh
+Ahlberg
+Ahlers
+Ahluwalia
+Ahmad
+Ahmadi
+Ahmed
+Aidarous
+Aiken
+Aimone
+Ainsworth
+Aitken
+Ajersch
+Akai
+Akbas
+Akens
+Akers
+Akhavan
+Akhtar
+Akita
+Akkermans
+Akrawi
+Aksel
+Akyurekli
+Al
+Al Bud
+Al-Basi
+Al-Tarabichi
+Aladangady
+Alanis
+Alanoly
+Alary
+Alavi
+Albea
+Albers
+Alberse
+Albert
+Alberts
+Alberty
+Albery
+Albrecht
+Albright
+Albritton
+Albtentac
+Alburger
+Alcock
+Alcott
+Alderdice
+Aldhizer
+Aldridge
+Alegre
+Aleksic
+Aleong
+Alexan
+Alexander
+Alexson
+Alfaro
+Alford
+Alfred
+Algie
+Algood
+Alguire
+Ali
+Alidina
+Alie
+Alikhan
+Alink
+Alkire
+Allahdin
+Allahyari
+Allam
+Allaman
+Allan
+Allard
+Allaway
+Allaye-Chan
+Allen
+Alles
+Alleva
+Alleyne
+Allgood
+Allison
+Allman
+Allwork
+Almeddahim
+Almon
+Alms
+Aloi
+Alomari
+Alperovich
+Alred
+Alsaleh
+Alshabout
+Alsop
+Alspaugh
+Alston
+Alswiti
+Altadonna
+Altay
+Alteen
+Altekar
+Altherr
+Alting-Mees
+Altman
+Altmann
+Alvarez
+Alvaro
+Alvi
+Aly
+Alzofon
+Amalu
+Amarsi
+Amato
+Amavisca
+Ambach
+Ambler
+Ambroise
+Ameen
+Amelkar
+America
+Amick
+Amin
+Amini
+Aminzadeh
+Amiot
+Amir
+Amlani
+Amorim
+Amos
+Amott
+Amouzgar
+Amstutz
+Amu
+Amundsen
+Ananmalay
+Ananth
+Anastasiadis
+Anastasio
+Anaya
+Ancel
+Anchia
+Anconetani
+Anctil
+Ander
+Andersen
+Anderson
+Anderton
+Andrade
+Andrassy
+Andre
+Andreasen
+Andreessen
+Andreatos
+Andress
+Andrew
+Andrews
+Andric
+Andros
+Andrukat
+Andrusiak
+Andruzzi
+Ange
+Angeli
+Angell
+Angerer
+Angermeyr
+Anglin
+Angobaldo
+Angus
+Angustia
+Angvall
+Anhorn
+Anker
+Annab
+Annabelle
+Annable
+Annas
+Annibale
+Annunziata
+Anolik
+Ansley
+Ansorger
+Anstead
+Anstett
+Anthonissen
+Anthony
+Antinucci
+Antkowiak
+Antle
+Antoft
+Antonarelli
+Antonelli
+Anwar
+Anzarouth
+Anzures
+Aoki
+Aparicio
+Apostolopoulos
+Appell
+Appenzeller
+Applebaum
+Applegarth
+Appleyard
+Applications
+Appugliese
+Apter
+Arabadjis
+Arai
+Aramideh
+Aravamudhan
+Arbuckle
+Archambault
+Archer
+Archibald
+Arcouet
+Ard
+Ardiel
+Ardizone
+Ardoin
+Arellano
+Arend
+Ares
+Areu
+Argento
+Arias
+Aribindi
+Arkesteijn
+Arko
+Armbruster
+Armenakis
+Armenta
+Armentrout
+Armes
+Armitage
+Armolavicius
+Armour
+Armstead
+Armstrong
+Arnauld
+Arnold
+Arnon
+Arnone
+Arnott
+Aronovich
+Aronson
+Aronstam
+Arora
+Arpin
+Arro
+Arsena
+Arsenault
+Arseneau
+Arthur
+Artola
+Artspssa
+Artuso
+Artzer
+Arunachalam
+Arvin
+Arwakhi
+Aryavong
+Asawa
+Asbill
+Ascott
+Asdel
+Asfazadour
+Asghar
+Asgharzadeh
+Ashar
+Ashbee
+Ashberry
+Ashby
+Ashdown
+Ashford
+Ashley
+Ashmore
+Ashraf
+Ashton
+Ashurkoff
+Ashwood-Smith
+Ashworth
+Asing
+Asistores
+Askins
+Asprer
+Asquin
+Assaad
+Asselin
+Assenza
+Assistance
+Associates
+Astalos
+Astle
+Astley
+Aston
+Astor
+Astorino
+Atalla
+Atcheson
+Atchison
+Athanassiadis
+Athwal
+Atkins
+Atkinson
+Atl
+Atlantic
+Atoui
+Atprs
+Attanasio
+Attarchi
+Attard
+Attaway
+Attenborough
+Atteridge
+Attfield
+Atwater
+Atwell-Byrne
+Au
+Au-Yang
+Au-Yeung
+AuYeung
+Aubin
+Aubrey
+Aubuchon
+Aucoin
+Aud
+Audet
+Audette
+Auerbach
+Augeri
+Augustus
+Auker
+Aula
+Aulakh
+Auld
+Ault
+Aumoine
+Aurelius
+Auriol
+Ausley
+Austin
+Australia
+Auth
+Auton
+Autoquote
+Avard
+Avellaneda
+Averett
+Averette
+Averill
+Aversa
+Avery
+Avirett
+Awadalla
+Awadia
+Awan
+Awano
+Axberg
+Ayandeh
+Ayaz
+Aydin
+Ayers
+Ayles
+Aylwin
+Ayotte
+Ayoubzadeh
+Ayoup
+Ayrault
+Ayre
+Ayres
+Ayscue
+Ayukawa
+Ayyuce
+Azad
+Azar
+Azari
+Azarshahi
+Azer
+Azevedo
+Aziz
+Azizuddin
+Azmak
+Azzuolo
+Baab
+Baader
+Babalola
+Babasaki
+Babb
+Babcock
+Baber
+Babin
+Babineau
+Babione
+Babyak
+Baccari
+Bacchiochi
+Bacciaglia
+Bach
+Bachecongi
+Bachelu
+Bachewich
+Bachmann
+Bachner
+Bachynski
+Backshall
+Baddeley
+Badelt
+Badenoch
+Badger
+Badjari
+Badmington
+Badowski
+Badza
+Bae
+Baenziger
+Baer
+Baerg
+Bagetakos
+Bagg
+Baggerman-Webster
+Baghdadi
+Bagi
+Bagnato
+Bagshaw
+Bagwell
+Bahgat
+Bahia
+Bahl
+Bahoric
+Bailetti
+Bailey
+Bailie
+Baillargeon
+Bailloux
+Bain
+Bainer
+Baines
+Bains
+Bainton
+Baird
+Bajada
+Bajpeyi
+Bakay
+Baker
+Baker-Gregory
+Bakhach
+Bakkum
+Balaban
+Balabanian
+Balakrishnan
+Balanger
+Balascak
+Balcom
+Balderston
+Baldock
+Baldridge
+Baldwin
+Bales
+Balgalvis
+Balkenhol
+Balkissoon
+Ballantine
+Ballard
+Ballarte
+Ballinger
+Ballios
+Ballou
+Ballyk
+Balmer
+Balog
+Balogh
+Balsas
+Balser
+Balter
+Baltodano
+Balutis
+Bambach
+Bame
+Bamfo
+Banaei
+Bandel
+Banens
+Banerd
+Banerjee
+Banez
+Banfalvi
+Bangert
+Bangia
+Banigan
+Banik
+Bankhead
+Banks
+Bannai
+Bannan
+Bannard
+Bannister
+Bansal
+Banu
+Banville
+Baquero
+Barabash
+Baragar
+Barakat
+Baran
+Barbary
+Barbe
+Barbeau
+Barberena
+Barbour
+Barclay
+Barcza
+Bardsley
+Bareham
+Barel
+Barenie
+Barentsen
+Barfield
+Barham
+Baribeau
+Baril
+Barker
+Barkhouse
+Barkley
+Barksdale
+Barkwill
+Barlow
+Barnaby
+Barnes
+Barnett
+Barnhardt
+Barnhart
+Barnhill
+Barnhouse
+Barnickel
+Barnwell
+Barolet
+Barr
+Barraclough
+Barrass
+Barrell
+Barrett
+Barreyre
+Barrientos
+Barriere
+Barrington
+Barritt
+Barron
+Barrows
+Barry
+Barsch
+Barsky
+Barsony
+Barstow
+Barszczewski
+Bartholomew
+Bartkowska
+Bartlett
+Bartley
+Bartolucci
+Barton
+Bartoszewicz
+Bartra
+Bartram
+Bartush
+Barty
+Bartz
+Barwikowski
+Basa
+Basco
+Bascombe
+Bashton
+Bashyam
+Basile
+Basinger
+Baskaran
+Baskerville
+Baskin
+Basladynski
+Basmadjian
+Basnett
+Bason
+Basser
+Bassett
+Bassignana
+Bassil
+Basta
+Bastarache
+Bastien
+Basu
+Batchelder
+Batchelor
+Batchoun
+Bateman
+Bates
+Bathrick
+Batson
+Battersby
+Battershill
+Battiston
+Batura
+Baudais
+Bauer
+Baughan
+Baugnon
+Baulch
+Baum
+Baumann
+Baumberg
+Baumert
+Bautista
+Bawek
+Baxter
+Bayer
+Bayerkohler
+Bayless
+Bayley
+Bayly
+Bayne
+Baynes
+Bayno
+Bayola
+Bayraktar
+Bays
+Bazarjani
+Bazemore
+Bazerghi
+Bazerman
+Bazik
+Baziuk
+Bcs
+Beagley
+Beal
+Beall
+Beals
+Beardmore
+Bears
+Beasley
+Beato
+Beaton
+Beattie
+Beattie-Hillier
+Beatty
+Beaty
+Beaubien
+Beaucaire
+Beauchaine
+Beauchamp
+Beauchemin
+Beaudet
+Beaudette
+Beaudin
+Beaudoin
+Beaudry
+Beaule
+Beaulieu
+Beaumier
+Beaumont
+Beaupre
+Beausejour
+Beauvais
+Beavington
+Beavis
+Bebber
+Bebee
+Becan
+Bechtel
+Becke
+Becker
+Beckett
+Beckham
+Beckie
+Beckman
+Beckstead
+Beckwith
+Beconovich
+Becquart
+Bedard
+Bedford
+Bedi
+Bedient
+Bedlington
+Bednar
+Bedoya
+Bedrosian
+Beebe
+Beeby
+Beecker
+Beehler
+Beekman
+Beeman
+Beerkens
+Beers
+Bees
+Beeston
+Beeton
+Befanis
+Beffert
+Beggs
+Begley
+Behlen
+Behler
+Behm
+Behnam
+Behrens
+Behroozi
+Beil
+Beilin
+Beine
+Beique
+Beisel
+Beitinjaneh
+Bejar
+Bekkedam
+Bektas
+Belair
+Belaire
+Beland
+Belanger
+Belboul
+Belcher
+Belcourt
+Belford
+Belich
+Belir
+Belisle
+Belk
+Bellefeuille
+Bellehumeur
+Bellew
+Belley
+Bellington
+Bellis
+Bello
+Bellosa
+Belmont
+Belohoubek
+Belrango
+Belson
+Belton
+Belzile
+Bemiller
+Bemis
+Ben-Ishai
+Benavides
+Benavidez
+Benchimol
+Benda
+Bender
+Beneda
+Benedek
+Benedetti
+Benefield
+Benefits
+Beneteau
+Benfield
+Benge
+Bengtson
+Benham
+Beninger
+Benjamin
+Benjes
+Bennatt
+Benne
+Bennefeld
+Benner
+Bennett
+Benning
+Bennison
+Benoit
+Benschop
+Benski
+Benson
+Benthin
+Bentley
+Bento
+Benton
+Benwell
+Benyamin-Seeyar
+Benyon
+Benzick
+Benzie
+Berek
+Berenbach
+Beresnikow
+Bereza
+Bergado
+Berger
+Bergeron
+Bergeson
+Bergland
+Bergman
+Bergmann
+Bergquist
+Bergsma
+Bergstrom
+Bergwerff
+Berhane
+Beriault
+Berkley
+Berman
+Bermel
+Berna
+Bernard
+Bernardi
+Bernardo
+Berndt
+Berneche
+Bernhardt
+Bernier
+Berning
+Bernstein
+Berrisford
+Berro
+Berryhill
+Berteau
+Berthelet
+Bertignoll
+Bertini
+Bertolini
+Bertram
+Bertrand
+Berube
+Beshai
+Besharah
+Beshir
+Besnier
+Besse
+Bessell
+Bessette
+Bessey
+Besson
+Bessuille
+Bestavros
+Beswick
+Betcher
+Bethune
+Beton
+Betsill
+Bettadapur
+Betterley
+Betters
+Betts
+Beun
+Beuren
+Beveridge
+Beverly
+Bevington
+Bezanson
+Bezdel
+Beznowski
+Bhandari
+Bharadwa
+Bhardwaj
+Bhasin
+Bhaskar
+Bhatia
+Bhatt
+Bhattacharya
+Bhatti
+Bhoday
+Bhullar
+Biage
+Bialkenius
+Biamonte
+Bianchi
+Biard
+Bible
+Bibr
+Bice
+Bickford
+Bidetti
+Biedermann
+Biel
+Bielan
+Bielby
+Bielecki
+Bielejeski
+Bienek
+Bienia
+Bierbrier
+Bierman
+Biermann
+Biersach
+Bieszczad
+Bigelow
+Biggers
+Biggerstaff
+Biggs
+Bigley
+Bigras
+Bihl
+Bijjani
+Bijman
+Bijons
+Bilanski
+Billard
+Billing
+Billingham
+Billoteau
+Bilodeau
+Bilovus
+Bilsborough
+Bilton
+Binda
+Binder
+Binggeli
+Bingham
+Binner
+Binnington
+Bins
+Bir
+Biray
+Birk
+Birkett
+Birks
+Birkwood
+Birtch
+Bisch
+Biss
+Bissegger
+Bissette
+Bisson
+Bissonnette
+Bittenbender
+Bittman
+Bitton
+Bivens
+Bizga
+Bjorklund
+Bjornson
+Blaauw
+Blackard
+Blackburn
+Blacker
+Blackley
+Blacklock
+Blackman
+Blackshaw
+Blackshire
+Blackwelder
+Blackwell
+Blackwood
+Bladon
+Blaiklock
+Blaine
+Blair
+Blais
+Blake
+Blake-Knox
+Blakemore
+Blakeslee
+Blakey
+Blakkolb
+Blalock
+Blanchard
+Blanche
+Blanchet
+Blanchette
+Blanco-Alonso
+Blander
+Blankenship
+Blann
+Blaschuk
+Blasing
+Blasko
+Blatherwick
+Blatt
+Blauer
+Blaufus
+Blaylock
+Blazejewski
+Blazek
+Blazer
+Bleile
+Blenk
+Blenkarn
+Blesi
+Blethen
+Bleuer
+Blevins
+Blezard
+Blidy
+Blimkie
+Blissett
+Blodgett
+Bloedon
+Bloemker
+Blois
+Blomquist
+Bloodworth
+Blostein
+Blouin
+Blount
+Bluethner
+Blum
+Blumenfeld
+Blumer
+Bluschke
+Bly
+Blyskal
+Blyszczak
+Blythe
+Bmethods
+Bnrecad
+Bnrinfo
+Bnrlsi
+Bnrsport
+Boal
+Boarder
+Boase
+Boatwright
+Bobar
+Bobbitt
+Boccali
+Bockaj
+Bocklage
+Bocservice
+Boddeveld
+Boden
+Bodford
+Bodin
+Bodkin
+Bodnar
+Boeck
+Boecke
+Boehlke
+Boehms
+Boersma
+Boeyen
+Bogal
+Bogart
+Bogert
+Boggan
+Boggia
+Boggild
+Boggs
+Bogumill
+Bohanan
+Bohannon
+Bohn
+Bohner
+Boileau
+Boily
+Boinnard
+Bois
+Boisseau
+Boisset
+Boisvert
+Boivin
+Bojeck
+Bokanovich
+Bokij
+Bokish
+Boland
+Bolding
+Bolduc
+Boleda
+Boles
+Bolgos
+Bolio
+Bolli
+Bolly
+Bolon
+Bolouri
+Bolsinger
+Bolton
+Bolzon
+Bomba
+Bombardier
+Bommakanti
+Bommer
+Bomstein
+Bonahoom
+Bondurant
+Bonfanti
+Bongers
+Bonnar
+Bonneau
+Bonnefoy
+Bonner
+Bonneville
+Bonney
+Bonnin
+Bono
+Boocock
+Booker
+Booking
+Bookings
+Boone
+Boorne
+Boorse
+Boos
+Boose
+Boothroyd
+Bopp
+Boppana
+Boraie
+Boray
+Borcic
+Bordage
+Boreham
+Borek
+Borel
+Borg
+Borgia
+Borha
+Borkowicz
+Borman
+Borodajluk
+Borojevic
+Borosch
+Borosh
+Boroski
+Boroughs
+Borowiecki
+Borozny
+Borrelli
+Borsa
+Borsato
+Borson
+Bortenstein
+Borthwick
+Bortolussi
+Borum
+Boruslawski
+Borza
+Borzic
+Bosch
+Boschin
+Boscio
+Bosco
+Bose
+Bosiljevac
+Bosnyak
+Bossa
+Bossert
+Bossett
+Bossler
+Bostelmann
+Bostock
+Boswell
+Boswick
+Bosworth
+Bosy
+Bot
+Bothwell
+Bott
+Botting
+Bottis
+Botto
+Bottomley
+Bottoms
+Botyrius
+Bouchard
+Boucher
+Boucouris
+Boudin
+Boudreau
+Bouffard
+Bouick
+Boulais
+Boulay
+Boulerice
+Boulos
+Boult
+Bounds
+Bour
+Bourahla
+Bourbonnais
+Bourcier
+Bourdeau
+Bourdignon
+Bourdin
+Bouret
+Bourgaize
+Bourgault
+Bourget
+Bourgon
+Bourguignon
+Bourk
+Bourland
+Bourlet
+Bourne
+Bouroncle
+Bourque
+Bourret
+Bousfield
+Boutilier
+Boutin
+Boutnikoff
+Boutot
+Bovat
+Bovee
+Bovenizer
+Bovey
+Bowab
+Bowcock
+Bowden
+Bowen
+Bowens
+Bower
+Bowers
+Bowes
+Bowick
+Bowler
+Bowles
+Bowling
+Bowser
+Bowyer
+Boyachek
+Boyajian
+Boyce
+Boyd
+Boye
+Boyea
+Boyer
+Boyes
+Boylan
+Boyle
+Boynton
+Bozeman
+Bozicevich
+Braaksma
+Brabant
+Brabec
+Bracewell
+Brackin
+Bracy
+Bradbury
+Bradd
+Braddock
+Braddy
+Bradee
+Bradford
+Brading
+Bradley
+Bradlow
+Bradshaw
+Brady
+Bradyhouse
+Bragado
+Braganza
+Bragg
+Braginetz
+Braham
+Brailey
+Brait
+Brambley
+Bramlett
+Branchaud
+Brandel
+Brander
+Brandon
+Brandsen
+Brandstadt
+Brandt
+Brandvold
+Branham
+Brann
+Brannan
+Brannen
+Brannick
+Brannon
+Brans
+Branscombe
+Brantley
+Brar
+Brashear
+Brasington
+Brassard
+Brasselle
+Brassem
+Brasset
+Brasunas
+Brathwaite
+Bratten
+Brauer
+Brault
+Braum
+Braun
+Braunstien
+Braverman
+Brawley
+Brazeau
+Brearley
+Breault
+Bredeck
+Bredfeldt
+Breedlove
+Breglec
+Brehm
+Breisch
+Breiten
+Bremner
+Brennan
+Brennand
+Brennen
+Brent
+Breon
+Brese
+Bresee
+Breslin
+Bresnahan
+Bresnan
+Bress
+Breton
+Brett
+Breuer
+Brevard
+Brewer
+Brewster
+Brewton
+Briante
+Briard
+Brichetto
+Brickey
+Brickman
+Briden
+Bridenstine
+Bridgeford
+Bridges
+Bridgman
+Brieda
+Briel
+Brien
+Briere
+Brierley
+Briggs
+Brightwell
+Brind'Amour
+Brindley
+Briner
+Bringhurst
+Brinklow
+Brinkman
+Brintnell
+Brisby
+Brisebois
+Brissette
+Brisson
+Britman
+Britt
+Brittain
+Britto
+Britton
+Brivet
+Brivins
+Brkich
+Broadfoot
+Broadhead
+Broadwell
+Broberg
+Broca
+Brocato
+Brock
+Brockhouse
+Brocklebank
+Brockmann
+Brockmeyer
+Brockschmidt
+Brodersen
+Brodfuehrer
+Brodgen
+Brodie
+Brodman
+Brodowski
+Brody
+Brogden
+Brogdon
+Brogley
+Brokaw
+Brombal
+Bromley
+Bronec
+Bronk
+Brooke
+Brooker
+Brookes
+Brookhart
+Brookhouse
+Brooks
+Brooksbank
+Broome
+Brophy
+Broschuk
+Brossard
+Brosselard
+Brosso
+Brost
+Brostrom
+Broten
+Brothers
+Brotherton
+Brough
+Broughton
+Brouillette
+Broulik
+Broussard
+Brousseau
+Brouthillier
+Brouwer
+Brovont
+Brower
+Brown-Gillard
+Browne
+Brownfield
+Browning
+Brownlee
+Brownlie
+Brownridge
+Brox
+Broyles
+Brubaker
+Bruce
+Bruder
+Bruhl
+Bruin
+Bruketa
+Brule
+Brum
+Brummitt
+Brummund
+Brunato
+Bruncati
+Bruneau
+Brunelle
+Bruner
+Bruner-Uebelhoer
+Brunet
+Brungardt
+Brunke
+Brunner
+Brunner-Walker
+Bruno
+Brunoni
+Brunsting
+Brunton
+Brushey
+Bruxvoort
+Bryan
+Bryant
+Brydges
+Brydon
+Bryenton
+Brys
+Bryttan
+Bubak
+Bubel
+Bucci
+Buchan
+Buchanan
+Buchko
+Buckalew
+Buckhoff
+Buckingham
+Buckley
+Bucklin
+Buckman
+Buckner
+Buczek
+Budd
+Buder
+Budhram
+Budihardjo
+Budimirovic
+Buechner
+Buehler
+Buettgen
+Buffam
+Buffett
+Buford
+Bugajska
+Bugajski
+Buggie
+Buhler
+Buhr
+Buhrkuhl
+Bui
+Bujold
+Buker
+Bukowski
+Bukta
+Bulan
+Bulanda
+Bulbrook
+Bulengo
+Buley
+Bulger
+Bulifant
+Bulitka
+Bulka
+Bulkovshteyn
+Bullard
+Bullas
+Bullen
+Bullett
+Bullinger
+Bullion
+Bulman
+Bulmanis
+Bulmer
+Bulz
+Bumgarner
+Bumstead
+Bunce
+Bundschuh
+Bundy
+Bunker
+Bunn
+Bunner
+Bunting
+Buntrock
+Bunzey
+Buratynski
+Burbage
+Burbidge
+Burcew
+Burchat
+Burchby
+Burdett
+Burdette
+Burdick
+Burega
+Burek
+Burge
+Burger
+Burgi
+Burgin
+Burkard
+Burke
+Burkepile
+Burkert
+Burkett
+Burkey
+Burkhardt
+Burleigh
+Burleson
+Burnage
+Burness
+Burnet
+Burnett
+Burnette
+Burney
+Burns
+Burnside
+Burr
+Burrell
+Burrowes
+Burrows
+Burrus
+Burruss
+Burton
+Burwell
+Busby
+Buscaglia
+Buscarino
+Busch
+Busche
+Buschelman
+Bush
+Bushell
+Bushnell
+Bushnik
+Buskard
+Buske
+Buskens
+Busko
+Bussewitz
+Bussey
+Bustillos
+Busuttil
+Butcher
+Butner
+Butta
+Butterfield
+Butters
+Buttrey
+Butts
+Butvich
+Buxton
+Buzzell
+Bvworks
+Bycenko
+Byczko
+Bydeley
+Byer
+Byers
+Byk
+Bykowy
+Bylina
+Byrd
+Byrgesen
+Byrne
+Byrnes
+CHOCS
+COKOL
+CPM
+CSR
+Cabaniss
+Cabral
+Caceres
+Cacha
+Cachero
+Cadd
+Cadeau
+Cadieux
+Cadshare
+Cadtools
+Cadzow
+Cae
+Caffrey
+Caffry
+Caglayan
+Cahill
+Cai
+Caie
+Cain
+Caine
+Caines
+Cairns
+Caison
+Cakarevic
+Calcote
+Calder
+Caldwell
+Caleta
+Calhoun
+Calis
+Calistoga
+Calistro
+Calkins
+Callaghan
+Callahan
+Callanan
+Calleja
+Callender
+Callery
+Callos
+Calloway
+Calmejane
+Calmenson
+Calow
+Caltrider
+Calva
+Calvin
+Camblin
+Cambre
+Camel-Toueg
+Cameron
+Camet
+Camillucci
+Camirand
+Campagna
+Campanella
+Campara
+Campbell
+Campbell-Tapp
+Campeau
+Camplone
+Campos
+Canada
+Canavan
+Cancela
+Candelario
+Canfield
+Cannataro
+Cano
+Cantlie
+Cantrell
+Cantwell
+Canuel
+Capelle
+Capes
+Capindale
+Caple
+Caplinger
+Capobianco
+Capostagno
+Capozzi
+Capps
+Capretta
+Captives
+Caputo
+Carbajal
+Carbonara
+Carbone
+Carboni
+Carbonneau
+Cardella
+Carden
+Cardozo
+Cards
+Careers
+Carella
+Caresani
+Carevic
+Carew
+Carey
+Cargill
+Cargnelli
+Carignan
+Carkner
+Carlberg
+Carldata
+Carle
+Carlebach
+Carli
+Carlin
+Carling
+Carlisle
+Carlock
+Carlos
+Carlsen
+Carlson
+Carlton
+Carlyle
+Carmichael
+Carmody
+Carmona
+Carnegie
+Carnogursky
+Caron
+Carpentier
+Carpool
+Carr
+Carranza
+Carriere
+Carrillo
+Carrmtce
+Carroll
+Carron
+Carruthers
+Carson
+Carsten
+Carstensen
+Carswell
+Carter
+Carty
+Carufel
+Caruk
+Caruso
+Caruth
+Carver
+Casadonte
+Casalou
+Casanova
+Casas
+Cascarini
+Casey
+Cashin
+Caskey
+Casler
+Casnji
+Casper
+Casperson
+Cassady
+Cassar
+Cassat
+Cassese
+Cassidy
+Casson
+Castaban
+Castell
+Castelloe
+Casten
+Castillo
+Casto
+Castonguay
+Castro
+Castro-Herrera
+Castronova
+Catanach
+Caterina
+Catering
+Catherwood
+Catlett
+Cato
+Caton
+Cau
+Caudill
+Caudle
+Cauthen
+Cauthers
+Cavan
+Cavanagh
+Cavasin
+Cavasso
+Caves
+Cavill
+Caviness
+Cavnar
+Cawley
+Cayer-Fleck
+Cayless
+Cayouette
+Caza
+Cech
+Cecil
+Cegelski
+Celestin
+Cellucci
+Cemensky
+Cencier
+Centeno
+Center
+Centers
+Centis
+Centre
+Ceponis
+Ceranic
+Cerny
+Cervantes
+Cesaratto
+Cesario
+Cescon
+Cetraro
+Chaaban
+Chaar
+Chabrat
+Chacko
+Chacon
+Chaddha
+Chaddock
+Chadha
+Chadwick
+Chafin
+Chafy
+Chagnon
+Chahal
+Chai
+Chai-Seong
+Chaikowsky
+Chaintreuil
+Chaisupakosol
+Chakrabarty
+Chakraborty
+Chakravarti
+Chalifour
+Chalker
+Challice
+Chalmers
+Chamard
+Chamayou
+Chambers
+Chambliss
+Champion-Demers
+Champsi
+Chamsi
+Chan
+Chanchlani
+Chanco
+Chandan
+Chandra
+Chandran
+Chandrashekar
+Chane
+Chang
+Changes
+Channa
+Channell
+Channen
+Chanonat
+Chanpong
+Chantal
+Chao
+Chapa
+Chapdelaine
+Chapen
+Chapin
+Chapleau
+Chaplin
+Chapman
+Chapmond
+Chappell
+Chappuis
+Chaput
+Charbonneau
+Charchanko
+Chardon
+Charest
+Charette
+Chari
+Charko
+Charlebois
+Charlino
+Charlinski
+Charlton
+Charney
+Charron
+Charter
+Chartier
+Chartrand
+Chasse
+Chatel
+Chatfield
+Chatha
+Chatterley
+Chatterton
+Chattoe
+Chattos
+Chau
+Chaudhary
+Chaudhry
+Chaudry
+Chauhan
+Chaurasia
+Chaurette
+Chautems
+Chauvin
+Chavers
+Chaves
+Chavez
+Chavis
+Chawla
+Chea
+Cheal
+Cheatham
+Cheba
+Checinski
+Checkland
+Chee
+Cheeseman
+Cheesman
+Cheetham
+Cheevers
+Chen
+Chenard
+Chenault
+Chene
+Cheney
+Cheng
+Chenier
+Chennette
+Chenoweth
+Chepregi
+Cher
+Cherkas
+Chern
+Chernetsky
+Cherng
+Cherrier
+Cheshire
+Chesser
+Chester
+Chesterfield
+Cheuk
+Cheung
+Cheval
+Chevarie
+Chhabria
+Chia
+Chiabaut
+Chiamvimonvat
+Chiang
+Chiarelli
+Chiavaroli
+Chickorie
+Chiem
+Chien
+Chik
+Chilausky
+Childerhose
+Childers
+Childree
+Childress
+Childs
+Chilibeck
+Chilton
+Chima
+Ching
+Chiniwala
+Chinnery
+Chiou
+Chirachanchai
+Chisholm
+Chisolm
+Chitkara
+Chitnis
+Chityal
+Chiu
+Chiverton
+Chiykowski
+Chmara
+Cho
+Choe
+Chohan
+Choi
+Cholet
+Cholette
+Cholewinski
+Chomik
+Chona
+Chong
+Choo
+Choo-Kang
+Chopowick
+Choptovy
+Choquette
+Chorley
+Chotkowski
+Chou
+Choudhury
+Chouhan
+Chouinard
+Chowhan
+Choy
+Choynowska
+Chrisman
+Christensen
+Christian
+Christiansen
+Christianson
+Christie
+Christl
+Christopher
+Christy
+Chronowic
+Chu
+Chuah
+Chubb
+Chugha
+Chui
+Chummun
+Chun
+Chung
+Chungphaisan
+Chunn
+Churas
+Churchill
+Chychrun
+Chytil
+Ciampini
+Cianci
+Ciancibello
+Ciaralli
+Ciaschi
+Ciccarelli
+Cicchino
+Cicci
+Cicek
+Cicero
+Ciesielski
+Cifelli
+Cifersky
+Cigay
+Cimino
+Cimolai
+Cinar
+Cinicolo
+Cinq-Mars
+Ciocca
+Ciochon
+Cioffi
+Ciolfi
+Cipolla
+Circe
+Cirulli
+Cisco
+Ciskowski
+Citarelli
+Cividino
+Cizmar
+Clacher
+Claggett
+Clairmont
+Claise
+Clampitte
+Clancy
+Clapham
+Clapp
+Clark
+Clark-Stewart
+Clarka
+Clarke
+Clarkson
+Clary
+Clason
+Claveau
+Claxton
+Claybrook
+Clayton
+Cleary
+Cleere
+Clegg
+Clemens
+Clements
+Clemmons
+Clendening
+Clenney
+Clerke
+Cleroux
+Clifford
+Clifton
+Clinckett
+Cline
+Clinger
+Clinkard
+Clinton
+Clipperton
+Clipsham
+Clites
+Clocklab
+Cloherty
+Clooney
+Closson
+Clost
+Clough
+Clouthier
+Cloutier
+Clow
+Cluett
+Clusiau
+Clysdale
+Co
+Co-op
+Co-ordinator
+Coady
+Coallier
+Coathup
+Coats
+Cobaugh
+Cobb
+Cobban
+Cobbold
+Coble
+Cobley
+Cobo
+Cobran
+Cocco
+Cochran
+Cochrane
+Cockburn
+Cocke
+Cockins
+Cocos-Archive
+Codack
+Codata
+Coddington
+Codoc
+Codrington
+Cody
+Coe
+Coffey
+Cogan
+Cogdell
+Coggins
+Coghlan
+Cogwell
+Cohea
+Cohen
+Cohn-Sfetcu
+Cohoe
+Cohrs
+Colagrosso
+Colangelo
+Colantonio
+Colbert
+Colbourne
+Colby
+Colclasure
+Coldwell
+Cole
+Coleman
+Coles
+Coley
+Colford
+Colgan
+Collazo
+Collecutt
+Colledge
+Collette
+Collevecchio
+Colley
+Collier
+Collins
+Collis
+Collyer
+Coloads
+Colontonio
+Colpitts
+Colquette
+Colquhoun
+Colquitt
+Colston
+Colter
+Colterman
+Colton
+Colucci
+Colvin
+Colwell
+Combaz
+Combee
+Combellack
+Combos
+Combs
+Comeau
+Comley
+Comm
+Commazzi
+Comments
+Committe
+Commons
+Communication
+Communications
+Comp
+Compton
+Comstock
+Comtois
+Conboy
+Conde
+Condurelis
+Conerly
+Coneybeare
+Congdon
+Conistis
+Conklin
+Conley
+Conlin
+Conlon
+Connell
+Connelly
+Conner
+Conners
+Connolly
+Connor
+Connors
+Connors-Cronin
+Conoly
+Conrad
+Conrath
+Conroy
+Constable
+Constantin
+Constantine
+Constantinescu
+Constantinides
+Constantino
+Constantinof
+Consultancy
+Contardo
+Conte
+Contine
+Contomichalos
+Conway
+Coochey
+Coody
+Coogan
+Cooke
+Cooksey
+Cooley
+Coombs
+Cooney
+Cooper
+Coord
+Coordinator
+Coors
+Copeland
+Copello
+Copeman
+Copes
+Copleston
+Copley
+Copp
+Coppedge
+Coppins
+Coqueugniot
+Corace
+Corbeil
+Corbett
+Corbin
+Corbitt
+Corcoran
+Cordell
+Cordy
+Corey
+Coriaty
+Corker
+Corkey
+Corkum
+Corless
+Corlett
+Corley
+Cormier
+Cornaro
+Cornell
+Corner
+Corpening
+Corr
+Correa
+Correia
+Corrigan
+Corritore
+Corriveau
+Corsale
+Corse
+Corson
+Corvo
+Cosburn
+Cosentino
+Cosgrove
+Cosner
+Cossota
+Costa
+Costache
+Costadimas
+Costandi
+Costantino
+Costanzino
+Costas
+Coste
+Costello
+Costelloe
+Costen
+Cote
+Cothran
+Cotnam
+Cotner
+Cotten
+Cottengim
+Cotter
+Cottingham
+Cottrell
+Cotugno
+Cotuna
+Coucopoulos
+Couey
+Coughran
+Coules
+Coulman
+Coulombe
+Coulson
+Coulter
+Coulterman
+Coupal
+Coupland
+Courchesne
+Couron
+Coursey
+Coursol
+Courson
+Courtadm
+Courtney
+Courville
+Couse
+Couser
+Cousineau
+Cousins
+Coutellier
+Couto
+Coutu
+Couture
+Covach
+Coverdale
+Covey
+Coviensky
+Coville
+Covington
+Cowan
+Cowart
+Cowell
+Cowen
+Cowick
+Cowley
+Cowling
+Cownie
+Cowper
+Coxall
+Coxe
+Coyle
+Coyne
+Cozart
+Cozyn
+Cozzi
+Crabb
+Crabe
+Crabtree
+Cracknell
+Craddock
+Crafton
+Craggs
+Craghead
+Craib
+Craig
+Craig-Dupuis
+Crain
+Cramer
+Cramm
+Crampton
+Cranston
+Crapco
+Crase
+Craver
+Crawford
+Crawhall
+Crawley
+Crawshaw
+Craycraft
+Cre
+Creamer
+Crean
+Creane
+Creasey
+Creasman
+Credico
+Credille
+Creech
+Creecy
+Cregan
+Creighton
+Cremer
+Crepeau
+Crerar
+Creswell
+Crews
+Cribbs
+Crick
+Crickard
+Cricker
+Crigger
+Crippen
+Cripps
+Crisler
+Cristescu
+Criswell
+Critchley
+Crocker
+Crockett
+Crogie
+Croisetiere
+Crolla
+Crompton
+Cromwell
+Cronan
+Cronin
+Cronk
+Cronkright
+Cronkwright
+Crooks
+Croom
+Cropper
+Crosby
+Crossley
+Crosson
+Crosswell
+Croteau
+Crothers
+Crotty
+Crowder
+Crowe
+Crowell
+Crowle
+Crowley
+Croxall
+Croxford
+Crozier
+Crucefix
+Cruey
+Cruickshank
+Crumpton
+Crutchfield
+Cruz
+Cruzado
+Csaszar
+Csenar
+Csop
+Csreport
+Ctas
+Cuany
+Cucchiaro
+Cucci
+Cuccioletta
+Cucuzzella
+Cuddihey
+Cuddihy
+Cuddy
+Cuellar
+Cuervo
+Cuffle
+Cuffling
+Cuggy
+Culberson
+Culbertson
+Culbreth
+Culham
+Culkin
+Cullen
+Culley
+Cullipher
+Cullum
+Culmer
+Culp
+Culver
+Culverhouse
+Cummine
+Cumming
+Cummings
+Cummins
+Cumpston
+Cung
+Cunha-Gomes
+Cunningham
+Cuper
+Cupido
+Curley
+Curmon
+Curnow
+Curran
+Currer
+Currie
+Currier
+Currin
+Curtin
+Curtis
+Cusato
+Cushing
+Cusick
+Cusson
+Custsupport
+Cusumano
+Cuthbert
+Cuthill
+Cutrufello
+Cuu
+Cwirzen
+Cyr
+Cytrynbaum
+Czappa
+Czarnecki
+Czeban
+Czychun
+D'Ambrosio
+D'Amico
+D'Amour
+D'Andrea
+D'Angelo
+D'Anjou
+D'Antonio
+D'Aoust
+D'Cruz
+D'Ingianni
+D'Ippolito
+D'Onofrio
+D'Orazio
+D'Silva
+D'Soto
+D'Souza
+D'lima
+DALE
+DDOCDB
+DMS
+DMSDB
+DPNBUILD
+DPP
+Da
+Da Gama
+Da Silva
+DaGama
+Daaboul
+Dacal
+Dace
+Dach
+Dachelet
+Dack
+Dacre
+Dada
+Dadalt
+Dadgar
+Dadkhah
+Dafoe
+Dagenais
+Dagert
+Dages
+Dagg
+Dagley
+Dagnall
+Dagoulis
+Dahan
+Dahl
+Dai
+Daigle
+Daigneault
+Dailey
+Daimee
+Dajerling
+Dal
+Daley
+Dall'oste
+Dallago
+Dallaire
+Dallal
+Dallas
+Dalmard
+Dalrymple
+Dalsiel
+Dalton
+Daly
+Dambenieks
+Damena
+Damerji
+Damiano
+Dana
+Danagher
+Danai
+Danbrook
+Dancy
+Dando
+Dandurand
+Dane
+Daneshzadeh
+Danforth
+Dangubic
+Daniel
+Danielak
+Daniells
+Daniels
+Danilowicz
+Daniluk
+Danjean
+Danker
+Danko
+Dann
+Dans
+Dansereau
+Dantu
+Dantzler
+Danzeisen
+Dao
+Daoud
+Daoust
+Daquano
+Darby
+Darcel
+Darcie
+Darcy
+Darden
+Dares
+Darlington
+Darnel
+Darnell
+Darou
+Darr
+Darrimon
+Darroch
+Darshi
+Darveau
+Das
+Dasch
+Dasd
+Dasilva
+Dasrath
+Dassani
+Dassie
+DataSupport
+Datacenter
+Datema
+Datta
+Dattalo
+Daudin
+Daugavietis
+Daugherty
+Daughtrey
+Daunais
+Dauphinais
+Dautenhahn
+Dauterive
+Davalo
+Davey
+David
+David-Yerumo
+Davidovich
+Davids
+Davidson
+Davies
+Davis
+Davison
+Davy
+Dawe
+Dawkins
+Dawson
+Daya
+Dayal
+Dayberry
+Daymond
+Db
+Dba
+Dbase
+Dbs
+De
+De Anda
+De Baets
+De Beaumont
+De Boer
+De Cecco
+De Coursey
+De Cristofaro
+De La
+De Leon
+De Los
+De Marco
+De Martino
+De Muinck
+De Souza
+De Toni
+De Varennes
+De Vito
+De Vries
+De Wiele
+De-Boer
+DeAcetis
+DeAlmeida
+DeBernardo
+DeBlois
+DeBrun
+DeBrusk
+DeCacqueray
+DeCiccio
+DeCoursin
+DeFacendis
+DeFalco
+DeFazio
+DeFord
+DeFrancesco
+DeGrandis
+DeHaan
+DeLargy
+DeLat
+DeLorenzo
+DeMarco
+DeNest
+DeNoon
+DePalma
+DeRaaf
+DeSalis
+DeSimone
+DeStefani
+DeWitte
+DeYoung
+DeZoete
+DeKoning
+Deagle
+Deak
+Deakin
+Dealto
+Deanda
+Deane
+Deans
+Dearaujo
+Deardurff
+Deason
+Deatherage
+Deatrick
+Debassige
+Debnam
+Deboer
+Debord
+Debortoli
+Decaire
+Decapua
+Decarie
+Decasper
+Decelles
+Decker
+Decleir
+Decourcy
+Deczky
+Dedas
+Deduk
+Dee
+Deek
+Deere
+Deery
+Deevey
+Defilippis
+Deforeit
+Defranchi
+Degan
+Degen
+Degenova
+Degraauw
+Deguines
+Deguire
+Dehghan
+Dehner
+Dehoff
+Deibert
+Deicher
+Deininger
+Deitiker
+Dejongh
+Dekeyser
+Del
+DelVecchio
+Delaat
+Delage
+Delahay
+Delaney
+Delangis
+Delbridge
+Delbrouck
+Deleon
+Delf
+Delgrosse
+Deligdisch
+Delisle
+Deliva
+Della
+Delle
+Delli
+Dellinger
+Delmar
+Delolmodiez
+Delong
+Delorenzi
+Delorme
+Delroy
+Deluca
+Deluce
+Deluco
+Delzer
+Demarest
+Demchuk
+Dement
+Demeo
+Demers
+Demetrick
+Demeulemeester
+Demidenko
+Demir
+Demjen
+Demone
+Demorest
+Demps
+Dempsey
+Dempster
+Demren
+Dendi
+Denebeim
+Deneen
+Denemark
+Denette
+Deng
+Denike
+Denis
+Denison
+Denley
+Denman
+Denmark
+Dennen
+Denney
+Denning
+Dennis
+Denno
+Denomme
+Denter
+Denton
+Denver
+Deol
+Depelteau
+Depew
+Dephoure
+Deployment
+Depooter
+Dept
+Derbyshire
+Derganc
+Dermardiros
+Derome
+Derosa
+Derrett
+Derry
+Dery
+DesMarais
+Desai
+Desantis
+Desautels
+Desch
+Deschamps
+Deschiffart
+Descoteaux
+Descotes
+Desgroseilliers
+Desharnais
+Desilets
+Desjardins
+Desjarlais
+Deslandes
+Deslaurier
+Deslauriers
+Desmond
+Desorbay
+Desourdy
+Despault
+Despinic
+Desplanque
+Despres
+Desrochers
+Desroches
+Desrosiers
+Dessain
+Destech
+Deugau
+Deugo
+Deutschmann
+Devarennes
+Devault
+Deveau
+Development
+Devenny
+Devenyi
+Devenyns
+Devera
+Devgon
+Devincenzi
+Devine
+Devlin
+Devore
+Devouges
+Devreeze
+Dewart
+Dewit
+Dewitt
+Deyirmendjian
+Dhaliwal
+Dhar
+Dhaussy
+Dhillon
+Dhir
+Dhuga
+Dhupar
+Di
+Di Cosola
+Di Giambattista
+Di Maso
+Di Millo
+Di Ninno
+DiFalco
+DiLoreto
+DiPasquale
+DiPerna
+DiPietro
+DiRienzo
+DiSisto
+DiTecco
+Diaconu
+Dias
+Diaz
+Dibenedetto
+Dibler
+Dicaprio
+Dickard
+Dickerson
+Dickeson
+Dickford
+Dickie
+Dickinson
+Dicks
+Dickson
+Didio-Duggan
+Dido
+Diduch
+Didylowski
+Diec
+Diederichs
+Diedrich
+Diee
+Diekman
+Diemel
+Diener
+Diep
+Dieplinger
+Diersch
+Diesing
+Dieter
+Dietrich
+Dieu
+Diffee
+Diffie
+Difilippo
+Difrancesco
+Digenova
+Digiacomo
+Digilio
+Dignam
+Dikaitis
+Dikens
+Dilallo
+Dilen
+Dilkie
+Dillabough
+Dillard
+Dilley
+Dillingham
+Dillon
+Dillow
+Dimarzo
+Dimillo
+Dimitry
+Dinalic
+Dinges
+Dingle
+Dingley
+Dingman
+Dinkel
+Dinnerville
+Dinnin
+Dinsmore
+Diogo
+Dion
+Dionne
+Dipace
+Dipierro
+Dipper
+Diradmin
+Dirbm
+Diretto
+Dirilten
+Disalvo
+Discenza
+Discover
+Disher
+Dishong
+Dispatch
+Dissinger
+Ditko
+Dittburner
+Dix
+Dixon
+Dmsrtime
+Dmuchalsky
+Doak
+Doan
+Dobbing
+Dobbins
+Dobbs
+Dobby
+Doble
+Dobransky
+Docherty
+Dockendorff
+Documentation-Grp
+Doczy
+Doda
+Dodd
+Dodds
+Dodgson
+Dodier
+Dodman
+Dodson
+Doerfel
+Doerksen
+Doerr
+Doggett
+Dohan
+Doherty
+Doi
+Doig
+Dokken
+Dokuzoguz
+Dolan
+Dolezal
+Dolginoff
+Dolgov
+Doliska
+Dolson
+Domanico
+Domas
+Domine
+Dominguez
+Dommety
+Donaghue
+Donahee
+Donahue
+Donak
+Donald
+Donaldson
+Donator
+Doncaster
+Doncell
+Donegan
+Donelan
+Dong
+Donkers
+Donleycott
+Donlon
+Donnelly
+Donner
+Donoghue
+Donohoe
+Donohue
+Donovan
+Doodeman
+Dooley
+Doolin
+Doolittle
+Dorais
+Doran
+Doray
+Dordari
+Dore
+Dorey
+Dorion
+Dorion-Magnan
+Doriot
+Doris-Hampton
+Dormer
+Dorn
+Dornback
+Dorotich
+Dorr
+Dorrell
+Dorronsoro
+Dorsey
+Dorval
+Dosanjh
+Dosenbach
+Doshi
+Doskas
+Doss
+Dost
+Dotsey
+Dotson
+Dottin
+Doublesin
+Doucet
+Doucette
+Doud
+Douet
+Dougall
+Dougherty
+Doughty
+Douglas
+Douglass
+Dourley
+Douville
+Dovel
+Dover
+Dovydaitis
+Dow
+Dowd
+Dowding
+Dowdy
+Dowell
+Dower
+Dowker
+Dowling
+Downer
+Downes
+Downey
+Downing
+Downs
+Dowse
+Dowser
+Doyle
+Doyon
+Dpierre
+Dpnqa
+Dpu
+Drabek
+Dracula
+Draffin
+Dragan
+Dragert
+Dragnea
+Drago
+Draier
+Drakage
+Drane
+Dransfield
+Draper
+Drappel
+Draves
+Dray
+Drayton
+Dreisbach
+Drenan
+Drennan
+Drescher
+Dresser
+Dressler
+Drewes
+Driedger
+Drinnan
+Driscoll
+Driver
+Drobnik
+Drolet
+Drop-Box
+Dropin
+Droste
+Drouin
+Drubld
+Drumheller
+Drummer
+Drummond
+Druzeta
+Drwiega
+Dryer
+Drynan
+Du Berger
+DuBois
+DuPaul
+DuPuis
+Dube
+Dubeau
+Dubee
+Dubose
+Dubreck
+Dubreuil
+Dubroff
+Dubroy
+Dubuc
+Duchaine
+Ducharme
+Duchesne
+Ducic
+Duda
+Dudas
+Dudgeon
+Dudley
+Dueck
+Duensing
+Dueppen
+Duffin
+Duffney
+Dufford
+Duffy
+Dufloth
+Dufour
+Dufresne
+Dugal
+Dugar
+Dugas
+Duggan
+Duguay
+Dukes
+Dula
+Dulaney
+Dulin
+Dulmage
+Dulude
+Dumais
+Dumas
+Dummer
+Dumont
+Dumouchel
+Dumouchelle
+Dunajski
+Dunbar
+Duncan
+Duncan-Smith
+Dundin
+Dunfield
+Dungan
+Dunham
+Dunik
+Dunkelman
+Dunlap
+Dunlay
+Dunlop
+Dunmore
+Dunn
+Dunne
+Dunnett
+Dunning
+Dunningham
+Dunnion
+Dunphy
+Dunsmore
+Dunson
+Dunstan
+Duong
+Duplacey
+Duplan
+Dupont
+Dupras
+Dupre
+Dupree
+Dupuis-Mignault
+Dupuy
+Duquette
+Duran
+Durant
+Durham
+Durie
+Durling
+Durnford
+Durose
+Durousseau
+Durovic
+Dursse
+Dusomos
+Duthie
+Dutil
+Dutt
+Duvarci
+Duxbury
+Duyck
+Dwyer
+Dyba
+Dybenko
+Dyck
+Dyess
+Dyke
+Dyment
+Dyna
+Dynie
+Dyrdahl
+Dysart
+Dyson
+Dziamba
+Dziawa
+Dziemian
+Dzioba
+ENG
+ETAS
+Eagles
+Eakes
+Eakins
+Eales
+Eansor
+Earles
+Earley
+Early
+Earnhardt
+Earps
+Easaw
+Eason
+Easson
+Easterling
+Eastick
+Eastland
+Eastman
+Easton
+Eastus
+Eaton
+Eaves
+Ebara
+Ebata
+Ebbinghaus
+Eberle
+Eberlin
+Ebert
+Ebrahim
+Eby
+Echols
+Ecker
+Eckert
+Eckhart
+Ecklund
+Eckstein
+Ecocafe
+Ecroyd
+Eddins
+Eddisford
+Edelman
+Eder
+Edey
+Edgar
+Edgette
+Edgreen
+Edkins
+Edmison
+Edmonds
+Edmondson
+Edmunds
+Edmxtest
+Edwards
+Edwige
+Edwin
+Efland
+Efstration
+Efthim
+Egan
+Egdorf
+Egerman
+Eggebraaten
+Eggersgluess
+Eggleton
+Egli
+Egner
+Ehlers
+Ehninger-Cuervo
+Ehrenfried
+Ehrenholz
+Ehrlich
+Eicher
+Eide
+Eierstock
+Eike
+Eimer
+Einarsson
+Einersen
+Eisele
+Eisen
+Eisenach
+Eisenhart
+Eisler
+Eisnor
+Eiswirth
+Eitner
+Ekiert
+El-Am
+El-Guebaly
+El-Hawary
+El-Torky
+Elam
+Elbeze
+Elbi
+Elchakieh
+Eldreth
+Eldridge
+Electronics
+Eleftheriou
+Eley
+Elgar
+Elgie
+Elgin
+Elhage
+Elhamahmy
+Elias
+Elie
+Elkaim
+Elkington
+Elkins
+Elks
+Ellacott
+Elledge
+Ellement
+Ellens
+Eller
+Ellerman
+Ellington
+Elliot
+Elliott
+Ellis
+Ellison
+Ellul
+Elms
+Elsing
+Elson
+Elting
+Elwood
+Ely
+Elzer
+Emami
+Emdin-Sproule
+Emerick
+Emerson
+Emery
+Emesh
+Emhart
+Emig
+Emili
+Emmell
+Emmerstorfer
+Emmert
+Emmons
+Emmott
+Emond
+Emory
+EmployeeClub
+Emrick
+Emro
+Encomenderos
+Endenburg
+Enderle
+Enders
+Endrys
+Endsley
+Enet
+Engel
+Engelberg
+Engelbrecht
+Engelhart
+Engineering
+England
+Engle
+Englebrick
+Engleman
+Englert
+English
+Engman
+Ennis
+Enns
+Enos
+Ensign
+Ensing
+Enstone
+Entwistle
+Environment
+Eow
+Eperjesy
+Eppenstiner
+Epperson
+Eppich
+Epplett
+Epps
+Epstein
+Epting
+Erbach
+Erbilgin
+Erfani
+Ergle
+Erguven
+Erichsen
+Erickson
+Eriksson
+Erkel
+Erler
+Erling
+Ermarkaryan
+Ermey
+Ernst
+Eroler
+Eros
+Ersil
+Erskine
+Ertan
+Ertl
+Ervi
+Erwin
+Esc
+Esch
+Escher
+Escobedo
+Escobido
+Escutin
+Esgate
+Esguerra
+Eshelman
+Eskew
+Eskicioglu
+Eskildsen
+Eslambolchi
+Esler
+Esliger
+Esmaili
+Esparza
+Espinosa
+Esposito
+Esry
+Esselbach
+Esser
+Essery
+Essig
+Esson
+Estabrooks
+Este
+Esteghamat
+Estep
+Estes
+Estey
+Estridge
+Eswara
+Etchieson
+Etemad
+Eteminan
+Ethier
+Ethington
+Etoh
+Etten
+Ettridge
+Ettson
+Etu
+Etzell
+Eu
+Eubanks
+Euler
+Eustace
+Eustis
+Eva
+Evans
+Eveleigh
+Evely
+Evenson
+Events
+Everett
+Everitt
+Evers
+Evraire
+Ewanchyna
+Ewart
+Ewasyshyn
+Ewing
+Exner
+Eyers
+Ezekiel
+Ezzat
+FASTONE
+FISOPN
+FWPtools
+Fab
+Fabijanic
+Fabris
+Fabrizio
+Fabry
+Fadel
+Fadlallah
+Fafara
+Fagan
+Fagg
+Fahey
+Fahrenthold
+Fahy
+Fainaru
+Fainecos
+Fairclough
+Fairless
+Fairlie
+Fairman
+Faison
+Fait
+Fajardo
+Falaki
+Falardeau
+Falbee
+Falcao
+Falconer
+Faletti
+Faley
+Falke
+Falkenstrom
+Falkner
+Fallah
+Fallahi
+Falletti
+Fallis
+Fallows
+Falquero
+Falt
+Familiadis
+Fanchi
+Fangio
+Fani
+Fann
+Fansher
+Fantauzzi
+Fanthome
+Fanus
+Faou
+Farag
+Farago
+Farah
+Farahvash
+Farant
+Fares
+Fargis
+Farhan
+Farias
+Farley
+Farmer
+Farnham
+Farnsworth
+Farnum
+Farquhar
+Farr
+Farranto
+Farrell
+Farren
+Farrington
+Farronato
+Farrow
+Faruque
+Fasken
+Fastfeat
+Fastpack
+Fater
+Fatica
+Fattouh
+Faubert
+Faucher
+Faulkner
+Faust
+Favell
+Favreau
+Favrot
+Fawcett
+Fazel
+Feddeman
+Feddersen
+Feder
+Federico
+Fedoruk
+Fedyk
+Feeley
+Feeney
+Fehr
+Feil
+Feild
+Feist
+Feith
+Felczak
+Feldberg
+Felder
+Feldman
+Felfli
+Felicetti
+Felix
+Felli
+Felske
+Feltman
+Felton
+Fenati
+Fender
+Fenez
+Fenn
+Fennell
+Fenner
+Fennessey
+Fenton
+Fenwick
+Fequiere
+Feregyhazy
+Ference
+Ferenz
+Fererro
+Ferguson
+Fergusson
+Ferland
+Fermoyle
+Fernald
+Fernandes
+Fernandez
+Fernando
+Ferner
+Ferrao
+Ferrara
+Ferraro
+Ferree
+Ferreira
+Ferrell
+Ferrer
+Ferrero
+Ferriera
+Ferriss
+Ferro
+Ferruzzi
+Fetterman
+Fetting
+Fetzko
+Feutlinske
+Fevre-Renault
+Feyen
+Ficco
+Ficici
+Ficken
+Ficker
+Fickes
+Fiegel
+Fielden
+Fielding
+Fields
+Fieldsup
+Fierthaler
+Fiest
+Fifield
+Figura
+Fikis
+Fildey
+Filer
+Filion
+Filippi
+Filkins
+Fillmore
+Filpus
+Filson
+Finak
+Finane
+Finckler
+Findlay
+Finkhelstein
+Finlayson
+Finley
+Finn
+Finnerty
+Finney
+Finnie
+Finnighan
+Finnon
+Finucane
+Finzel
+Fiore
+Fiorile
+Firat
+Firerobin
+Firment
+Firtos
+Fischer
+Fischetti
+Fiset
+Fisette
+Fishencord
+Fisher
+Fishman
+Fisico
+Fisprod
+Fiszman
+Fitch
+Fiteny
+Fitz
+Fitzgerald
+Fitzgibbons
+Fitzpatrick
+Fitzsimmons
+Fixsen
+Flach
+Flaherty
+Flanagan
+Flanders
+Flann
+Flansburg
+Flatley
+Fleischer
+Fleishman
+Fleming
+Fleskes
+Fletcher
+Fleuchaus
+Fleugel
+Fleurima
+Fleury
+Flewelling
+Flickinger
+Flindall
+Flintall
+Floch
+Flook
+Flookes
+Florence
+Flores
+Florescu
+Florez
+Florjancic
+Flowers
+Floyd
+Floysvik
+Fludgate
+Flueckinger
+Fluet
+Fluney
+Flury
+Fluty
+Flynn
+Fobert
+Focht
+Focsaneanu
+Fodell
+Foeppel
+Foessl
+Foest
+Fogelson
+Foght
+Fogle
+Fogleman
+Fok
+Foldes
+Foley
+Follett
+Follmer
+Folwell
+Fon
+Fondacaro
+Fong
+Fontaine
+Fontana
+Fontanilla
+Fontanini
+Foods
+Foong
+Foos
+Forbes
+Forbrich
+Forbs
+Forden
+Forecasting
+Foreman
+Forese
+Forester
+Forgeron
+Forghani
+Forgues
+Forland
+Formagie
+Forno
+Forrest
+Forrester
+Forslund
+Forster
+Forsythe
+Fortier
+Fortman
+Fortner
+Foss
+Fothergill
+Foubert
+Foucault
+Fouchard
+Fougere
+Fouillard
+Fouke
+Fouletier
+Foulkes
+Fouret
+Fournel
+Fourney
+Fournier
+Fouts
+Fowler
+Fowler-Hornbuckle
+Fowles
+Fowlkes
+Fowlston
+Foxworthy
+Fradette
+Fragnito
+Fraley
+Fralick
+Fralix
+Frampton
+Fran
+France
+Francese
+Francis
+Francispillai
+Franco
+Francoeur
+Francois
+Frangoulis
+Frankcom
+Frankenberger
+Frankos
+Franks
+Frans
+Frantz
+Franze
+Franzky
+Franzwa
+Frape
+Fraser
+Fraties
+Frazier
+Fredenburgh
+Frederick
+Frederico
+Fredette
+Fredine
+Fredrickson
+Fredriksen
+Freeburn
+Freeland
+Freeley
+Freeth
+Freimark
+Freire
+Freiwald
+Freixe
+French
+Frendo
+Frenette
+Freno
+Fretz
+Frey
+Freyermuth
+Freyler
+Fricker
+Fricks
+Fridel
+Frie
+Friedberg
+Frieder
+Friedl
+Friedrich
+Frierson
+Friesen
+Frink
+Frischknecht
+Frisk
+Friton
+Fritz
+Frizado
+Frobel
+Froberg
+Frobisher
+Frodsham
+Froehlich
+Froncek
+Frondozo
+Fronsee
+Fross
+Frosst
+Froud
+Frucci
+Frumerie
+Fryar
+Frydach
+Fryer
+Fssup
+Fu
+Fuchs
+Fucito
+Fujii
+Fujimoto
+Fujiwara
+Fukui
+Fulford
+Fulk
+Fullager
+Fuller
+Fullmer
+Fullum
+Fulmer
+Fumerton
+Funamoto
+Funderburg
+Fung
+Funston
+Fuqua
+Furdoonji
+Furgerson
+Furlin
+Furlow
+Furmaniak
+Furst
+Fusca
+Fuson
+Fussell
+Fwpco
+Fyfe
+Fysh
+Gabbai
+Gabbard
+Gabe
+Gaboury
+Gabriel
+Gach
+Gaconnier
+Gadbois
+Gadher
+Gadouchis
+Gadsby
+Gadzinowski
+Gaebel
+Gaffney
+Gaftea
+Gagan
+Gagne
+Gagnier
+Gagnon
+Gahan
+Gahir
+Gahlot
+Gahr
+Gahunia
+Gaiarsa
+Gaiger
+Gaime
+Gainer
+Gaines
+Gaiotti
+Gaiser
+Gaitan
+Gaither
+Gajewski
+Gajowiak
+Galanakis
+Galasso
+Galbraith
+Galdwin
+Galipeau
+Gallagher
+Gallais
+Gallegos
+Gallenbeck
+Galligan
+Gallinger
+Gallion
+Gallman
+Gallo
+Gallops
+Gallouzi
+Galloway
+Galluzzi
+Galt
+Galvin
+Gamarnik
+Gammage
+Gamsa
+Gan
+Ganadry
+Gandhi
+Gane
+Gangotra
+Ganguly
+Gann
+Ganness
+Gannon
+Gans
+Gantt
+Gara
+Garamvolgyi
+Garand
+Garay
+Garbis
+Garbish
+Garcia
+Garcia-Lamarca
+Garcia-Molina
+Gard
+Gardiner
+Gardner
+Garee
+Gareis
+Garey
+Garfield
+Garg
+Garguilo
+Gargul
+Gargulak
+Garinger
+Garito
+Garmon
+Garneau
+Garrett
+Garry
+Gartley
+Gartshore
+Garvey
+Garvin
+Garwood
+Gary
+Gascho
+Gascon
+Gasikowski
+Gaskins
+Gaspard
+Gasparotto
+Gass
+Gast
+Gaston
+Gasul
+Gateau
+Gateley
+Gater
+Gates
+Gatka
+Gattrell
+Gaube
+Gaudet
+Gaudet-Montsion
+Gaudon
+Gaudreau
+Gaughan
+Gaul
+Gault
+Gause
+Gauthier
+Gavens
+Gavidia
+Gavillucci
+Gavin
+Gawargy
+Gawdan
+Gawronski
+Gawtrey
+Gaylor
+Gaylord
+Gayman
+Gazier
+Gazo
+Gdowik
+Geadah
+Geary
+Gebhardt
+Gebhart
+Gebrael
+Geddes
+Gedeon
+Gedman
+Geer
+Geesman
+Gehm
+Gehr
+Gehring
+Geiger
+Geisler
+Geldrez
+Gelinas
+Gell
+Gelling
+Gelo
+Gemmill
+Gendre
+Gendron
+Geneau
+Genet
+Genge
+Genova
+Genovise
+Gentes
+Gentzler
+Geoffrion
+George
+Georges
+Georgescu
+Georgiou
+Gera
+Gerald
+Gerard
+Gerbec
+Gerber
+Gerenser
+Gergen
+Gerhart
+Gerlich
+Gerlinsky
+Gerlt
+Germain
+Germano
+Germe
+Gerritse
+Gerstmar
+Gerth
+Gertridge
+Gervais
+Gervaise
+Gerynowicz
+Gesino
+Getchell
+Geuder
+Gewell
+Geyer
+Ghaemi
+Ghaemian
+Ghanem
+Ghangurde
+Ghani
+Ghantous
+Ghartey
+Ghasemian
+Ghatta
+Gheciu
+Ghelarducci
+Gheorghe
+Ghidali
+Ghorashy
+Ghossein
+Ghulati
+Giallo
+Giamatteo
+Giamberardino
+Giang
+Giani
+Giannandrea
+Giarritta
+Gibb
+Gibbins
+Gibbons
+Gibbs
+Gibeault
+Giblin
+Gibson
+Gidaro
+Giekes
+Gierka
+Giertych
+Giesbrecht
+Gieschen
+Giese
+Giguere
+Gilbertson
+Gilchrist
+Giles
+Gillard
+Gille
+Gilleland
+Gilles
+Gillespie
+Gillespy
+Gillet
+Gillette
+Gilliam
+Gilliard
+Gillies
+Gilligan
+Gilliland
+Gillis
+Gillon
+Gillot
+Gillstrom
+Gilmore
+Gilmour
+Gilstorf
+Gimon
+Ginest
+Gingerich
+Gingras
+Gingrich
+Ginzburg
+Gioffre
+Gionet
+Giordano
+Giotis
+Giovinazzo
+Girard
+Girgis
+Giridharagopal
+Girotti
+Girouard
+Giroux
+Girvan
+Gittins
+Giuhat
+Giuliani
+Giuntini
+Glancey
+Glanfield
+Glaros
+Glasa
+Glaser
+Glasgow
+Glasser
+Glast
+Glaszczak
+Glazer
+Gleason
+Gleditsch
+Glemboski
+Glenn
+Glew
+Glidewell
+Glinka
+Glinski
+Glofcheskie
+Glover
+Glowa
+Glucksman
+Glymph
+Gnaedinger
+Goatcher
+Goba
+Gobeil
+Gobeli
+Gockel
+Godard
+Godcharles
+Goddard
+Godden
+Goddette
+Godfrey
+Godin
+Godina
+Godish
+Godley
+Godlington
+Godo
+Godowsky
+Godse
+Godsoe
+Godwin
+Goel
+Goerss
+Goertz
+Goertzen
+Goetz
+Goff
+Gofron
+Goggin
+Goh
+Goheen
+Goin
+Goins
+Golas
+Golaszewski
+Golczewski
+Goldberg
+Goldenberg
+Golder
+Goldman
+Goldmann
+Goldner
+Goldstein
+Goldthorp
+Golia
+Goliss
+Golka
+Goller
+Golshan
+Gombos
+Gomes
+Gomez
+Gomm
+Goniotakis
+Gonsalves
+Gonzales
+Gonzalez
+Gooch
+Good
+Goodbar
+Gooderham
+Goodfellow
+Goodier
+Goodinson
+Goodman
+Goodner
+Goodridge
+Goodrow
+Goodson
+Goodwin
+Goold
+Gooley
+Goos
+Gopaul
+Gopisetty
+Gorasia
+Gorberg
+Gording
+Gordon
+Gores
+Gorfine
+Gorham
+Gorhum
+Goricanec
+Goridkov
+Goring
+Gorius
+Gorlick
+Gorman
+Gorsky
+Gorton
+Gorzocoski
+Goss
+Gosselin
+Gosset
+Gostanian
+Goswick
+Goszczynski
+Gotch
+Gotchall
+Gothard
+Gottlieb
+Gottschalk
+Gottstein
+Goudreau
+Gougeon
+Gough
+Gouhara
+Goukon
+Gould
+Gouldson
+Goulet
+Goulette
+Goulfine
+Goupil
+Gourley
+Govindarajan
+Govindasamy
+Gowan
+Gowda
+Gowens
+Gower
+Gowin
+Gowl
+Gowland
+Goyal
+Goyer
+Goyette
+Goza
+Gozen
+Grabner
+Grabowski
+Gracey
+Grader
+Graessley
+Graff
+Grafton
+Graibe
+Grainger
+Graman
+Gramiak
+Granata
+Grandbois
+Grande
+Grandmason
+Grandy
+Granfield
+Granger
+Granic
+Granner
+Grasman
+Grassmann
+Gratton
+Grau
+Grauer
+Grausso
+Gravelle
+Gravely
+Graver
+Graves
+Gravitt
+Gravitte
+Grawberger
+Graybill
+Graydon
+Grayson
+Graziano
+Grazzini
+Greaver
+Greaves
+Grebil
+Grebner
+Greco
+Greeley
+Greenberg
+Greene
+Greenfield
+Greenlee
+Greenstreet
+Greenway
+Greer
+Gregarick
+Greger
+Gregg
+Grego
+Gregoire
+Gregor-Pearse
+Gregorio
+Gregorski
+Gregory
+Grelck
+Grenier
+Grenon
+Greszczuk
+Greveling
+Grevy
+Grewal
+Greytock
+Gribbon
+Gribbons
+Griffioen
+Griffith
+Griffiths
+Grigg
+Grignon
+Grigsby
+Grills
+Grimble
+Grimes
+Grimm
+Grimmell
+Grimshaw
+Grimsley
+Griner
+Grinham
+Grisoni
+Grissom
+Griswold
+Gritton
+Grixti
+Groce
+Grochau
+Groetsema
+Groff
+Grogan
+Grohovsky
+Groleau
+Grona
+Grondin
+Gronwall
+Grooms
+Grootenboer
+Gros
+Grosjean
+Grosman
+Grosse
+Grossman
+Grossutti
+Groth
+Groulx
+Grover
+Groves
+Grovestine
+Growden
+Gruau
+Grubbs
+Gruber
+Grueneich
+Gruenhagen
+Grund
+Gruska
+Gruszczynski
+Gryder
+Grzegorek
+Grzesik
+Gu
+Guajardo
+Guarino
+Guarnera
+Guatto
+Guay
+Gubbins
+Gubenco
+Gucer
+Guciz
+Gudgeon
+Guenette
+Guercioni
+Guerette
+Guerin
+Guertin
+Guevara
+Guido
+Guignon
+Guilbault
+Guilbert
+Guilford
+Guilfoyle
+Guillaume
+Guillet
+Guilmette
+Guimond
+Guin
+Guindi
+Guindon
+Guinnane
+Guirguis
+Guisler
+Guitard
+Gulbrandsen
+Gulick
+Gulis
+Gulko
+Gullekson
+Gultekin
+Gulvin
+Gumb
+Gumbley
+Gummadi
+Gunasekera
+Gunawan
+Gundecha
+Gundersen
+Gunderson
+Gundlach
+Gundry
+Gung
+Gungor
+Gunkel
+Gunn
+Gunnells
+Gunter
+Gunther
+Gupta
+Gupton
+Gur-Arie
+Gurash
+Gure
+Gurer
+Gurevitch
+Gurgenci
+Gurica
+Gurley
+Gurney
+Gursahaney
+Gursin
+Gustafson
+Gustlin
+Gutcher
+Gutermuth
+Guth
+Guthrie
+Guthro
+Gutierrez
+Guttman
+Guty
+Gutzmann
+Guy-Arbour
+Guyot
+Guzman
+Gyenes
+Gyger
+Gylys
+Gysel
+Gyurcsak
+HDI
+HSI
+Haack
+Haaksman
+Haas
+Habel
+Habelrih
+Habert
+Habib
+Hachadorian
+Hache
+Hachey
+Hacker
+Hackett
+Hadaway
+Haddad
+Hadden
+Haddow
+Hadel
+Hadi
+Hadirahardjo
+Hadley
+Hadziomerovic
+Haerle
+Haertel
+Hafermalz
+Hafiz
+Hafleigh
+Hagan
+Hagar
+Hage
+Hagen
+Hagenbuch
+Hagenbuck
+Hager
+Hagerty
+Hagewood
+Haggart
+Haggarty
+Haggerty
+Hagglund
+Hagley
+Hagstrom
+Hagwood
+Hahn
+Haig
+Haigh
+Hailes
+Hailey
+Hainer
+Haines
+Hainline
+Haire
+Hakansson
+Halbedel
+Halejak
+Haley
+Halford
+Halicki
+Hallenbeck
+Hallett
+Halley
+Halligan
+Halliwill
+Hallman
+Hally
+Halovanic
+Halpenny
+Halpern
+Halpin
+Haluk
+Halula
+Hamavand
+Hambali
+Hameed
+Hamel
+Hamelin
+Hamid
+Hamidi
+Hamilton
+Hamlett
+Hamlin
+Hammel
+Hammerli
+Hammermeister
+Hammond
+Hammonds
+Hamner
+Hamori
+Hamoui
+Hampel
+Hampshire
+Hampson
+Hampton
+Hamra
+Han
+Hancock
+Handforth
+Handley
+Handschy
+Hanel
+Haney
+Hanford
+Hanham
+Hanington
+Hankins
+Hanlan
+Hanley
+Hann
+Hanna
+Hannah
+Hanneman
+Hannula
+Hanrahan
+Hans
+Hansen
+Hanser
+Hanson
+Hansquine
+Hansson
+Hanzel
+Hanzlicek
+Hao
+Harabedian
+Harada
+Harapiak
+Harbord
+Harbottle
+Harbour
+Hardage
+Hardcastle
+Hardee
+Hardersen
+Hardin
+Harding
+Hardison
+Hardman
+Hardwick
+Hardyman
+Haren
+Hargadon
+Hargreaves
+Hargrove
+Hargrow
+Hariman
+Harker
+Harkness
+Harlan
+Harless
+Harley
+Harman
+Harmon
+Harms
+Harold
+Haroutounian
+Harpe
+Harper
+Harrawood
+Harrell
+Harriett
+Harrington
+Harriott
+Harris
+Harrison
+Harrod
+Harron
+Harsch
+Harsham
+Harshfield
+Harte
+Hartell
+Harter
+Hartford
+Hartgrove
+Hartin
+Hartkopf
+Hartland
+Hartleb
+Hartley
+Hartling
+Hartman
+Hartsell
+Harty
+Hartzel
+Harvey
+Harville
+Harvison
+Harwerth
+Harwood
+Hasan
+Hasbrouck
+Hasegawa
+Hasen
+Hasham
+Hashemi
+Hashimoto
+Haskins
+Haslach
+Hassan
+Hassenklover
+Hassey
+Hassold
+Hasted
+Hastic
+Hastie
+Hastings
+Hatcher
+Hatchett
+Hately
+Hatfield
+Hathaway
+Hatridge
+Hattar
+Hatten
+Hattingh
+Hatz
+Hatzenbichler
+Hau
+Haubert
+Hauck
+Hauerstock
+Haufe
+Hauge
+Haughey
+Haughwout
+Haugrud
+Haupt
+Haurie
+Hause
+Hautanen
+Havelock
+Haveman
+Haverkamp
+Haverty
+Havis
+Hawes
+Hawi
+Hawken
+Hawker
+Hawkes
+Hawkins
+Hawley
+Hawryluk
+Hawrysh
+Hawryszko
+Hawthorne
+Hayden
+Haydock
+Haydon
+Hayes
+Haylock
+Hayman
+Haynes
+Hayward
+Hazeldine
+Hazell
+Hazelrig
+Hazelton
+Hazen
+Hazenboom
+Hazlett
+Heald
+Health-Safety
+Healy
+Hearn
+Hearnden
+Heaton
+Hebbar
+Hebert
+Heckman
+Heddell
+Hedin
+Hedke
+Hedman
+Hedrich
+Hedrick
+Heeralall
+Heffernan
+Heffner
+Hehn-Schroeder
+Heidebrecht
+Heidepriem
+Heighton
+Heikkila
+Heile
+Heilig
+Heiliger
+Heilsnis
+Heinen
+Heinjus
+Heinke
+Heinonen
+Heinrichs
+Heinzman
+Heisler
+Heitmann
+Hekel
+Heki
+Heldenbrand
+Helem
+Helfrick
+Helgeland
+Helkaa
+Hellberg
+Heller
+Hellyer
+Helms
+Helmy
+Helpb
+Helpline
+Helseth
+Helstab
+Helton
+Helwege
+Hembrick
+Hemens-Davis
+Hemme
+Hemmerle
+Hemphill
+Hempinstall
+Hempstead
+Henao
+Hench
+Henderson
+Hendren
+Hendricks
+Hendrickse
+Hendricksen
+Hendriks
+Hendrycks
+Henein
+Heng
+Hengeveld
+Hengl
+Hengst
+Henley
+Henline
+Henneberger
+Hennebury
+Hennelly
+Hennessy
+Henninger
+Hennon
+Henriksen
+Hensen
+Henshaw
+Hensley
+Henson
+Henthorne
+Hepburn
+Heppes
+Herak
+Herbel
+Herberger
+Herbers
+Hering
+Herlihy
+Herling
+Hermack
+Herman
+Hermann-Kendall
+Hermanns
+Hermes
+Hernandez
+Herndon
+Herner
+Hernon
+Herod
+Heroux
+Herr
+Herrage
+Herren
+Herrera
+Herrick
+Herring
+Herrington
+Herriotts
+Herrmann
+Herron
+Herscovici
+Herscovitch
+Hersee
+Hershberger
+Hertler
+Hertzog
+Herve
+Herzig
+Hesche
+Hesk
+Hesketh
+Heslop
+Hess
+Hesse
+Hester
+Hetzel
+Heurich
+Hewage
+Hewer
+Hewett
+Hewitt
+Hews
+Heybroek
+Heydon
+Heyer
+Heynen
+Heys
+Heystraeten
+Heyward
+Hibberd
+Hibler
+Hickerson
+Hickey
+Hickin
+Hickman
+Hickman-Miott
+Hickox
+Hicks
+Hiebsch
+Hien
+Hiers
+Higginbotham
+Higgins
+Higham
+Highet
+Highsmith
+Hight
+Hightower
+Higuchi
+Hikita
+Hilaire
+Hilberman
+Hilbig
+Hildebrand
+Hilder
+Hildum
+Hilla
+Hillard
+Hiller
+Hilliard
+Hillidge
+Hillier
+Hillring
+Hills
+Hillson
+Hilmi
+Hils
+Hilton
+Hiltz
+Hilwa
+Hincher
+Hinchey
+Hinchley
+Hindle
+Hinds
+Hindson
+Hine
+Hiner
+Hines
+Hingtgen
+Hink
+Hinkel
+Hinkle
+Hinojosa
+Hinsdale
+Hinshaw
+Hinson
+Hinton
+Hinton-Smith
+Hinz
+Hipp
+Hippert
+Hipson
+Hirakawa
+Hiraki
+Hirayama
+Hirose
+Hirsch
+Hirshman
+Hisaki
+Hiscoe
+Hiscott
+Hishchak
+Hisko
+Hislop
+Hitchcock
+Hitchings
+Hite
+Hiusser
+Hively
+Hixon
+Hixson
+Hjartarson
+Hlady
+Hlauschek
+Hnidek
+Hoadley
+Hoag
+Hoagland
+Hoang
+Hoare
+Hobbs
+Hobesh
+Hobgood
+Hobin
+Hoch
+Hochberger
+Hockaday
+Hoctor
+Hocutt
+Hodder
+Hoddinott
+Hodgens
+Hodges
+Hodgins
+Hodgkin
+Hodgkiss
+Hodgson
+Hoeg
+Hoehling
+Hoehn
+Hoeksma
+Hoekstra
+Hoeler
+Hoelscher
+Hoequist
+Hoes
+Hoferek
+Hoffelt
+Hoffman
+Hoffmann
+Hoffmeister
+Hoffpauir
+Hoffstedder
+Hofmann
+Hofmeister
+Hofstede
+Hofstetter
+Hogeboom
+Hogg
+Hoggan
+Hogue
+Holberry
+Holbrooks
+Holcomb
+Holcombe
+Holcroft
+Holdaway
+Holder
+Holdren
+Holesinger
+Holinski
+Hollack
+Holland
+Hollander
+Hollandsworth
+Hollbach
+Hollen
+Hollenbach
+Hollenbeck
+Holleran
+Holley
+Holliday
+Hollingshead
+Hollingsworth
+Hollington
+Hollingworth
+Hollis
+Hollister
+Holloway
+Hollran
+Holman
+Holmans
+Holmes
+Holmquist
+Holness
+Holsclaw
+Holthaus
+Holton
+Holtz
+Holtze
+Holvey
+Holy
+Holz
+Homa
+Homan
+Homayoon
+Homayoun
+Homonick
+Honbarrier
+Honda
+Honeycutt
+Honkakangas
+Hook
+Hooker
+Hooks
+Hooper
+Hoorman
+Hooton
+Hoover
+Hopcroft
+Hopf
+Hopkins
+Hopkinson
+Hopley
+Hoppenworth
+Hopper
+Hopson
+Hoque
+Hor
+Horak
+Horalek
+Horban
+Hord
+Hore
+Horemans
+Horgan
+Horianopoulos
+Horkoff
+Hornacek
+Hornbeck
+Hornbeek
+Hornburg
+Horne
+Horning
+Hornung
+Horowitz
+Horsfield
+Horstman
+Horton
+Horvath
+Horwitz
+Horwood
+Hosang
+Hoscheid
+Hoshi
+Hosier
+Hoskin
+Hosking
+Hoskins
+Hosneld
+Hosseini
+Hotline
+Hotlist
+Hotson
+Houde
+Hough
+Houghton
+Houk
+Houle
+Hounsell
+Houston
+Hoverman
+Hovey
+Hovinga
+Howald
+Howard
+Howarth
+Howat
+Howe
+Howe-Patterson
+Howell
+Howerton
+Howes
+Howie
+Howlett
+Howley
+Howorth
+Howse
+Hoxie
+Hoyer
+Hoyt
+Hr
+Hrenyk
+Hrubik
+Hrushowy
+Hruska
+Hrvatin
+Hsiang
+Hsieh
+Hsu
+Hu
+Huang
+Hubal
+Hubbard
+Huber
+Huberman
+Hubers
+Hubert
+Hubley
+Huboi
+Hudak
+Huddleston
+Hudecek
+Hudepohl
+Hudgins
+Hudson
+Hudy
+Hudyma
+Huelsman
+Huenemann
+Huestis
+Huether
+Hufana
+Huffman
+Hugel
+Huggins
+Hughes
+Hughes-Cunningham
+Hughey
+Hughson
+Hugo
+Huguin
+Huhn
+Hui
+Huitt
+Hulen
+Hulett
+Huliganga
+Hulme
+Hulvershorn
+Hume
+Humenik
+Humenuk
+Humes
+Humiston
+Hummel
+Hummerston
+Humphrey
+Humphreys
+Humphries
+Hundrieser
+Huneault
+Hungle
+Hunike
+Hunnicutt
+Hunsberger
+Hunsucker
+Hunter
+Huntington
+Huntley
+Huor
+Huot
+Hupe
+Huppert
+Hurd
+Huret
+Hurman
+Hurst
+Hurtado
+Hurteau
+Hurtubise
+Hurwitz
+Husain
+Husarewych
+Hussain
+Hussein
+Hussey
+Huszar
+Huszarik
+Hutcherson
+Hutchings
+Hutchins
+Hutchinson
+Hutchison
+Hutson
+Hutt
+Hutter
+Hutton
+Huynh
+Hvezda
+Hwang
+Hyatt
+Hyde
+Hyer
+Hyers
+Hyjek
+Hylarides
+Hyman
+Hyndman
+Hyrne
+Hysler
+Hyslop
+Hyte
+IBNTAS
+IC
+IEM
+INFO-MANAGEMENT
+INSP
+IOCNTRL
+IRCMARKET
+IRCMTL
+ITAC
+Iacoviello
+Iacovo
+Ianace
+Iannotti
+Iannozzi
+Iantaffi
+Iaquinto
+Iarocci
+Ibach
+Ibarra
+Ibsen
+Iburg
+Ichizen
+Id
+Ide
+Ientile
+Iezzi
+Ifact
+Ifill
+Igarashi
+Igglesden
+Iguchi
+Ihnat
+Ikeda
+Ikotin
+Ilic
+Ilk
+Illidge
+Ilmberger
+Ilowski
+Imbemba
+Imhof
+Imming
+Inamullah
+Ince
+Incze
+Indahl
+Infocenter
+Ing
+Inge
+Ingell
+Ingersoll
+Ingle
+Ingles
+Ingling
+Inglis
+Ingram
+Ingrey
+Inhulsen
+Inman
+Innes
+Inniss
+Inoue
+Inrig
+Inscoe
+Inspection
+Instal
+Integ
+Integration
+Intemann
+Interaction
+Intihar
+Intplan
+Intune
+Ioannou
+Iocca
+Ioui
+Ip
+Ipadmin
+Ippolito
+Irani
+Irc
+IrcInternal-Docs
+Ircbellcore
+Irccar
+Ircmer
+Ircstandards
+Ireland
+Iribarren
+Irick
+Irvin
+Irvine
+Irving
+Irwin
+Isaac
+Isaacs
+Isbister
+Isenor
+Isensee
+Isert
+Isfan
+Ishak
+Ishee
+Isherwood
+Ishii
+Isip
+Iskandar
+Iskra
+Islam
+Isley
+Ismail
+Issa
+Itah
+Itas
+Itaya
+Iteam
+Ito
+Iu
+Ivan
+Ivancevic
+Ivancic
+Ivanoff
+Ivanyi
+Ivers
+Iversen
+Ives
+Ivett
+Ivey
+Iwanyk
+Iyengar
+Iyer
+Izbinsky
+Izique
+Izzo
+Izzotti
+Jaakkola
+Jablonski
+Jachym
+Jackman
+Jackson
+Jacob
+Jacobs
+Jacobsen
+Jacobson
+Jacques
+Jaenen
+Jaffer
+Jagatic
+Jager
+Jagernauth
+Jagla
+Jago
+Jagodzinski
+Jahromi
+Jain
+Jak
+Jakab
+Jakabffy
+Jakim
+Jakola
+Jakstys
+Jakubowski
+Jalaie
+Jalali
+Jalalizadeh
+Jalbert
+Jalilvand
+Jamal
+Jamaly
+Jamensky
+James
+Jamieson
+Jamison
+Jammu
+Jamnejad
+Jamroz
+Jamshidi
+Janaratne
+Jancewicz
+Jancovic
+Janczyn
+Jande
+Janecka
+Janelle
+Janes
+Jang
+Janiszewski
+Janke
+Jankowski
+Janning
+Janovich
+Janseen
+Jansen
+Janssen
+Jantz-Lee
+Jantzi
+Japp
+Jaques
+Jarboe
+Jarchow
+Jarman
+Jarmoc
+Jarmon
+Jarmul
+Jarnak
+Jarvah
+Jarvie
+Jarvis
+Jarzemsky
+Jasen
+Jasmann
+Jasmin
+Jasny
+Jasrotia
+Jasti
+Jaswal
+Jatar
+Jauvin
+Java
+Javallas
+Javallas-Ross
+Javed
+Javor
+Jawanda
+Jawor
+Jaworski
+Jaworsky
+Jayamanne
+Jazanoski
+Jcst
+Jean-Louis
+Jeanes
+Jeavons
+Jedrysiak
+Jee
+Jee-Howe
+Jefferson
+Jeffries
+Jeleniewski
+Jelinek
+Jemczyk
+Jeng
+Jenkins
+Jenkinson
+Jenner
+Jenness
+Jennette
+Jennings
+Jensen
+Jensenworth
+Jepson
+Jeremy
+Jernigan
+Jeronimo
+Jeroski
+Jervis
+Jeska
+Jesshope
+Jessup
+Jesty
+Jeter
+Jew
+Jewell
+Jewett
+Jezioranski
+Jiang
+Jimenez
+Jims
+Jindal
+Joachimpillai
+Joannidis
+Joannis
+Jobe
+Jobs
+Jodoin
+Jodoin-St.Jean
+Joe
+Joffe
+Johannes
+Johannessen
+Johannsen
+Johansen
+Johanson
+John
+Johns
+Johnsen
+Johnson
+Johnston
+Johnstone
+Joiner
+Jolicoeur
+Joll
+Jolliffe
+Joly
+Jonczak
+Jone
+Jones
+Jong
+Jonkheer
+Joplin
+Jordan
+Jorgensen
+Joron
+Joseph
+Joshi
+Josiah
+Joslin
+Joson
+Joudrey
+Jowett
+Joyce
+Joyner
+Juan
+Jubainville
+Jubb
+Jubenville
+Jubinville
+Juby
+Judd
+Juers
+Jugandi
+Juhan
+Julian
+Junaid
+Juneau
+Jung
+Jungmeisteris
+Juni
+Junkie
+Junkin
+Jurek
+Jurewicz
+Jurgutis
+Jurman
+Juscesak
+Juskevicius
+Justus
+Kabe
+Kabel
+Kabolizadeh
+Kacor
+Kacsor
+Kaczmarek
+Kaczmarska
+Kaczynski
+Kadamani
+Kaden
+Kadlecik
+Kaefer
+Kaehler
+Kahan
+Kahhale
+Kahhan
+Kahil
+Kahkonen
+Kahn
+Kahnert
+Kahtasian
+Kaid
+Kaidannek
+Kaigler
+Kajeejit
+Kaji
+Kakou
+Kakuta
+Kalab
+Kalaichelvan
+Kalair
+Kalechstein
+Kales
+Kaley
+Kaliski
+Kalitzkus
+Kalleward
+Kallio
+Kalman
+Kalnitsky
+Kalogerakos
+Kalsey
+Kalt
+Kaluzny
+Kalwa
+Kalwarowskyj
+Kalyani
+Kam
+Kamal
+Kamboh
+Kamel
+Kamerson
+Kamiyama
+Kammerer
+Kamminga
+Kamoun
+Kamyszek
+Kan
+Kanagendra
+Kandra
+Kane
+Kang
+Kang-Gill
+Kangelis
+Kanies
+Kannel
+Kannemann
+Kanno
+Kantor
+Kanungo
+Kao
+Kaoud
+Kapadia
+Kapatou
+Kapella
+Kapil
+Kaplan
+Kapp
+Kaps
+Kapsa
+Kapuscinski
+Kara
+Karaali
+Karademir
+Karam
+Karass
+Karchevski
+Kardomateas
+Kardos
+Karhuniemi
+Karia
+Karibian
+Karim
+Karkotsky
+Karmali
+Karmous-Edwards
+Karn
+Karnazes
+Karol
+Karole
+Karolefski
+Karp
+Karr
+Karsan
+Karsner
+Karsz
+Karunaratne
+Karwowski
+Kasbia
+Kasbow
+Kasdorf
+Kashani-nia
+Kashef
+Kashima
+Kashul
+Kasparian
+Kasprzak
+Kassam
+Kassissia
+Kastelberg
+Kasten
+Kastner
+Kaston
+Kasumovich
+Katcher
+Katchmar
+Kathie
+Kathnelson
+Katibian
+Kato
+Katsouras
+Katz
+Katzenelson
+Kaudel
+Kauffeldt
+Kauffman
+Kaufman
+Kaufmann
+Kaunas
+Kaura
+Kaus
+Kausche
+Kavanagh
+Kavis
+Kawa
+Kawaguchi
+Kawakami
+Kawamura
+Kawashima
+Kawauchi
+Kay
+Kaya
+Kayalioglu
+Kayar
+Kaye
+Kayle
+Kaypour
+Kayser
+Kazimierski
+Kazmierczak
+Kea
+Kealey
+Kean
+Keane
+Kearney
+Kearns
+Keast
+Keates
+Keating
+Kebede
+Kechichian
+Keck
+Kee
+Keef
+Keegstra
+Keehan
+Keehn
+Keelan
+Keeler
+Keels
+Keenan
+Keene
+Keene-Moore
+Keer
+Keever
+Keffer
+Kehler
+Kehoe
+Kehr
+Keifer
+Keighley
+Keilholz
+Keilty
+Keim
+Keiser
+Keitel
+Keith
+Kelbe
+Kelemen
+Kelkar
+Kell
+Kelland
+Kelleher
+Keller
+Kellerman
+Kellett
+Kelley
+Kellogg
+Kellum
+Kelly
+Kelsay
+Kelsch
+Kelso
+Kember
+Kemish
+Kemkeng
+Kemme
+Kemp
+Kempf
+Kempffer
+Kemppainen
+Kempski
+Kempster
+Kendall
+Kendi
+Kendrick
+Kenedi
+Kenik
+Kenkel
+Kenlan
+Kenmir
+Kennaday
+Kennard
+Kennedy
+Kenneth
+Kenney
+Kenny
+Kenol
+Kensinger
+Kent
+Kenworthy
+Kenyon
+Keogh
+Kepekci
+Kerfoot
+Keriakos
+Kerlovich
+Kernahan
+Kerner
+Kernodle
+Kerns
+Kerr
+Kerschner
+Kerwin
+Keseris
+Kesler
+Kesling
+Kessel
+Kessing
+Kessler
+Kestelman
+Kester
+Ketcham
+Ketcheson
+Ketchum
+Ketkar
+Ketley
+Ketsler
+Ketterer
+Kettles
+Keung
+Keuning
+Keveny
+Keyes
+Khadbai
+Khalaf
+Khalil
+Khalilzadeh
+Khanna
+Khatib
+Khatod
+Khatri
+Khawar
+Khesin
+Khezri
+Khimasia
+Kho
+Khodosh
+Khorami
+Khosla
+Khosravi
+Khosraviani
+Khouderchah
+Khouderchan
+Khoury
+Khouzam
+Khurana
+Kiang
+Kibler
+Kidd
+Kiebel
+Kiecksee
+Kiefer
+Kiel
+Kielstra
+Kiely
+Kiens
+Kiernan
+Kiger
+Kigyos
+Kikuchi
+Kikuta
+Kilbank
+Kilburn
+Kilby
+Kilcoin
+Kilcoyne
+Killam
+Killeen
+Killen
+Kilner
+Kilpatrick
+Kilzer
+Kim
+Kimball
+Kimbarovsky
+Kimble
+Kimbrell
+Kimbrough
+Kimler
+Kimm
+Kimma
+Kimoto
+Kinahan
+Kinamon
+Kinch
+Kindel
+Kindem
+King
+Kingaby
+Kingan
+Kingdon
+Kingrey
+Kingsbury
+Kingshott
+Kingsland
+Kingsley-Evans
+Kingston
+Kingzett
+Kinley
+Kinnaird
+Kinney
+Kinniburgh
+Kinos
+Kinoshita
+Kinrys
+Kinsella
+Kinsey
+Kinsman
+Kinstley
+Kipnis
+Kirady
+Kirby
+Kirchner
+Kirfman
+Kirkby
+Kirkendall
+Kirkham
+Kirkland
+Kirkley
+Kirkpatrick
+Kirkwood
+Kirley
+Kirn
+Kirouac
+Kish
+Kishi
+Kita
+Kittinger
+Kitzmiller
+Kivell
+Klaassen
+Klammer
+Klamner
+Klapper
+Klappholz
+Klashinsky
+Klasky
+Klassen
+Klaudinyi
+Klaudt
+Klavkalns
+Klebsch
+Klein
+Kleppinger
+Kletchko
+Kleynenberg
+Klimas
+Klimon
+Kline
+Kling
+Klingsporn
+Klodt
+Klostermann
+Kloth
+Klotz
+Klowak
+Klug
+Kluger
+Kluke
+Klutts
+Knapp
+Knappe
+Knapton
+Knecht
+Kneedler
+Kneese
+Kneeshaw
+Kneisel
+Knes-Maxwell
+Kness
+Knickerbocker
+Knieps
+Knighten
+Knighton
+Knio
+Knipe
+Knitl
+Knittel
+Knobeloch
+Knobloch
+Knorp
+Knorr
+Knouse
+Knowles
+Knox
+Knudsen
+Ko
+Koa
+Koay
+Kobeski
+Kobierski
+Koblitz
+Kobreek
+Koch
+Kochanski
+Kochis
+Kodnar
+Kodsi
+Koelbl
+Koeller
+Koellner
+Koens
+Koerner
+Kogan
+Kohalmi
+Kohalmi-Hill
+Kohl
+Kohler
+Kohm
+Kohn
+Kohnhorst
+Kohut
+Koiste
+Kok
+Kokkat
+Kokoska
+Kokosopoulos
+Kolappa
+Kolb
+Kolbe
+Kolek
+Kolenda
+Kolesnik
+Koleyni
+Kolk
+Koller
+Kollman
+Kollmorgen
+Kolodiejchuk
+Kolodziej
+Kolos
+Kolski
+Kolton
+Koman
+Komaromi
+Komatsu
+Komenda
+Komorowski
+Konarski
+Konforti
+Kong
+Kong-Quee
+Koning
+Konno
+Konomis
+Koohgoli
+Koohi
+Koolstra
+Koolwine
+Koonce
+Koontz
+Kopala
+Kopfman
+Kopke
+Koprulu
+Korbe
+Korbel
+Kordik
+Korea
+Koren
+Korest
+Korey
+Korf
+Kornachuk
+Kornitzer
+Korpela
+Kortekaas
+Kortje
+Kos
+Kosarski
+Kosasih
+Kosiorska
+Kositpaiboon
+Koskie
+Koskinen
+Koslowsky
+Kosnaskie
+Kosowan
+Koss
+Kosten
+Koster
+Kostowskyj
+Kosturik
+Kostyniuk
+Kot
+Kotamarti
+Kotler
+Kotval
+Kotyk
+Kou
+Kouba
+Kouhi
+Kovacs
+Koval
+Kovarik
+Kovats
+Koverzin
+Kowal
+Kowalczewski
+Kowaleski
+Kowalkowski
+Kowallec
+Kowalski
+Kowalsky
+Kozak
+Kozelj
+Koziol
+Kozlowski
+Kozsukan
+Kozuch
+Kozyra
+Kpodzo
+Krabicka
+Kraehenbuehl
+Krajacic
+Krajesky
+Krakowetz
+Kramar
+Kramer
+Kranenburg
+Krater
+Kratz
+Krauel
+Kraus
+Krausbar
+Krause
+Krautle
+Krawchuk
+Krawec
+Kreiger
+Kreimer
+Krenn
+Krenos
+Kresl
+Kretsch
+Krick
+Krieg
+Kriegler
+Krienke
+Krier
+Krikorian
+Krisa
+Krishnan
+Kristian
+Kristjanson
+Krivossidis
+Kriz
+Krodel
+Kroeger
+Krogh
+Krol
+Kromer
+Krone
+Krotish
+Krowlek
+Krozser
+Krten
+Krueger
+Krug
+Kruger
+Krull
+Krumwiede
+Kruse
+Kruusement
+Kruziak
+Krym
+Kryski
+Krysko
+Ku
+Kuan
+Kubash
+Kubik
+Kubitschek
+Kuchelmeister
+Kuczynski
+Kudas
+Kudrewatych
+Kuechler
+Kuehn
+Kuehne
+Kuhfus
+Kuhlkamp
+Kuhn
+Kuhns
+Kuivinen
+Kujanpaa
+Kulachandran
+Kulikowsky
+Kulinski
+Kulkarni
+Kum
+Kumagai
+Kumamoto
+Kumar
+Kummer
+Kun
+Kundel
+Kunecke
+Kung
+Kuniyasu
+Kunkel
+Kuntova
+Kunz
+Kuo
+Kupe
+Kupferman
+Kupferschmidt
+Kupidy
+Kupitz
+Kuracina
+Kurash
+Kurauchi
+Kurczak
+Kurdas
+Kurdziel
+Kureshy
+Kurian
+Kurio
+Kurita
+Kurniawan
+Kurolapnik
+Kurowski
+Kursell
+Kurth
+Kurtz
+Kuruppillai
+Kuryliak
+Kurylyk
+Kus
+Kusan
+Kushan
+Kushnir
+Kushwaha
+Kusmider
+Kusumakar
+Kusyk
+Kutac
+Kutch
+Kutschke
+Kutten
+Kuykendall
+Kuzbary
+Kuzemka
+Kuzyk
+Kuzz
+Kwa
+Kwan
+Kwant
+Kwast
+Kwee
+Kwiatkowska
+Kwissa
+Kwok
+Kwong
+Kydd
+Kyle
+Kyoung
+Kyzer
+L'Anglais
+L'Ecuyer
+L'Heureux
+L'ecuyer-Demers
+LIBRARIAN
+LLoyd
+LRCRICH
+LaBauve
+LaBelle
+LaBonte
+LaBranche
+LaFargue
+LaPierre
+LaPlante
+LaPointe
+LaRue
+LaVecchia
+LaVoie
+Laale
+Laba
+Labarge
+Labenek
+Laberge
+Labfive
+Labiche
+Labossiere
+Labrador
+Labrie
+Labrinos
+Labuhn
+Lacasse
+Lacelle
+Lachambre
+Lachance
+Lachine
+Lachowski
+Lackenbauer
+Lackie
+Lacombe
+Lacosse
+Lacoste
+Lacroix
+Ladd
+Ladet
+Ladouceur
+Ladva
+Ladymon
+Lafata
+Laferriere
+Lafever
+Lafferty
+Laflamme
+Lafleur
+Lafontaine
+Laforge
+Laframboise
+Lafrance
+Lagace
+Lagarde
+Lagrandeur
+Lahaie
+Lahaye
+Lahey
+Lahlum
+Lahteenmaa
+Lai
+Laidlaw
+Laine
+Lainesse
+Laing
+Laitinen
+Lajzerowicz
+Laker
+Lakhani
+Lakhian
+Lakier
+Lakins
+Lakshminarayan
+Lalani
+Laliberte
+Lalka
+Lally
+Lalonde
+Lalu
+Lamarche
+Lamarque
+Lamarre
+Lambregts
+Lambregtse
+Lamedica
+Lamers
+Lamey
+Lamirande
+Lamm
+Lamonde
+Lamont
+Lamontagne
+Lamothe
+Lamouche
+Lamoureux
+Lampe
+Lamphier
+Lampman
+Lamy
+Lan
+Lanava
+Lancaster
+Lanctot
+Landaveri
+Lande
+Lander
+Landers
+Landon
+Landriault
+Landry
+Laney
+Lang
+Langdon
+Lange
+Langelier
+Langenberg
+Langer
+Langett
+Langevin
+Langford
+Langlais
+Langley
+Langlois
+Langner
+Langstaff
+Langton
+Laniel
+Lanier
+Lannan
+Lanoe
+Lanoszka
+Lanoue
+Lanouette
+Lans
+Lansupport
+Lanteigne
+Lanthier
+Lantos
+Lantto
+Lantz
+Lanunix
+Lanwan
+Lanz
+Lanzkron
+Lao
+Lapchak
+Laporte
+Lapostolle
+Lappan
+Laprade
+Lapre
+Laprise
+Lara
+Larabie
+Laraia
+Larche
+Larin
+Lariviere
+Larkin
+Larkins
+Larmour
+Larner
+Laroche
+Larock
+Larocque
+Larose
+Larribeau
+Larrigan
+Larsen
+Larson
+Larstone
+Laruffa
+Larwill
+Lasch
+Laschuk
+Lashansky
+Lasher
+Lashmit
+Lask
+Laskaris
+Laskin
+Lassig
+Lassiter
+Lasson
+Lassonde
+Laster
+Latchford
+Latella
+Latessa
+Lathangue
+Lathrop
+Latif
+Latin
+Latorre
+Latour
+Latreille
+Lattanzi
+Latulippe
+Lau
+Lauderdale
+Laufer
+Laugher
+Laughlin
+Laughridge
+Laughton
+Laurence
+Laurent
+Lauria
+Lauriault
+Laurich
+Laurin
+Lauriston
+Laursen
+Lauruhn
+Lauson
+Lauten
+Laux
+Lauze
+Lauzon
+Lavallee
+Lavarnway
+Lavelle
+Lavergne
+Lavers
+Laverty
+Lavictoire
+Lavigne
+Laville
+Laviolette
+Lavorata
+Lawbaugh
+Lawler
+Lawless
+Lawlis
+Lawlor
+Lawrence
+Lawrie
+Laws
+Lawson
+Lawther
+Lawton
+Layne
+Layton
+Lazar
+Lazarou
+Lazarowich
+Lazure
+Lazzara
+Le
+LeBaron
+LeBlanc
+LeClair
+LeClaire
+LeCouteur
+LeDinh
+LeGuen
+LePage
+LeTarte
+Leader
+Leafloor
+Leahy
+Leander
+Leang
+Leapheart
+Leary
+Leatham
+Leathers
+Leavell
+Leaver
+Leavitt
+Lebars
+Lebeau
+Lebel
+Leblond
+Lebo
+Lebon
+Lecandro
+Leckie
+Leclerc
+Lecompte
+Lecours
+Ledamun
+Leder
+Lederman
+Ledet
+Ledford
+Ledou
+Ledoux
+Ledu
+Leduc
+Ledwell
+Lee
+Leenher
+Leeson
+Lefebvre
+Lefevre
+Leffler
+Leftwich
+Legeny
+Leger
+Legg
+Leggett
+Legrandvallet
+Legris
+Legros
+Legrove
+Legrow
+Lehman
+Lehmann
+Lehrbaum
+Lehtinen
+Lehtovaara
+Leiba
+Leibich
+Leibovitz
+Leibowitz
+Leicht
+Leiding
+Leigh
+Leighton
+Leiker
+Leima
+Lein
+Leinen
+Leistico
+Leitch
+Leitner
+Leitrick
+Leiwe
+Lem
+Lemaire
+Lemay
+Lemieux
+Lemky
+Lemley
+Lemyre
+Lenathen
+Lenehan
+Leney
+Lengel
+Lenhard
+Lenior
+Lenir
+Lennig
+Lenox
+Lentz
+Lenz
+Lenzi
+Leo
+Leo-Miza
+Leon
+Leonard
+Leone
+Leong
+Leonhardt
+Leonida
+Leoutsarakos
+Leow
+Lepine
+Lepore
+Leppert
+Lerch
+Leroux
+Lescot
+Leshowitz
+Lesmerises
+Lesniak
+Lesourd
+Lesperance
+Lessard
+Lessin
+Lester
+Lesway
+Letchworth
+Letendre
+Leth
+Lethbridge
+Lethebinh
+Letourneau
+Letsome
+Lett
+Letulle
+Leuenberger
+Leung
+Leuty
+Levac
+Levasseur
+Leveille
+Levere
+Levert
+Levesque
+Levey
+Levi
+Levin
+Levine
+Levisky
+Levitin
+Levo
+Lew
+Lewandowski
+Lewek
+Lewellen
+Lewinski
+Ley
+Leydig
+Li
+Lian
+Liang
+Liao
+Lias
+Liaw
+Libadmin
+Libov
+Licandro
+Licata
+Licerio
+Lichtenstein
+Liddle
+Lidster
+Lidstone
+Lieberman
+Liebrecht
+Liem
+Lienemann
+Lienhard
+Liepa
+Liesemer
+Liesenberg
+Lieure
+Liew
+Lifshey
+Lightfield
+Lightfoot
+Lighthall
+Lighthiser
+Lightowler
+Ligon
+Ligurs
+Likert
+Likourgiotis
+Lilleniit
+Lillis
+Lilly
+Limbaugh
+Limeina
+Limerick
+Lin
+Linaugh
+Linback
+Linberg
+Lind
+Lindamood
+Lindberg
+Lindbergh
+Lindell
+Lindemulder
+Linder
+Lindholm
+Lindler
+Lindow
+Lindquist
+Lindsay
+Lindsey
+Lindstrom
+Lindt
+Linebarger
+Linegar
+Lineham
+Linfield
+Ling
+Lingafelter
+Linke
+Linkletter
+Linn
+Linton
+Lipari
+Lipe
+Lippens
+Lipschutz
+Lipscomb
+Lipski
+Lisak
+Lisch
+Lischynsky
+Lisee
+Lisenchuk
+Liskoff
+Lister
+Liston
+Litherland
+Litt
+Littau
+Littlewood
+Litva
+Litz
+Litzenberger
+Liu
+Livas
+Livek
+Liverman
+Livermore
+Livezey
+Livingston
+Livingstone
+Livshits
+Lizak
+Lizzi
+Ljubicich
+Llaguno
+Llanos
+Llewellyn
+LoBue
+Loa
+Loadbuild
+Loadbuilder
+Loader
+Loadsum
+Lobasso
+Lobaugh
+Lobello
+Lobianco
+Lobin
+Locicero
+Lockard
+Locke
+Locken
+Lockett
+Lockhart
+Lockwood
+Lococo
+Lodeserto
+Loe
+Loeffler
+Loewen
+Loftis
+Logan
+Logarajah
+Loggins
+Loghry
+Logntp
+Logue
+Loh
+Lohoar
+Loi
+Loiseau
+Loisel
+Lojewski
+Loker
+Lollis
+Lombardo
+Lombrink
+Lommen
+Londhe
+London
+Lonergan
+Longbottom
+Longchamps
+Longfield
+Longhenry
+Longo
+Longpre
+Longtin
+Lonnman
+Lonsdale
+Loo
+Loong
+Loos
+Looyen
+Loper
+Loperena
+Lopes
+Lopez
+Lopiano
+Lopinski
+Loponen
+Loquercio
+Lorance
+Lorenc
+Lorenz
+Lorenzen
+Lorenzo
+Lorfano
+Lorimer
+Lorincz
+Lorint
+Lormor
+Loro
+Lortie
+Losfeld
+Losier
+Loso
+Lotan
+Lote
+Lotochinski
+Lott
+Lotz
+Lou
+Loucel
+Loudiadis
+Lough
+Loughery
+Loughran
+Loughrin
+Louie
+Louis
+Louisseize
+Louk
+Louladakis
+Loux
+Lovas
+Lovatt
+Loveday
+Lovegrove
+Lovejoy
+Lovekin
+Lovelace
+Loveland
+Loveless
+Lovell
+Lovett
+Lovin
+Lovitt
+Lowder
+Lowe
+Lowery
+Lowman
+Lowrie
+Lowther
+Loxton
+Loyd
+Loyer
+Loyola
+Loyst
+Loza
+Lozier
+Lozinski
+Lrcrtp
+Lu
+Luan
+Lucas
+Lucente
+Lucey
+Luciani
+Lucking
+Ludchen
+Ludviksen
+Ludwick
+Ludwig
+Lue
+Luetchford
+Luetke
+Luettchau
+Luff
+Lugsdin
+Lugwig
+Luhcs
+Lui
+Luin
+Luk
+Lukas
+Lukassen
+Lukaszewski
+Luke
+Luker
+Lukers
+Lukic
+Lukie
+Lukshis
+Lum
+Lum-Wah
+Lumley
+Lumsden
+Lun
+Luna
+Lund
+Lunde
+Lundhild
+Lundy
+Lunn
+Luoma
+Luong
+Lupatin
+Lupher
+Lupien
+Luquire
+Luscombe
+Lussier
+Luszczek
+Lutz
+Luu
+Luwemba
+Luxford
+Luyten
+Luzarraga
+Luzine
+Ly
+Lyall
+Lychak
+Lyliston
+Lyman
+Lynham
+Lynn
+Lynton
+Lyon
+Lyons
+Lysinger
+Lystad
+Lystiuk
+Lystuik
+Lytle
+MACKenzie
+MAINT
+MIC
+MMail
+MTL
+Maahs
+Maas
+Mabes
+Mabson
+Mabuchi
+Mac
+Mac Maid
+MacAdams
+MacArthur
+MacCarthy
+MacConaill
+MacCormack
+MacDermaid
+MacDonald
+MacDonell
+MacDougall
+MacDowall
+MacDuff
+MacElwee
+MacFarlane
+MacGillivray
+MacGregor
+MacHattie
+MacInnes
+MacInnis
+MacIsaac
+MacIver
+MacKay
+MacKinnon
+MacLaren
+MacLaurin
+MacLean
+MacLennan
+MacLeod
+MacMartin
+MacMeekin
+MacMillan
+MacMillan-Brown
+MacMullin
+MacNaughton
+MacNeil
+MacNeill
+MacPhail
+MacPherson
+MacRae
+Macalik
+Macaulay
+Maccallum
+Macchiusi
+Mach
+Machan
+Machika
+Machnicki-Hynes
+Maciejewski
+Maciel
+Mackel
+Mackey
+Mackin
+Macklem
+Macklin
+Mackzum
+Maclellan
+Macnicoll
+Macoosh
+Macpost
+Macquistan
+Macsupport
+Madan
+Madani
+Maddix
+Mader
+Madgett
+Madhavan
+Madigan
+Madill
+Madison
+Madl
+Madras
+Madsen
+Maduri
+Maennling
+Maenpaa
+Maeya
+Magbee
+Mage
+Magee
+Mages
+Maginley
+Maglione
+Magnan
+Magnuson
+Magnussen
+Magnusson
+Magrath
+Magri
+Maguire
+Mah
+Mahaffee
+Mahbeer
+Mahendra
+Maher
+Maheu
+Maheux
+Mahiger
+Mahin
+Mahlig
+Mahn
+Mahon
+Mahonen
+Mahoney
+Mahoney-Robbs
+Mai
+Maidenhead
+Maidens
+Maier
+Maijala
+Maika
+Maikawa
+Mailroom
+Mainardi
+Maine
+Mainville
+Mainwaring
+Mair
+Maisonneuve
+Maitland
+Majd
+Majeed
+Majek
+Majernik
+Majid
+Majmudar
+Majors
+Majumdar
+Majury
+Mak
+Makarenko
+Makino
+Makinson
+Makohoniuk
+Makoid
+Maksoud
+Maksuta
+Malaher
+Malam
+Malanos
+Malavia
+Malcolm
+Malec
+Malee
+Malek
+Maleski
+Malhi
+Malhotra
+Maliepaard
+Malik
+Malisic
+Maliski
+Malizia
+Malkani
+Malkiewicz
+Malkinson
+Malle
+Mallett
+Mallory
+Malloy
+Mallozzi
+Malmqvist
+Malone
+Maloney
+Malott
+Malta
+Maltby
+Maltese
+Maludzinski
+Malynowsky
+Malyszka
+Malzahn
+Mamoulides
+Management
+Manager
+Manceau
+Manchester
+Mancini
+Mand
+Mandel
+Mandeville
+Mandrusov
+Maness
+Mangione
+Mangum
+Manica
+Manickam
+Manitius
+Mankowski
+Manley
+Mann
+Manner
+Manners
+Manning
+Mannino
+Mannion
+Manno
+Manolios
+Manoukian
+Mansbridge
+Mansell
+Mansi
+Manson
+Mansourati
+Mansouri
+Mantell
+Manto
+Manuel
+Manus
+Manuszak
+Manverse
+Manwaring
+Mao
+Mapes
+Mapile
+Maracle
+Maragoudakis
+Marano
+Marasco
+Marasliyan
+Marc
+Marcanti
+Marcantonio
+Marceau
+Marcelissen
+Marcellus
+Marcey
+Marchand
+Marchant
+Marcheck
+Marchese
+Marchetti
+Marciniuk
+Marco
+Marcom
+Marconi
+Marcotte
+Marcoux
+Marcum
+Marcus
+Marengere
+Marette
+Margetson
+Marghetis
+Margittai
+Mariani
+Marineau
+Marino
+Marinos
+Marion
+Mariotti
+Maritan
+Markell
+Markes
+Marketing
+Markham
+Markiewicz
+Markland
+Markle
+Markmeyer
+Marko
+Markovic
+Markovich
+Marks
+Marleau
+Marling
+Marlow
+Marmen
+Marmillon
+Marmion
+Marneris
+Marouchos
+Maroun
+Marples
+Marquart
+Marr
+Marra
+Marrec
+Marren
+Marrett
+Marriott
+Marrone
+Marschewaki
+Marsden
+Marshall
+Marshaus
+Marshman
+Marson
+Martel
+Martell
+Martens
+Martenson
+Martenstyn
+Marti
+Martincello
+Martincich
+Martineau
+Martinez
+Marting
+Martins
+Marttinen
+Marturano
+Marui
+Marum
+Maruszak
+Marx
+Maryak
+Marzella
+Marzullo
+Masales
+Masapati
+Masciarelli
+Mashura
+Masika
+Masini
+Maskell
+Maskery
+Maslen
+Masotti
+Masse
+Massengill
+Massey
+Massicotte
+Massingale
+Masson
+Massone
+Massonneau
+Massoudian
+Massumi
+Mastellar
+Mastenbrook
+Masterplan
+Masters
+Masterson
+Mastromattei
+Mastronardi
+Masty
+Matalon
+Matatall
+Materkowski
+Materna
+Mather
+Matheson
+Mathew
+Mathews
+Mathewson
+Mathias
+Mathieson
+Mathieu
+Mathis
+Mathiue
+Mathur
+Mathurin
+Mathus
+Matibag
+Matlock
+Matney
+Matrundola
+Matson
+Matsubara
+Matsugu
+Matsunaga
+Matsushita
+Matsuzaka
+Matsuzawa
+Matteau
+Mattes
+Matthews
+Mattiussi
+Mattiuz
+Matton
+Mattson
+Matusik
+Mau
+Mauck
+Maudrie
+Mauer
+Mauldin
+Maund
+Mauney
+Maunu
+Maurer
+Maveety
+Mavis
+Mavrou
+Mawani
+Mawji
+Mawst
+Maxey
+Maxin
+Maxseiner
+Maxsom
+Maybee
+Maycock
+Maye
+Mayea
+Mayenburg
+Mayer
+Mayes
+Mayfield
+Mayhugh
+Mayman
+Maynard
+Mayne
+Maynes
+Mayo
+Mayoux
+Mayr
+Mayr-Stein
+Mays
+Mazanji
+Mazarick
+Mazey
+Mazurek
+Mazzei
+Mc
+Mc Alpine
+Mc Ginn
+McAdam
+McAdams
+McAdorey
+McAfee
+McAlear
+McAleer
+McAlister
+McAllister
+McAllum
+McAndrew
+McArthur
+McAteer
+McAulay
+McAuliffe
+McBeth
+McBrayne
+McBride
+McBroom
+McBryan
+McCabe
+McCafferty
+McCaffity
+McCaffrey
+McCaig
+McCain
+McCall
+McCallen
+McCallum
+McCampbell
+McCandless
+McCann
+McCarroll
+McCarron
+McCarthy
+McCartin
+McCartney
+McCaugherty
+McCaughey
+McCauley
+McCaw
+McClain
+McClarren
+McClary
+McClean
+McCleery
+McClellan
+McClelland
+McClendon
+McClennon
+McClintock
+McCloskey
+McCloughan
+McClure
+McCluskey
+McClymont
+McColl
+McCollam
+McCollum
+McColman
+McComb
+McCombs
+McConaghay
+McConkey
+McConnell
+McConney
+McCord
+McCorkell
+McCorkle
+McCormack
+McCormick
+McCorquodale
+McCoy
+McCracken
+McCrain
+McCraney
+McCray
+McCready
+McCreanor
+McCreath
+McCreesh
+McCrimmon
+McCuaig
+McCue
+McCullen
+McCulloch
+McCullogh
+McCullough
+McCully
+McCune
+McCurdy
+McCusker
+McDade
+McDaniel
+McDaniels
+McDavitt
+McDermott
+McDevitt
+McDonald
+McDonnell
+McDonough
+McDoom
+McDougald
+McDougall
+McDowall
+McDowell
+McDuffie
+McDunn
+McEachern
+McElderry
+McElhone
+McElligott
+McElrea
+McElroy
+McEvoy
+McEwan
+McEwen
+McEwen-Robillard
+McFadden
+McFall
+McFarland
+McFarlane
+McFeely
+McGalliard
+McGarry
+McGaughey
+McGee
+McGeown
+McGhee
+McGill
+McGillicuddy
+McGillvray
+McGilly
+McGinn
+McGlynn
+McGonagle
+McGonigal
+McGorman
+McGovern
+McGowan
+McGrath
+McGregor
+McGruder
+McGuigan
+McGuinness
+McGuire
+McGurn
+McHale
+McHan
+McHarg
+McHugh
+McInerney
+McInnis
+McIntee
+McIntire
+McIntomny
+McIntosh
+McIntyre
+McIsaac
+McIver
+McKay
+McKeage
+McKSeague
+McKearney
+McKechnie
+McKee
+McKeegan
+McKeen
+McKeithan
+McKenna
+McKenney
+McKenzie
+McKeone
+McKeown
+McKerrow
+McKibben
+McKibbin
+McKibbon
+McKie
+McKillop
+McKinlay
+McKinley
+McKinney
+McKinnon
+McKnight
+McLachlan
+McLaren
+McLauchlan
+McLaughlin
+McLawhon
+McLawhorn
+McLean
+McLellan
+McLemore
+McLenaghan
+McLendon
+McLennan
+McLeod
+McLuskie
+McMahan
+McMahon
+McMann
+McMannen
+McManus
+McMasters
+McMenamin
+McMichael
+McMillan
+McMillen
+McMillian
+McMillion
+McMinn
+McMonagle
+McMullen
+McMullin
+McMurray
+McNab
+McNabb
+McNair
+McNally
+McNamara
+McNamee
+McNaughton
+McNeal
+McNealy
+McNeely
+McNeese
+McNeil
+McNeill
+McNeilly
+McNerlan
+McNerney
+McNichol
+McNicol
+McNitt
+McNulty
+McPhaden
+McPhail
+McPhee
+McPherson
+McQuaid
+McQuaig
+McQuarrie
+McQueen
+McRae
+McRann
+McReady
+McRitchie
+McRonald
+McRuvie
+McSheffrey
+McSorley
+McSween
+McTaggart
+McTavish
+McTiernan
+McTurner
+McVay
+McVeety
+McVeigh
+McVey
+McVicar
+McVicker
+McWalter
+McWalters
+McWaters
+McWherter
+McWhinney
+McWhorter
+McWilton
+Mccoy-Cage
+Mcellistrem
+Mcgehee
+Mcginley
+Mcgrachan
+Mcilroy
+Mcmeegan
+Mcshane
+Meachum
+Meadows
+Meads
+Meagher
+Mealin
+Meany
+Measures
+Meche
+Mecher
+Meckler
+Meckley
+Mecteau
+Medefesser
+Medeiros
+Meder
+Medioni
+Medlin
+Medlock
+Mednick
+Meehan
+Meeks
+Meerveld
+Meese
+Meffe
+Meggitt
+Meghani
+Mehta
+Mei
+Meier
+Meijer
+Meikle
+Meilleur
+Mein
+Meiser
+Meisner
+Meissner
+Mejdal
+Mejia
+Mejury
+Melanson
+Meldrum
+Meleg
+Meleski
+Meleskie
+Meletios
+Melfi
+Melkild
+Mellor
+Melnyk
+Meloling
+Melton
+Melucci
+Menaker
+Menard
+Menasce
+Menashian
+Mencer
+Mendelsohn
+Mendez
+Mendolia
+Mendonca
+Mendorf
+Mendy
+Menechian
+Menendez
+Menna
+Mennie
+Menon
+Mensinkai
+Menyhart
+Menzel
+Menzies
+Mercier
+Merciline
+Meredith
+Meres
+Mereu
+Meridew
+Merinder
+Meriwether
+Merizzi
+Merklinger
+Mermelstein
+Merrett
+Merrick
+Merrill
+Merrills
+Merrils
+Merrithew
+Merritt
+Merryweather
+Mersch
+Mersinger
+Merwin
+Merworth
+Meseberg
+Meskimen
+Mesko
+Mesquita
+Messer
+Messerian
+Messick
+Messier
+Meszaros
+Metcalf
+Metcalfe
+Metelski
+Metheny
+Metherell
+Methiwalla
+Methot
+Metler
+Metrailer
+Metrics
+Mettrey
+Metz
+Metzger
+Meubus
+Meunier
+Mevis
+Meyer
+Meyerink
+Mezzano
+Mezzoiuso
+Mgmt
+Mia
+Miao
+Miasek
+Miceli
+Michael
+Michaelides
+Michaels
+Michaelson
+Michailov
+Michalos
+Michaud
+Michels
+Michelsen
+Michelson
+Michelussi
+Mickens
+Micklos
+Micucci
+Middlebrooks
+Middleton
+Midha
+Mielke
+Miello
+Miernik
+Miers
+Mierwa
+Miezitis
+Mignault
+Mihan
+Mihara
+Mihm
+Mikelonis
+Mikhail
+Miki
+Miko
+Miksik
+Mikulka
+Milaknis
+Milakovic
+Milan
+Milanovich
+Milar
+Milburn
+Miles
+Milford
+Milian
+Milinkovich
+Millaire
+Millar
+Millard
+Millen
+Millerwood
+Millette
+Milligan
+Milloy
+Mills
+Millspaugh
+Millward
+Milmine
+Milne
+Milotte
+Milstead
+Milston
+Miltenburg
+Milton
+Milway
+Mims
+Mina
+Minai
+Minard
+Mincey
+Minck
+Minegishi
+Miner
+Minetola
+Minichilli
+Minichillo
+Minkus
+Minos
+Minter
+Minthorne
+Minyard
+Mior
+Miotla
+Mir
+Miranda
+Mirande
+Mirarchi
+Mirek
+Miron
+Mirza
+Mis
+Misczak
+Mishina
+Miskelly
+Misko
+Misra
+Missailidis
+Misslitz
+Mistry
+Mistuloff
+Misutka
+Mitalas
+Mitchell
+Mitchelson
+Mitchler
+Mitrani
+Mitrou
+Mitsui
+Mittleider
+Mivehchi
+Mizerk
+Mlacak
+Mlcoch
+Mo
+Mobasheri
+Mobley
+Mocock
+Modafferi
+Modi
+Modigh
+Modl
+Modotto
+Moebes
+Moen
+Moening
+Moeschet
+Moetteli
+Moffatt
+Moffet
+Moffett
+Mofina
+Moghe
+Moghis
+Mogridge
+Moh
+Mohajeri
+Mohammad
+Mohammed
+Mohan
+Moharram
+Mohideen
+Mohr
+Mohrmann
+Moizer
+Mojgani
+Mok
+Mok-Fung
+Mokbel
+Mokros
+Molani
+Moledina
+Mollerus
+Molloy
+Molnar
+Molochko
+Moloney
+Molson
+Molyneux
+Mombourquette
+Momon
+Momtahan
+Monachella
+Monaco
+Monaghan
+Monahan
+Moncion
+Monck
+Moncur
+Mondor
+Monet
+Monette
+Moneypenny
+Monforton
+Monfre
+Mong
+Moniter
+Monn
+Monroe
+Monson
+Montag
+Montague
+Montaldo
+Montange
+Montanino
+Montcalm
+Monteggia
+Montelli
+Montero
+Monterosso-Wood
+Montgomery
+Montijo
+Montmorency
+Montor
+Montoute
+Montoya
+Montreal
+Montreuil
+Montsion
+Montsko
+Montuno
+Mony
+Monzo
+Moo-Young
+Mooder
+Moogk
+Mooken
+Moomey
+Mooney
+Moorcroft
+Moore
+Moore-Vigeant
+Moorefield
+Moorer
+Moores
+Moorhouse
+Moosavi
+Moraetes
+Morais
+Morales
+Moran
+Morcinelli
+Mordecai
+Morden
+Mordy
+Moreau
+Moree
+Morek
+Moreland
+Morelli
+Moreno
+Morettin
+Morey
+Morgan
+Morgan-Cavallaro
+Morglan
+Mori
+Moriarty
+Morimoto
+Morin
+Morini
+Morino
+Morissette
+Moritz
+Moriyama
+Morley
+Morneau
+Morocz
+Moroz
+Morra
+Morreale
+Morrin
+Morrison
+Morrissette
+Morse
+Morson
+Mortimer
+Morton
+Moschopoulos
+Moseby
+Moser
+Moshinsky
+Moshiri
+Moshtagh
+Moskalik
+Mosley
+Mostovac
+Motashaw
+Mote
+Mototsune
+Mott
+Mou
+Mouat
+Moubarak
+Mouillaud
+Moulds
+Moulsoff
+Moulton
+Mousseau
+Moussette
+Mowat
+Mowbray
+Mowle
+Moxham
+Moxley
+Moxon
+Moy
+Moyano
+Moyce
+Moyer
+Moyers
+Moynihan
+Mozek
+Mozeleski
+Mraz
+Mrozinski
+Msg
+Mtcbase
+Mtlipadm
+Mtnview
+Mucci
+Muchow
+Mucklow
+Mudry
+Muehle
+Mueller
+Muenstermann
+Mufti
+Mugniot
+Muhammed
+Mui
+Muir
+Muise
+Mujahed
+Mukai
+Mukhar
+Mukherjee
+Mukhopadhyay
+Mulder
+Mulders
+Muldoon
+Mulero
+Mulherkar
+Mulholland
+Mullaly
+Mullaney
+Mullarney
+Mullen
+Muller
+Mullett
+Mullin
+Mullinix
+Mullins
+Mulot
+Mulqueen
+Mulroney
+Mulvie
+Mumford
+Mumma
+Mummy-Craft
+Munden
+Mundi
+Mundy
+Munikoti
+Muniz
+Munn
+Munns
+Munro
+Munroe
+Munsey
+Munter
+Munz
+Muradia
+Murash
+Murat
+Murawski
+Murchison
+Murdaugh
+Murdeshwar
+Murdoch
+Murdock
+Murison
+Murnaghan
+Muro
+Murock
+Murphin
+Murphy
+Murphy-king
+Murray
+Murrell
+Murris
+Murtagh
+Murton
+Musa
+Musca
+Musclow
+Muselik
+Musgrove
+Musick
+Mussallem
+Mussar
+Musselwhite
+Musser
+Mustafa
+Mustillo
+Mutcher
+Muthuswamy
+Muttaqi
+Muus
+Muzio
+Myatt
+Myer
+Myers
+Myers-Pillsworth
+Myhill
+Mykityshyn
+Mymryk
+Myrah
+Myre
+Myrick
+Myrillas
+Myroon
+Mystkowski
+NCC
+NE-Region
+NTINASH
+NTPADMIN
+Nabors
+Nace
+Nadeau
+Nadeau-Dostie
+Nadler
+Nadolny
+Nadon
+Naem
+Nafezi
+Nagai
+Nagaraj
+Nagarur
+Nagel
+Nagendra
+Nagenthiram
+Nagle
+Naguib
+Nagy
+Nagys
+Nahabedian
+Nahas
+Nahata
+Nahmias
+Nahorniak
+Naimpally
+Nair
+Nairn
+Naismith
+Najafi
+Nakamura
+Nakano
+Nakatsu
+Nakhla
+Nakhoul
+Nakonecznyj
+Naldrett
+Nall
+Nallengara
+Nambride
+Namiki
+Namont
+Nanamiya
+Nance
+Nandi
+Naolu
+Naor
+Naoum
+Napert
+Naphan
+Napier-Wilson
+Napke
+Napper
+Narasimhan
+Narayan
+Narayana
+Narayanan
+Nardiello
+Naro
+Narraway
+Narron
+Nasato
+Nash
+Nashville
+Nasir
+Nason
+Nass
+Nassoy
+Nassr
+Natale
+Nath
+Nathoo
+Natiuk
+Naufal
+Naugle
+Naujokas
+Naujoks
+Nault
+Nava
+Navalta
+Navaratnam
+Navarre
+Navarro
+Naveda
+Nawaby
+Naybor
+Naylor
+Nazardad
+Ndububa
+NeKueey
+Neal
+Neander
+Nearing
+Neate
+Neault
+Nebel
+Nedderman
+Needham
+Neefs
+Neely
+Negandhi
+Negrich
+Nehring
+Neibauer
+Neider
+Neidy
+Neifert
+Neil
+Neill
+Neilly
+Neilsen
+Neilson
+Neisius
+Neitzel
+Nelon
+Nelson
+Nemec
+Nemes
+Nemeth
+Nentwich
+Nerby
+Nerem
+Nesbitt
+Nesrallah
+Ness
+Nessman
+Nestor
+NetTeam
+Netas
+Netdbs
+Netdev
+Nethersole
+Netlink
+Neto
+Nettles
+Netto
+Network-Ops
+Networkroom
+Networks
+Netzke
+Neubauer
+Neufeld
+Neuman
+Neumann
+Neumeister
+Neuschwander
+Neustifter
+Neusy
+Nevardauskis
+Neville
+Nevins
+Nevison
+Nevrela
+NewLab
+Newberry
+Newbold
+Newby
+Newcomb
+Newcombe
+Newell
+Newham
+Newhook
+Newkirk
+Newland
+Newman
+Newnam
+Newport
+News
+Newsom
+Newsome
+Neyman
+Neywick
+Nezon
+Ng
+Ngo
+Nguyen
+Nguyen-The
+Nhan
+Nicandro
+Niccolls
+Nicholas
+Nicholl
+Nichols
+Nicholson
+Nickell
+Nickells
+Nickels
+Nickerson
+Nickle
+Nickonov
+Nicol
+Nicolaou
+Nicoletta
+Nicolle
+Nicosia
+Nie
+Niebudek
+Niedens
+Niedra
+Niedzwiecki
+Nielsen
+Nielson
+Niemi
+Niepmann
+Niergarth
+Nigam
+Nikfarjam
+Nikiforuk
+Nikolopoulos
+Nilakantan
+Niles
+Nill
+Nilson
+Nilsson
+Nimmo
+Ninety-one
+Ning
+Nipper
+Niro
+Nisbet
+Nischuk
+Nishida
+Nishiguchi
+Nishihara
+Nishimura
+Nishith
+Nishiyama
+Nitschky
+Niu
+Nix
+Nixon
+Nizamuddin
+Nizman
+Njo
+Noah
+Nobes
+Nock
+Noddin
+Noel
+Noffke
+Noguchi
+Nokes
+Nolan
+Nolan-Moore
+Nolen
+Noles
+Nolet
+Noll
+Nolter
+Nomura
+Nonkes
+Noone
+Noorani
+Noorbhai
+Norby
+Norczen
+Nordskog
+Nordstrom
+Norfleet
+Norgaard
+Noris
+Norman
+Normandin
+Norment
+Norndon
+Noronha
+Norris
+Northam
+Northcott
+Norton
+Norwood
+Noseworthy
+Notley
+Nou
+Noujeim
+Novak
+Novia
+Novisedlak
+Novotny
+Nowak
+Nowell
+Nowina-Konopka
+Nowlin
+Noy
+Noye
+Noyes
+Npi
+Nss
+Ntelpac
+Ntlc
+Ntprel
+Nttest
+Nuber
+Nuetzi
+Nugent
+Nunes
+Nunez
+Nunn
+Nunnally
+Nunold
+Nurmi
+Nuttall
+Nyberg
+Nyce
+Nyland
+Nyre
+Nys
+O Karina
+O'Brecht
+O'Brian
+O'Brien
+O'Carroll
+O'Colmain
+O'Connell
+O'Conner
+O'Connor
+O'Dacre
+O'Dale
+O'Dea
+O'Doherty
+O'Donnell
+O'Donovan
+O'Dwyer
+O'Farrell
+O'Grady
+O'Hagan
+O'Hara
+O'Hearn
+O'Heocha
+O'Higgins
+O'Keefe
+O'Keeffer
+O'Kelly
+O'Leary
+O'Malley
+O'Meara
+O'Murchu
+O'Neal
+O'Neall
+O'Neil
+O'Neill
+O'Regan
+O'Reilly
+O'Rourke
+O'Shaughnessey
+O'Shaughnessy
+O'Shea
+O'Sullivan
+O'Toole
+OConnor
+OFCPARM
+OFCPARMS
+OPERATIONS
+OPS
+OPSPLNG
+OKelly
+Oakley
+Oaks
+Oam
+Oanes
+Oastler
+Oates
+Obeda
+Obeidat
+Obenauf
+Ober
+Oberhammer
+Obermeyer
+Obermyer
+Oberpriller
+Oblak
+Obrecht
+Obrien
+Obrusniak
+Ocampo
+Ochman
+Ochoa
+Ochs
+Ocone
+Odac
+Odden
+Odecki
+Odegaard
+Oden
+Odgers
+Odum
+Oertelt
+Oesterreicher
+Oestreich
+Oetting
+Oey
+Offers
+Ogan
+Ogburn
+Ogilvie
+Ogrodnik
+Oguz
+Ohandley
+Ohashi
+Ohmaru
+Ohmayer
+Ohsone
+Ojerholm
+Oka
+Okada
+Okafo
+Okai
+Okamoto
+Oke
+Okon
+Okun
+Okura
+Okuzawa
+Older
+Oldfield
+Oldham
+Oldright
+Oleksyshyn
+Olesen
+Olesko
+Olinger
+Olinyk
+Olivares
+Oliveira
+Oliver
+Olivier
+Olliff
+Olmstead
+Olsen
+Olsheski
+Olson
+Olszewski
+Olynyk
+Oman
+Omura
+Onder
+Ondovcik
+Ong
+Onsiteteam
+Onsy
+Onufrak-Stoner
+Onyshko
+Ooi
+Oost
+Op
+Opalski
+Oper
+Operator
+Operators
+Oplinger
+Oran
+Ord
+Ordas
+Orders
+Ordog
+Ordway
+Oreffice
+Oreilly
+Orfano
+Orford
+Organization
+Orgren-Streb
+Orlando
+Orme
+Ormesher
+Ormsby
+Ornburn
+Orol
+Oros
+Orr
+Orser
+Orsini
+Orth
+Ortiz
+Orton
+Osadciw
+Osatuik
+Osborn
+Osborne
+Osburn
+Osgood
+Oshinski
+Oshiro
+Osiakwan
+Oskorep
+Oslund
+Osman
+Ostapiw
+Ostarello
+Ostaszewski
+Oster
+Osterberg
+Osterhout
+Osterman
+Ostifichuk
+Oswald
+Oswalt
+Otsuka
+Ottco
+Ottosson
+Ottowa
+Oturakli
+Otway
+Oucharek
+Ouellet
+Ouellette
+Ouimet
+Outage
+Outhwaite
+Outram
+Ouzas
+Ovans
+Ovas
+Overby
+Overcash
+Overdyke
+Overton
+Oviedo
+Owen
+Owens
+Owensby
+Owsiak
+Oxendine
+Oyama
+Ozer
+Ozersky
+Oziemblo
+Oziskender
+Ozkan
+Ozmizrak
+Ozmore
+Ozyetis
+PATCOR
+PCBOARDS
+PCBTOOLS
+PKDCD
+Paar
+Pacey
+Pachal
+Pacheco
+Pachek
+Pachner
+Pachulski
+Packager
+Packard
+Pacon
+Paczek
+Paczynski
+Paddon
+Padgett
+Padilla
+Padiou
+Paes
+Paetsch
+Pafilis
+Pagani
+Pageau
+Paget
+Pagi
+Paglia
+Pagliarulo
+Pai
+Paialunga
+Paige
+Paine
+Painter
+Pak
+Paksi
+Pakulski
+Palacek
+Palamar
+Palasek
+Palczuk
+Palermo
+Paley
+Palfreyman
+Palidwor
+Paliga
+Palik
+Paliwal
+Pallen
+Palmer
+Paluso
+Pambianchi
+Pamperin
+Pancewicz
+Panch
+Panchen
+Panchmatia
+Pancholy
+Pandey
+Pandolfo
+Pandrangi
+Pandya
+Panek
+Panesar
+Panger
+Pangia
+Panizzi
+Panke
+Pankhurst
+Pankiw
+Panko
+Pankratz
+Pannell
+Panosh
+Pantages
+Pantalone
+Panter
+Panton
+Pao
+Paoletti
+Paone
+Papadopulos
+Papageorges
+Papageorgiou
+Papajanis
+Papalitskas
+Papantonis
+Paparella
+Pape
+Paperno
+Papers
+Papiez
+Papineau
+Papp
+Pappas
+Papper
+Pappu
+Paprocki
+Paquette
+Paquin
+Paracha
+Paradis
+ParadiseNTMVAA
+Parasiliti
+Pardi
+Parham
+Parihar
+Parikh
+Paris
+Parise
+Parisen
+Parisi
+Parisien
+Parkash
+Parker
+Parker-Shane
+Parkes
+Parkhill
+Parkin
+Parkins
+Parkinson
+Parks
+Parmaksezian
+Parman
+Parmar
+Parmenter
+Parmigiani
+Parn
+Parnell
+Parniani
+Parnigoni
+Parow
+Parr
+Parra
+Parrilli
+Parrillo
+Parrish
+Parrish-Bell
+Parrott
+Parsloe
+Parsons
+Partello
+Parthasarathy
+Partin
+Parton
+Partovi
+Parulekar
+Paryag
+Parypa
+Pascal
+Pascale
+Pascali
+Pascas
+Paschall
+Pasher
+Pashia
+Pashmineh
+Pasquale
+Passier
+Passin
+Pasternak
+Pastore
+Pastorek
+Pastuszok
+Pasvar
+Patacki
+Patchcor
+Patchett
+Patchor
+Patchsqa
+Patel
+Patenaude
+Paterson
+Patey
+Pathak
+Patner
+Patoka
+Paton
+Patoskie
+Patriarche
+Patrick
+Patrizio
+Patry
+Patte
+Patten
+Patterson
+Patteson
+Pattison
+Pattullo
+Patwardhan
+Pau
+Paul
+Paulett
+Pauley
+Paulhus
+Pauli
+Paulich
+Paulin
+Pauling
+Paulk
+Paulovics
+Paulus
+Paunins
+Pavitt
+Pavlic
+Pavlovic
+Pawelchuk
+Pawlikowski
+Pawliw
+Paye
+Payette
+Paylor
+Payn
+Payne
+Paynter
+Payton
+Pazos
+Pbx
+PcSupport
+Pde
+Pdesupport
+Peacemaker
+Peacocke
+Peake
+Pearce
+Pearcy
+Pearse
+Pearson
+Peart
+Peate
+Peaugh
+Peavoy
+Pecic
+Peckel
+Peckett
+Pedigo
+Pedley
+Pedneault
+Peebles
+Peedin
+Peerman
+Peers
+Peeters
+Peets
+Pegler
+Peirce
+Peiser
+Peixoto
+Peleato
+Pelissier
+Pelkie
+Pell
+Pelland
+Pellegrini
+Pelletier
+Pellizzari
+Pellizzeri
+Pelosi
+Pelot
+Pelton
+Peluso
+Pelz
+Pena
+Pena-Fernandez
+Pendergraft
+Pendergrass
+Pendharkar
+Pendleton
+Penfield
+Peng
+Penland
+Penn
+Pennell
+Penner
+Penney
+Pennington
+Peon
+Peoples
+Pepe
+Pepin
+Pepler
+Pepper
+Pepple
+Peptis
+Pera
+Peralta
+Perazzini
+Perchthold
+Percy
+Pereira
+Perenyi
+Perez
+Perfetti
+Pericak
+Perina
+Perkins
+Perkinson
+Perlmutter
+Pernell
+Perras
+Perrault
+Perreault
+Perrella
+Perrier
+Perrin
+Perrine
+Perron
+Perrotta
+Perry
+Perryman
+Persaud
+Perschke
+Persechino
+Personna
+Peschke
+Pesik
+Pesold
+Pestill
+Peter
+Peterman
+Peters
+Petersen
+Peterson
+Petillion
+Petras
+Petrea
+Petree
+Petrescu
+Petretta
+Petrey
+Petrick
+Petrie
+Petrinack
+Petro
+Petrovic
+Petrunewich
+Petrunka
+Petschenig
+Pettinger
+Pettitt
+Petzold
+Pevec
+Pevzner
+Pewitt
+Pezzoli
+Pezzoni
+Pezzullo
+Pfeffer
+Pfeilschifter
+Pfieffer
+Pfifferling
+Pfitzner
+Phagan
+Phair
+Phalen
+Phalpher
+Pham
+Phan
+Pharr
+Pharris
+Phelan
+Phelps
+Phifer
+Philbeck
+Philion
+Philip
+Philips
+Phillip
+Phillips
+Philp
+Phipps
+Phung
+Piasecki
+Piatt
+Picard
+Piche
+Pichocki
+Pickens
+Pickett
+Pickles
+Piecaitis
+Piecowye
+Piel
+Pien
+Piercey
+Piercy
+Pieron
+Pierosara
+Pieroway
+Pierre
+Pierret
+Piersol
+Pierson
+Pietromonaco
+Pietropaolo
+Pietrzak
+Piette
+Pifko
+Piggott
+Pighin
+Piitz
+Pilch
+Pilcher
+Pilip
+Pilipchuk
+Pilkington
+Pillars
+Pillman
+Pillsworth
+Pilmoor
+Pilon
+Pilote
+Pilotte
+Piltz
+Pimentel
+Pimiskern
+Pimpare
+Pinalez
+Pinchen
+Pinder
+Pindur
+Pineau
+Pinel
+Pinizzotto
+Pinkerton
+Pinnegar
+Pinney
+Pino
+Pinsonneault
+Pintado
+Pinto-Lobo
+Pintwala
+Piotto
+Piper
+Piperni
+Piperno
+Pipit
+Pipkins
+Pippin
+Pippy
+Piqueras
+Piraino
+Pirkey
+Pirkle
+Pisani
+Piske
+Pissot
+Pistilli
+Pitcairn
+Pitcavage
+Pitcher
+Pitre
+Pitt
+Pittam
+Pittges
+Pittman
+Pittner
+Pitton
+Pitts
+Pituley
+Piwkowski
+Piyasena
+Pizzanelli
+Pizzarello
+Pizzimenti
+Pkg
+Placido
+Plaisance
+Plaisant
+Plambeck
+Plamondon
+Planas
+Planche
+Plantamura
+Plante
+Planthara
+Planting
+Plaskie
+Plasse
+Plastina
+Plater-Zyberk
+Plato
+Platt
+Platthy
+Platts
+Playatuna
+Plenderleith
+Plett
+Pleydon
+Plmcoop
+Ploeg
+Ploof
+Plotter
+Plouffe
+Plourde
+Plsntp
+Plssup
+Plucinska
+Plummer
+Plyler
+Podlesna
+Podmaroff
+Podolski
+Poe
+Poettcker
+Poff
+Pohlmann
+Poindexter
+Pointner
+Poirier
+Poissant
+Pokinko
+Pokrifcak
+Pokrywa
+Pokusay
+Polak
+Polakowski
+Polanco
+Polashock
+Polder
+Poleretzky
+Poley
+Poliwoda
+Polk
+Pollack
+Pollinzi
+Pols
+Polsha
+Polson
+Poluchowska
+Polulack
+Poma
+Pomerleau
+Pomeroy
+Pommainville
+Pompeo
+Pomposelli
+Pon
+Ponthieux
+Poole
+Poon
+Poorman
+Popa
+Popadick
+Popel
+Popela
+Popescu
+Popieraitis
+Popoff
+Popovich
+Popovics
+Popowicz
+Popowycz
+Popp
+Popper
+Porebski
+Porecha
+Portelance
+Porter
+Porterfield
+Portigal
+Portwood
+Portz
+Posavad
+Pospisil
+Posta
+Postavsky
+Posthumus
+Postlethwaite
+Postolek
+Potesta
+Potocki
+Potter
+Pottle
+Potts
+Potvin
+Pouhyet
+Poulin
+Pouliot
+Poulos
+Poulsen
+Poulter
+Poustchi
+Powell
+Powers
+Pownall
+Powney
+Poyer
+Poyner
+Pozzi
+Pracht
+Prada
+Prado
+Praeuner
+Prakash
+Prang
+Prasad
+Prasada
+Prashad
+Prashaw
+Pratt
+Prattico
+Pravato
+Praysner
+Prchal
+Precoda
+Predel
+Predon
+Preece
+Preo
+Prescott
+Presgrove
+Presley
+Presner
+Presson
+Presti
+Prestia
+Prestipino
+Preston
+Preston-Thomas
+Prestrud
+Presutti
+Preuss
+Prevatt
+Preville
+Prevost
+Prewitt
+Prichard
+Prickett
+Pridgen
+Priede
+Priestley
+Prikkel
+Primeau
+Pringle
+Prints
+Printsupport
+Pritchard
+Privett
+Privitera
+Problems
+Probs
+Procaccio
+Procca
+Procner
+Procter
+Prodmfg
+Prodmgmt
+Production
+Proffit
+Prog
+Program-Office
+Projects
+Projofc
+Prokes
+Prokop
+Prokopenko
+Propes
+Prosise
+Prosperi
+Pross
+Prosyk
+Proudfoot
+Proulx
+Provencal
+Provencher
+Pruett
+Prunier
+Prupis
+Prybyla
+Prymack
+Pryor
+Prystie
+Pryszlak
+Przewlocki
+Przybycien
+Psklib
+Psutka
+Ptefs
+Puchala
+Puckett
+Puddington
+Pue-Gilchrist
+Puelma
+Puent
+Puett
+Puetz
+Pufpaff
+Pugh
+Puglia
+Pujara
+Pulcher
+Pulcine
+Pullan
+Pullum
+Pulver
+Pundyk
+Pung
+Purcell
+Purchasing
+Purdy
+Purgerson
+Purington
+Purnell
+Purohit
+Purson
+Puryear
+Pushelberg
+Pusztai
+Putman
+Putnam
+Puukila
+Pye
+Pyle
+Pyles
+Pyron
+Qadir
+Qadri
+Qainfo
+Qu
+Quan
+Quane
+Quante
+Quantrill
+Quartermain
+Quattrucci
+Quayle
+Quek
+Quelch
+Quenneville
+Querengesser
+Queries
+Quesnel
+Questell
+Quevillon
+Quigley
+Quilty
+Quinlan
+Quinn
+Quinones
+Quintana
+Quintero
+Quintin
+Quinz
+Quizmaster
+Quon
+Qureshi
+RK
+RTP
+Raab
+Raaflaub
+Rabadi
+Rabaglia
+Rabatich
+Rabecs
+Rabenstein
+Rabiasz
+Rabie
+Rabipour
+Rabjohn
+Rabon
+Rabzel
+Racette
+Racicot
+Racine
+Racioppi
+Racz
+Radcliffe
+Raddalgoda
+Radford
+Radick
+Radko
+Radojicic
+Radovnikovic
+Radulovich
+Radvanyi
+Rafael
+Rafek
+Rafferty
+Rafflin
+Rafol
+Rafter
+Raftery
+Ragan
+Ragbir
+Ragde
+Raghunath
+Ragland
+Raglin
+Ragsdale
+Raha
+Rahal
+Rahdar
+Rahimtoola
+Rahm
+Rahman
+Rahmani
+Rahmany
+Rahn
+Rahrer
+Raila
+Railey
+Raine
+Raines
+Rainey
+Raing
+Rains
+Rainsforth
+Raissian
+Raiswell
+Rajala
+Rajapakse
+Rajcher
+Rajchgod
+Rajchwald
+Rajczi
+Rajguru
+Rajwani
+Raker
+Rakesh
+Rakochy
+Rakotomalala
+Raley
+Ralph
+Rama
+Ramachandran
+Ramage
+Ramakesavan
+Ramakrishna
+Raman
+Ramanathan
+Ramaswamy
+Rambo
+Rambow
+Ramee
+Ramey
+Ramirez-Chavez
+Ramkissoon
+Ramlogan
+Ramnarine
+Ramondt
+Ramos
+Rampaul
+Ramroop
+Ramsaran
+Ramsay
+Ramsayer
+Ramsden
+Ramsey
+Ramseyer
+Ranahan
+Rance
+Rand
+Randall
+Randecker
+Randell
+Randhawa
+Randolph
+Raney
+Rangaswami
+Rangel
+Ranger
+Rangooni
+Ranieri
+Ranjan
+Rankin
+Rannells
+Ranoa
+Ranoska
+Rantala
+Rao
+Raphael
+Rappoport
+Rasberry
+Raschig
+Rashed
+Rashid
+Rashidi
+Rasmus
+Rasmussen
+Rassell
+Rastelli
+Rastogi
+Ratcliffe
+Rathbun
+Ratnam
+Ratnayake
+Rattray
+Ratz
+Rau
+Raud
+Rauen
+Rausa
+Rausch
+Raves
+Ravi
+Ravindranath
+Ravji
+Raxter
+Rayl
+Rayment
+Raymond
+Raynard
+Rayner
+Raynor
+Rch
+Rea
+Reade
+Readling
+Realtime
+Reaume
+Reaves
+Reavis
+Recabarren
+Receiving
+Reckhard
+Recktenwald
+Records
+Recsnik
+Recycling
+Reda
+Reddick
+Reddigan
+Redding
+Reddington
+Reddy
+Redfoot
+Redish
+Redman
+Redmond
+Redshaw
+Redway
+Reece
+Reeder
+Rees
+Reese
+Reetz
+Reeves
+Rega
+Regan
+Rege
+Regier
+Regimbald
+Register
+Regnier
+Rego
+Rehbein
+Rehder
+Rehel
+Reich
+Reichenbach
+Reichinger
+Reichman
+Reichow
+Reid
+Reidelberger
+Reifschneider
+Reijerkerk
+Reilly
+Reiman
+Reimann
+Reimbursement
+Reinboth
+Reinhold
+Reinink
+Reinke
+Reinlie
+Reinwald
+Reis
+Reiser
+Reiss
+Reist
+Reiter
+Reitfort
+Reith
+Reitlingshoefer
+Rekowski
+Relations
+Reller
+Rembecki
+Rembish
+Remedios
+Remers
+Remillard
+Remon
+Remrey
+Remson
+Renaud
+Rendon
+Reneau
+Renfro
+Renfroe
+Renken
+Rennie
+Reno
+Renton
+Renwick
+Repeta
+Reporting
+Reports
+Requests
+Research
+Resnick
+Ress
+Ressner
+Rester
+Restore
+Restrepo
+Results
+Retallack
+Rettie
+Reuben
+Reuss
+Reva
+Revah
+Revelle
+Revill
+Revis
+Rewitzer
+Rexroad
+Rey
+Reydman
+Reyes
+Reynolds
+Rezaian
+Rezansoff
+Reznechek
+Reznick
+Rezzik
+Rfa
+Rff
+Rhattigan
+Rheault
+Rheaume
+Rhew
+Rhoades
+Rhoads
+Rhodenizer
+Rhodes
+Rhyndress
+Rialland
+Ribakovs
+Ribaldo
+Ribi
+Ribot
+Riccitelli
+Ricciuto
+Richard
+Richards
+Richardson
+Richer
+Richlark
+Richman
+Richmond
+Rickard
+Rickborn
+Rickel
+Ricker
+Ricketson
+Ricketts
+Rickey
+Ricks
+Riddall
+Riddick
+Rider
+Ridgeway
+Ridgewell
+Ridgway
+Ridley
+Riebl
+Riedel
+Riehle
+Rigdon
+Riggins
+Riggs
+Riggsbee
+Rightmire
+Rigsbee
+Rigstad
+Rikley
+Riley
+Riml
+Rimmler
+Rimsa
+Rintala
+Rintoul
+Riopel
+Riopelle
+Riordan
+Rios
+Riou
+Rioux
+Ripa
+Ripley
+Risdal
+Risher
+Rishy-Maharaj
+Risko
+Risler
+Rist
+Risto
+Ritchey
+Ritchie
+Ritenour
+Rittenhouse
+Ritter
+Rittmann
+Ritz
+Ritza
+Ritzmann
+Riva
+Rivard
+Rivera
+Rivers
+Rivest
+Rix
+Rizewiski
+Rizk
+Rizzuti
+Robart
+Robb
+Robbins
+Roberge
+Roberson
+Robert
+Roberto
+Roberts
+Robertson
+Robieux
+Robillard
+Robins
+Robinson
+Robitaille
+Robles
+Robson
+Robustness
+Roch
+Roche
+Rochelle
+Rochon
+Rockley
+Roddick
+Roddy
+Rodely
+Roden
+Rodenfels
+Rodger
+Rodgers
+Rodi
+Rodkey
+Rodney
+Rodrigue
+Rodrigues
+Rodriguez
+Rodriques
+Rodriquez
+Rodschat
+Roehl
+Roehrig
+Roelofs
+Roerick
+Roesler
+Roeten
+Rogan
+Roger
+Rogers
+Rogge
+Rogne
+Rogness
+Rognlie
+Rohal
+Rohan
+Rohtert
+Roig
+Roithmaier
+Rojas
+Rok
+Rokas
+Roldan
+Roleson
+Rolfes
+Rolland
+Rollin
+Rollins
+Rollinson
+Rollo
+Rolls
+Rolnick
+Rolph
+Rolston
+Romagnino
+Roman
+Romanchuck
+Romano
+Romanowski
+Rombeek
+Romberg
+Rombough
+Romero
+Ronald
+Ronaldson
+Ronan
+Rondeau
+Roney
+Roob
+Roohy-Laleh
+Rooney
+Roots
+Roper
+Rorie
+Rosa
+Rosado
+Rosch
+Rosche
+Roscoe
+Roseland
+Rosenberg
+Rosenblum
+Rosenfeld
+Rosenquist
+Rosenthal
+Rosewell
+Rosien
+Rosko
+Rospars
+Ross
+Ross-Adams
+Ross-Ross
+Rossanese
+Rosser
+Rossi
+Rossignol
+Rosson
+Rosvick
+Roszko
+Rotenberg
+Roth
+Rothamel
+Rothey
+Rothwell
+Rotondo
+Rotzjean
+Rouer
+Rouleau
+Roulez
+Roundy
+Rourk
+Rourke
+Rous
+Rousseau
+Roussier
+Roussin
+Roussy
+Routhier
+Routing
+Rowan
+Rowatt
+Rowe
+Rowell
+Rowen
+Rowhani
+Rowland
+Rowlandson
+Rowley
+Rowsell
+Roy
+Royals
+Royer
+Royle
+Royster
+Rozen
+Rozier
+Rozon
+Rozumna
+Rtpbuild
+Rtprel
+Rtprelb
+Ruane
+Ruaud
+Ruban
+Ruben
+Rubin
+Rubinov
+Rubinstein
+Rubio
+Ruck
+Ruckman
+Rud
+Rudd
+Ruddell
+Ruddick
+Ruddle
+Rudiak
+Rudis
+Rudisill
+Rudzinski
+Rudzitis
+Ruel
+Ruest
+Ruffolo
+Rufino
+Ruigrok
+Ruiz
+Rumley
+Rummans
+Rummel
+Rummell
+Runciman
+Rundle
+Rundstein
+Runkel
+Runnels
+Running
+Runyon
+Rupert
+Rupnow
+Rupp
+Ruppert
+Ruprecht
+Rusch
+Ruschmeier
+Rushing
+Rushton
+Rusin
+Russell
+Russett
+Ruth
+Ruthart
+Rutherford
+Rutland
+Rutledge
+Rutt
+Ruttan
+Rutter
+Rutulis
+Rutyna
+Ruyant
+Ruzicka
+Ruzycki
+Ryall
+Ryals
+Ryan
+Rybczynski
+Rychlicki
+Ryde
+Ryder
+Rydhan
+Ryerson
+Rygwalski
+Rykwalder
+Rylott
+Rymkiewicz
+Rynders
+Rynties
+Rzepczynski
+SHOP
+SOS
+SUPPORT
+SVM-BNRMTVA
+SVM-BNRMTVB
+SWR
+SYS
+SYSINT
+Saad
+Saatcioglu
+Sabadash
+Sabat
+Sabatini
+Sabbagh
+Saberi
+Sabety
+Sabo
+Sabol
+Saboorian
+Sabourin
+Sabri
+Sabry
+Sacarello
+Sacchetti
+Sadeghi
+Sadler
+Sadorra
+Sadri
+Sadroudine
+Saed
+Safah
+Sagan
+Sager
+Sagris
+Saha
+Sahinalp
+Sahli
+Saidzadeh
+Saifullah
+Saikaley
+Sails
+Saini
+Sainsbury
+Saisho
+Saito
+Saiyed
+Sakaguchi
+Sakauye
+Sakus
+Salada
+Saladna
+Salam
+Salamon
+Salapek
+Salazar
+Salb
+Saleh
+Salehi
+Salem
+Salembier
+Salemi
+Sales
+Salgado
+Salhany
+Salibi
+Salim-Yasuda
+Salimi
+Salinas
+Salkilld
+Salkini
+Salkok
+Salladay
+Sallee
+Salomon
+Salsbery
+Saltamartini
+Salter
+Saltsider
+Salva
+Salvato
+Salvin
+Salyer
+Salyniuk
+Salzillo
+Samac
+Samalot
+Samaroo
+Sambi
+Samhaber
+Samieian
+Sammon
+Sammons
+Samora
+Sampaleanu
+Sampat
+Sampson
+Sampson-Cobb
+Samson
+Samsonenko
+Samuel
+Sanabria
+Sanborn
+Sanche
+Sanchez
+Sandberg
+Sandell
+Sanders
+Sanderson
+Sandford
+Sandhar
+Sandhu
+Sandiford
+Sandison
+Sandler
+Sandlford
+Sandner
+Sandness
+Sandre
+Sandrock
+Sanford
+Sanford-Wright
+Sangha
+Sanh
+Sanity
+Sankey
+Sanks
+Sanoy
+Sanramon
+Sanschagrin
+Sansom
+Sanson
+Santabarbara
+Santella
+Santi
+Santiago
+Santitoro
+Santos
+Sanzone
+Sapena
+Saran
+Saran-Brar
+Saravanos
+Sarbutt
+Sargent
+Sargeson
+Sarin
+Sarioglu
+Sarkari
+Sarlos
+Sarma
+Sarna
+Sarrasin
+Sarrazin
+Sarson
+Sartin
+Sarto
+Sartor
+Sarubbi
+Sasaki
+Sasore
+Sassine
+Sasson
+Sastry
+Sathe
+Satkamp
+Satkunaseelan
+Sato
+Satta
+Satterfield
+Sattler
+Satya
+Saucerman
+Sauck
+Sauder
+Sauer
+Saul
+Saulnier
+Sauls
+Saumure
+Saundercook
+Saunders
+Saunderson
+Saungikar
+Sauvageau
+Sauve
+Savadkouhi
+Savanh
+Savard
+Savarimuthu
+Savaryego
+Savino
+Savoie
+Sawada
+Saward
+Sawaya
+Sawchuk
+Sawczyn
+Sawyers
+Saxena
+Sayar
+Sayed
+Sayegh
+Sayer
+Sayre
+Scalabrini
+Scalera
+Scales
+Scammerhorn
+Scamurra
+Scandrett
+Scanga
+Scanlan
+Scanlon
+Scapin
+Scarborough
+Scarbrough
+Scarffe
+Scarlett
+Scarrow
+Scatena
+Scates
+Schacham
+Schachtler
+Schack
+Schadan
+Schaefer
+SchaeferNTMVAA
+Schaefers
+Schafer
+Schaffel
+Schallenberg
+Schaller
+Schanck
+Schanne
+Scharf
+Schartmann
+Schatzberg
+Schauer
+Schavo
+Schavone
+Scheck
+Schecter
+Schedulers
+Scheduling
+Scheer
+Scheffler
+Scheible
+Scheidt
+Scheifele
+Schejbal
+Schell
+Schellenberger
+Schembri
+Schemena
+Schenck
+Schenk
+Schenkel
+Schepps
+Scherbinsky
+Scherer
+Scherzinger
+Schesvold
+Scheuermann
+Schick
+Schieber
+Schiefer
+Schiegl
+Schierbaum
+Schill
+Schiller
+Schilling
+Schiltz
+Schinkel
+Schipper
+Schirmer
+Schirtzinger
+Schissel
+Schittl
+Schlachter
+Schlagenhauf
+Schlange
+Schledwitz
+Schlegel
+Schlemmer
+Schlichtherle
+Schlichting
+Schlobohm
+Schluter
+Schmadtke
+Schmeing
+Schmeler
+Schmelzel
+Schmidt
+Schmitigal
+SchmitigalNTMVAA
+Schmitt
+Schmitz
+Schmoe
+Schnackenberg
+Schnaithman
+Schneider
+Schneiders
+Schnell
+Schnirer
+Schnob
+Schnupp
+Schnurmann
+Schober
+Schoch
+Schoen
+Schoenermarck
+Schoenling
+Schofield
+Scholes
+Scholey
+Scholman
+Scholtz
+Schonberger
+Schooley
+Schousboe
+Schrader
+Schrage
+Schram
+Schraner
+Schrang
+Schreiber
+Schreier
+Schreiner
+Schrier
+Schroeder
+Schroer
+Schroff
+Schryburt
+Schubert
+Schuck
+Schuddeboom
+Schuett
+Schuette
+Schuld
+Schulte
+Schultz
+Schultze
+Schulze
+Schumacher
+Schumann
+Schuster
+Schute
+Schutte
+Schutz
+Schvan
+Schwab
+Schwaderer
+Schwalbach
+Schwane
+Schwantes
+Schwartz
+Schwarz
+Schwenk
+Schyving
+Scibek
+Scissons
+Scodras
+Scomello
+Sconzo
+Scorziello
+Scott
+Scotti
+Scourneau
+Scovell
+Scovill
+Scp
+Scrantom
+Scrbacic
+Screener
+Scribner
+Scrivens
+Scroger
+Scss
+Scssdev
+Scully
+Scurlock
+Seabrook
+Seager
+Seagle
+Seagraves
+Seagroves
+Seale
+Sealy
+Seamster
+Searl
+Searles
+Sears
+Seatter
+Seawell
+Seay
+Sebastian
+Sebastien
+Sebeh
+Secrest
+Security
+Seddigh
+Sedran
+Seeds
+Seegobin
+Seelaender
+Seeler
+Seeley
+Seery
+Sees
+Seetharaman
+Seggie
+Seguin
+Sehgal
+Sehinson
+Sehmbey
+Sei
+Seidl
+Seidman
+Seifers
+Seifert
+Seifried
+Seiler
+Seiple
+Seitz
+Seiz
+Sej
+Selbrede
+Selby
+Selchow
+Selent
+Selic
+Seliske
+Selisker
+Selkirk
+Sellars
+Sellers
+Sells
+Sellwood
+Sembi
+Semeniuk
+Semler
+Semmens
+Sendyk
+Senecal
+Senese
+Sengoba
+Sengupta
+Seniuk
+Senten
+Sentner
+Senyildiz
+Senyshyn
+Sepe
+Sepko
+Serack
+Serapin
+Serber
+Serbin
+Serbus
+Seregelyi
+Sergent
+Sergi
+Sergo
+Seroka
+Serour
+Serraf
+Serrano
+Serre
+Servais
+Servance
+Services
+Servidio
+Serville
+Seshadri
+Sethi
+Sethian
+Setiawan
+Seto
+Settels
+Setterfield
+Settles
+Seufert
+Severin
+Severinac
+Severn
+Severns
+Sevigny
+Sevilla
+Sewell
+Seymour
+Sezer
+Sfiroudis
+Sgornikov
+Sguigna
+Shabatura
+Shabo
+Shackelford
+Shackleford
+Shackleton
+Shackley
+Shaddock
+Shafer
+Shaffer
+Shafik
+Shahen
+Shahroodi
+Shakib
+Shalla
+Shalmon
+Shamblin
+Shames
+Shamji
+Shamshiri
+Shan
+Shanahan
+Shane
+Shaner
+Shang
+Shankar
+Shannon
+Shantz
+Shao
+Shapcott
+Shapin
+Shapiro
+Shapland
+Shariff
+Sharkey
+Sharma
+Sharman
+Sharpe
+Sharratt
+Shastri
+Shastry
+Shattuck
+Shaughnessy
+Shaver
+Shayanpour
+Shea
+Sheaffer
+Shealy
+Shearer
+Shearin
+Shearman
+Shears
+Shechtman
+Shedd
+Sheehan
+Sheergar
+Sheets
+Sheffey
+Sheffield
+Sheidafar
+Sheikh
+Shein
+Shek
+Shelby
+Sheldon
+Shelegey
+Shelley
+Shellman
+Shelton
+Shemwell
+Shen
+Shennan
+Shepard
+Sheppard
+Sherali
+Sherard
+Sherban
+Shere
+Sheremeto
+Sheridan
+Sherif
+Sherk
+Sherlock
+Sherman
+Sherow
+Sherrard
+Sherrell
+Sherrer
+Sherrill
+Sherwin
+Sheth
+Sheu
+Shew
+Shewchenko
+Shi
+Shibahara
+Shibata
+Shibberu
+Shieff
+Shiel
+Shields
+Shiell
+Shier
+Shiffer
+Shiflett
+Shigemura
+Shiley
+Shillinger
+Shillingford
+Shimandle
+Shinder
+Shingler
+Shinjo
+Shipe
+Shipp
+Shippen
+Shirai
+Shireman
+Shirey
+Shirinlou
+Shirley
+Shishakly
+Shishido
+Shiu
+Shiue
+Shivcharan
+Shivnan
+Shnay
+Shnider
+Shoaf
+Shoemaker
+Shonka
+Shonuck
+Shorgan
+Shostak
+Shoulars
+Shoun
+Showers
+Shreve
+Shrieves
+Shtivelman
+Shtulman
+Shu
+Shubaly
+Shue
+Shukor
+Shukster
+Shuler
+Shull
+Shultz
+Shum
+Shuman
+Shumate
+Shunmugam
+Shupe
+Shurtleff
+Shuster
+Shute
+Shutler
+Shwed
+Shylo
+Shypski
+Shyu
+Sibbet
+Sibiga
+Sibincic
+Sicard
+Sich
+Sickler
+Sicotte
+Siddall
+Siddell
+Siddiqui
+Sides
+Sidhu
+Sidor
+Sidorovsky
+Sieben
+Sieber
+Siefert
+Siegel
+Siegle
+Siehl
+Sieling
+Siemens
+Siemer
+Siew
+Siewert
+Sigda
+Sigmon
+Sigurdson
+Sigut
+Sikes
+Sikri
+Silang
+Silburt
+Silgardo
+Silianu
+Silieff
+Silins
+Sills
+Sils
+Silva
+Silverman
+Silverstone
+Silverthorn
+Silvester
+Silvestri
+Silwer
+Sim
+Simanskis
+Simard
+Simard-Normandin
+Simcoe
+Simcox
+Simeone
+Simhan
+Simkin
+Simmonds
+Simmons
+Simms
+Simon
+Simonovich
+Simons
+Simonsen
+Simpkin
+Simpson
+Sims
+Simser
+Simson
+Simzer
+Sinanan
+Sinasac
+Sinchak
+Sinclair
+Singbeil
+Singer
+Singh
+Singhal
+Singham
+Sinha
+Sinkfield
+Sinkovits
+Sinnett
+Sinnott
+Sinoyannis
+Sinyor
+Siomalas
+Siperco
+Sipple
+Sirevicius
+Sisk
+Sist
+Sitar
+Sitch
+Sitler
+Siu
+Siu-Kwok
+Sivaji
+Sivasothy
+Sizto
+Sjerps
+Skaff
+Skaftason
+Skaggs
+Skalski
+Skanes
+Skaret
+Skedelsky
+Skelly
+Skene
+Skeoch
+Skerlak
+Skerry
+Skeuse
+Skiba
+Skiclub
+Skillen
+Skillman
+Skinner
+Skoberne
+Skof
+Skopliak
+Skrebels
+Skrobanski
+Skrobecki
+Skruber
+Skuce
+Skwarok
+Slaa
+Slabaugh
+Slaby
+Slade
+Sladek
+Slagel
+Slattery
+Slautterback
+Slavin
+Sldisk
+Sleeman
+Sleeth
+Slempers
+Slinkard
+Slinowsky
+Sliter
+Sloan
+Sloane
+Sloboda
+Slobodian
+Slobodrian
+Slonosky
+Slotnick
+Slozil
+Slunder
+Slusser
+Slyteris
+Smale
+Smallwood
+Smecca
+Smedema
+Smeenk
+Smelters
+Smerdell
+Smerek
+Smid
+Smit
+Smith
+Smithdeal
+Smithson
+Smits
+Smolin
+Smook
+Smoot
+Smothers
+Smrke
+Smrke-Surbey
+Smuda
+Smulders
+Smyth
+Smythe
+Snair
+Snapper
+Snarr
+Snead
+Snedden
+Snedeker
+Snelgrove
+Snelling
+Snider
+Snipes
+Snodgrass
+Snoke
+Snuggs
+Snyder
+Soard
+Sobchuk
+Sobczak
+Sobeck
+Sobel
+Sobiesiak
+Sobkow
+Sobolak
+Sobolewski
+Sobon
+Sochovka
+Sodano
+Sodhi
+Soh
+Sohal
+Sohni
+Sohns
+Sohota
+Soin
+Sojka
+Sojkowski
+Sokolowski
+Sokyrko
+Soldera
+Solheim
+Soliman
+Solkoff
+Sollee
+Sollman
+Solman
+Solodko
+Solomon
+Solski
+Somani
+Somera
+Somers
+Somerville
+Somisetty
+Sommer
+Sommerdorf
+Sommerfeld
+Sompong
+Somppi
+SonHing
+Sonier
+Sonne
+Sonoda
+Soo
+Sood
+Sookdeo
+Sooley
+Soong
+Sorathia
+Soreanu
+Sorensen
+Soriano
+Sorrell
+Sorrentino
+Sosa
+Sossaman
+Sotelo
+Sotiriadis
+Soto
+Souba
+Soucie
+Soucy
+Soules
+Soulliere
+Soumis
+Sourisseau
+Sourour
+Sousa
+Soussa
+Souther
+Southon
+Southworth
+Souza
+Sova
+Soweidan
+Sowry
+Soyland
+Soyster
+Spallin
+Spann
+Spannbauer
+Sparacio
+Sparkes
+Sparks
+Sparksman
+Spaugh
+Speaker
+Spearman
+Spearpoint
+Spears
+Specs
+Speer
+Speers
+Speight
+Spejewski
+Spence
+Spencer
+Spessot
+Spicer
+Spieker
+Spilchak
+Spillane
+Spindler
+Spinelli
+Spingola
+Spinks
+Spisak
+Spitzer
+Splitt
+Spohn
+Spolar
+Sponagle
+Sponchia
+Spooner
+Spragg
+Spraggins
+Sprayberry
+Spriggs
+Sprigings
+SpringThorpe
+Sprott
+Sproule
+Spruell
+Sprules
+Sprunger
+Spurlin
+Spurlock
+Spurway
+Squires
+Squizzato
+Sreedhar
+Sridaran
+Sridhar
+Srikrishna
+Srinivasan
+Srivastava
+Sroczynski
+St
+St-Amour
+St-Denis
+St-Louis
+St-Martin
+St-Onge
+St-Pierre
+St.
+St.Clair-Holmes
+St.Denis
+St.Germain
+St.Jacques
+St.John
+St.Laurent
+St.Louis
+St.Pierre
+St.Vil
+StJohn
+StJames
+Staats
+Stability
+Stacey
+Stach
+Stachowiak
+Stackpole
+Stadelmeier
+Stadler
+Staffeld
+Staffing
+Staggs
+Stagmier
+Stahl
+Stahly
+Stainback
+Stallabrass
+Stallcup
+Stallings
+Stalter
+Stambouli
+Stamboulie
+Stampfl
+Stampley
+Stamps
+Stanciu
+Standards
+Standel
+Standen
+Standrin
+Stanfield
+Stanke
+Stanley
+Stansbury
+Stansby
+Stansell
+Stansfield
+Stanton
+Stanulis
+Stapenhorst
+Staples
+Staring
+Starkauskas
+Starkebaum
+Starkes
+Starks
+Starnes
+Starowicz
+Starr
+Stars
+Starsdps
+Starzman
+Stasaski
+Stasiak
+Stasney
+Stastny
+Stasyszyn
+Stat
+Staten
+Statile
+Staton
+Stayton
+Stctest
+Stds
+Ste
+Ste-Marie
+Steckley
+Steede
+Steele
+Steelman
+Steen
+Steenburg
+Steene
+Steeves
+Stefanac
+Steffens
+Steffes
+Steffey
+Steffy
+Stegall
+Stegman
+Stegmueller
+Steiert
+Steinbacher
+Steinberg
+Steinhart
+Steip
+Stejskal
+Steklasa
+Stelcner
+Stellitano
+Stellwag
+Stemmler
+Stender
+Stennett
+Stenson
+Stensrud
+Stepchuk
+Stephans
+Stephen
+Stephens
+Stephenson
+Stepler
+Stepp
+Steranka
+Stercyk
+Sterczyk
+Sterescu
+Sterian
+Stern
+Steski
+Stetner
+Stetter
+Stevanovic
+Steven
+Stevens
+Stevenson
+Stewart
+Stewart-Guthrie
+Stickland
+Stiglitz
+Stiles
+Stillwell
+Stinson
+Stinziani
+Stirling
+Stirrett
+Stites
+Stocker
+Stocks
+Stockwell
+Stodart
+Stoddard
+Stoffels
+Stokes
+Stokker
+Stokoe
+Stokoski
+Stoner
+Stonos
+Stooke
+Storace
+Storey
+Storrie
+Stotts
+Stotz
+Stouder
+Stough
+Stovall
+Stover
+Stowe
+Stoyles
+Strachan
+Strackholder
+Strader
+Strandberg
+Strandlund
+Strannemar
+Strasser
+Stratton
+Straub
+Strauch
+Strauss
+Strautman
+Strawczynski
+Strayhorn
+Streater
+Streatfield
+Streibel
+Streight
+Streng
+Strickland
+Strider
+Strober
+Strock
+Stroemer
+Strohmeyer
+Stronski
+Stropp
+Stroud
+Stroupe
+Strube
+Struble
+Strucchelli
+Strudwick
+Struzynski
+Stuart
+Stubblefield
+Stubbs
+Stuckey
+Studer
+Stults
+Stumpf
+Sturdivant
+Sture
+Sturrock
+Stutts
+Su
+Subasinghe
+Subick
+Subissati
+Subramanian
+Subsara
+Suchocki
+Suda
+Sudan
+Sudbey
+Sudbury
+Suddarth
+Suen
+Suer
+Suess
+Sufcak
+Suffern
+Sugandi
+Sugarbroad
+Sugarman
+Sugihara
+Suh
+Suharly
+Suitt
+Sulatycki
+Sulewski
+Sullivan
+Sumi
+Summach
+Summerlin
+Summers
+Sumner
+Sumpter
+Sunatori
+Sundar
+Sundaram
+Sunderland
+Sunstrum
+Suomela
+Supervisor
+Suprick
+Sura
+Surazski
+Surber
+Surowaniec
+Surray
+Surreau
+Surridge
+Sursal
+Susanto
+Susick
+Sutarwala
+Sutcliffe
+Suter
+Sutera
+Sutherland
+Suthers
+Sutphen
+Sutter
+Sutterfield
+Sutterlin
+Sutton
+Suwala
+Suwanawongse
+Suyama
+Suykens
+Suzuki
+Svalesen
+Svilans
+Svo
+Swact
+Swaden
+Swails
+Swaine
+Swann
+Swanson
+Swanston
+Swartz
+Swazey
+Swearingen
+Sweeney
+Sweetnam
+Swepston
+Swiat
+Swiatkowski
+Swick
+Swiderski
+Swinamer
+Swinburne
+Swinkels
+Swinks
+Swinney
+Swinson
+Swinwood
+Swisher
+Switching
+Switzer
+Swope
+Swyer
+Sy
+Syal
+Sydnor
+Sydor
+Sydoryk
+Syed
+Sykes
+Sylvain
+Sylvester
+Sylvestre
+Sylvie
+Sym
+Symons
+Synness
+Syposz
+Syres
+Syrett
+Sysadmin
+Syssupport
+Systems
+Systest
+Szabo
+Szamosi
+Szaplonczay
+Szaran
+Szeto
+Sziladi
+Szkarlat
+Szopinski
+Szot
+Szpakowski
+Szpilfogel
+Sztein
+Szuminski
+Szura
+Szymanski
+Szypulski
+TAS
+TRIAL
+Ta
+Tabaja
+Tabalba
+Tabbert
+Tabl
+Tabler
+Tables
+Tabor
+Tac
+Taddio
+Tadevich
+Tadge
+Tadlock
+Taggart
+Taghizadeh
+Tahamont
+Taharuddin
+Taheri
+Tahir
+Tai
+Tait
+Tajbakhsh
+Takagi
+Takahashi
+Takashima
+Takata
+Takefman
+Takeuchi
+Taki
+Takiyanagi
+Talbert
+Talbot
+Talbott
+Talevi
+Talis
+Tallett
+Talmont
+Talton
+Tamarelli
+Tamasi
+Tammaro
+Tamrazian
+Tamura
+Tan-atichat
+Tanaka
+Tanchak
+Tancordo
+Tandberg
+Tandiono
+Tanferna
+Tanglao
+Tangren
+Tanio
+Tanir
+Tanner
+Tanniere
+Tapner
+Tapp
+Tappenden
+Tappert
+Tapsell
+Taralp
+Tarant
+Taranto
+Taraschuk
+Tarasewicz
+Tardif
+Tardiff
+Tardioli
+Taren
+Targosky
+Tariq
+Tarlamis
+Tarle
+Tarnai
+Tarof
+Tarquinio
+Tarrant
+Tarsky
+Tarver
+Taschereau
+TaskForce
+Taspatch
+Tassi
+Tasso
+Tassy
+Tasuk
+Tatangsurja
+Tatar
+Tatemichi
+Tates
+Tatsdocn
+Tattenbaum
+Tatum
+Tauberg
+Taul
+Tauscher
+Tavana
+Tavares
+Taverner
+Tawfik
+Tay
+Taylor
+Taylor-Hudson
+Tchir
+Td
+Teacher
+Teague
+Teasley
+Tebbe
+Tebinka
+Technosoft
+Tecklenburg
+Teder
+Tedrick
+Teed
+Teerdhala
+Teh
+Teichman
+Teitelbaum
+Tejada
+Tejani
+Tel
+Telco
+Telecom
+Telesis
+Telex
+Telfer
+Telidis
+Telke
+Tello
+Tellup
+Telos
+Temp
+Temple-Downing
+Templeton
+Tena
+Tencer
+Teniola
+Tennant
+Teo
+Terakado
+Teran
+Terminals
+Terneus
+Terrade
+Terranella
+Terranova
+Terrel
+Terrell
+Terwey
+Terwilligar
+Terzian
+Tesch
+Tesfamariam
+Tesh
+Tessier
+Tessler
+TestNTMVAA
+TestNTMVAB
+Testa
+Testagc
+Tester
+Testing
+TestingPOSTTEST
+Testsds
+Testtools
+Tetrault
+Tetreault
+Teufel
+Tevlin
+Thabet
+Thacker
+Thain
+Thaker
+Thakur
+Tham
+Thames
+Tharby
+Tharrington
+Thaxton
+Thayer
+Thedford
+Theis
+Theloosen
+Themann
+Theocharakis
+Theodore
+Theoret
+Theriault
+Therien
+Theriot
+Therrien
+Thevenard
+Thevenart
+Thibault
+Thibeault
+Thibert
+Thibodeaux
+Thibon
+Thieken
+Thiel
+Thierry
+Thifault
+Thill
+Thirugnanam
+Thisdel
+Thom
+Thomaier
+Thomas
+Thomason
+Thomassin
+Thomey
+Thomlinson
+Thompson
+Thoms
+Thomsen
+Thomson
+Thorley
+Thorman
+Thornber
+Thornburg
+Thorne
+Thornley
+Thornton
+Thorpe
+Thorsen
+Thorslund
+Thorson
+Threader
+Throgmorton
+Thuesen
+Thum
+Thumm
+Thurgood
+Thurley
+Thurman
+Thurston
+Thuswaldner
+Tiberghien
+Tibi
+Tice
+Ticzon
+Tidball
+Tidd
+Tiedemann
+Tiegs
+Tien
+Tierney
+Tieu
+Tigg
+Tihanyi
+Tilbenny
+Tilden
+Tilk
+Tille
+Tiller
+Tilley
+Tillman
+Tilmon
+Tilson
+Tilton
+Timesheet
+Timleck
+Timler
+Timm
+Timmer
+Timmerman
+Timmins
+Timmons
+Timms
+Timpson
+Tims
+Timsit
+Timtschenko
+Tiner
+Ting
+Tinney
+Tintor
+Tio
+Tippett
+Tipping
+Tipton
+Tischhauser
+Tischler
+Tisdale
+Tisdall
+Tiseo
+Titus
+Tiu
+Tiwari
+Tjia
+ToDo
+Toastmasters
+Tobias
+Tod
+Todaro
+Todd
+Todloski
+Todorovic
+Toews
+Togasaki
+Tognoni
+Tohama
+Tolar
+Toles
+Toletzka
+Tolgyessy
+Tolle
+Tolson
+Toly
+Tom
+Tomacic
+Tomar
+Tomasetti
+Tomassi
+Tomaszewska
+Tombul
+Tomes
+Tomlin
+Tomlinson
+Tompkins
+Tonelli
+Tonkovich
+Tookey
+Toole
+Tooley
+Toolroom
+Tools
+Toolset
+Toomer
+Toone
+Toop
+Toothman
+Tooyserkani
+Toperzer
+Topgun
+Toplis
+Topol
+Topp
+Torain
+Torbert
+Tordocs
+Torian
+Tornes
+Tornqvist
+Torok
+Torrance
+Torrealba
+Torrell
+Torrens
+Torres
+Toscano
+Tosczak
+Toshach
+ToshachNTMVAA
+Tostenson
+Tota
+Totaro
+Toth
+Totino
+Totman
+Totten
+Totti
+Touchette
+Tougas
+Toulson
+Tousignant
+Towaij
+Towers
+Towill
+Towler
+Towles
+Townley
+Towns
+Townsel
+Townsend
+Townson
+Towsley
+Toyooka
+Tracey
+Tracey-McCabe
+Trachsel
+Tracz
+Trader
+Trafford
+Trahan
+Trainer
+Training
+Trainor
+Trame
+Tran
+Tranfaglia
+Translations
+Tranter
+Trasmundi
+Traugott
+Traulich
+Traut
+Trautman
+Travers
+Travis
+Traxler
+Trayer
+Traylor
+Traynor
+Tredway
+Treen
+Trefry
+Trefts
+Tregenza
+Tremaine
+Tremblay
+Tremewan
+Trent
+Trentadue
+Tres-Support
+Trese
+Tresrch
+Trevethan
+Trevitt
+Trickett
+Trieu
+Trif
+Trifiro
+Triggiano
+Trimble
+Trinh
+Trinidad
+Trink
+Tripier
+Triplehorn
+Tripp
+Tripps
+Trisic
+Trisko
+Trittler
+Tritton
+Trivedi
+Trocchi
+Trochu
+Troesch
+Trojak
+Tromm
+Tropea
+Tropeano
+Trotsky
+Trotter
+Trottier
+Trouborst
+Troup
+Trowbridge
+Trpisovsky
+Truchon
+Trudel
+Trudell
+Truelove
+Truesdale
+Truffer
+Trull
+Trumble
+Trunley
+Truong
+Truran
+Trussler
+Trutschel
+Tsai
+Tsakalis
+Tsalikis
+Tsang
+Tsao
+Tschaja
+Tse
+Tseng
+Tsenter
+Tsiakas
+Tsitsior
+Tsitsonsis
+Tso
+Tsonos
+Tsortos
+Tsui
+Tsuji
+Tsuk
+Tsunoda
+Ttisupport
+Tu
+Tuan
+Tubb
+Tucker
+Tudo
+Tue
+Tuen
+Tufford
+Tulk
+Tull
+Tullius
+Tullo
+Tully
+Tunali
+Tunon
+Tuok
+Tupas
+Tupling
+Turbes
+Turbyfill
+Turchan
+Turcot
+Turcotte
+Turkki
+Turkovic
+Turnbull
+Turner
+Turney
+Turpin
+Turrubiarte
+Turunen
+Tussey
+Tutt
+Tuttle
+Tuxford
+Twa
+Twarog
+Tweddle
+Twidale
+Twiss
+Twitty
+Twolan
+Twx
+Twyman
+Twynham
+Twyver
+Tyda
+Tye
+Tyler
+Tymchuk
+Tynan
+Tyndall
+Tyner
+Typer
+Tyrance
+Tyroler
+Tyrrell
+Tyson
+Tzaneteas
+Tzuang
+US
+USER
+Uae
+Uberig
+Uchida
+Uchiyama
+Udall
+Udayasekaran
+Ude
+Uecker
+Ueda
+Ueyama
+Uffner
+Ufomadu
+Uguccioni
+Ugwa
+Uhl
+Uhlhorn
+Uhlig
+Ukena
+Ulgen
+Ully
+Ulrich
+Uludamar
+Umeeda
+Umeh
+Umetsu
+Umphres
+Underwood
+Unger
+Unitt
+Unix
+Unixsupport
+Unkefer
+Unkles
+Unsoy
+Unxlb
+Upchurch
+Updt
+Uppal
+Upshaw
+Upton
+Urbanowich
+Urbick
+Urbielewicz
+Urbshas
+Urnes
+Urow
+Urquhart
+Urwin
+Usrouter
+Usyk
+Utas
+Utsumi
+Uyar
+VMXA
+VO
+Vacher
+Vachon
+Vaculik
+Vadala
+Vafaie
+Vaglio-Laurin
+Vahary
+Vahdat
+Vaid
+Vaillancourt
+Vaillant
+Vairavan
+Vajentic
+Vakili
+Valcourt
+Valdez
+Valenta
+Valente
+Valentik
+Valentin
+Valenziano
+Valerien
+Valerio
+Valerius
+Valia
+Valin
+Valiquette
+Valiveti
+Valko
+Vallee
+Vallentyne
+Vallet
+Valliani
+Valliere
+Vallieres
+Vallozzi
+Valois
+Valvasori
+Van Alphen
+Van Alstine
+Van Atta
+Van Bakel
+Van Benthem
+Van Cooney
+Van Den
+Van Der
+Van Dyke
+Van Es
+Van Eyk
+Van Fleet
+Van Gaal
+Van Haste
+Van Holst
+Van Hoy
+Van Hulst
+Van Kast
+Van Kessel
+Van Klink
+Van Laten
+Van Loon
+Van Mansum
+Van Meter
+Van Neste
+Van Oorschot
+Van Orden
+Van Phil
+Van Rijn
+Van Rijswijk
+Van Schouwen
+Van Schyndel
+Van Sickle
+Van Terrie
+Van Veen
+Van Vrouwerff
+Van Weringh
+VanDenKieboom
+VanDerBoom
+VanDommele
+VanGastel
+VanLaar
+VanPatten
+VanStaalduinen
+Vanaman
+Vanasse
+Vance
+Vandagriff
+VandenHeuvel
+Vandenberg
+Vandenborre
+Vandenheede
+VanderVeen
+Vanderburg
+Vandergeest
+Vanderhelm
+Vanderheyden
+Vanderhoeven
+Vanderhooft
+Vanderpol
+Vandervelde
+Vanderwel
+Vandevalk
+Vandeven
+Vandewouw
+Vandoorne
+Vandusen
+Vankooten
+Vanliew
+Vanstory
+Vanta
+Vanwormhoudt
+Vanwychen
+Vanzella
+Varady
+Varano
+Vardy
+Vargas
+Vargo
+Varia
+Varkel
+Varkey
+Varley
+Varmazis
+Varsava
+Vartanesian
+Varughese
+Vasarhelyi
+Vaserfirer
+Vasil
+Vasile
+Vasiliadis
+Vasilopoulos
+Vastine
+Vasudeva
+Vaters
+Vaughan
+Vaughn
+Vavroch
+Vawter
+Vea
+Veale
+Veals
+Veck
+Veedell
+Vega
+Vehling
+Veillette
+Veilleux
+Veit
+Veksler
+Vela
+Velasquez
+Vele
+Vella
+Vellino
+Veloria
+Veloz
+Velsher
+Vempati
+Vendette
+Veness
+Venguswamy
+Venier
+Venjohn
+Venne
+Venning
+Vennos
+Ventrone
+Ventura
+Venturini
+Verardi
+Verch
+Verdonselli
+Verheyden
+Verhoeven
+Verhotz
+Verification
+Verkroost
+Verma
+Vermeesch
+Vermette
+Vernon
+Verreau
+Verrenneau
+Verrilli
+Versace
+Versteeg
+Vertolli
+Verville
+Verzilli
+Veselko
+Vesterdal
+Vetil
+Vetrano
+Vetrie
+Vetter
+Vettese
+Vexler
+Vey
+Veyrat
+Vezeau
+Vezina
+Viano
+Viau
+Vick
+Vickers
+Videa
+Vidmer
+Viduya
+Viegas
+Vieger
+Viehweg
+Vieillard-Baron
+Vieira
+Vieiro
+Viens
+Vieregge
+Vigeant
+Viitaniemi
+Vilayil
+Vilhan
+Vilis
+Villanueva
+Villella
+Villeneuve
+Vilmansen
+Vilozny
+Vinas
+Vincent
+Vinet
+Viney
+Vinnell
+Vinson
+Virani
+Virant
+Virchick
+Virgoe
+Viriato
+Virk
+Visentin
+Vish
+Visockis
+Visser
+Visvanatha
+Vitacco
+Vitaglian
+Vivian
+Vivier
+Vlad
+Vlahos
+Vmsupport
+Voadmin
+Vodicka
+Voduc
+Voelcker
+Vogel
+Vogt
+Voight
+Voitel
+Volchegursky
+Volfe
+Volk
+Volker
+Volkmann
+Volkmer
+Volz
+Von Semmler
+Von Zuben
+VonCannon
+VonLehmden
+Vonck
+Vonderhaar
+Vonderscher
+Vonderweidt
+Vonreichbauer
+Vopalensky
+Vopni
+Vosberg
+Vosburg
+Voss
+Vosu
+Vosup
+Vowels
+Vrabel
+Vradmin
+Vrbetic
+Vreugdenhil
+Vu
+Vucinich
+Vuignier
+Vuncannon
+Vuong
+Vyas
+WAR
+WGA
+WPMS
+Wa
+Wacheski
+Wachtstetter
+Wacker
+Wada
+Wadasinghe
+Waddell
+Wadden
+Waddick
+Waddington
+Wadkins
+Wadsworth
+Waespe
+Waeyen
+Wager
+Wagers
+Waggoner
+Waghorne
+Waghray
+Wagle
+Wagner
+Wagoner
+Wahab
+Wai
+Waid
+Waidler
+Waigh
+Waines
+Wainwright
+Waissman
+Waitman
+Wakabayashi
+Wakefield
+Wakeham
+Wakim
+Walas
+Walbridge
+Walchli
+Waldick
+Waldie
+Waldron
+Wales
+Waletzky
+Walford
+Walia
+Walker
+Walkins
+Walkley
+Walkowiak
+Wallace
+Wallaert
+Wallbank
+Wall
+Waller
+Walles
+Wallgren
+Wallis
+Walls
+Waloff
+Walpole
+Walrond
+Walser
+Walsh
+Walston
+Walta
+Walter
+Walters
+Walton
+Walz
+Wambsganz
+Wanda
+Wandel
+Wandscher
+Wang
+Wanner
+Wans
+Wanzeck
+Warburton
+Wardle
+Wardrop
+Wares
+Warfel
+Wargnier
+Wark
+Warkentin
+Warner
+Warnock
+Warrellow
+Warriner
+Warshawsky
+Wartman
+Warun
+Warwick
+Waschuk
+Washburn
+Washington
+Wasitova
+Wasmeier
+Wassel
+Wasserman
+Wasson
+Wasylenko
+Wasylyk
+Watanabe
+Watchmaker
+Watchorn
+Waterhouse
+Waterman
+Waters
+Watford
+Watkins
+Watkinson
+Watmore
+Watson
+Watters
+Wattier
+Watts
+Watznauer
+Waucheul
+Waugh
+Waybright
+Wayler
+Wayling
+Wayman
+Waytowich
+Weagle
+Weakley
+Wealch
+Weare
+Wease
+Weatherly
+Weathersbee
+Weatherspoon
+Weaver
+Webb
+Webber
+Webster
+Weckwerth
+Weddell
+Weedmark
+Weeks
+Wefers
+Wegener
+Weger
+Wegrowicz
+Wei
+Weibust
+Weidenborner
+Weidenfeller
+Weidinger
+Weihs
+Weil
+Weinbender
+Weinkauf
+Weirich
+Weisenberg
+Weiser
+Weiss
+Weist
+Weitz
+Weitzel
+Welch
+Weldon
+Welham
+Welker
+Wellard
+Welling
+Wells
+Welsch
+Welsford
+Welten
+Wen
+Wendling
+Wenham
+Wennerstrom
+Wentworth
+Wenyon
+Wenzel
+Wepf
+Weppler
+Werewolf
+Werick
+Werling
+Werner
+Wernik
+Werth
+Wertz
+Wery
+Wesenberg
+Wesoloski
+Wesolowski
+Wessel
+Wessell
+Wesselman
+Wesselow
+Wessels
+Wessenberg
+Westbrook
+Westcott
+Wester
+Westfall
+Westgarth
+Westlake
+Westmoreland
+Weston
+Weston-Dawkes
+Westphal
+Westwood
+Wetherbee
+Wetteland
+Wetzel
+Wever
+Weyand
+Whalen
+Whaley
+Whang
+Whatley
+Wheatley
+Wheaton
+Wheeler
+Wheelock
+Whelan
+Whelpdale
+Whetston
+Whetzel
+Whidden
+Whipps
+Whisenhunt
+Whiskin
+Whisler
+Whitaker
+Whited
+Whiteford
+Whitehurst
+Whiteman
+Whiteside
+Whitfield
+Whitfill
+Whitford
+Whiting
+Whitlock
+Whitman
+Whitmore
+Whitney
+Whitsell
+Whitt
+Whittaker
+Whittam
+Whitten
+Whittier
+Whittingham
+Whitton
+Whitty
+Whitwam
+Whitwell
+Whitworth
+Whyte
+Wichers
+Wichman
+Wicht
+Wichterle
+Wickes
+Wickham
+Wickie
+Widdicombe
+Widdis
+Widdowson
+Widener
+Widows
+Widuch
+Wiebe
+Wiederhold
+Wiedman
+Wiegand
+Wieland
+Wienert
+Wiens
+Wiercioch
+Wierzba
+Wiggins
+Wiggs
+Wight
+Wigle
+Wignall
+Wikkerink
+Wiklund
+Wilbur
+Wilby
+Wilcox
+Wilczewski
+Wilde
+Wildeman
+Wilder
+Wilderman
+Wildgen
+Wildman
+Wilemon
+Wilenius
+Wiley
+Wilford
+Wilgosh
+Wilhelm
+Wilhelmson
+Wilhoit
+Wilke
+Wilken
+Wilkerson
+Wilkes
+Wilkie
+Wilkins
+Wilkinson
+Wilko
+Wilks
+Willard
+Willcock
+Willcocks
+Willcox
+Willekes
+Willemsen
+Willenbring
+Willets
+Willett
+Willette
+Willey
+Willhoff
+Williams
+Williamson
+Williford
+Willis
+Willison
+Willmore
+Willmott
+Willoughby
+Willson
+Wilsey
+Wilson
+Wilton
+Wiltz
+Wimberley
+Wimbush
+Wimmer
+Winchester
+Windom
+Windsor
+Winfield
+Wingar
+Wingard
+Wingate
+Wingfield
+Wingo
+Wingrove
+Winicki
+Winje
+Winklemaier
+Winkler
+Winlow
+Winn
+Winningham
+Winnington
+Winnipeg
+Winsborrow
+Winsky
+Winslow
+Winstead
+Winterberg
+Winters
+Wintour
+Wippel
+Wirth
+Wiseman
+Wishewan
+Wisniewski
+Wissinger
+Wissler
+Witchlow
+Witham
+Withrow
+Witkowski
+Witney
+Witt
+Wittich
+Wittik
+Wittman
+Witzel
+Witzman
+Witzmann
+Wobbrock
+Woelffel
+Woessner
+Woinsky
+Wojciechowski
+Wojcik
+Wojdylo
+Wojnar
+Wojtecki
+Wokoma
+Wolczanski
+Wolfe
+Wolfenbarger
+Wolff
+Wolfman
+Wolford
+Wolfs
+Wolfson
+Wolk
+Woll
+Woloshko
+Wolowidnyk
+Wolska
+Wolski
+Wolter
+Womack
+Womble
+Wong
+Woodall
+Woodford
+Woodhall
+Woodley
+Woodlief
+Woodman
+Woodrow
+Woods
+Woodward
+Woodward-Jack
+Woodyer
+Wooff
+Woolery
+Wooley
+Woollam
+Woolley
+Woolwine
+Wooster
+Wooten
+Wootton
+Wormald
+Worobey
+Woroszczuk
+Worpell
+Worrall
+Worsley
+Worthington
+Wortman
+Wozniak
+Wracher
+Wray
+Wrigglesworth
+Wrigley
+Wrobel
+Wroblewski
+Wsadmin
+Wsbackup
+Wu
+Wueppelmann
+Wun
+Wurtz
+Wyant
+Wyatt
+Wyble
+Wycoff
+Wye
+Wykoff
+Wylie
+Wyllie
+Wyman
+Wymard
+Wyndham
+Wynes
+Wyrstiuk
+Wyss
+Wytenburg
+Wyzga-Taplin
+Xavier
+Xayaraj
+Xenos
+Xie
+Xmssupport
+Xpm
+Xpmbld
+Xpmbuilder
+Xu
+Yabe
+Yach
+Yadollahi
+Yaeger
+Yahyapour
+Yakibchuk
+Yakimovich
+Yamada
+Yamamoto
+Yamaoka
+Yamashita
+Yamin
+Yan
+Yanagida
+Yancey
+Yandell
+Yano
+Yanosik
+Yao
+Yarber
+Yarbrough
+Yardy
+Yarnell
+Yarosh
+Yassa
+Yates
+Yau
+Yaung
+Yazdani
+Yazdi
+Yearwood
+Yeck
+Yedema
+Yee
+Yeh
+Yelvington
+Yendall
+Yenilmez
+Yenor
+Yeo
+Yerigan
+Yerneni
+Yeung
+Yim
+Ying
+Yoakum
+Yoe
+Yogeswaran
+Yohe
+Yokeley
+Yong
+Yonk
+York
+Yorke
+Yoshikawa
+Yoshioka
+Yoshiyama
+Yost
+Youel
+Younan
+Younes
+Youngblood
+Younger
+Younglove
+Youngman
+Youngs
+Younkin
+Yount
+Yousefpour
+Yousuf
+Yowell
+Yu
+Yuan
+Yudin
+Yue
+Yuen
+Yuengling
+Yuhanna
+Yuhn
+Yuill
+Yum
+Yumurtaci
+Yun
+Yundt
+Yung
+Yurach
+Yurchuk
+Yuste
+Yvon
+Yzerman
+Zabek
+Zabokrzycki
+Zabransky
+Zaccari
+Zacharias
+Zack
+Zadeh
+Zadorozny
+Zadow
+Zafarano
+Zafarullah
+Zagorsek
+Zagorski
+Zagrodney
+Zaharychuk
+Zahn
+Zaia
+Zaid
+Zaidi
+Zajac
+Zakarow
+Zalameda
+Zaleski
+Zalite
+Zalokar
+Zaloker
+Zalzale
+Zaman
+Zampino
+Zander
+Zanet
+Zanetti
+Zanga
+Zani
+Zantiris
+Zapach
+Zarate
+Zaretsky
+Zargham
+Zarkel
+Zarlenga
+Zatkovic
+Zattiero
+Zatylny
+Zauhar
+Zauner
+Zavadiuk
+Zawadka
+Zaydan
+Zazulak
+Zbib
+Zbuda
+Zee
+Zeggil
+Zegray
+Zeidler
+Zeiger
+Zeigler
+Zeimet
+Zeisler
+Zeitler
+Zelenka
+Zeller
+Zelsmann
+Zemanek
+Zen
+Zenar
+Zeng
+Zenisek
+Zenkevicius
+Zenkner
+Zerriffi
+Zetterlund-Clark
+Zetts
+Zhang
+Zhao
+Zhelka
+Zhong
+Zhou
+Ziai
+Ziebarth
+Zieber
+Ziegler
+Ziehn
+Zielinski
+Ziemba
+Zigrand
+Zilaie
+Zimmer
+Zimmerer
+Zimmerly
+Zimmerman
+Zimmermann
+Zingale
+Zingeler
+Zinkie
+Zinn
+Zirko
+Zisu
+Zitko
+Zito
+Zitzmann
+Zivilik
+Zivkovic
+Zlatin
+Znack
+Zoehner
+Zoellner
+Zoerb
+Zollman
+Zolmer
+Zonner
+Zonoun
+Zoppel
+Zoratti
+Zork
+Zorony
+Zorzi
+Zottola
+Zou
+Zrobok
+Zubans
+Zubricki
+Zuccarelli
+Zug
+Zuk
+Zukas
+Zukosky
+Zukovsky
+Zumhagen
+Zumpf
+Zunuzi
+Zurawlev
+Zureik
+Zurl
+Zvonar
+Zwick
+Zwicker
+Zwierzchowski
+Zybala
+Zylstra
+Zywiel
+cprs
+de Belen
+de Buda
+de CHABERT
+de Elizalde
+de Grace
+de Hoog
+de Salis
+de Wilton
+de Witte
+deMontluzin
+deRosenroll
+deVette
+fpsched
+livinston
+van Leeuwen
+von Ende
diff --git a/opends/resource/MakeLDIF/states b/opends/resource/MakeLDIF/states
new file mode 100644
index 0000000..961d2c4
--- /dev/null
+++ b/opends/resource/MakeLDIF/states
@@ -0,0 +1,51 @@
+AL
+AK
+AZ
+AR
+CA
+CO
+CT
+DE
+DC
+FL
+GA
+HI
+ID
+IL
+IN
+IA
+KS
+KY
+LA
+ME
+MD
+MA
+MI
+MN
+MS
+MO
+MT
+NE
+NV
+NH
+NJ
+NM
+NY
+NC
+ND
+OH
+OK
+OR
+PA
+RI
+SC
+SD
+TN
+TX
+UT
+VT
+VA
+WA
+WV
+WI
+WY
diff --git a/opends/resource/MakeLDIF/streets b/opends/resource/MakeLDIF/streets
new file mode 100644
index 0000000..be3a345
--- /dev/null
+++ b/opends/resource/MakeLDIF/streets
@@ -0,0 +1,74 @@
+Adams
+Ash
+Birch
+Broadway
+Cedar
+Center
+Central
+Cherry
+Chestnut
+Church
+College
+Davis
+Dogwood
+East
+Eighth
+Eleventh
+Elm
+Fifteenth
+Fifth
+First
+Forest
+Fourteenth
+Fourth
+Franklin
+Green
+Hickory
+Highland
+Hill
+Hillcrest
+Jackson
+Jefferson
+Johnson
+Lake
+Lakeview
+Laurel
+Lee
+Lincoln
+Locust
+Madison
+Main
+Maple
+Meadow
+Mill
+Miller
+Ninth
+North
+Oak
+Park
+Pine
+Poplar
+Railroad
+Ridge
+River
+Second
+Seventh
+Sixth
+South
+Spring
+Spruce
+Sunset
+Sycamore
+Taylor
+Tenth
+Third
+Thirteenth
+Twelfth
+Valley
+Walnut
+Washington
+West
+Williams
+Willow
+Wilson
+Woodland
diff --git a/opends/resource/bin/makeldif.bat b/opends/resource/bin/makeldif.bat
new file mode 100755
index 0000000..b1c3d5c
--- /dev/null
+++ b/opends/resource/bin/makeldif.bat
@@ -0,0 +1,57 @@
+
+@echo off
+rem CDDL HEADER START
+rem
+rem The contents of this file are subject to the terms of the
+rem Common Development and Distribution License, Version 1.0 only
+rem (the "License"). You may not use this file except in compliance
+rem with the License.
+rem
+rem You can obtain a copy of the license at
+rem trunk/opends/resource/legal-notices/OpenDS.LICENSE
+rem or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+rem See the License for the specific language governing permissions
+rem and limitations under the License.
+rem
+rem When distributing Covered Code, include this CDDL HEADER in each
+rem file and include the License file at
+rem trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+rem add the following below this CDDL HEADER, with the fields enclosed
+rem by brackets "[]" replaced with your own identifying * information:
+rem Portions Copyright [yyyy] [name of copyright owner]
+rem
+rem CDDL HEADER END
+rem
+rem
+rem Portions Copyright 2006 Sun Microsystems, Inc.
+
+setlocal
+
+set DIR_HOME=%~dP0..
+set INSTANCE_ROOT=%DIR_HOME%
+
+if "%JAVA_BIN%" == "" goto noJavaBin
+goto setClassPath
+
+:noJavaBin
+if "%JAVA_HOME%" == "" goto noJavaHome
+if not exist "%JAVA_HOME%\bin\java.exe" goto noJavaHome
+set JAVA_BIN="%JAVA_HOME%\bin\java.exe"
+goto setClassPath
+
+:noJavaHome
+echo Error: JAVA_HOME environment variable is not set.
+echo Please set it to a valid Java 5 installation.
+goto end
+
+
+:setClassPath
+FOR %%x in (%DIR_HOME%\lib\*.jar) DO call "%DIR_HOME%\bin\setcp.bat" %%x
+
+cd %DIR_HOME%
+
+%JAVA_BIN% %JAVA_ARGS% -classpath "%CLASSPATH%" org.opends.server.tools.makeldif.MakeLDIF --configClass org.opends.server.config.ConfigFileHandler --configFile %DIR_HOME%\config\config.ldif --resourcePath %DIR_HOME%\config\MakeLDIF %*
+
+
+:end
+
diff --git a/opends/resource/bin/makeldif.sh b/opends/resource/bin/makeldif.sh
new file mode 100755
index 0000000..53f665d
--- /dev/null
+++ b/opends/resource/bin/makeldif.sh
@@ -0,0 +1,75 @@
+#!/bin/sh
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at
+# trunk/opends/resource/legal-notices/OpenDS.LICENSE
+# or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at
+# trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+# add the following below this CDDL HEADER, with the fields enclosed
+# by brackets "[]" replaced with your own identifying * information:
+# Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+# Portions Copyright 2006 Sun Microsystems, Inc.
+
+
+# Capture the current working directory so that we can change to it later.
+# Then apture the location of this script and the Directory Server instance
+# root so that we can use them to create appropriate paths.
+WORKING_DIR=`pwd`
+
+cd `dirname $0`
+SCRIPT_DIR=`pwd`
+
+cd ..
+INSTANCE_ROOT=`pwd`
+export INSTANCE_ROOT
+
+cd ${WORKING_DIR}
+
+
+# See if JAVA_HOME is set. If not, then see if there is a java executable in
+# the path and try to figure it out.
+if test -z "${JAVA_BIN}"
+then
+ if test -z "${JAVA_HOME}"
+ then
+ JAVA_BIN=`which java 2> /dev/null`
+ if test $? -eq 0
+ then
+ export JAVA_BIN
+ else
+ echo "Please set JAVA_HOME to the root of a Java 5.0 installation."
+ exit 1
+ fi
+ else
+ JAVA_BIN=${JAVA_HOME}/bin/java
+ export JAVA_BIN
+ fi
+fi
+
+CLASSPATH=${INSTANCE_ROOT}/classes
+for JAR in ${INSTANCE_ROOT}/lib/*.jar
+do
+ CLASSPATH=${CLASSPATH}:${JAR}
+done
+export CLASSPATH
+
+
+${JAVA_BIN} ${JAVA_ARGS} org.opends.server.tools.makeldif.MakeLDIF \
+ --configClass org.opends.server.config.ConfigFileHandler \
+ --configFile ${INSTANCE_ROOT}/config/config.ldif \
+ --resourcePath ${INSTANCE_ROOT}/config/MakeLDIF "${@}"
diff --git a/opends/src/server/org/opends/server/config/ConfigConstants.java b/opends/src/server/org/opends/server/config/ConfigConstants.java
index dc08a82..12875ff 100644
--- a/opends/src/server/org/opends/server/config/ConfigConstants.java
+++ b/opends/src/server/org/opends/server/config/ConfigConstants.java
@@ -3226,6 +3226,15 @@
/**
+ * The path to the directory that should serve as the MakeLDIF resource
+ * directory. It is relative to the server root.
+ */
+ public static final String PATH_MAKELDIF_RESOURCE_DIR =
+ "config" + File.separator + "MakeLDIF";
+
+
+
+ /**
* The path to the directory containing the server schema definitions. It is
* relative to the server root.
*/
diff --git a/opends/src/server/org/opends/server/messages/ToolMessages.java b/opends/src/server/org/opends/server/messages/ToolMessages.java
index d272716..d4335f1 100644
--- a/opends/src/server/org/opends/server/messages/ToolMessages.java
+++ b/opends/src/server/org/opends/server/messages/ToolMessages.java
@@ -2148,9 +2148,9 @@
/**
- * The message ID for the message that will be used a requested include base
- * does not exist in the targeted backend. This takes two arguments, which
- * are the specified include branch DN and the requested backend ID.
+ * The message ID for the message that will be used if a requested include
+ * base does not exist in the targeted backend. This takes two arguments,
+ * which are the specified include branch DN and the requested backend ID.
*/
public static final int MSGID_LDIFIMPORT_INVALID_INCLUDE_BASE =
CATEGORY_MASK_TOOLS | SEVERITY_MASK_SEVERE_ERROR | 219;
@@ -5233,6 +5233,776 @@
/**
+ * The message ID for the message that will be used if an invalid number of
+ * arguments were provided for a MakeLDIF tag. This takes four arguments,
+ * which are the name of the tag, the line number on which it appears, the
+ * expected number of arguments, and the actual number of arguments.
+ */
+ public static final int MSGID_MAKELDIF_TAG_INVALID_ARGUMENT_COUNT =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_MILD_ERROR | 535;
+
+
+
+ /**
+ * The message ID for the message that will be used if an invalid number of
+ * arguments were provided for a MakeLDIF tag, when a range of arguments are
+ * allowed. This takes five arguments, which are the name of the tag, the
+ * line number on which it appears, the minimum number of expected arguments,
+ * the maximum number of expected arguments, and the actual number of
+ * arguments.
+ */
+ public static final int MSGID_MAKELDIF_TAG_INVALID_ARGUMENT_RANGE_COUNT =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_MILD_ERROR | 536;
+
+
+
+ /**
+ * The message ID for the message that will be used if an undefined attribute
+ * type is referenced in a template file. This takes two arguments, which are
+ * the name of the attribute type and the line number on which it appears.
+ */
+ public static final int MSGID_MAKELDIF_TAG_UNDEFINED_ATTRIBUTE =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_MILD_ERROR | 537;
+
+
+
+ /**
+ * The message ID for the message that will be used if an integer value is
+ * below the allowed lower bound. This takes four arguments, which are the
+ * provided integer value, the lower bound, the tag name, and the line number
+ * on which it appears in the template file.
+ */
+ public static final int MSGID_MAKELDIF_TAG_INTEGER_BELOW_LOWER_BOUND =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_MILD_ERROR | 538;
+
+
+
+ /**
+ * The message ID for the message that will be used if value cannot be parsed
+ * as an integer. This takes three arguments, which are the provided value,
+ * the tag name, and the line number on which it appears in the template file.
+ */
+ public static final int MSGID_MAKELDIF_TAG_CANNOT_PARSE_AS_INTEGER =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_MILD_ERROR | 539;
+
+
+
+ /**
+ * The message ID for the message that will be used if an integer value is
+ * above the allowed upper bound. This takes four arguments, which are the
+ * provided integer value, the upper bound, the tag name, and the line number
+ * on which it appears in the template file.
+ */
+ public static final int MSGID_MAKELDIF_TAG_INTEGER_ABOVE_UPPER_BOUND =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_MILD_ERROR | 540;
+
+
+
+ /**
+ * The message ID for the message that will be used if a tag argument is an
+ * empty string, which is not allowed. This takes three arguments, which is
+ * the position of the argument, the tag name, and the line number on which
+ * it appears in the template file.
+ */
+ public static final int MSGID_MAKELDIF_TAG_INVALID_EMPTY_STRING_ARGUMENT =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_MILD_ERROR | 541;
+
+
+
+ /**
+ * The message ID for the message that will be used if a value cannot be
+ * parsed as a Boolean. This takes three arguments, which are the provided
+ * value, the tag name, and the line number on which it appears in the
+ * template file.
+ */
+ public static final int MSGID_MAKELDIF_TAG_CANNOT_PARSE_AS_BOOLEAN =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_MILD_ERROR | 542;
+
+
+
+ /**
+ * The message ID for the message that will be used if a branch references an
+ * undefined subordinate template. This takes two arguments, which are the DN
+ * of the branch entry and the name of the undefined template.
+ */
+ public static final int MSGID_MAKELDIF_UNDEFINED_BRANCH_SUBORDINATE =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_MILD_ERROR | 543;
+
+
+
+ /**
+ * The message ID for the message that will be used if an error occurs while
+ * attempting to load a class for use as a tag. This takes a single argument,
+ * which is the name of the class.
+ */
+ public static final int MSGID_MAKELDIF_CANNOT_LOAD_TAG_CLASS =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_MILD_ERROR | 544;
+
+
+
+ /**
+ * The message ID for the message that will be used if an error occurs while
+ * attempting to instantiate a class for use as a tag. This takes a single
+ * argument, which is the name of the class.
+ */
+ public static final int MSGID_MAKELDIF_CANNOT_INSTANTIATE_TAG =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_MILD_ERROR | 545;
+
+
+
+ /**
+ * The message ID for the message that will be used if an attempt is made to
+ * register a new tag with a conflicting name. This takes two arguments,
+ * which are the name of the class and the name of the tag.
+ */
+ public static final int MSGID_MAKELDIF_CONFLICTING_TAG_NAME =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_MILD_ERROR | 546;
+
+
+
+ /**
+ * The message ID for the message that will be used if a potential undefined
+ * constant is used in the template file. This takes two arguments, which are
+ * the name of the constant and the line number on which it is used.
+ */
+ public static final int MSGID_MAKELDIF_WARNING_UNDEFINED_CONSTANT =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_MILD_WARNING | 547;
+
+
+
+ /**
+ * The message ID for the message that will be used if a constant definition
+ * does not include an equal sign. This takes a single argument, which is the
+ * line number on which it appears.
+ */
+ public static final int MSGID_MAKELDIF_DEFINE_MISSING_EQUALS =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_MILD_ERROR | 548;
+
+
+
+ /**
+ * The message ID for the message that will be used if a constant definition
+ * does not include a name. This takes a single argument, which is the line
+ * number on which it appears.
+ */
+ public static final int MSGID_MAKELDIF_DEFINE_NAME_EMPTY =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_MILD_ERROR | 549;
+
+
+
+ /**
+ * The message ID for the message that will be used if a constant definition
+ * has a name that conflicts with another constant. This takes two arguments,
+ * which are the name of the constant and the line number on which the
+ * conflict was detected.
+ */
+ public static final int MSGID_MAKELDIF_CONFLICTING_CONSTANT_NAME =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_MILD_ERROR | 550;
+
+
+
+ /**
+ * The message ID for the message that will be used if a constant definition
+ * does not have a value. This takes two arguments, which are the name of the
+ * constant and the line number on which it is defined.
+ */
+ public static final int MSGID_MAKELDIF_WARNING_DEFINE_VALUE_EMPTY =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_MILD_ERROR | 551;
+
+
+
+ /**
+ * The message ID for the message that will be used if a branch definition
+ * has a DN that conflicts with another branch. This takes two arguments,
+ * which are the branch DN and the line number on which the conflict was
+ * detected.
+ */
+ public static final int MSGID_MAKELDIF_CONFLICTING_BRANCH_DN =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_MILD_ERROR | 552;
+
+
+
+ /**
+ * The message ID for the message that will be used if a template definition
+ * has a name that conflicts with another template. This takes two arguments,
+ * which are the template name and the line number on which the conflict was
+ * detected.
+ */
+ public static final int MSGID_MAKELDIF_CONFLICTING_TEMPLATE_NAME =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_MILD_ERROR | 553;
+
+
+
+ /**
+ * The message ID for the message that will be used if an unrecognized line
+ * was found in the template file. This takes two arguments, which are the
+ * content of the line and the line number on which it was found.
+ */
+ public static final int MSGID_MAKELDIF_UNEXPECTED_TEMPLATE_FILE_LINE =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_MILD_ERROR | 554;
+
+
+
+ /**
+ * The message ID for the message that will be used if a template references
+ * an undefined subordinate template. This takes two arguments, which are the
+ * name of the parent template and the name of the undefined subordinate
+ * template.
+ */
+ public static final int MSGID_MAKELDIF_UNDEFINED_TEMPLATE_SUBORDINATE =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_MILD_ERROR | 555;
+
+
+
+ /**
+ * The message ID for the message that will be used if an error occurs while
+ * trying to parse the branch DN. This takes two arguments, which are the DN
+ * string and the line number on which it appears.
+ */
+ public static final int MSGID_MAKELDIF_CANNOT_DECODE_BRANCH_DN =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_MILD_ERROR | 556;
+
+
+
+ /**
+ * The message ID for the message that will be used if a subordinate template
+ * definition does not include a colon. This takes two arguments, which are
+ * the line number and the branch DN.
+ */
+ public static final int MSGID_MAKELDIF_BRANCH_SUBORDINATE_TEMPLATE_NO_COLON =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_MILD_ERROR | 557;
+
+
+
+ /**
+ * The message ID for the message that will be used if a subordinate template
+ * specifies an invalid number of entries. This takes four arguments, which
+ * are the line number, the branch DN, the invalid number of entries, and the
+ * subordinate template name.
+ */
+ public static final int
+ MSGID_MAKELDIF_BRANCH_SUBORDINATE_INVALID_NUM_ENTRIES =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_MILD_ERROR | 558;
+
+
+
+ /**
+ * The message ID for the message that will be used if there are zero entries
+ * to be created for a subordinate template. This takes three arguments,
+ * which are the line number, the branch DN, and the subordinate template
+ * name.
+ */
+ public static final int MSGID_MAKELDIF_BRANCH_SUBORDINATE_ZERO_ENTRIES =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_MILD_WARNING | 559;
+
+
+
+ /**
+ * The message ID for the message that will be used if an error occurs while
+ * trying to parse the number of entries for a subordinate template. This
+ * takes three arguments, which are the template name, the line number, and
+ * the branch DN.
+ */
+ public static final int
+ MSGID_MAKELDIF_BRANCH_SUBORDINATE_CANT_PARSE_NUMENTRIES =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_MILD_ERROR | 560;
+
+
+
+ /**
+ * The message ID for the message that will be used if a subordinate template
+ * definition does not include a colon. This takes two arguments, which are
+ * the line number and the template name.
+ */
+ public static final int
+ MSGID_MAKELDIF_TEMPLATE_SUBORDINATE_TEMPLATE_NO_COLON =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_MILD_ERROR | 561;
+
+
+
+ /**
+ * The message ID for the message that will be used if a subordinate template
+ * specifies an invalid number of entries. This takes four arguments, which
+ * are the line number, the template name, the invalid number of entries, and
+ * the subordinate template name.
+ */
+ public static final int
+ MSGID_MAKELDIF_TEMPLATE_SUBORDINATE_INVALID_NUM_ENTRIES =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_MILD_ERROR | 562;
+
+
+
+ /**
+ * The message ID for the message that will be used if there are zero entries
+ * to be created for a subordinate template. This takes three arguments,
+ * which are the line number, the template name, and the subordinate template
+ * name.
+ */
+ public static final int MSGID_MAKELDIF_TEMPLATE_SUBORDINATE_ZERO_ENTRIES =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_MILD_WARNING | 563;
+
+
+
+ /**
+ * The message ID for the message that will be used if an error occurs while
+ * trying to parse the number of entries for a subordinate template. This
+ * takes three arguments, which are the subordinate template name, the line
+ * number, and the template name.
+ */
+ public static final int
+ MSGID_MAKELDIF_TEMPLATE_SUBORDINATE_CANT_PARSE_NUMENTRIES =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_MILD_ERROR | 564;
+
+
+
+ /**
+ * The message ID for the message that will be used if a template references
+ * an undefined RDN attribute. This takes two arguments, which are the
+ * name of the parent template and the name of the undefined RDN attribute.
+ */
+ public static final int MSGID_MAKELDIF_TEMPLATE_MISSING_RDN_ATTR =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_MILD_ERROR | 565;
+
+
+
+ /**
+ * The message ID for the message that will be used if a branch definition has
+ * an extra line with no colon to separate the attribute type from the value
+ * pattern. This takes two arguments, which are the line number in the
+ * template file and the branch DN.
+ */
+ public static final int MSGID_MAKELDIF_NO_COLON_IN_BRANCH_EXTRA_LINE =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_MILD_ERROR | 566;
+
+
+
+ /**
+ * The message ID for the message that will be used if a branch definition has
+ * an extra line with no attribute type . This takes two arguments, which are
+ * the line number in the template file and the branch DN.
+ */
+ public static final int MSGID_MAKELDIF_NO_ATTR_IN_BRANCH_EXTRA_LINE =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_MILD_ERROR | 567;
+
+
+
+ /**
+ * The message ID for the message that will be used if a branch definition has
+ * an extra line with no value. This takes two arguments, which are the line
+ * number in the template file and the branch DN.
+ */
+ public static final int MSGID_MAKELDIF_NO_VALUE_IN_BRANCH_EXTRA_LINE =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_MILD_WARNING | 568;
+
+
+
+ /**
+ * The message ID for the message that will be used if a template definition
+ * has a line with no colon to separate the attribute type from the value
+ * pattern. This takes two arguments, which are the line number in the
+ * template file and the template name.
+ */
+ public static final int MSGID_MAKELDIF_NO_COLON_IN_TEMPLATE_LINE =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_MILD_ERROR | 569;
+
+
+
+ /**
+ * The message ID for the message that will be used if a template definition
+ * has a line with no attribute type . This takes two arguments, which are
+ * the line number in the template file and the template name.
+ */
+ public static final int MSGID_MAKELDIF_NO_ATTR_IN_TEMPLATE_LINE =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_MILD_ERROR | 570;
+
+
+
+ /**
+ * The message ID for the message that will be used if a template definition
+ * has a line with no value. This takes two arguments, which are the line
+ * number in the template file and the template name.
+ */
+ public static final int MSGID_MAKELDIF_NO_VALUE_IN_TEMPLATE_LINE =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_MILD_WARNING | 571;
+
+
+
+ /**
+ * The message ID for the message that will be used if a template definition
+ * references an undefined tag. This takes two arguments, which are the name
+ * of the tag and the line number on which it appears in the template file.
+ */
+ public static final int MSGID_MAKELDIF_NO_SUCH_TAG =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_MILD_ERROR | 572;
+
+
+
+ /**
+ * The message ID for the message that will be used if an error occurs while
+ * trying to create a new tag instance. This takes three arguments, which are
+ * the tag name, the line number, and a message explaining the problem that
+ * occurred.
+ */
+ public static final int MSGID_MAKELDIF_CANNOT_INSTANTIATE_NEW_TAG =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_MILD_ERROR | 573;
+
+
+ /**
+ * The message ID for the message that will be used as the description of the
+ * configFile argument. This does not take any arguments.
+ */
+ public static final int MSGID_MAKELDIF_DESCRIPTION_CONFIG_FILE =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_INFORMATIONAL | 574;
+
+
+ /**
+ * The message ID for the message that will be used as the description of the
+ * configClass argument. This does not take any arguments.
+ */
+ public static final int MSGID_MAKELDIF_DESCRIPTION_CONFIG_CLASS =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_INFORMATIONAL | 575;
+
+
+ /**
+ * The message ID for the message that will be used as the description of the
+ * templateFile argument. This does not take any arguments.
+ */
+ public static final int MSGID_MAKELDIF_DESCRIPTION_TEMPLATE =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_INFORMATIONAL | 576;
+
+
+ /**
+ * The message ID for the message that will be used as the description of the
+ * ldifFile argument. This does not take any arguments.
+ */
+ public static final int MSGID_MAKELDIF_DESCRIPTION_LDIF =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_INFORMATIONAL | 577;
+
+
+ /**
+ * The message ID for the message that will be used as the description of the
+ * randomSeed argument. This does not take any arguments.
+ */
+ public static final int MSGID_MAKELDIF_DESCRIPTION_SEED =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_INFORMATIONAL | 578;
+
+
+ /**
+ * The message ID for the message that will be used as the description of the
+ * help argument. This does not take any arguments.
+ */
+ public static final int MSGID_MAKELDIF_DESCRIPTION_HELP =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_INFORMATIONAL | 579;
+
+
+
+ /**
+ * The message ID for the message that will be used if an error occurs while
+ * attempting to initialize the command-line argument parser. This takes a
+ * single argument, which is a message explaining the problem that occurred.
+ */
+ public static final int MSGID_MAKELDIF_CANNOT_INITIALIZE_ARGS =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_SEVERE_ERROR | 580;
+
+
+
+ /**
+ * The message ID for the message that will be used if an error occurs while
+ * parsing the provided command-line arguments. This takes a single argument,
+ * which is a message explaining the problem that occurred.
+ */
+ public static final int MSGID_MAKELDIF_ERROR_PARSING_ARGS =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_SEVERE_ERROR | 581;
+
+
+
+ /**
+ * The message ID for the message that will be used if an error occurs while
+ * initializing the Directory Server JMX subsystem. This takes two arguments,
+ * which are the path to the Directory Server configuration file and a message
+ * explaining the problem that occurred.
+ */
+ public static final int MSGID_MAKELDIF_CANNOT_INITIALIZE_JMX =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_SEVERE_ERROR | 582;
+
+
+
+ /**
+ * The message ID for the message that will be used if an error occurs while
+ * initializing the Directory Server configuration. This takes two
+ * arguments, which are the path to the Directory Server configuration file
+ * and a message explaining the problem that occurred.
+ */
+ public static final int MSGID_MAKELDIF_CANNOT_INITIALIZE_CONFIG =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_SEVERE_ERROR | 583;
+
+
+
+ /**
+ * The message ID for the message that will be used if an error occurs while
+ * initializing the Directory Server schema. This takes two arguments, which
+ * are the path to the Directory Server configuration file and a message
+ * explaining the problem that occurred.
+ */
+ public static final int MSGID_MAKELDIF_CANNOT_INITIALIZE_SCHEMA =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_SEVERE_ERROR | 584;
+
+
+
+ /**
+ * The message ID for the message that will be used if an I/O exception was
+ * thrown while trying to load the template file. This takes a single
+ * argument, which is a message explaining the problem that occurred.
+ */
+ public static final int MSGID_MAKELDIF_IOEXCEPTION_DURING_PARSE =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_SEVERE_ERROR | 585;
+
+
+
+ /**
+ * The message ID for the message that will be used if a non-I/O exception was
+ * thrown while trying to load the template file. This takes a single
+ * argument, which is a message explaining the problem that occurred.
+ */
+ public static final int MSGID_MAKELDIF_EXCEPTION_DURING_PARSE =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_SEVERE_ERROR | 586;
+
+
+
+ /**
+ * The message ID for the message that will be used if a value cannot be
+ * parsed as a format string. This takes three arguments, which are the
+ * provided value, the tag name, and the line number on which it appears in
+ * the template file.
+ */
+ public static final int MSGID_MAKELDIF_TAG_INVALID_FORMAT_STRING =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_MILD_ERROR | 587;
+
+
+
+ /**
+ * The message ID for the message that will be used if a random tag does not
+ * specify the random value type. This takes a single argument, which is the
+ * line number on which it appears in the template file.
+ */
+ public static final int MSGID_MAKELDIF_TAG_NO_RANDOM_TYPE_ARGUMENT =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_MILD_ERROR | 588;
+
+
+
+ /**
+ * The message ID for the message that will be used if a random tag will
+ * always generate an empty value. This takes a single argument, which is the
+ * line number on which it appears in the template file.
+ */
+ public static final int MSGID_MAKELDIF_TAG_WARNING_EMPTY_VALUE =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_MILD_WARNING | 589;
+
+
+
+ /**
+ * The message ID for the message that will be used if a random tag has an
+ * unknown random type. This takes two arguments, which are the line number
+ * on which it appears in the template file and the provided random type.
+ */
+ public static final int MSGID_MAKELDIF_TAG_UNKNOWN_RANDOM_TYPE =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_MILD_ERROR | 590;
+
+
+
+ /**
+ * The message ID for the message that will be used as the description of the
+ * resourcePath argument. This does not take any arguments.
+ */
+ public static final int MSGID_MAKELDIF_DESCRIPTION_RESOURCE_PATH =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_INFORMATIONAL | 591;
+
+
+
+ /**
+ * The message ID for the message that will be used if the specified temlate
+ * file could not be found. This takes a single argument, which is the
+ * specified template file.
+ */
+ public static final int MSGID_MAKELDIF_COULD_NOT_FIND_TEMPLATE_FILE =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_MILD_ERROR | 592;
+
+
+
+ /**
+ * The message ID for the message that will be used if the specified resource
+ * directory does not exist. This takes a single argument, which is the
+ * specified resource directory.
+ */
+ public static final int MSGID_MAKELDIF_NO_SUCH_RESOURCE_DIRECTORY =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_MILD_ERROR | 593;
+
+
+
+ /**
+ * The message ID for the message that will be used if the specified resource
+ * directory exists but is not a directory. This takes a single argument,
+ * which is the specified resource directory.
+ */
+ public static final int MSGID_MAKELDIF_RESOURCE_DIRECTORY_NOT_DIRECTORY =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_MILD_ERROR | 594;
+
+
+
+ /**
+ * The message ID for the message that will be used if the specified tag
+ * could not be found. This takes three arguments, which are the file path,
+ * the tag name, and the line number on which it appears in the template file.
+ */
+ public static final int MSGID_MAKELDIF_TAG_CANNOT_FIND_FILE =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_MILD_ERROR | 595;
+
+
+
+ /**
+ * The message ID for the message that will be used if an invalid file access
+ * mode was specified. This takes three arguments, which are the access mode,
+ * the tag name, and the line number on which it appears in the template file.
+ */
+ public static final int MSGID_MAKELDIF_TAG_INVALID_FILE_ACCESS_MODE =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_MILD_ERROR | 596;
+
+
+
+ /**
+ * The message ID for the message that will be used if an error occurs while
+ * trying to read the contents of a file. This takes four arguments, which
+ * are the file path, the tag name, the line number on which it appears in the
+ * template file, and a message explaining the problem that occurred.
+ */
+ public static final int MSGID_MAKELDIF_TAG_CANNOT_READ_FILE =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_MILD_ERROR | 597;
+
+
+
+ /**
+ * The message ID for the message that will be used if an error occurs while
+ * trying to create the output LDIF file. This takes two arguments, which are
+ * the path to the LDIF file and a message explaining the problem that
+ * occurred.
+ */
+ public static final int MSGID_MAKELDIF_UNABLE_TO_CREATE_LDIF =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_MILD_ERROR | 598;
+
+
+
+ /**
+ * The message ID for the message that will be used if an error occurs while
+ * trying to write to the output LDIF file. This takes two arguments, which
+ * are the path to the LDIF file and a message explaining the problem that
+ * occurred.
+ */
+ public static final int MSGID_MAKELDIF_ERROR_WRITING_LDIF =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_MILD_ERROR | 599;
+
+
+
+ /**
+ * The message ID for the message that will be used to indicate the number of
+ * entries that have been processed. This takes a single argument, which is
+ * the number of entries processed.
+ */
+ public static final int MSGID_MAKELDIF_PROCESSED_N_ENTRIES =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_INFORMATIONAL | 600;
+
+
+
+ /**
+ * The message ID for the message that will be used if an error occurs while
+ * trying to write an entry. This takes two arguments, which are the DN of
+ * the entry and a message with information about the problem that occurred.
+ */
+ public static final int MSGID_MAKELDIF_CANNOT_WRITE_ENTRY =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_MILD_ERROR | 601;
+
+
+
+ /**
+ * The message ID for the message that will be used to indicate that all
+ * processing has been completed. This takes a single argument, which is the
+ * number of entries processed.
+ */
+ public static final int MSGID_MAKELDIF_PROCESSING_COMPLETE =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_INFORMATIONAL | 602;
+
+
+
+ /**
+ * The message ID for the message that will be used as the description of the
+ * templateFile argument. This does not take any arguments.
+ */
+ public static final int MSGID_LDIFIMPORT_DESCRIPTION_TEMPLATE_FILE =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_INFORMATIONAL | 603;
+
+
+
+ /**
+ * The message ID for the message that will be used if both the ldifFile and
+ * the templateFile arguments were provided. This takes two arguments, which
+ * are the long identifiers for the ldifFile and templateFile options.
+ */
+ public static final int MSGID_LDIFIMPORT_CONFLICTING_OPTIONS =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_SEVERE_ERROR | 604;
+
+
+
+ /**
+ * The message ID for the message that will be used if neither the ldifFile or
+ * the templateFile arguments was provided. This takes two arguments, which
+ * are the long identifiers for the ldifFile and templateFile options.
+ */
+ public static final int MSGID_LDIFIMPORT_MISSING_REQUIRED_ARGUMENT =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_SEVERE_ERROR | 605;
+
+
+
+ /**
+ * The message ID for the message that will be used if an error occurs while
+ * attempting to initialize a MakeLDIF template file. This takes two
+ * arguments, which are the path to the template file and a message explaining
+ * the problem that occurred.
+ */
+ public static final int MSGID_LDIFIMPORT_CANNOT_PARSE_TEMPLATE_FILE =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_SEVERE_ERROR | 606;
+
+
+
+ /**
+ * The message ID for the message that will be used if a template line has an
+ * unclosed tag. This takes a single argument, which is the line number on
+ * which it appears in the template file.
+ */
+ public static final int MSGID_MAKELDIF_INCOMPLETE_TAG =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_MILD_ERROR | 607;
+
+
+
+ /**
+ * The message ID for the message that will be used if a branch definition
+ * includes a tag that is not allowed for use in branches. This takes two
+ * arguments, which are the name of the tag and the line number on which it
+ * appears in the template file.
+ */
+ public static final int MSGID_MAKELDIF_TAG_NOT_ALLOWED_IN_BRANCH =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_MILD_ERROR | 608;
+
+
+
+ /**
+ * The message ID for the message that will be used as the description of the
+ * randomSeed argument. This does not take any arguments.
+ */
+ public static final int MSGID_LDIFIMPORT_DESCRIPTION_RANDOM_SEED =
+ CATEGORY_MASK_TOOLS | SEVERITY_MASK_INFORMATIONAL | 609;
+
+
+
+ /**
* Associates a set of generic messages with the message IDs defined in this
* class.
*/
@@ -5517,6 +6287,11 @@
"once to import from multiple LDIF files (the files " +
"will be processed in the order they are provided in " +
"the arguments).");
+ registerMessage(MSGID_LDIFIMPORT_DESCRIPTION_TEMPLATE_FILE,
+ "Specifies the path to the MakeLDIF template file " +
+ "defining the data to be generated for the import. This " +
+ "may not be used in conjunction with the --ldifFile " +
+ "option.");
registerMessage(MSGID_LDIFIMPORT_DESCRIPTION_APPEND,
"Indicates that the import process should append to the " +
"existing database rather than overwriting it.");
@@ -5562,10 +6337,10 @@
"Specifies the path to a file into which rejected " +
"entries may be written if they are not accepted during " +
"the import process.");
- registerMessage(MSGID_LDIFIMPORT_DESCRIPTION_OVERWRITE_REJECTS,
- "Indicates whether to overwrite an existing rejects " +
- "file when performing an LDIF import rather than " +
- "appending to it.");
+ registerMessage(MSGID_LDIFIMPORT_DESCRIPTION_RANDOM_SEED,
+ "Specifies the seed to use for the random number " +
+ "generator. This is only applicable when generating " +
+ "entries from a template.");
registerMessage(MSGID_LDIFIMPORT_DESCRIPTION_SKIP_SCHEMA_VALIDATION,
"Indicates whether to skip schema validation during the " +
"import.");
@@ -5585,6 +6360,13 @@
registerMessage(MSGID_LDIFIMPORT_ERROR_PARSING_ARGS,
"An error occurred while parsing the command-line " +
"arguments: %s.");
+ registerMessage(MSGID_LDIFIMPORT_CONFLICTING_OPTIONS,
+ "The %s and %s arguments are incompatible and may not be " +
+ "used together.");
+ registerMessage(MSGID_LDIFIMPORT_MISSING_REQUIRED_ARGUMENT,
+ "Neither the %s or the %s argument was provided. One " +
+ "of these arguments must be given to specify the source " +
+ "for the LDIF data to be imported.");
registerMessage(MSGID_LDIFIMPORT_SERVER_BOOTSTRAP_ERROR,
"An unexpected error occurred while attempting to " +
"bootstrap the Directory Server client-side code: %s.");
@@ -5633,6 +6415,9 @@
registerMessage(MSGID_LDIFIMPORT_INVALID_INCLUDE_BASE,
"Provided include base DN \"%s\" is not handled by the " +
"backend with backend ID %s.");
+ registerMessage(MSGID_LDIFIMPORT_CANNOT_PARSE_TEMPLATE_FILE,
+ "Unable to parse the specified file %s as a MakeLDIF " +
+ "template file: %s.");
registerMessage(MSGID_LDIFIMPORT_CANNOT_OPEN_REJECTS_FILE,
"An error occurred while trying to open the rejects " +
"file %s for writing: %s.");
@@ -6962,6 +7747,236 @@
registerMessage(MSGID_INSTALLDS_ERROR_READING_FROM_STDIN,
"ERROR: Unexpected failure while reading from standard " +
"input: %s.");
+
+
+ registerMessage(MSGID_MAKELDIF_TAG_INVALID_ARGUMENT_COUNT,
+ "Invalid number of arguments provided for tag %s on line " +
+ "number %d of the template file: expected %d, got %d.");
+ registerMessage(MSGID_MAKELDIF_TAG_INVALID_ARGUMENT_RANGE_COUNT,
+ "Invalid number of arguments provided for tag %s on line " +
+ "number %d of the template file: expected between %d " +
+ "and %d, got %d.");
+ registerMessage(MSGID_MAKELDIF_TAG_UNDEFINED_ATTRIBUTE,
+ "Undefined attribute %s referenced on line %d of the " +
+ "template file.");
+ registerMessage(MSGID_MAKELDIF_TAG_INTEGER_BELOW_LOWER_BOUND,
+ "Value %d is below the lowest allowed value of %d for " +
+ "tag %s on line %d of the template file.");
+ registerMessage(MSGID_MAKELDIF_TAG_CANNOT_PARSE_AS_INTEGER,
+ "Cannot parse value \"%s\" as an integer for tag %s on " +
+ "line %d of the template file.");
+ registerMessage(MSGID_MAKELDIF_TAG_INTEGER_ABOVE_UPPER_BOUND,
+ "Value %d is above the largest allowed value of %d for " +
+ "tag %s on line %d of the template file.");
+ registerMessage(MSGID_MAKELDIF_TAG_INVALID_EMPTY_STRING_ARGUMENT,
+ "Argument %d for tag %s on line number %d may not be an " +
+ "empty string.");
+ registerMessage(MSGID_MAKELDIF_TAG_CANNOT_PARSE_AS_BOOLEAN,
+ "Cannot parse value \"%s\" as a Boolean value for tag %s " +
+ "on line %d of the template file. The value must be " +
+ "either 'true' or 'false'.");
+ registerMessage(MSGID_MAKELDIF_UNDEFINED_BRANCH_SUBORDINATE,
+ "The branch with entry DN %s references a subordinate " +
+ "template named %s which is not defined in the template " +
+ "file.");
+ registerMessage(MSGID_MAKELDIF_CANNOT_LOAD_TAG_CLASS,
+ "Unable to load class %s for use as a MakeLDIF tag.");
+ registerMessage(MSGID_MAKELDIF_CANNOT_INSTANTIATE_TAG,
+ "Cannot instantiate class %s as a MakeLDIF tag.");
+ registerMessage(MSGID_MAKELDIF_CONFLICTING_TAG_NAME,
+ "Cannot register the tag defined in class %s because " +
+ "the tag name %s conflicts with the name of another " +
+ "tag that has already been registered.");
+ registerMessage(MSGID_MAKELDIF_WARNING_UNDEFINED_CONSTANT,
+ "Possible reference to an undefined constant %s on line " +
+ "%d.");
+ registerMessage(MSGID_MAKELDIF_DEFINE_MISSING_EQUALS,
+ "The constant definition on line %d is missing an " +
+ "equal sign to delimit the constant name from the value.");
+ registerMessage(MSGID_MAKELDIF_DEFINE_NAME_EMPTY,
+ "The constant definition on line %d does not include a " +
+ "name for the constant.");
+ registerMessage(MSGID_MAKELDIF_CONFLICTING_CONSTANT_NAME,
+ "The definition for constant %s on line %d conflicts " +
+ "with an earlier constant definition included in the " +
+ "template.");
+ registerMessage(MSGID_MAKELDIF_WARNING_DEFINE_VALUE_EMPTY,
+ "Constant %s defined on line %d has not been assigned a " +
+ "value.");
+ registerMessage(MSGID_MAKELDIF_CONFLICTING_BRANCH_DN,
+ "The branch definition %s starting on line %d conflicts " +
+ "with an earlier branch definition contained in the " +
+ "template file.");
+ registerMessage(MSGID_MAKELDIF_CONFLICTING_TEMPLATE_NAME,
+ "The template definition %s starting on line %d " +
+ "conflicts with an earlier template definition contained " +
+ "in the template file.");
+ registerMessage(MSGID_MAKELDIF_UNEXPECTED_TEMPLATE_FILE_LINE,
+ "Unexpected template line \"%s\" encountered on line %d " +
+ "of the template file.");
+ registerMessage(MSGID_MAKELDIF_UNDEFINED_TEMPLATE_SUBORDINATE,
+ "The template named %s references a subordinate template " +
+ "named %s which is not defined in the template file.");
+ registerMessage(MSGID_MAKELDIF_TEMPLATE_MISSING_RDN_ATTR,
+ "The template named %s includes RDN attribute %s that " +
+ "is not assigned a value in that template.");
+ registerMessage(MSGID_MAKELDIF_CANNOT_DECODE_BRANCH_DN,
+ "Unable to decode branch DN \"%s\" on line %d of the " +
+ "template file.");
+ registerMessage(MSGID_MAKELDIF_BRANCH_SUBORDINATE_TEMPLATE_NO_COLON,
+ "Subordinate template definition on line %d for branch " +
+ "%s is missing a colon to separate the template name " +
+ "from the number of entries.");
+ registerMessage(MSGID_MAKELDIF_BRANCH_SUBORDINATE_INVALID_NUM_ENTRIES,
+ "Subordinate template definition on line %d for branch " +
+ "%s specified invalid number of entries %d for template " +
+ "%s.");
+ registerMessage(MSGID_MAKELDIF_BRANCH_SUBORDINATE_ZERO_ENTRIES,
+ "Subordinate template definition on line %d for branch " +
+ "%s specifies that zero entries of type %s should be " +
+ "generated.");
+ registerMessage(MSGID_MAKELDIF_BRANCH_SUBORDINATE_CANT_PARSE_NUMENTRIES,
+ "Unable to parse the number of entries for template %s " +
+ "as an integer for the subordinate template definition " +
+ "on line %d for branch %s.");
+ registerMessage(MSGID_MAKELDIF_TEMPLATE_SUBORDINATE_TEMPLATE_NO_COLON,
+ "Subordinate template definition on line %d for template " +
+ "%s is missing a colon to separate the template name " +
+ "from the number of entries.");
+ registerMessage(MSGID_MAKELDIF_TEMPLATE_SUBORDINATE_INVALID_NUM_ENTRIES,
+ "Subordinate template definition on line %d for template " +
+ "%s specified invalid number of entries %d for " +
+ "subordinate template %s.");
+ registerMessage(MSGID_MAKELDIF_TEMPLATE_SUBORDINATE_ZERO_ENTRIES,
+ "Subordinate template definition on line %d for template " +
+ "%s specifies that zero entries of type %s should be " +
+ "generated.");
+ registerMessage(MSGID_MAKELDIF_TEMPLATE_SUBORDINATE_CANT_PARSE_NUMENTRIES,
+ "Unable to parse the number of entries for template %s " +
+ "as an integer for the subordinate template definition " +
+ "on line %d for template %s.");
+ registerMessage(MSGID_MAKELDIF_NO_COLON_IN_BRANCH_EXTRA_LINE,
+ "There is no colon to separate the attribute name from " +
+ "the value pattern on line %s of the template file in " +
+ "the definition for branch %s.");
+ registerMessage(MSGID_MAKELDIF_NO_ATTR_IN_BRANCH_EXTRA_LINE,
+ "There is no attribute name before the colon on line %d " +
+ "of the template file in the definition for branch %s.");
+ registerMessage(MSGID_MAKELDIF_NO_VALUE_IN_BRANCH_EXTRA_LINE,
+ "The value pattern for line %s of the template file in " +
+ "the definition for branch %s is empty.");
+ registerMessage(MSGID_MAKELDIF_INCOMPLETE_TAG,
+ "Line %d of the template file contains an incomplete " +
+ "tag that starts with either '<' or '{' but does get " +
+ "closed.");
+ registerMessage(MSGID_MAKELDIF_NO_COLON_IN_BRANCH_EXTRA_LINE,
+ "There is no colon to separate the attribute name from " +
+ "the value pattern on line %s of the template file in " +
+ "the definition for template %s.");
+ registerMessage(MSGID_MAKELDIF_NO_ATTR_IN_TEMPLATE_LINE,
+ "There is no attribute name before the colon on line %d " +
+ "of the template file in the definition for template %s.");
+ registerMessage(MSGID_MAKELDIF_NO_VALUE_IN_TEMPLATE_LINE,
+ "The value pattern for line %s of the template file in " +
+ "the definition for template %s is empty.");
+ registerMessage(MSGID_MAKELDIF_NO_SUCH_TAG,
+ "An undefined tag %s is referenced on line %d of the " +
+ "template file.");
+ registerMessage(MSGID_MAKELDIF_CANNOT_INSTANTIATE_NEW_TAG,
+ "An unexpected error occurred while trying to create a " +
+ "new instance of tag %s referenced on line %d of the " +
+ "template file: %s.");
+ registerMessage(MSGID_MAKELDIF_TAG_NOT_ALLOWED_IN_BRANCH,
+ "Tag %s referenced on line %d of the template file is " +
+ "not allowed for use in branch definitions.");
+ registerMessage(MSGID_MAKELDIF_DESCRIPTION_CONFIG_FILE,
+ "The path to the Directory Server configuration file.");
+ registerMessage(MSGID_MAKELDIF_DESCRIPTION_CONFIG_CLASS,
+ "The fully-qualified name of the Java class to use as " +
+ "the Directory Server configuration handler. If this is " +
+ "not provided, then a default of " +
+ ConfigFileHandler.class.getName() + " will be used.");
+ registerMessage(MSGID_MAKELDIF_DESCRIPTION_RESOURCE_PATH,
+ "Specifies the path to look for MakeLDIF resources " +
+ "(e.g., data files) not found in the current working " +
+ "directory or template directory path.");
+ registerMessage(MSGID_MAKELDIF_DESCRIPTION_TEMPLATE,
+ "The path to the template file with information about " +
+ "the LDIF data to generate.");
+ registerMessage(MSGID_MAKELDIF_DESCRIPTION_LDIF,
+ "The path to the LDIF file to be written.");
+ registerMessage(MSGID_MAKELDIF_DESCRIPTION_SEED,
+ "The seed to use to initialize the random number " +
+ "generator.");
+ registerMessage(MSGID_MAKELDIF_DESCRIPTION_HELP,
+ "Show this usgae information.");
+ registerMessage(MSGID_MAKELDIF_CANNOT_INITIALIZE_ARGS,
+ "An unexpected error occurred while attempting to " +
+ "initialize the command-line arguments: %s.");
+ registerMessage(MSGID_MAKELDIF_ERROR_PARSING_ARGS,
+ "An error occurred while parsing the command-line " +
+ "arguments: %s.");
+ registerMessage(MSGID_MAKELDIF_CANNOT_INITIALIZE_JMX,
+ "An error occurred while attempting to initialize the " +
+ "Directory Server JMX subsystem based on the information " +
+ "in configuration file %s: %s.");
+ registerMessage(MSGID_MAKELDIF_CANNOT_INITIALIZE_CONFIG,
+ "An error occurred while attempting to process the " +
+ "Directory Server configuration file %s: %s.");
+ registerMessage(MSGID_MAKELDIF_CANNOT_INITIALIZE_SCHEMA,
+ "An error occurred while attempting to initialize the " +
+ "Directory Server schema based on the information in " +
+ "configuration file %s: %s.");
+ registerMessage(MSGID_MAKELDIF_IOEXCEPTION_DURING_PARSE,
+ "An error occurred while attempting to read the " +
+ "template file: %s.");
+ registerMessage(MSGID_MAKELDIF_EXCEPTION_DURING_PARSE,
+ "An error occurred while attempting to parse the " +
+ "template file: %s.");
+ registerMessage(MSGID_MAKELDIF_TAG_INVALID_FORMAT_STRING,
+ "Cannot parse value \"%s\" as an valid format string for " +
+ "tag %s on line %d of the template file.");
+ registerMessage(MSGID_MAKELDIF_TAG_NO_RANDOM_TYPE_ARGUMENT,
+ "The random tag on line %d of the template file does " +
+ "not include an argument to specify the type of random " +
+ "value that should be generated.");
+ registerMessage(MSGID_MAKELDIF_TAG_WARNING_EMPTY_VALUE,
+ "The value generated from the random tag on line %d of " +
+ "the template file will always be an empty string.");
+ registerMessage(MSGID_MAKELDIF_TAG_UNKNOWN_RANDOM_TYPE,
+ "The random tag on line %d of the template file " +
+ "references an unknown random type of %s.");
+ registerMessage(MSGID_MAKELDIF_COULD_NOT_FIND_TEMPLATE_FILE,
+ "Could not find template file %s.");
+ registerMessage(MSGID_MAKELDIF_NO_SUCH_RESOURCE_DIRECTORY,
+ "The specified resource directory %s could not be found.");
+ registerMessage(MSGID_MAKELDIF_RESOURCE_DIRECTORY_NOT_DIRECTORY,
+ "The specified resource directory %s exists but is not a " +
+ "directory.");
+ registerMessage(MSGID_MAKELDIF_TAG_CANNOT_FIND_FILE,
+ "Cannot find file %s referenced by tag %s on line %d of " +
+ "the template file.");
+ registerMessage(MSGID_MAKELDIF_TAG_INVALID_FILE_ACCESS_MODE,
+ "Invalid file access mode %s for tag %s on line %d of " +
+ "the template file. It must be either \"sequential\" or " +
+ "\"random\".");
+ registerMessage(MSGID_MAKELDIF_TAG_CANNOT_READ_FILE,
+ "An error occurred while trying to read file %s " +
+ "referenced by tag %s on line %d of the template file: " +
+ "%s.");
+ registerMessage(MSGID_MAKELDIF_UNABLE_TO_CREATE_LDIF,
+ "An error occurred while attempting to open LDIF file %s " +
+ "for writing: %s.");
+ registerMessage(MSGID_MAKELDIF_ERROR_WRITING_LDIF,
+ "An error occurred while writing data to LDIF file %s: " +
+ "%s.");
+ registerMessage(MSGID_MAKELDIF_PROCESSED_N_ENTRIES,
+ "Processed %d entries.");
+ registerMessage(MSGID_MAKELDIF_CANNOT_WRITE_ENTRY,
+ "An error occurred while attempting to write entry %s to " +
+ "LDIF: %s.");
+ registerMessage(MSGID_MAKELDIF_PROCESSING_COMPLETE,
+ "LDIF processing complete. %d entries written.");
}
}
diff --git a/opends/src/server/org/opends/server/tools/ImportLDIF.java b/opends/src/server/org/opends/server/tools/ImportLDIF.java
index 186d248..09926b4 100644
--- a/opends/src/server/org/opends/server/tools/ImportLDIF.java
+++ b/opends/src/server/org/opends/server/tools/ImportLDIF.java
@@ -28,9 +28,11 @@
+import java.io.File;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
+import java.util.Random;
import org.opends.server.api.Backend;
import org.opends.server.api.plugin.PluginType;
@@ -45,6 +47,7 @@
import org.opends.server.core.InitializationException;
import org.opends.server.core.LockFileManager;
import org.opends.server.loggers.StartupErrorLogger;
+import org.opends.server.tools.makeldif.TemplateFile;
import org.opends.server.types.AttributeType;
import org.opends.server.types.DN;
import org.opends.server.types.ErrorLogCategory;
@@ -55,6 +58,7 @@
import org.opends.server.util.args.ArgumentException;
import org.opends.server.util.args.ArgumentParser;
import org.opends.server.util.args.BooleanArgument;
+import org.opends.server.util.args.IntegerArgument;
import org.opends.server.util.args.StringArgument;
import static org.opends.server.config.ConfigConstants.*;
@@ -116,6 +120,7 @@
BooleanArgument quietMode = null;
BooleanArgument replaceExisting = null;
BooleanArgument skipSchemaValidation = null;
+ IntegerArgument randomSeed = null;
StringArgument backendID = null;
StringArgument configClass = null;
StringArgument configFile = null;
@@ -127,6 +132,7 @@
StringArgument includeFilterStrings = null;
StringArgument ldifFiles = null;
StringArgument rejectFile = null;
+ StringArgument templateFile = null;
// Create the command-line argument parser for use with this program.
@@ -154,12 +160,19 @@
ldifFiles =
- new StringArgument("ldiffile", 'l', "ldifFile", true, true, true,
+ new StringArgument("ldiffile", 'l', "ldifFile", false, true, true,
"{ldifFile}", null, null,
MSGID_LDIFIMPORT_DESCRIPTION_LDIF_FILE);
argParser.addArgument(ldifFiles);
+ templateFile =
+ new StringArgument("templatefile", 't', "templateFile", false, false,
+ true, "{templateFile}", null, null,
+ MSGID_LDIFIMPORT_DESCRIPTION_TEMPLATE_FILE);
+ argParser.addArgument(templateFile);
+
+
append =
new BooleanArgument("append", 'a', "append",
MSGID_LDIFIMPORT_DESCRIPTION_APPEND);
@@ -234,6 +247,13 @@
argParser.addArgument(overwriteRejects);
+ randomSeed =
+ new IntegerArgument("randomseed", 'S', "randomSeed", false, false,
+ true, "{seed}", 0, null, false, 0, false, 0,
+ MSGID_LDIFIMPORT_DESCRIPTION_RANDOM_SEED);
+ argParser.addArgument(randomSeed);
+
+
skipSchemaValidation =
new BooleanArgument("skipschema", 's', "skipSchemaValidation",
MSGID_LDIFIMPORT_DESCRIPTION_SKIP_SCHEMA_VALIDATION);
@@ -296,6 +316,29 @@
}
+ // Make sure that either the "ldifFile" argument or the "templateFile"
+ // argument was provided, but not both.
+ if (ldifFiles.isPresent())
+ {
+ if (templateFile.isPresent())
+ {
+ int msgID = MSGID_LDIFIMPORT_CONFLICTING_OPTIONS;
+ String message = getMessage(msgID, ldifFiles.getLongIdentifier(),
+ templateFile.getLongIdentifier());
+ System.err.println(message);
+ return 1;
+ }
+ }
+ else if (! templateFile.isPresent())
+ {
+ int msgID = MSGID_LDIFIMPORT_MISSING_REQUIRED_ARGUMENT;
+ String message = getMessage(msgID, ldifFiles.getLongIdentifier(),
+ templateFile.getLongIdentifier());
+ System.err.println(message);
+ return 1;
+ }
+
+
// Perform the initial bootstrap of the Directory Server and process the
// configuration.
DirectoryServer directoryServer = DirectoryServer.getInstance();
@@ -758,9 +801,57 @@
}
+ // See if the data should be read from LDIF files or generated via MakeLDIF.
+ LDIFImportConfig importConfig;
+ if (ldifFiles.isPresent())
+ {
+ ArrayList<String> fileList = new ArrayList<String>(ldifFiles.getValues());
+ importConfig = new LDIFImportConfig(fileList);
+ }
+ else
+ {
+ Random random;
+ if (randomSeed.isPresent())
+ {
+ try
+ {
+ random = new Random(randomSeed.getIntValue());
+ }
+ catch (Exception e)
+ {
+ random = new Random();
+ }
+ }
+ else
+ {
+ random = new Random();
+ }
+
+ String resourcePath = DirectoryServer.getServerRoot() + File.separator +
+ PATH_MAKELDIF_RESOURCE_DIR;
+ TemplateFile tf = new TemplateFile(resourcePath, random);
+
+ ArrayList<String> warnings = new ArrayList<String>();
+ try
+ {
+ tf.parse(templateFile.getValue(), warnings);
+ }
+ catch (Exception e)
+ {
+ int msgID = MSGID_LDIFIMPORT_CANNOT_PARSE_TEMPLATE_FILE;
+ String message = getMessage(msgID, templateFile.getValue(),
+ e.getMessage());
+ logError(ErrorLogCategory.BACKEND, ErrorLogSeverity.SEVERE_ERROR,
+ message, msgID);
+ return 1;
+ }
+
+ importConfig = new LDIFImportConfig(tf);
+ }
+
+
+
// Create the LDIF import configuration to use when reading the LDIF.
- ArrayList<String> fileList = new ArrayList<String>(ldifFiles.getValues());
- LDIFImportConfig importConfig = new LDIFImportConfig(fileList);
importConfig.setAppendToExistingData(append.isPresent());
importConfig.setReplaceExistingEntries(replaceExisting.isPresent());
importConfig.setCompressed(isCompressed.isPresent());
diff --git a/opends/src/server/org/opends/server/tools/makeldif/AttributeValueTag.java b/opends/src/server/org/opends/server/tools/makeldif/AttributeValueTag.java
new file mode 100644
index 0000000..9f5c739
--- /dev/null
+++ b/opends/src/server/org/opends/server/tools/makeldif/AttributeValueTag.java
@@ -0,0 +1,272 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ * Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ * Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.tools.makeldif;
+
+
+
+import java.util.List;
+
+import org.opends.server.core.DirectoryServer;
+import org.opends.server.core.InitializationException;
+import org.opends.server.types.AttributeType;
+
+import static org.opends.server.messages.MessageHandler.*;
+import static org.opends.server.messages.ToolMessages.*;
+import static org.opends.server.util.StaticUtils.*;
+
+
+
+/**
+ * This class defines a tag that is used to reference the value of a specified
+ * attribute already defined in the entry.
+ */
+public class AttributeValueTag
+ extends Tag
+{
+ // The attribute type that specifies which value should be used.
+ private AttributeType attributeType;
+
+ // The maximum number of characters to include from the value.
+ private int numCharacters;
+
+
+
+ /**
+ * Creates a new instance of this attribute value tag.
+ */
+ public AttributeValueTag()
+ {
+ attributeType = null;
+ numCharacters = 0;
+ }
+
+
+
+ /**
+ * Retrieves the name for this tag.
+ *
+ * @return The name for this tag.
+ */
+ public String getName()
+ {
+ return "AttributeValue";
+ }
+
+
+
+ /**
+ * Indicates whether this tag is allowed for use in the extra lines for
+ * branches.
+ *
+ * @return <CODE>true</CODE> if this tag may be used in branch definitions,
+ * or <CODE>false</CODE> if not.
+ */
+ public boolean allowedInBranch()
+ {
+ return true;
+ }
+
+
+
+ /**
+ * Performs any initialization for this tag that may be needed while parsing
+ * a branch definition.
+ *
+ * @param templateFile The template file in which this tag is used.
+ * @param branch The branch in which this tag is used.
+ * @param arguments The set of arguments provided for this tag.
+ * @param lineNumber The line number on which this tag appears in the
+ * template file.
+ * @param warnings A list into which any appropriate warning messages
+ * may be placed.
+ *
+ * @throws InitializationException If a problem occurs while initializing
+ * this tag.
+ */
+ public void initializeForBranch(TemplateFile templateFile, Branch branch,
+ String[] arguments, int lineNumber,
+ List<String> warnings)
+ throws InitializationException
+ {
+ if ((arguments.length < 1) || (arguments.length > 2))
+ {
+ int msgID = MSGID_MAKELDIF_TAG_INVALID_ARGUMENT_RANGE_COUNT;
+ String message = getMessage(msgID, getName(), lineNumber, 1, 2,
+ arguments.length);
+
+ throw new InitializationException(msgID, message);
+ }
+
+ String lowerName = toLowerCase(arguments[0]);
+ attributeType = DirectoryServer.getAttributeType(lowerName, true);
+ if (! branch.hasAttribute(attributeType))
+ {
+ int msgID = MSGID_MAKELDIF_TAG_UNDEFINED_ATTRIBUTE;
+ String message = getMessage(msgID, arguments[0], lineNumber);
+
+ throw new InitializationException(msgID, message);
+ }
+
+ if (arguments.length == 2)
+ {
+ try
+ {
+ numCharacters = Integer.parseInt(arguments[1]);
+ if (numCharacters < 0)
+ {
+ int msgID = MSGID_MAKELDIF_TAG_INTEGER_BELOW_LOWER_BOUND;
+ String message = getMessage(msgID, numCharacters, 0, getName(),
+ lineNumber);
+
+ throw new InitializationException(msgID, message);
+ }
+ }
+ catch (NumberFormatException nfe)
+ {
+ int msgID = MSGID_MAKELDIF_TAG_CANNOT_PARSE_AS_INTEGER;
+ String message = getMessage(msgID, arguments[1], getName(), lineNumber);
+
+ throw new InitializationException(msgID, message);
+ }
+ }
+ else
+ {
+ numCharacters = 0;
+ }
+ }
+
+
+
+ /**
+ * Performs any initialization for this tag that may be needed while parsing
+ * a template definition.
+ *
+ * @param templateFile The template file in which this tag is used.
+ * @param template The template in which this tag is used.
+ * @param arguments The set of arguments provided for this tag.
+ * @param lineNumber The line number on which this tag appears in the
+ * template file.
+ * @param warnings A list into which any appropriate warning messages
+ * may be placed.
+ *
+ * @throws InitializationException If a problem occurs while initializing
+ * this tag.
+ */
+ public void initializeForTemplate(TemplateFile templateFile,
+ Template template, String[] arguments,
+ int lineNumber, List<String> warnings)
+ throws InitializationException
+ {
+ if ((arguments.length < 1) || (arguments.length > 2))
+ {
+ int msgID = MSGID_MAKELDIF_TAG_INVALID_ARGUMENT_RANGE_COUNT;
+ String message = getMessage(msgID, getName(), lineNumber, 1, 2,
+ arguments.length);
+
+ throw new InitializationException(msgID, message);
+ }
+
+ String lowerName = toLowerCase(arguments[0]);
+ attributeType = DirectoryServer.getAttributeType(lowerName, true);
+ if (! template.hasAttribute(attributeType))
+ {
+ int msgID = MSGID_MAKELDIF_TAG_UNDEFINED_ATTRIBUTE;
+ String message = getMessage(msgID, arguments[0], lineNumber);
+
+ throw new InitializationException(msgID, message);
+ }
+
+ if (arguments.length == 2)
+ {
+ try
+ {
+ numCharacters = Integer.parseInt(arguments[1]);
+ if (numCharacters < 0)
+ {
+ int msgID = MSGID_MAKELDIF_TAG_INTEGER_BELOW_LOWER_BOUND;
+ String message = getMessage(msgID, numCharacters, 0, getName(),
+ lineNumber);
+
+ throw new InitializationException(msgID, message);
+ }
+ }
+ catch (NumberFormatException nfe)
+ {
+ int msgID = MSGID_MAKELDIF_TAG_CANNOT_PARSE_AS_INTEGER;
+ String message = getMessage(msgID, arguments[1], getName(), lineNumber);
+
+ throw new InitializationException(msgID, message);
+ }
+ }
+ else
+ {
+ numCharacters = 0;
+ }
+ }
+
+
+
+ /**
+ * Generates the content for this tag by appending it to the provided tag.
+ *
+ * @param templateEntry The entry for which this tag is being generated.
+ * @param templateValue The template value to which the generated content
+ * should be appended.
+ *
+ * @return The result of generating content for this tag.
+ */
+ public TagResult generateValue(TemplateEntry templateEntry,
+ TemplateValue templateValue)
+ {
+ TemplateValue v = templateEntry.getValue(attributeType);
+ if (v == null)
+ {
+ // This is fine -- we just won't append anything.
+ return TagResult.SUCCESS_RESULT;
+ }
+
+ if (numCharacters > 0)
+ {
+ String valueString = v.getValue().toString();
+ if (valueString.length() > numCharacters)
+ {
+ templateValue.append(valueString.substring(0, numCharacters));
+ }
+ else
+ {
+ templateValue.append(valueString);
+ }
+ }
+ else
+ {
+ templateValue.getValue().append(v.getValue());
+ }
+
+ return TagResult.SUCCESS_RESULT;
+ }
+}
+
diff --git a/opends/src/server/org/opends/server/tools/makeldif/Branch.java b/opends/src/server/org/opends/server/tools/makeldif/Branch.java
new file mode 100644
index 0000000..9b9a699
--- /dev/null
+++ b/opends/src/server/org/opends/server/tools/makeldif/Branch.java
@@ -0,0 +1,450 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ * Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ * Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.tools.makeldif;
+
+
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.opends.server.core.DirectoryServer;
+import org.opends.server.types.Attribute;
+import org.opends.server.types.AttributeType;
+import org.opends.server.types.AttributeValue;
+import org.opends.server.types.DN;
+import org.opends.server.types.Entry;
+
+import static org.opends.server.messages.MessageHandler.*;
+import static org.opends.server.messages.ToolMessages.*;
+import static org.opends.server.util.StaticUtils.*;
+
+
+
+/**
+ * This class defines a branch that should be included in the resulting LDIF. A
+ * branch may or may not have subordinate entries.
+ */
+public class Branch
+{
+ // The DN for this branch entry.
+ private DN branchDN;
+
+ // The number of entries that should be created below this branch for each
+ // subordinate template.
+ private int[] numEntriesPerTemplate;
+
+ // The names of the subordinate templates for this branch.
+ private String[] subordinateTemplateNames;
+
+ // The set of subordinate templates for this branch.
+ private Template[] subordinateTemplates;
+
+ // The template file in which this branch appears.
+ private TemplateFile templateFile;
+
+ // The set of template lines that correspond to the RDN components.
+ private TemplateLine[] rdnLines;
+
+ // The set of extra lines that should be included in this branch entry.
+ private TemplateLine[] extraLines;
+
+
+
+ /**
+ * Creates a new branch with the provided information.
+ *
+ * @param templateFile The template file in which this branch appears.
+ * @param branchDN The DN for this branch entry.
+ */
+ public Branch(TemplateFile templateFile, DN branchDN)
+ {
+ this(templateFile, branchDN, new String[0], new int[0],
+ new TemplateLine[0]);
+ }
+
+
+
+ /**
+ * Creates a new branch with the provided information.
+ *
+ * @param templateFile The template file in which this branch
+ * appears.
+ * @param branchDN The DN for this branch entry.
+ * @param subordinateTemplateNames The names of the subordinate templates
+ * used to generate entries below this
+ * branch.
+ * @param numEntriesPerTemplate The number of entries that should be
+ * created below this branch for each
+ * subordinate template.
+ * @param extraLines The set of extra lines that should be
+ * included in this branch entry.
+ */
+ public Branch(TemplateFile templateFile, DN branchDN,
+ String[] subordinateTemplateNames, int[] numEntriesPerTemplate,
+ TemplateLine[] extraLines)
+ {
+ this.templateFile = templateFile;
+ this.branchDN = branchDN;
+ this.subordinateTemplateNames = subordinateTemplateNames;
+ this.numEntriesPerTemplate = numEntriesPerTemplate;
+ this.extraLines = extraLines;
+
+ subordinateTemplates = null;
+
+
+ // Get the RDN template lines based just on the entry DN.
+ Entry entry = createEntry(branchDN);
+
+ ArrayList<String> warnings = new ArrayList<String>();
+ ArrayList<TemplateLine> lineList = new ArrayList<TemplateLine>();
+
+ for (String ocName : entry.getObjectClasses().values())
+ {
+ try
+ {
+ String[] valueStrings = new String[] { ocName };
+ Tag[] tags = new Tag[1];
+ tags[0] = new StaticTextTag();
+ tags[0].initializeForBranch(templateFile, this, valueStrings, 0,
+ warnings);
+
+ TemplateLine l =
+ new TemplateLine(DirectoryServer.getObjectClassAttributeType(), 0,
+ tags);
+ lineList.add(l);
+ }
+ catch (Exception e)
+ {
+ // This should never happen.
+ e.printStackTrace();
+ }
+ }
+
+ for (List<Attribute> attrList : entry.getUserAttributes().values())
+ {
+ for (Attribute a : attrList)
+ {
+ for (AttributeValue v : a.getValues())
+ {
+ try
+ {
+ String[] valueStrings = new String[] { v.getStringValue() };
+ Tag[] tags = new Tag[1];
+ tags[0] = new StaticTextTag();
+ tags[0].initializeForBranch(templateFile, this, valueStrings, 0,
+ warnings);
+ lineList.add(new TemplateLine(a.getAttributeType(), 0, tags));
+ }
+ catch (Exception e)
+ {
+ // This should never happen.
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+
+ for (List<Attribute> attrList : entry.getOperationalAttributes().values())
+ {
+ for (Attribute a : attrList)
+ {
+ for (AttributeValue v : a.getValues())
+ {
+ try
+ {
+ String[] valueStrings = new String[] { v.getStringValue() };
+ Tag[] tags = new Tag[1];
+ tags[0] = new StaticTextTag();
+ tags[0].initializeForBranch(templateFile, this, valueStrings, 0,
+ warnings);
+ lineList.add(new TemplateLine(a.getAttributeType(), 0, tags));
+ }
+ catch (Exception e)
+ {
+ // This should never happen.
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+
+ rdnLines = new TemplateLine[lineList.size()];
+ lineList.toArray(rdnLines);
+ }
+
+
+
+ /**
+ * Performs any necessary processing to ensure that the branch initialization
+ * is completed. In particular, it should make sure that all referenced
+ * subordinate templates actually exist in the template file.
+ *
+ * @param templates The set of templates defined in the template file.
+ *
+ * @throws MakeLDIFException If any of the subordinate templates are not
+ * defined in the template file.
+ */
+ public void completeBranchInitialization(Map<String,Template> templates)
+ throws MakeLDIFException
+ {
+ if (subordinateTemplateNames == null)
+ {
+ subordinateTemplateNames = new String[0];
+ subordinateTemplates = new Template[0];
+ }
+ else
+ {
+ subordinateTemplates = new Template[subordinateTemplateNames.length];
+ for (int i=0; i < subordinateTemplates.length; i++)
+ {
+ subordinateTemplates[i] =
+ templates.get(toLowerCase(subordinateTemplateNames[i]));
+ if (subordinateTemplates[i] == null)
+ {
+ int msgID = MSGID_MAKELDIF_UNDEFINED_BRANCH_SUBORDINATE;
+ String message = getMessage(msgID, subordinateTemplateNames[i],
+ branchDN.toString());
+ throw new MakeLDIFException(msgID, message);
+ }
+ }
+ }
+ }
+
+
+
+ /**
+ * Retrieves the DN for this branch entry.
+ *
+ * @return The DN for this branch entry.
+ */
+ public DN getBranchDN()
+ {
+ return branchDN;
+ }
+
+
+
+ /**
+ * Retrieves the names of the subordinate templates for this branch.
+ *
+ * @return The names of the subordinate templates for this branch.
+ */
+ public String[] getSubordinateTemplateNames()
+ {
+ return subordinateTemplateNames;
+ }
+
+
+
+ /**
+ * Retrieves the set of subordinate templates used to generate entries below
+ * this branch. Note that the subordinate templates will not be available
+ * until the <CODE>completeBranchInitialization</CODE> method has been called.
+ *
+ * @return The set of subordinate templates used to generate entries below
+ * this branch.
+ */
+ public Template[] getSubordinateTemplates()
+ {
+ return subordinateTemplates;
+ }
+
+
+
+ /**
+ * Retrieves the number of entries that should be created below this branch
+ * for each subordinate template.
+ *
+ * @return The number of entries that should be created below this branch for
+ * each subordinate template.
+ */
+ public int[] getNumEntriesPerTemplate()
+ {
+ return numEntriesPerTemplate;
+ }
+
+
+
+ /**
+ * Adds a new subordinate template to this branch. Note that this should not
+ * be used after <CODE>completeBranchInitialization</CODE> has been called.
+ *
+ * @param name The name of the template to use to generate the
+ * entries.
+ * @param numEntries The number of entries to create based on the template.
+ */
+ public void addSubordinateTemplate(String name, int numEntries)
+ {
+ String[] newNames = new String[subordinateTemplateNames.length+1];
+ int[] newCounts = new int[numEntriesPerTemplate.length+1];
+
+ System.arraycopy(subordinateTemplateNames, 0, newNames, 0,
+ subordinateTemplateNames.length);
+ System.arraycopy(numEntriesPerTemplate, 0, newCounts, 0,
+ numEntriesPerTemplate.length);
+
+ newNames[subordinateTemplateNames.length] = name;
+ newCounts[numEntriesPerTemplate.length] = numEntries;
+
+ subordinateTemplateNames = newNames;
+ numEntriesPerTemplate = newCounts;
+ }
+
+
+
+ /**
+ * Retrieves the set of extra lines that should be included in this branch
+ * entry.
+ *
+ * @return The set of extra lines that should be included in this branch
+ * entry.
+ */
+ public TemplateLine[] getExtraLines()
+ {
+ return extraLines;
+ }
+
+
+
+ /**
+ * Adds the provided template line to the set of extra lines for this branch.
+ *
+ * @param line The line to add to the set of extra lines for this branch.
+ */
+ public void addExtraLine(TemplateLine line)
+ {
+ TemplateLine[] newExtraLines = new TemplateLine[extraLines.length+1];
+ System.arraycopy(extraLines, 0, newExtraLines, 0, extraLines.length);
+ newExtraLines[extraLines.length] = line;
+
+ extraLines = newExtraLines;
+ }
+
+
+
+ /**
+ * Indicates whether this branch contains a reference to the specified
+ * attribute type, either in the RDN components of the DN or in the extra
+ * lines.
+ *
+ * @param attributeType The attribute type for which to make the
+ * determination.
+ *
+ * @return <CODE>true</CODE> if the branch does contain the specified
+ * attribute type, or <CODE>false</CODE> if it does not.
+ */
+ public boolean hasAttribute(AttributeType attributeType)
+ {
+ if (branchDN.getRDN().hasAttributeType(attributeType))
+ {
+ return true;
+ }
+
+ for (TemplateLine l : extraLines)
+ {
+ if (l.getAttributeType().equals(attributeType))
+ {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+
+
+ /**
+ * Writes the entry for this branch, as well as all appropriate subordinate
+ * entries.
+ *
+ * @param entryWriter The entry writer to which the entries should be
+ * written.
+ *
+ * @return The result that indicates whether processing should continue.
+ *
+ * @throws IOException If a problem occurs while attempting to write to the
+ * LDIF writer.
+ *
+ * @throws MakeLDIFException If some other problem occurs.
+ */
+ public TagResult writeEntries(EntryWriter entryWriter)
+ throws IOException, MakeLDIFException
+ {
+ // Create a new template entry and populate it based on the RDN attributes
+ // and extra lines.
+ TemplateEntry entry = new TemplateEntry(this);
+
+ for (TemplateLine l : rdnLines)
+ {
+ TagResult r = l.generateLine(entry);
+ if (! (r.keepProcessingEntry() && r.keepProcessingParent() &&
+ r.keepProcessingTemplateFile()))
+ {
+ return r;
+ }
+ }
+
+ for (TemplateLine l : extraLines)
+ {
+ TagResult r = l.generateLine(entry);
+ if (! (r.keepProcessingEntry() && r.keepProcessingParent() &&
+ r.keepProcessingTemplateFile()))
+ {
+ return r;
+ }
+ }
+
+ if (! entryWriter.writeEntry(entry.toEntry()))
+ {
+ return TagResult.STOP_PROCESSING;
+ }
+
+
+ for (int i=0; i < subordinateTemplates.length; i++)
+ {
+ TagResult r =
+ subordinateTemplates[i].writeEntries(entryWriter, branchDN,
+ numEntriesPerTemplate[i]);
+ if (! (r.keepProcessingParent() && r.keepProcessingTemplateFile()))
+ {
+ if (r.keepProcessingTemplateFile())
+ {
+ // We don't want to propagate a "stop processing parent" all the way
+ // up the chain.
+ return TagResult.SUCCESS_RESULT;
+ }
+
+ return r;
+ }
+ }
+
+ return TagResult.SUCCESS_RESULT;
+ }
+}
+
diff --git a/opends/src/server/org/opends/server/tools/makeldif/DNTag.java b/opends/src/server/org/opends/server/tools/makeldif/DNTag.java
new file mode 100644
index 0000000..c901542
--- /dev/null
+++ b/opends/src/server/org/opends/server/tools/makeldif/DNTag.java
@@ -0,0 +1,234 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ * Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ * Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.tools.makeldif;
+
+
+
+import java.util.List;
+
+import org.opends.server.core.InitializationException;
+import org.opends.server.types.DN;
+import org.opends.server.types.RDN;
+
+import static org.opends.server.messages.MessageHandler.*;
+import static org.opends.server.messages.ToolMessages.*;
+
+
+
+/**
+ * This class defines a tag that is used to include the DN of the current entry
+ * in the attribute value.
+ */
+public class DNTag
+ extends Tag
+{
+ // The number of DN components to include.
+ private int numComponents;
+
+
+
+ /**
+ * Creates a new instance of this DN tag.
+ */
+ public DNTag()
+ {
+ numComponents = 0;
+ }
+
+
+
+ /**
+ * Retrieves the name for this tag.
+ *
+ * @return The name for this tag.
+ */
+ public String getName()
+ {
+ return "DN";
+ }
+
+
+
+ /**
+ * Indicates whether this tag is allowed for use in the extra lines for
+ * branches.
+ *
+ * @return <CODE>true</CODE> if this tag may be used in branch definitions,
+ * or <CODE>false</CODE> if not.
+ */
+ public boolean allowedInBranch()
+ {
+ return true;
+ }
+
+
+
+ /**
+ * Performs any initialization for this tag that may be needed while parsing
+ * a branch definition.
+ *
+ * @param templateFile The template file in which this tag is used.
+ * @param branch The branch in which this tag is used.
+ * @param arguments The set of arguments provided for this tag.
+ * @param lineNumber The line number on which this tag appears in the
+ * template file.
+ * @param warnings A list into which any appropriate warning messages
+ * may be placed.
+ *
+ * @throws InitializationException If a problem occurs while initializing
+ * this tag.
+ */
+ public void initializeForBranch(TemplateFile templateFile, Branch branch,
+ String[] arguments, int lineNumber,
+ List<String> warnings)
+ throws InitializationException
+ {
+ initializeInternal(templateFile, arguments, lineNumber);
+ }
+
+
+
+ /**
+ * Performs any initialization for this tag that may be needed while parsing
+ * a template definition.
+ *
+ * @param templateFile The template file in which this tag is used.
+ * @param template The template in which this tag is used.
+ * @param arguments The set of arguments provided for this tag.
+ * @param lineNumber The line number on which this tag appears in the
+ * template file.
+ * @param warnings A list into which any appropriate warning messages
+ * may be placed.
+ *
+ * @throws InitializationException If a problem occurs while initializing
+ * this tag.
+ */
+ public void initializeForTemplate(TemplateFile templateFile,
+ Template template, String[] arguments,
+ int lineNumber, List<String> warnings)
+ throws InitializationException
+ {
+ initializeInternal(templateFile, arguments, lineNumber);
+ }
+
+
+
+ /**
+ * Performs any initialization for this tag that may be needed for this tag.
+ *
+ * @param templateFile The template file in which this tag is used.
+ * @param arguments The set of arguments provided for this tag.
+ * @param lineNumber The line number on which this tag appears in the
+ * template file.
+ *
+ * @throws InitializationException If a problem occurs while initializing
+ * this tag.
+ */
+ private void initializeInternal(TemplateFile templateFile, String[] arguments,
+ int lineNumber)
+ throws InitializationException
+ {
+ if (arguments.length == 0)
+ {
+ numComponents = 0;
+ }
+ else if (arguments.length == 1)
+ {
+ try
+ {
+ numComponents = Integer.parseInt(arguments[0]);
+ }
+ catch (NumberFormatException nfe)
+ {
+ int msgID = MSGID_MAKELDIF_TAG_CANNOT_PARSE_AS_INTEGER;
+ String message = getMessage(msgID, arguments[0], getName(), lineNumber);
+ throw new InitializationException(msgID, message);
+ }
+ }
+ else
+ {
+ int msgID = MSGID_MAKELDIF_TAG_INVALID_ARGUMENT_RANGE_COUNT;
+ String message = getMessage(msgID, getName(), lineNumber, 0, 1,
+ arguments.length);
+
+ throw new InitializationException(msgID, message);
+ }
+ }
+
+
+
+ /**
+ * Generates the content for this tag by appending it to the provided tag.
+ *
+ * @param templateEntry The entry for which this tag is being generated.
+ * @param templateValue The template value to which the generated content
+ * should be appended.
+ *
+ * @return The result of generating content for this tag.
+ */
+ public TagResult generateValue(TemplateEntry templateEntry,
+ TemplateValue templateValue)
+ {
+ DN dn = templateEntry.getDN();
+ if ((dn == null) || dn.isNullDN())
+ {
+ return TagResult.SUCCESS_RESULT;
+ }
+
+ if (numComponents == 0)
+ {
+ dn.toString(templateValue.getValue());
+ }
+ else if (numComponents > 0)
+ {
+ RDN[] rdnComps = dn.getRDNComponents();
+ int count = Math.min(numComponents, rdnComps.length);
+
+ rdnComps[0].toString(templateValue.getValue());
+ for (int i=1; i < count; i++)
+ {
+ templateValue.append(",");
+ rdnComps[i].toString(templateValue.getValue());
+ }
+ }
+ else
+ {
+ RDN[] rdnComps = dn.getRDNComponents();
+ int count = Math.min(Math.abs(numComponents), rdnComps.length);
+
+ rdnComps[rdnComps.length-count].toString(templateValue.getValue());
+ for (int i=1; i < count; i++)
+ {
+ templateValue.append(",");
+ rdnComps[rdnComps.length-count+i].toString(templateValue.getValue());
+ }
+ }
+
+ return TagResult.SUCCESS_RESULT;
+ }
+}
+
diff --git a/opends/src/server/org/opends/server/tools/makeldif/EntryWriter.java b/opends/src/server/org/opends/server/tools/makeldif/EntryWriter.java
new file mode 100644
index 0000000..8c3ef08
--- /dev/null
+++ b/opends/src/server/org/opends/server/tools/makeldif/EntryWriter.java
@@ -0,0 +1,68 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ * Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ * Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.tools.makeldif;
+
+
+
+import java.io.IOException;
+
+import org.opends.server.types.Entry;
+
+
+
+/**
+ * This interface defines a method that may be used to write entries generated
+ * through the MakeLDIF utility.
+ */
+public interface EntryWriter
+{
+ /**
+ * Writes the provided entry to the appropriate target.
+ *
+ * @param entry The entry to be written.
+ *
+ * @return <CODE>true</CODE> if the entry writer will accept additional
+ * entries, or <CODE>false</CODE> if no more entries should be
+ * written.
+ *
+ * @throws IOException If a problem occurs while writing the entry to its
+ * intended destination.
+ *
+ * @throws MakeLDIFException If some other problem occurs.
+ */
+ public boolean writeEntry(Entry entry)
+ throws IOException, MakeLDIFException;
+
+
+
+ /**
+ * Notifies the entry writer that no more entries will be provided and that
+ * any associated cleanup may be performed.
+ */
+ public void closeEntryWriter();
+}
+
diff --git a/opends/src/server/org/opends/server/tools/makeldif/FileTag.java b/opends/src/server/org/opends/server/tools/makeldif/FileTag.java
new file mode 100644
index 0000000..72f4a74
--- /dev/null
+++ b/opends/src/server/org/opends/server/tools/makeldif/FileTag.java
@@ -0,0 +1,268 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ * Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ * Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.tools.makeldif;
+
+
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+import java.util.Random;
+
+import org.opends.server.core.InitializationException;
+
+import static org.opends.server.messages.MessageHandler.*;
+import static org.opends.server.messages.ToolMessages.*;
+
+
+
+/**
+ * This class defines a tag that is used provide values from a text file. The
+ * file should have one value per line. Access to the values may be either at
+ * random or in sequential order.
+ */
+public class FileTag
+ extends Tag
+{
+ // Indicates whether the values should be selected sequentially or at random.
+ private boolean sequential;
+
+ // The file containing the data.
+ private File dataFile;
+
+ // The index used for sequential access.
+ private int nextIndex;
+
+ // The random number generator for this tag.
+ private Random random;
+
+ // The array of lines read from the file.
+ private String[] fileLines;
+
+
+
+ /**
+ * Creates a new instance of this file tag.
+ */
+ public FileTag()
+ {
+ sequential = false;
+ dataFile = null;
+ nextIndex = 0;
+ random = null;
+ fileLines = null;
+ }
+
+
+
+ /**
+ * Retrieves the name for this tag.
+ *
+ * @return The name for this tag.
+ */
+ public String getName()
+ {
+ return "File";
+ }
+
+
+
+ /**
+ * Indicates whether this tag is allowed for use in the extra lines for
+ * branches.
+ *
+ * @return <CODE>true</CODE> if this tag may be used in branch definitions,
+ * or <CODE>false</CODE> if not.
+ */
+ public boolean allowedInBranch()
+ {
+ return true;
+ }
+
+
+
+ /**
+ * Performs any initialization for this tag that may be needed while parsing
+ * a branch definition.
+ *
+ * @param templateFile The template file in which this tag is used.
+ * @param branch The branch in which this tag is used.
+ * @param arguments The set of arguments provided for this tag.
+ * @param lineNumber The line number on which this tag appears in the
+ * template file.
+ * @param warnings A list into which any appropriate warning messages
+ * may be placed.
+ *
+ * @throws InitializationException If a problem occurs while initializing
+ * this tag.
+ */
+ public void initializeForBranch(TemplateFile templateFile, Branch branch,
+ String[] arguments, int lineNumber,
+ List<String> warnings)
+ throws InitializationException
+ {
+ initializeInternal(templateFile, arguments, lineNumber, warnings);
+ }
+
+
+
+ /**
+ * Performs any initialization for this tag that may be needed while parsing
+ * a template definition.
+ *
+ * @param templateFile The template file in which this tag is used.
+ * @param template The template in which this tag is used.
+ * @param arguments The set of arguments provided for this tag.
+ * @param lineNumber The line number on which this tag appears in the
+ * template file.
+ * @param warnings A list into which any appropriate warning messages
+ * may be placed.
+ *
+ * @throws InitializationException If a problem occurs while initializing
+ * this tag.
+ */
+ public void initializeForTemplate(TemplateFile templateFile,
+ Template template, String[] arguments,
+ int lineNumber, List<String> warnings)
+ throws InitializationException
+ {
+ initializeInternal(templateFile, arguments, lineNumber, warnings);
+ }
+
+
+
+ /**
+ * Performs any initialization for this tag that may be needed.
+ *
+ * @param templateFile The template file in which this tag is used.
+ * @param arguments The set of arguments provided for this tag.
+ * @param lineNumber The line number on which this tag appears in the
+ * template file.
+ * @param warnings A list into which any appropriate warning messages
+ * may be placed.
+ *
+ * @throws InitializationException If a problem occurs while initializing
+ * this tag.
+ */
+ private void initializeInternal(TemplateFile templateFile, String[] arguments,
+ int lineNumber, List<String> warnings)
+ throws InitializationException
+ {
+ random = templateFile.getRandom();
+
+
+ // There must be at least one argument, and possibly two.
+ if ((arguments.length < 1) || (arguments.length > 2))
+ {
+ int msgID = MSGID_MAKELDIF_TAG_INVALID_ARGUMENT_RANGE_COUNT;
+ String message = getMessage(msgID, getName(), lineNumber, 1, 2,
+ arguments.length);
+ throw new InitializationException(msgID, message);
+ }
+
+
+ // The first argument should be the path to the file.
+ dataFile = templateFile.getFile(arguments[0]);
+ if ((dataFile == null) || (! dataFile.exists()))
+ {
+ int msgID = MSGID_MAKELDIF_TAG_CANNOT_FIND_FILE;
+ String message = getMessage(msgID, arguments[0], getName(), lineNumber);
+ throw new InitializationException(msgID, message);
+ }
+
+
+ // If there is a second argument, then it should be either "sequential" or
+ // "random". If there isn't one, then we should assume "random".
+ if (arguments.length == 2)
+ {
+ if (arguments[1].equalsIgnoreCase("sequential"))
+ {
+ sequential = true;
+ nextIndex = 0;
+ }
+ else if (arguments[1].equalsIgnoreCase("random"))
+ {
+ sequential = false;
+ }
+ else
+ {
+ int msgID = MSGID_MAKELDIF_TAG_INVALID_FILE_ACCESS_MODE;
+ String message = getMessage(msgID, arguments[1], getName(), lineNumber);
+ throw new InitializationException(msgID, message);
+ }
+ }
+ else
+ {
+ sequential = false;
+ }
+
+
+ // See if the file has already been read into memory. If not, then read it.
+ try
+ {
+ fileLines = templateFile.getFileLines(dataFile);
+ }
+ catch (IOException ioe)
+ {
+ int msgID = MSGID_MAKELDIF_TAG_CANNOT_READ_FILE;
+ String message = getMessage(msgID, arguments[0], getName(), lineNumber,
+ String.valueOf(ioe));
+ throw new InitializationException(msgID, message, ioe);
+ }
+ }
+
+
+
+ /**
+ * Generates the content for this tag by appending it to the provided tag.
+ *
+ * @param templateEntry The entry for which this tag is being generated.
+ * @param templateValue The template value to which the generated content
+ * should be appended.
+ *
+ * @return The result of generating content for this tag.
+ */
+ public TagResult generateValue(TemplateEntry templateEntry,
+ TemplateValue templateValue)
+ {
+ if (sequential)
+ {
+ templateValue.append(fileLines[nextIndex++]);
+ if (nextIndex >= fileLines.length)
+ {
+ nextIndex = 0;
+ }
+ }
+ else
+ {
+ templateValue.append(fileLines[random.nextInt(fileLines.length)]);
+ }
+
+ return TagResult.SUCCESS_RESULT;
+ }
+}
+
diff --git a/opends/src/server/org/opends/server/tools/makeldif/FirstNameTag.java b/opends/src/server/org/opends/server/tools/makeldif/FirstNameTag.java
new file mode 100644
index 0000000..f37c4df
--- /dev/null
+++ b/opends/src/server/org/opends/server/tools/makeldif/FirstNameTag.java
@@ -0,0 +1,138 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ * Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ * Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.tools.makeldif;
+
+
+
+import java.util.List;
+
+import org.opends.server.core.InitializationException;
+
+import static org.opends.server.messages.MessageHandler.*;
+import static org.opends.server.messages.ToolMessages.*;
+
+
+
+/**
+ * This class defines a tag that is used to include a first name in the
+ * attribute value.
+ */
+public class FirstNameTag
+ extends Tag
+{
+ // The template file with which this tag is associated.
+ private TemplateFile templateFile;
+
+
+
+ /**
+ * Creates a new instance of this first name tag.
+ */
+ public FirstNameTag()
+ {
+ // No implementation required.
+ }
+
+
+
+ /**
+ * Retrieves the name for this tag.
+ *
+ * @return The name for this tag.
+ */
+ public String getName()
+ {
+ return "First";
+ }
+
+
+
+ /**
+ * Indicates whether this tag is allowed for use in the extra lines for
+ * branches.
+ *
+ * @return <CODE>true</CODE> if this tag may be used in branch definitions,
+ * or <CODE>false</CODE> if not.
+ */
+ public boolean allowedInBranch()
+ {
+ return false;
+ }
+
+
+
+ /**
+ * Performs any initialization for this tag that may be needed while parsing
+ * a template definition.
+ *
+ * @param templateFile The template file in which this tag is used.
+ * @param template The template in which this tag is used.
+ * @param arguments The set of arguments provided for this tag.
+ * @param lineNumber The line number on which this tag appears in the
+ * template file.
+ * @param warnings A list into which any appropriate warning messages
+ * may be placed.
+ *
+ * @throws InitializationException If a problem occurs while initializing
+ * this tag.
+ */
+ public void initializeForTemplate(TemplateFile templateFile,
+ Template template, String[] arguments,
+ int lineNumber, List<String> warnings)
+ throws InitializationException
+ {
+ this.templateFile = templateFile;
+
+ if (arguments.length != 0)
+ {
+ int msgID = MSGID_MAKELDIF_TAG_INVALID_ARGUMENT_COUNT;
+ String message = getMessage(msgID, getName(), lineNumber, 0,
+ arguments.length);
+
+ throw new InitializationException(msgID, message);
+ }
+ }
+
+
+
+ /**
+ * Generates the content for this tag by appending it to the provided tag.
+ *
+ * @param templateEntry The entry for which this tag is being generated.
+ * @param templateValue The template value to which the generated content
+ * should be appended.
+ *
+ * @return The result of generating content for this tag.
+ */
+ public TagResult generateValue(TemplateEntry templateEntry,
+ TemplateValue templateValue)
+ {
+ templateValue.append(templateFile.getFirstName());
+ return TagResult.SUCCESS_RESULT;
+ }
+}
+
diff --git a/opends/src/server/org/opends/server/tools/makeldif/GUIDTag.java b/opends/src/server/org/opends/server/tools/makeldif/GUIDTag.java
new file mode 100644
index 0000000..4730f21
--- /dev/null
+++ b/opends/src/server/org/opends/server/tools/makeldif/GUIDTag.java
@@ -0,0 +1,164 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ * Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ * Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.tools.makeldif;
+
+
+
+import java.util.List;
+import java.util.UUID;
+
+import org.opends.server.core.InitializationException;
+
+import static org.opends.server.messages.MessageHandler.*;
+import static org.opends.server.messages.ToolMessages.*;
+
+
+
+/**
+ * This class defines a tag that is used to include a GUID in the attribute
+ * value.
+ */
+public class GUIDTag
+ extends Tag
+{
+ /**
+ * Creates a new instance of this GUID tag.
+ */
+ public GUIDTag()
+ {
+ // No implementation required.
+ }
+
+
+
+ /**
+ * Retrieves the name for this tag.
+ *
+ * @return The name for this tag.
+ */
+ public String getName()
+ {
+ return "GUID";
+ }
+
+
+
+ /**
+ * Indicates whether this tag is allowed for use in the extra lines for
+ * branches.
+ *
+ * @return <CODE>true</CODE> if this tag may be used in branch definitions,
+ * or <CODE>false</CODE> if not.
+ */
+ public boolean allowedInBranch()
+ {
+ return true;
+ }
+
+
+
+ /**
+ * Performs any initialization for this tag that may be needed while parsing
+ * a branch definition.
+ *
+ * @param templateFile The template file in which this tag is used.
+ * @param branch The branch in which this tag is used.
+ * @param arguments The set of arguments provided for this tag.
+ * @param lineNumber The line number on which this tag appears in the
+ * template file.
+ * @param warnings A list into which any appropriate warning messages
+ * may be placed.
+ *
+ * @throws InitializationException If a problem occurs while initializing
+ * this tag.
+ */
+ public void initializeForBranch(TemplateFile templateFile, Branch branch,
+ String[] arguments, int lineNumber,
+ List<String> warnings)
+ throws InitializationException
+ {
+ if (arguments.length != 0)
+ {
+ int msgID = MSGID_MAKELDIF_TAG_INVALID_ARGUMENT_COUNT;
+ String message = getMessage(msgID, getName(), lineNumber, 0,
+ arguments.length);
+
+ throw new InitializationException(msgID, message);
+ }
+ }
+
+
+
+ /**
+ * Performs any initialization for this tag that may be needed while parsing
+ * a template definition.
+ *
+ * @param templateFile The template file in which this tag is used.
+ * @param template The template in which this tag is used.
+ * @param arguments The set of arguments provided for this tag.
+ * @param lineNumber The line number on which this tag appears in the
+ * template file.
+ * @param warnings A list into which any appropriate warning messages
+ * may be placed.
+ *
+ * @throws InitializationException If a problem occurs while initializing
+ * this tag.
+ */
+ public void initializeForTemplate(TemplateFile templateFile,
+ Template template, String[] arguments,
+ int lineNumber, List<String> warnings)
+ throws InitializationException
+ {
+ if (arguments.length != 0)
+ {
+ int msgID = MSGID_MAKELDIF_TAG_INVALID_ARGUMENT_COUNT;
+ String message = getMessage(msgID, getName(), lineNumber, 0,
+ arguments.length);
+
+ throw new InitializationException(msgID, message);
+ }
+ }
+
+
+
+ /**
+ * Generates the content for this tag by appending it to the provided tag.
+ *
+ * @param templateEntry The entry for which this tag is being generated.
+ * @param templateValue The template value to which the generated content
+ * should be appended.
+ *
+ * @return The result of generating content for this tag.
+ */
+ public TagResult generateValue(TemplateEntry templateEntry,
+ TemplateValue templateValue)
+ {
+ templateValue.append(UUID.randomUUID().toString());
+ return TagResult.SUCCESS_RESULT;
+ }
+}
+
diff --git a/opends/src/server/org/opends/server/tools/makeldif/IfAbsentTag.java b/opends/src/server/org/opends/server/tools/makeldif/IfAbsentTag.java
new file mode 100644
index 0000000..3c82d33
--- /dev/null
+++ b/opends/src/server/org/opends/server/tools/makeldif/IfAbsentTag.java
@@ -0,0 +1,229 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ * Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ * Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.tools.makeldif;
+
+
+
+import java.util.List;
+
+import org.opends.server.core.DirectoryServer;
+import org.opends.server.core.InitializationException;
+import org.opends.server.types.AttributeType;
+
+import static org.opends.server.messages.MessageHandler.*;
+import static org.opends.server.messages.ToolMessages.*;
+import static org.opends.server.util.StaticUtils.*;
+
+
+
+/**
+ * This class defines a tag that is used to base presence of one attribute on
+ * the absence of another attribute and/or attribute value.
+ */
+public class IfAbsentTag
+ extends Tag
+{
+ // The attribute type for which to make the determination.
+ private AttributeType attributeType;
+
+ // The value for which to make the determination.
+ private String assertionValue;
+
+
+
+ /**
+ * Creates a new instance of this ifabsent tag.
+ */
+ public IfAbsentTag()
+ {
+ attributeType = null;
+ assertionValue = null;
+ }
+
+
+
+ /**
+ * Retrieves the name for this tag.
+ *
+ * @return The name for this tag.
+ */
+ public String getName()
+ {
+ return "IfAbsent";
+ }
+
+
+
+ /**
+ * Indicates whether this tag is allowed for use in the extra lines for
+ * branches.
+ *
+ * @return <CODE>true</CODE> if this tag may be used in branch definitions,
+ * or <CODE>false</CODE> if not.
+ */
+ public boolean allowedInBranch()
+ {
+ return true;
+ }
+
+
+
+ /**
+ * Performs any initialization for this tag that may be needed while parsing
+ * a branch definition.
+ *
+ * @param templateFile The template file in which this tag is used.
+ * @param branch The branch in which this tag is used.
+ * @param arguments The set of arguments provided for this tag.
+ * @param lineNumber The line number on which this tag appears in the
+ * template file.
+ * @param warnings A list into which any appropriate warning messages
+ * may be placed.
+ *
+ * @throws InitializationException If a problem occurs while initializing
+ * this tag.
+ */
+ public void initializeForBranch(TemplateFile templateFile, Branch branch,
+ String[] arguments, int lineNumber,
+ List<String> warnings)
+ throws InitializationException
+ {
+ if ((arguments.length < 1) || (arguments.length > 2))
+ {
+ int msgID = MSGID_MAKELDIF_TAG_INVALID_ARGUMENT_RANGE_COUNT;
+ String message = getMessage(msgID, getName(), lineNumber, 1, 2,
+ arguments.length);
+ throw new InitializationException(msgID, message);
+ }
+
+ String lowerName = toLowerCase(arguments[0]);
+ AttributeType t = DirectoryServer.getAttributeType(lowerName, true);
+ if (! branch.hasAttribute(t))
+ {
+ int msgID = MSGID_MAKELDIF_TAG_UNDEFINED_ATTRIBUTE;
+ String message = getMessage(msgID, arguments[0], lineNumber);
+ throw new InitializationException(msgID, message);
+ }
+
+ if (arguments.length == 2)
+ {
+ assertionValue = arguments[1];
+ }
+ else
+ {
+ assertionValue = null;
+ }
+ }
+
+
+
+ /**
+ * Performs any initialization for this tag that may be needed while parsing
+ * a template definition.
+ *
+ * @param templateFile The template file in which this tag is used.
+ * @param template The template in which this tag is used.
+ * @param arguments The set of arguments provided for this tag.
+ * @param lineNumber The line number on which this tag appears in the
+ * template file.
+ * @param warnings A list into which any appropriate warning messages
+ * may be placed.
+ *
+ * @throws InitializationException If a problem occurs while initializing
+ * this tag.
+ */
+ public void initializeForTemplate(TemplateFile templateFile,
+ Template template, String[] arguments,
+ int lineNumber, List<String> warnings)
+ throws InitializationException
+ {
+ if ((arguments.length < 1) || (arguments.length > 2))
+ {
+ int msgID = MSGID_MAKELDIF_TAG_INVALID_ARGUMENT_RANGE_COUNT;
+ String message = getMessage(msgID, getName(), lineNumber, 1, 2,
+ arguments.length);
+ throw new InitializationException(msgID, message);
+ }
+
+ String lowerName = toLowerCase(arguments[0]);
+ AttributeType t = DirectoryServer.getAttributeType(lowerName, true);
+ if (! template.hasAttribute(t))
+ {
+ int msgID = MSGID_MAKELDIF_TAG_UNDEFINED_ATTRIBUTE;
+ String message = getMessage(msgID, arguments[0], lineNumber);
+ throw new InitializationException(msgID, message);
+ }
+
+ if (arguments.length == 2)
+ {
+ assertionValue = arguments[1];
+ }
+ else
+ {
+ assertionValue = null;
+ }
+ }
+
+
+
+ /**
+ * Generates the content for this tag by appending it to the provided tag.
+ *
+ * @param templateEntry The entry for which this tag is being generated.
+ * @param templateValue The template value to which the generated content
+ * should be appended.
+ *
+ * @return The result of generating content for this tag.
+ */
+ public TagResult generateValue(TemplateEntry templateEntry,
+ TemplateValue templateValue)
+ {
+ List<TemplateValue> values = templateEntry.getValues(attributeType);
+ if ((values == null) || values.isEmpty())
+ {
+ return TagResult.SUCCESS_RESULT;
+ }
+
+ if (assertionValue == null)
+ {
+ return TagResult.OMIT_FROM_ENTRY;
+ }
+ else
+ {
+ for (TemplateValue v : values)
+ {
+ if (assertionValue.equals(v.getValue().toString()))
+ {
+ return TagResult.OMIT_FROM_ENTRY;
+ }
+ }
+
+ return TagResult.SUCCESS_RESULT;
+ }
+ }
+}
+
diff --git a/opends/src/server/org/opends/server/tools/makeldif/IfPresentTag.java b/opends/src/server/org/opends/server/tools/makeldif/IfPresentTag.java
new file mode 100644
index 0000000..bb8bb55
--- /dev/null
+++ b/opends/src/server/org/opends/server/tools/makeldif/IfPresentTag.java
@@ -0,0 +1,229 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ * Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ * Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.tools.makeldif;
+
+
+
+import java.util.List;
+
+import org.opends.server.core.DirectoryServer;
+import org.opends.server.core.InitializationException;
+import org.opends.server.types.AttributeType;
+
+import static org.opends.server.messages.MessageHandler.*;
+import static org.opends.server.messages.ToolMessages.*;
+import static org.opends.server.util.StaticUtils.*;
+
+
+
+/**
+ * This class defines a tag that is used to base presence of one attribute on
+ * the presence of another attribute and/or attribute value.
+ */
+public class IfPresentTag
+ extends Tag
+{
+ // The attribute type for which to make the determination.
+ private AttributeType attributeType;
+
+ // The value for which to make the determination.
+ private String assertionValue;
+
+
+
+ /**
+ * Creates a new instance of this ifpresent tag.
+ */
+ public IfPresentTag()
+ {
+ attributeType = null;
+ assertionValue = null;
+ }
+
+
+
+ /**
+ * Retrieves the name for this tag.
+ *
+ * @return The name for this tag.
+ */
+ public String getName()
+ {
+ return "IfPresent";
+ }
+
+
+
+ /**
+ * Indicates whether this tag is allowed for use in the extra lines for
+ * branches.
+ *
+ * @return <CODE>true</CODE> if this tag may be used in branch definitions,
+ * or <CODE>false</CODE> if not.
+ */
+ public boolean allowedInBranch()
+ {
+ return true;
+ }
+
+
+
+ /**
+ * Performs any initialization for this tag that may be needed while parsing
+ * a branch definition.
+ *
+ * @param templateFile The template file in which this tag is used.
+ * @param branch The branch in which this tag is used.
+ * @param arguments The set of arguments provided for this tag.
+ * @param lineNumber The line number on which this tag appears in the
+ * template file.
+ * @param warnings A list into which any appropriate warning messages
+ * may be placed.
+ *
+ * @throws InitializationException If a problem occurs while initializing
+ * this tag.
+ */
+ public void initializeForBranch(TemplateFile templateFile, Branch branch,
+ String[] arguments, int lineNumber,
+ List<String> warnings)
+ throws InitializationException
+ {
+ if ((arguments.length < 1) || (arguments.length > 2))
+ {
+ int msgID = MSGID_MAKELDIF_TAG_INVALID_ARGUMENT_RANGE_COUNT;
+ String message = getMessage(msgID, getName(), lineNumber, 1, 2,
+ arguments.length);
+ throw new InitializationException(msgID, message);
+ }
+
+ String lowerName = toLowerCase(arguments[0]);
+ AttributeType t = DirectoryServer.getAttributeType(lowerName, true);
+ if (! branch.hasAttribute(t))
+ {
+ int msgID = MSGID_MAKELDIF_TAG_UNDEFINED_ATTRIBUTE;
+ String message = getMessage(msgID, arguments[0], lineNumber);
+ throw new InitializationException(msgID, message);
+ }
+
+ if (arguments.length == 2)
+ {
+ assertionValue = arguments[1];
+ }
+ else
+ {
+ assertionValue = null;
+ }
+ }
+
+
+
+ /**
+ * Performs any initialization for this tag that may be needed while parsing
+ * a template definition.
+ *
+ * @param templateFile The template file in which this tag is used.
+ * @param template The template in which this tag is used.
+ * @param arguments The set of arguments provided for this tag.
+ * @param lineNumber The line number on which this tag appears in the
+ * template file.
+ * @param warnings A list into which any appropriate warning messages
+ * may be placed.
+ *
+ * @throws InitializationException If a problem occurs while initializing
+ * this tag.
+ */
+ public void initializeForTemplate(TemplateFile templateFile,
+ Template template, String[] arguments,
+ int lineNumber, List<String> warnings)
+ throws InitializationException
+ {
+ if ((arguments.length < 1) || (arguments.length > 2))
+ {
+ int msgID = MSGID_MAKELDIF_TAG_INVALID_ARGUMENT_RANGE_COUNT;
+ String message = getMessage(msgID, getName(), lineNumber, 1, 2,
+ arguments.length);
+ throw new InitializationException(msgID, message);
+ }
+
+ String lowerName = toLowerCase(arguments[0]);
+ AttributeType t = DirectoryServer.getAttributeType(lowerName, true);
+ if (! template.hasAttribute(t))
+ {
+ int msgID = MSGID_MAKELDIF_TAG_UNDEFINED_ATTRIBUTE;
+ String message = getMessage(msgID, arguments[0], lineNumber);
+ throw new InitializationException(msgID, message);
+ }
+
+ if (arguments.length == 2)
+ {
+ assertionValue = arguments[1];
+ }
+ else
+ {
+ assertionValue = null;
+ }
+ }
+
+
+
+ /**
+ * Generates the content for this tag by appending it to the provided tag.
+ *
+ * @param templateEntry The entry for which this tag is being generated.
+ * @param templateValue The template value to which the generated content
+ * should be appended.
+ *
+ * @return The result of generating content for this tag.
+ */
+ public TagResult generateValue(TemplateEntry templateEntry,
+ TemplateValue templateValue)
+ {
+ List<TemplateValue> values = templateEntry.getValues(attributeType);
+ if ((values == null) || values.isEmpty())
+ {
+ return TagResult.OMIT_FROM_ENTRY;
+ }
+
+ if (assertionValue == null)
+ {
+ return TagResult.SUCCESS_RESULT;
+ }
+ else
+ {
+ for (TemplateValue v : values)
+ {
+ if (assertionValue.equals(v.getValue().toString()))
+ {
+ return TagResult.SUCCESS_RESULT;
+ }
+ }
+
+ return TagResult.OMIT_FROM_ENTRY;
+ }
+ }
+}
+
diff --git a/opends/src/server/org/opends/server/tools/makeldif/LastNameTag.java b/opends/src/server/org/opends/server/tools/makeldif/LastNameTag.java
new file mode 100644
index 0000000..f4ad87e
--- /dev/null
+++ b/opends/src/server/org/opends/server/tools/makeldif/LastNameTag.java
@@ -0,0 +1,138 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ * Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ * Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.tools.makeldif;
+
+
+
+import java.util.List;
+
+import org.opends.server.core.InitializationException;
+
+import static org.opends.server.messages.MessageHandler.*;
+import static org.opends.server.messages.ToolMessages.*;
+
+
+
+/**
+ * This class defines a tag that is used to include a last name in the
+ * attribute value.
+ */
+public class LastNameTag
+ extends Tag
+{
+ // The template file with which this tag is associated.
+ private TemplateFile templateFile;
+
+
+
+ /**
+ * Creates a new instance of this last name tag.
+ */
+ public LastNameTag()
+ {
+ // No implementation required.
+ }
+
+
+
+ /**
+ * Retrieves the name for this tag.
+ *
+ * @return The name for this tag.
+ */
+ public String getName()
+ {
+ return "Last";
+ }
+
+
+
+ /**
+ * Indicates whether this tag is allowed for use in the extra lines for
+ * branches.
+ *
+ * @return <CODE>true</CODE> if this tag may be used in branch definitions,
+ * or <CODE>false</CODE> if not.
+ */
+ public boolean allowedInBranch()
+ {
+ return false;
+ }
+
+
+
+ /**
+ * Performs any initialization for this tag that may be needed while parsing
+ * a template definition.
+ *
+ * @param templateFile The template file in which this tag is used.
+ * @param template The template in which this tag is used.
+ * @param arguments The set of arguments provided for this tag.
+ * @param lineNumber The line number on which this tag appears in the
+ * template file.
+ * @param warnings A list into which any appropriate warning messages
+ * may be placed.
+ *
+ * @throws InitializationException If a problem occurs while initializing
+ * this tag.
+ */
+ public void initializeForTemplate(TemplateFile templateFile,
+ Template template, String[] arguments,
+ int lineNumber, List<String> warnings)
+ throws InitializationException
+ {
+ this.templateFile = templateFile;
+
+ if (arguments.length != 0)
+ {
+ int msgID = MSGID_MAKELDIF_TAG_INVALID_ARGUMENT_COUNT;
+ String message = getMessage(msgID, getName(), lineNumber, 0,
+ arguments.length);
+
+ throw new InitializationException(msgID, message);
+ }
+ }
+
+
+
+ /**
+ * Generates the content for this tag by appending it to the provided tag.
+ *
+ * @param templateEntry The entry for which this tag is being generated.
+ * @param templateValue The template value to which the generated content
+ * should be appended.
+ *
+ * @return The result of generating content for this tag.
+ */
+ public TagResult generateValue(TemplateEntry templateEntry,
+ TemplateValue templateValue)
+ {
+ templateValue.append(templateFile.getLastName());
+ return TagResult.SUCCESS_RESULT;
+ }
+}
+
diff --git a/opends/src/server/org/opends/server/tools/makeldif/MakeLDIF.java b/opends/src/server/org/opends/server/tools/makeldif/MakeLDIF.java
new file mode 100644
index 0000000..e31cc08
--- /dev/null
+++ b/opends/src/server/org/opends/server/tools/makeldif/MakeLDIF.java
@@ -0,0 +1,424 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ * Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ * Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.tools.makeldif;
+
+
+
+import java.io.File;
+import java.io.IOException;
+import java.util.LinkedList;
+import java.util.Random;
+
+import org.opends.server.core.DirectoryServer;
+import org.opends.server.types.Entry;
+import org.opends.server.types.ExistingFileBehavior;
+import org.opends.server.types.LDIFExportConfig;
+import org.opends.server.util.LDIFWriter;
+import org.opends.server.util.args.ArgumentException;
+import org.opends.server.util.args.ArgumentParser;
+import org.opends.server.util.args.BooleanArgument;
+import org.opends.server.util.args.IntegerArgument;
+import org.opends.server.util.args.StringArgument;
+
+import static org.opends.server.messages.MessageHandler.*;
+import static org.opends.server.messages.ToolMessages.*;
+import static org.opends.server.util.StaticUtils.*;
+
+
+
+/**
+ * This class defines a program that can be used to generate LDIF content based
+ * on a template.
+ */
+public class MakeLDIF
+ implements EntryWriter
+{
+ /**
+ * The fully-qualified name of this class for debugging purposes.
+ */
+ private static final String CLASS_NAME =
+ "org.opends.server.tools.makeldif.MakeLDIF";
+
+
+
+ /**
+ * The position at which to wrap long lines of console output.
+ */
+ public static final int MAX_LINE_WIDTH = 79;
+
+
+
+ // The LDIF writer that will be used to write the entries.
+ private LDIFWriter ldifWriter;
+
+ // The total number of entries that have been written.
+ private long entriesWritten;
+
+
+
+ /**
+ * Invokes the <CODE>makeLDIFMain</CODE> method with the provided set of
+ * arguments.
+ *
+ * @param args The command-line arguments provided for this program.
+ */
+ public static void main(String[] args)
+ {
+ MakeLDIF makeLDIF = new MakeLDIF();
+ int returnCode = makeLDIF.makeLDIFMain(args);
+ if (returnCode != 0)
+ {
+ System.exit(returnCode);
+ }
+ }
+
+
+
+ /**
+ * Creates a new instance of this utility. It should just be used for
+ * invoking the <CODE>makeLDIFMain</CODE> method.
+ */
+ public MakeLDIF()
+ {
+ ldifWriter = null;
+ entriesWritten = 0L;
+ }
+
+
+
+ /**
+ * Processes the provided set of command-line arguments and begins generating
+ * the LDIF content.
+ *
+ * @param args The command-line arguments provided for this program.
+ *
+ * @return A result code of zero if all processing completed properly, or
+ * a nonzero result if a problem occurred.
+ */
+ public int makeLDIFMain(String[] args)
+ {
+ // Create and initialize the argument parser for this program.
+ ArgumentParser argParser = new ArgumentParser(CLASS_NAME, false);
+ BooleanArgument showUsage;
+ IntegerArgument randomSeed;
+ StringArgument configClass;
+ StringArgument configFile;
+ StringArgument templatePath;
+ StringArgument ldifFile;
+ StringArgument resourcePath;
+
+ try
+ {
+ configFile = new StringArgument("configfile", 'c', "configFile", true,
+ false, true, "{configFile}", null, null,
+ MSGID_MAKELDIF_DESCRIPTION_CONFIG_FILE);
+ argParser.addArgument(configFile);
+
+
+ configClass = new StringArgument("configclass", 'C', "configClass", false,
+ false, true, "{configClass}", null, null,
+ MSGID_MAKELDIF_DESCRIPTION_CONFIG_CLASS);
+ argParser.addArgument(configClass);
+
+
+ resourcePath =
+ new StringArgument("resourcepath", 'r', "resourcePath", true, false,
+ true, "{path}", null, null,
+ MSGID_MAKELDIF_DESCRIPTION_RESOURCE_PATH);
+ argParser.addArgument(resourcePath);
+
+
+ templatePath = new StringArgument("templatefile", 't', "templateFile",
+ true, false, true, "{file}", null, null,
+ MSGID_MAKELDIF_DESCRIPTION_TEMPLATE);
+ argParser.addArgument(templatePath);
+
+
+ ldifFile = new StringArgument("ldiffile", 'o', "ldifFile", true, false,
+ true, "{file}", null, null,
+ MSGID_MAKELDIF_DESCRIPTION_LDIF);
+ argParser.addArgument(ldifFile);
+
+
+ randomSeed = new IntegerArgument("randomseed", 's', "randomSeed", false,
+ false, true, "{seed}", 0, null,
+ MSGID_MAKELDIF_DESCRIPTION_SEED);
+ argParser.addArgument(randomSeed);
+
+
+ showUsage = new BooleanArgument("help", 'H', "help",
+ MSGID_MAKELDIF_DESCRIPTION_HELP);
+ argParser.addArgument(showUsage);
+ argParser.setUsageArgument(showUsage);
+ }
+ catch (ArgumentException ae)
+ {
+ int msgID = MSGID_MAKELDIF_CANNOT_INITIALIZE_ARGS;
+ String message = getMessage(msgID, ae.getMessage());
+ System.err.println(wrapText(message, MAX_LINE_WIDTH));
+ return 1;
+ }
+
+
+ // Parse the command-line arguments provided to the program.
+ try
+ {
+ argParser.parseArguments(args);
+ }
+ catch (ArgumentException ae)
+ {
+ int msgID = MSGID_MAKELDIF_ERROR_PARSING_ARGS;
+ String message = getMessage(msgID, ae.getMessage());
+ System.err.println(wrapText(message, MAX_LINE_WIDTH));
+ System.err.println(argParser.getUsage());
+ return 1;
+ }
+
+
+ // If we should just display usage information, then print it and exit.
+ if (showUsage.isPresent())
+ {
+ return 0;
+ }
+
+
+ // Initialize the Directory Server configuration handler using the
+ // information that was provided.
+ DirectoryServer directoryServer = DirectoryServer.getInstance();
+ directoryServer.bootstrapClient();
+
+ try
+ {
+ directoryServer.initializeJMX();
+ }
+ catch (Exception e)
+ {
+ int msgID = MSGID_MAKELDIF_CANNOT_INITIALIZE_JMX;
+ String message = getMessage(msgID,
+ String.valueOf(configFile.getValue()),
+ e.getMessage());
+ System.err.println(wrapText(message, MAX_LINE_WIDTH));
+ return 1;
+ }
+
+ try
+ {
+ directoryServer.initializeConfiguration(configClass.getValue(),
+ configFile.getValue());
+ }
+ catch (Exception e)
+ {
+ int msgID = MSGID_MAKELDIF_CANNOT_INITIALIZE_CONFIG;
+ String message = getMessage(msgID,
+ String.valueOf(configFile.getValue()),
+ e.getMessage());
+ System.err.println(wrapText(message, MAX_LINE_WIDTH));
+ return 1;
+ }
+
+ try
+ {
+ directoryServer.initializeSchema();
+ }
+ catch (Exception e)
+ {
+ int msgID = MSGID_MAKELDIF_CANNOT_INITIALIZE_SCHEMA;
+ String message = getMessage(msgID,
+ String.valueOf(configFile.getValue()),
+ e.getMessage());
+ System.err.println(wrapText(message, MAX_LINE_WIDTH));
+ return 1;
+ }
+
+
+ // Create the random number generator that will be used for the generation
+ // process.
+ Random random;
+ if (randomSeed.isPresent())
+ {
+ try
+ {
+ random = new Random(randomSeed.getIntValue());
+ }
+ catch (Exception e)
+ {
+ random = new Random();
+ }
+ }
+ else
+ {
+ random = new Random();
+ }
+
+
+ // If a resource path was provided, then make sure it's acceptable.
+ File resourceDir = new File(resourcePath.getValue());
+ if (! resourceDir.exists())
+ {
+ int msgID = MSGID_MAKELDIF_NO_SUCH_RESOURCE_DIRECTORY;
+ String message = getMessage(msgID, resourcePath.getValue());
+ System.err.println(wrapText(message, MAX_LINE_WIDTH));
+ return 1;
+ }
+
+
+ // Load and parse the template file.
+ LinkedList<String> warnings = new LinkedList<String>();
+ TemplateFile templateFile = new TemplateFile(resourcePath.getValue(),
+ random);
+ try
+ {
+ templateFile.parse(templatePath.getValue(), warnings);
+ }
+ catch (IOException ioe)
+ {
+ int msgID = MSGID_MAKELDIF_IOEXCEPTION_DURING_PARSE;
+ String message = getMessage(msgID, ioe.getMessage());
+ System.err.println(wrapText(message, MAX_LINE_WIDTH));
+ return 1;
+ }
+ catch (Exception e)
+ {
+ int msgID = MSGID_MAKELDIF_EXCEPTION_DURING_PARSE;
+ String message = getMessage(msgID, e.getMessage());
+ System.err.println(wrapText(message, MAX_LINE_WIDTH));
+ return 1;
+ }
+
+
+ // If there were any warnings, then print them.
+ if (! warnings.isEmpty())
+ {
+ for (String s : warnings)
+ {
+ System.err.println(wrapText(s, MAX_LINE_WIDTH));
+ }
+ }
+
+
+ // Create the LDIF writer that will be used to actually write the LDIF.
+ LDIFExportConfig exportConfig =
+ new LDIFExportConfig(ldifFile.getValue(),
+ ExistingFileBehavior.OVERWRITE);
+ try
+ {
+ ldifWriter = new LDIFWriter(exportConfig);
+ }
+ catch (IOException ioe)
+ {
+ int msgID = MSGID_MAKELDIF_UNABLE_TO_CREATE_LDIF;
+ String message = getMessage(msgID, ldifFile.getValue(),
+ String.valueOf(ioe));
+ System.err.println(wrapText(message, MAX_LINE_WIDTH));
+ return 1;
+ }
+
+
+ // Generate the LDIF content.
+ try
+ {
+ templateFile.generateLDIF(this);
+ }
+ catch (Exception e)
+ {
+ int msgID = MSGID_MAKELDIF_ERROR_WRITING_LDIF;
+ String message = getMessage(msgID, ldifFile.getValue(),
+ String.valueOf(e));
+ System.err.println(wrapText(message, MAX_LINE_WIDTH));
+ return 1;
+ }
+ finally
+ {
+ try
+ {
+ ldifWriter.close();
+ } catch (Exception e) {}
+ }
+
+
+ // If we've gotten here, then everything was successful.
+ return 0;
+ }
+
+
+
+ /**
+ * Writes the provided entry to the appropriate target.
+ *
+ * @param entry The entry to be written.
+ *
+ * @return <CODE>true</CODE> if the entry writer will accept more entries, or
+ * <CODE>false</CODE> if not.
+ *
+ * @throws IOException If a problem occurs while writing the entry to its
+ * intended destination.
+ *
+ * @throws MakeLDIFException If some other problem occurs.
+ */
+ public boolean writeEntry(Entry entry)
+ throws IOException, MakeLDIFException
+ {
+ try
+ {
+ ldifWriter.writeEntry(entry);
+
+ if ((++entriesWritten % 1000) == 0)
+ {
+ int msgID = MSGID_MAKELDIF_PROCESSED_N_ENTRIES;
+ String message = getMessage(msgID, entriesWritten);
+ System.out.println(wrapText(message, MAX_LINE_WIDTH));
+ }
+
+ return true;
+ }
+ catch (IOException ioe)
+ {
+ throw ioe;
+ }
+ catch (Exception e)
+ {
+ int msgID = MSGID_MAKELDIF_CANNOT_WRITE_ENTRY;
+ String message = getMessage(msgID, String.valueOf(entry.getDN()),
+ String.valueOf(e));
+ throw new MakeLDIFException(msgID, message, e);
+ }
+ }
+
+
+
+ /**
+ * Notifies the entry writer that no more entries will be provided and that
+ * any associated cleanup may be performed.
+ */
+ public void closeEntryWriter()
+ {
+ int msgID = MSGID_MAKELDIF_PROCESSING_COMPLETE;
+ String message = getMessage(msgID, entriesWritten);
+ System.out.println(wrapText(message, MAX_LINE_WIDTH));
+ }
+}
+
diff --git a/opends/src/server/org/opends/server/tools/makeldif/MakeLDIFException.java b/opends/src/server/org/opends/server/tools/makeldif/MakeLDIFException.java
new file mode 100644
index 0000000..252be8b
--- /dev/null
+++ b/opends/src/server/org/opends/server/tools/makeldif/MakeLDIFException.java
@@ -0,0 +1,95 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ * Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ * Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.tools.makeldif;
+
+
+
+/**
+ * This class defines an exception that can be thrown if a problem occurs during
+ * MakeLDIF processing.
+ */
+public class MakeLDIFException
+ extends Exception
+{
+ /**
+ * The serial version identifier required to satisfy the compiler because this
+ * class extends <CODE>java.lang.Exception</CODE>, which implements the
+ * <CODE>java.io.Serializable</CODE> interface. This value was generated
+ * using the <CODE>serialver</CODE> command-line utility included with the
+ * Java SDK.
+ */
+ private static final long serialVersionUID = -918795152848233269L;
+
+
+
+ // The unique identifier for the message.
+ private int msgID;
+
+
+
+ /**
+ * Creates a new MakeLDIF exception with the provided information.
+ *
+ * @param msgID The unique identifier for the message.
+ * @param message The message for this exception.
+ */
+ public MakeLDIFException(int msgID, String message)
+ {
+ super(message);
+
+ this.msgID = msgID;
+ }
+
+
+
+ /**
+ * Creates a new MakeLDIF exception with the provided information.
+ *
+ * @param msgID The unique identifier for the message.
+ * @param message The message for this exception.
+ * @param cause The underlying cause for this exception.
+ */
+ public MakeLDIFException(int msgID, String message, Throwable cause)
+ {
+ super(message, cause);
+
+ this.msgID = msgID;
+ }
+
+
+
+ /**
+ * Retrieves the unique identifier for the message.
+ *
+ * @return The unique identifier for the message.
+ */
+ public int getMessageID()
+ {
+ return msgID;
+ }
+}
+
diff --git a/opends/src/server/org/opends/server/tools/makeldif/MakeLDIFInputStream.java b/opends/src/server/org/opends/server/tools/makeldif/MakeLDIFInputStream.java
new file mode 100644
index 0000000..e69307a
--- /dev/null
+++ b/opends/src/server/org/opends/server/tools/makeldif/MakeLDIFInputStream.java
@@ -0,0 +1,293 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ * Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ * Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.tools.makeldif;
+
+
+
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.TimeUnit;
+
+import org.opends.server.types.Entry;
+import org.opends.server.types.LDIFExportConfig;
+import org.opends.server.util.LDIFException;
+import org.opends.server.util.LDIFWriter;
+
+
+
+/**
+ * This class creates an input stream that can be used to read entries generated
+ * by MakeLDIF as if they were being read from another source like a file. It
+ * has a fixed-size queue that dictates how many entries may be held in memory
+ * at any given time.
+ */
+public class MakeLDIFInputStream
+ extends InputStream
+ implements EntryWriter
+{
+ // Indicates whether all of the entries have been generated.
+ private boolean allGenerated;
+
+ // Indicates whether this input stream has been closed.
+ private boolean closed;
+
+ // The byte array output stream that will be used to convert entries to byte
+ // arrays with their LDIF representations.
+ private ByteArrayOutputStream entryOutputStream;
+
+ // The byte array that will hold the LDIF representation of the next entry to
+ // be read.
+ private ByteBuffer entryBytes;
+
+ // The IOException that should be thrown the next time a read is requested.
+ private IOException ioException;
+
+ // The LDIF writer that will be used to write the entries to LDIF.
+ private LDIFWriter ldifWriter;
+
+ // The queue used to hold generated entries until they can be read.
+ private LinkedBlockingQueue<Entry> entryQueue;
+
+ // The background thread being used to actually generate the entries.
+ private MakeLDIFInputStreamThread generatorThread;
+
+ // The template file to use to generate the entries.
+ private TemplateFile templateFile;
+
+
+
+ /**
+ * Creates a new MakeLDIF input stream that will generate entries based on the
+ * provided template file.
+ *
+ * @param templateFile The template file to use to generate the entries.
+ */
+ public MakeLDIFInputStream(TemplateFile templateFile)
+ {
+ this.templateFile = templateFile;
+
+ allGenerated = false;
+ closed = false;
+ entryQueue = new LinkedBlockingQueue<Entry>(10);
+ ioException = null;
+ entryBytes = null;
+
+ entryOutputStream = new ByteArrayOutputStream(8192);
+ LDIFExportConfig exportConfig = new LDIFExportConfig(entryOutputStream);
+
+ try
+ {
+ ldifWriter = new LDIFWriter(exportConfig);
+ }
+ catch (IOException ioe)
+ {
+ // This should never happen.
+ ioException = ioe;
+ }
+
+ generatorThread = new MakeLDIFInputStreamThread(this, templateFile);
+ generatorThread.start();
+ }
+
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public void close()
+ {
+ closed = true;
+ ioException = null;
+ }
+
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public int read()
+ throws IOException
+ {
+ if (closed)
+ {
+ return -1;
+ }
+ else if (ioException != null)
+ {
+ throw ioException;
+ }
+
+ if ((entryBytes == null) || (! entryBytes.hasRemaining()))
+ {
+ if (! getNextEntry())
+ {
+ closed = true;
+ return -1;
+ }
+ }
+
+ return (0xFF & entryBytes.get());
+ }
+
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public int read(byte[] b, int off, int len)
+ throws IOException
+ {
+ if (closed)
+ {
+ return -1;
+ }
+ else if (ioException != null)
+ {
+ throw ioException;
+ }
+
+ if ((entryBytes == null) || (! entryBytes.hasRemaining()))
+ {
+ if (! getNextEntry())
+ {
+ closed = true;
+ return -1;
+ }
+ }
+
+ int bytesRead = Math.min(len, entryBytes.remaining());
+ entryBytes.get(b, off, bytesRead);
+ return bytesRead;
+ }
+
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean writeEntry(Entry entry)
+ throws IOException, MakeLDIFException
+ {
+ while (! closed)
+ {
+ try
+ {
+ if (entryQueue.offer(entry, 500, TimeUnit.MILLISECONDS))
+ {
+ return true;
+ }
+ } catch (InterruptedException ie) {}
+ }
+
+ return false;
+ }
+
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public void closeEntryWriter()
+ {
+ allGenerated = true;
+ }
+
+
+
+ /**
+ * Sets the I/O exception that should be thrown on any subsequent calls to
+ * <CODE>available</CODE> or <CODE>read</CODE>.
+ *
+ * @param ioException The I/O exception that should be thrown.
+ */
+ void setIOException(IOException ioException)
+ {
+ this.ioException = ioException;
+ }
+
+
+
+ /**
+ * Retrieves the next entry and puts it in the entry byte buffer.
+ *
+ * @return <CODE>true</CODE> if the next entry is available, or
+ * <CODE>false</CODE> if there are no more entries or if the input
+ * stream has been closed.
+ */
+ private boolean getNextEntry()
+ {
+ Entry entry = entryQueue.poll();
+ while (entry == null)
+ {
+ if (closed)
+ {
+ return false;
+ }
+ else if (allGenerated)
+ {
+ entry = entryQueue.poll();
+ if (entry == null)
+ {
+ return false;
+ }
+ }
+ else
+ {
+ try
+ {
+ entry = entryQueue.poll(500, TimeUnit.MILLISECONDS);
+ } catch (InterruptedException ie) {}
+ }
+ }
+
+ try
+ {
+ entryOutputStream.reset();
+ ldifWriter.writeEntry(entry);
+ ldifWriter.flush();
+ entryBytes = ByteBuffer.wrap(entryOutputStream.toByteArray());
+ }
+ catch (LDIFException le)
+ {
+ // This should never happen.
+ ioException = new IOException(le.getMessage());
+ return false;
+ }
+ catch (IOException ioe)
+ {
+ // Neither should this.
+ ioException = ioe;
+ return false;
+ }
+
+ return true;
+ }
+}
+
diff --git a/opends/src/server/org/opends/server/tools/makeldif/MakeLDIFInputStreamThread.java b/opends/src/server/org/opends/server/tools/makeldif/MakeLDIFInputStreamThread.java
new file mode 100644
index 0000000..b86e5c2
--- /dev/null
+++ b/opends/src/server/org/opends/server/tools/makeldif/MakeLDIFInputStreamThread.java
@@ -0,0 +1,92 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ * Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ * Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.tools.makeldif;
+
+
+
+import java.io.IOException;
+
+import org.opends.server.api.DirectoryThread;
+
+
+
+/**
+ * This class defines a thread that will be used in conjunction with the
+ * MakeLDIF input stream to actually generate the data.
+ */
+class MakeLDIFInputStreamThread
+ extends DirectoryThread
+{
+ // The MakeLDIF input stream that this thread is feeding.
+ private MakeLDIFInputStream inputStream;
+
+ // The template file to use to generate the entries.
+ private TemplateFile templateFile;
+
+
+
+ /**
+ * Creates a new instance of this MakeLDIF input stream thread that will feed
+ * the provided input strema.
+ *
+ * @param inputStream The MakeLDIF input stream that this thread will feed.
+ * @param templateFile The template file to use to generate the entries.
+ */
+ public MakeLDIFInputStreamThread(MakeLDIFInputStream inputStream,
+ TemplateFile templateFile)
+ {
+ super("MakeLDIF Input Stream Thread");
+
+ this.inputStream = inputStream;
+ this.templateFile = templateFile;
+ }
+
+
+
+ /**
+ * Operates in a loop, generating entries and feeding them to the input stream
+ * until either all entries have been generated or the input stream is closed.
+ */
+ public void run()
+ {
+ try
+ {
+ templateFile.generateLDIF(inputStream);
+ }
+ catch (MakeLDIFException mle)
+ {
+ inputStream.setIOException(new IOException(mle.getMessage()));
+ inputStream.closeEntryWriter();
+ }
+ catch (IOException ioe)
+ {
+ inputStream.setIOException(ioe);
+ inputStream.closeEntryWriter();
+ }
+ }
+}
+
diff --git a/opends/src/server/org/opends/server/tools/makeldif/ParentDNTag.java b/opends/src/server/org/opends/server/tools/makeldif/ParentDNTag.java
new file mode 100644
index 0000000..6db0cd2
--- /dev/null
+++ b/opends/src/server/org/opends/server/tools/makeldif/ParentDNTag.java
@@ -0,0 +1,138 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ * Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ * Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.tools.makeldif;
+
+
+
+import java.util.List;
+
+import org.opends.server.core.InitializationException;
+import org.opends.server.types.DN;
+
+import static org.opends.server.messages.MessageHandler.*;
+import static org.opends.server.messages.ToolMessages.*;
+
+
+
+/**
+ * This class defines a tag that is used to include the DN of the parent entry
+ * in the attribute value.
+ */
+public class ParentDNTag
+ extends Tag
+{
+ /**
+ * Creates a new instance of this parent DN tag.
+ */
+ public ParentDNTag()
+ {
+ // No implementation required.
+ }
+
+
+
+ /**
+ * Retrieves the name for this tag.
+ *
+ * @return The name for this tag.
+ */
+ public String getName()
+ {
+ return "ParentDN";
+ }
+
+
+
+ /**
+ * Indicates whether this tag is allowed for use in the extra lines for
+ * branches.
+ *
+ * @return <CODE>true</CODE> if this tag may be used in branch definitions,
+ * or <CODE>false</CODE> if not.
+ */
+ public boolean allowedInBranch()
+ {
+ return false;
+ }
+
+
+
+ /**
+ * Performs any initialization for this tag that may be needed while parsing
+ * a template definition.
+ *
+ * @param templateFile The template file in which this tag is used.
+ * @param template The template in which this tag is used.
+ * @param arguments The set of arguments provided for this tag.
+ * @param lineNumber The line number on which this tag appears in the
+ * template file.
+ * @param warnings A list into which any appropriate warning messages
+ * may be placed.
+ *
+ * @throws InitializationException If a problem occurs while initializing
+ * this tag.
+ */
+ public void initializeForTemplate(TemplateFile templateFile,
+ Template template, String[] arguments,
+ int lineNumber, List<String> warnings)
+ throws InitializationException
+ {
+ if (arguments.length != 0)
+ {
+ int msgID = MSGID_MAKELDIF_TAG_INVALID_ARGUMENT_COUNT;
+ String message = getMessage(msgID, getName(), lineNumber, 0,
+ arguments.length);
+
+ throw new InitializationException(msgID, message);
+ }
+ }
+
+
+
+ /**
+ * Generates the content for this tag by appending it to the provided tag.
+ *
+ * @param templateEntry The entry for which this tag is being generated.
+ * @param templateValue The template value to which the generated content
+ * should be appended.
+ *
+ * @return The result of generating content for this tag.
+ */
+ public TagResult generateValue(TemplateEntry templateEntry,
+ TemplateValue templateValue)
+ {
+ DN parentDN = templateEntry.getParentDN();
+ if ((parentDN == null) || parentDN.isNullDN())
+ {
+ return TagResult.SUCCESS_RESULT;
+ }
+
+ parentDN.toString(templateValue.getValue());
+ return TagResult.SUCCESS_RESULT;
+ }
+}
+
diff --git a/opends/src/server/org/opends/server/tools/makeldif/PresenceTag.java b/opends/src/server/org/opends/server/tools/makeldif/PresenceTag.java
new file mode 100644
index 0000000..e124d39
--- /dev/null
+++ b/opends/src/server/org/opends/server/tools/makeldif/PresenceTag.java
@@ -0,0 +1,218 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ * Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ * Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.tools.makeldif;
+
+
+
+import java.util.List;
+import java.util.Random;
+
+import org.opends.server.core.InitializationException;
+
+import static org.opends.server.messages.MessageHandler.*;
+import static org.opends.server.messages.ToolMessages.*;
+
+
+
+/**
+ * This class defines a tag that is used to indicate that a value should only be
+ * included in a percentage of the entries.
+ */
+public class PresenceTag
+ extends Tag
+{
+ // The percentage of the entries in which this attribute value should appear.
+ private int percentage;
+
+ // The random number generator for this tag.
+ private Random random;
+
+
+
+ /**
+ * Creates a new instance of this presence tag.
+ */
+ public PresenceTag()
+ {
+ percentage = 100;
+ }
+
+
+
+ /**
+ * Retrieves the name for this tag.
+ *
+ * @return The name for this tag.
+ */
+ public String getName()
+ {
+ return "Presence";
+ }
+
+
+
+ /**
+ * Indicates whether this tag is allowed for use in the extra lines for
+ * branches.
+ *
+ * @return <CODE>true</CODE> if this tag may be used in branch definitions,
+ * or <CODE>false</CODE> if not.
+ */
+ public boolean allowedInBranch()
+ {
+ return true;
+ }
+
+
+
+ /**
+ * Performs any initialization for this tag that may be needed while parsing
+ * a branch definition.
+ *
+ * @param templateFile The template file in which this tag is used.
+ * @param branch The branch in which this tag is used.
+ * @param arguments The set of arguments provided for this tag.
+ * @param lineNumber The line number on which this tag appears in the
+ * template file.
+ * @param warnings A list into which any appropriate warning messages
+ * may be placed.
+ *
+ * @throws InitializationException If a problem occurs while initializing
+ * this tag.
+ */
+ public void initializeForBranch(TemplateFile templateFile, Branch branch,
+ String[] arguments, int lineNumber,
+ List<String> warnings)
+ throws InitializationException
+ {
+ initializeInternal(templateFile, arguments, lineNumber);
+ }
+
+
+
+ /**
+ * Performs any initialization for this tag that may be needed while parsing
+ * a template definition.
+ *
+ * @param templateFile The template file in which this tag is used.
+ * @param template The template in which this tag is used.
+ * @param arguments The set of arguments provided for this tag.
+ * @param lineNumber The line number on which this tag appears in the
+ * template file.
+ * @param warnings A list into which any appropriate warning messages
+ * may be placed.
+ *
+ * @throws InitializationException If a problem occurs while initializing
+ * this tag.
+ */
+ public void initializeForTemplate(TemplateFile templateFile,
+ Template template, String[] arguments,
+ int lineNumber, List<String> warnings)
+ throws InitializationException
+ {
+ initializeInternal(templateFile, arguments, lineNumber);
+ }
+
+
+
+ /**
+ * Performs any initialization for this tag that may be needed for this tag.
+ *
+ * @param templateFile The template file in which this tag is used.
+ * @param arguments The set of arguments provided for this tag.
+ * @param lineNumber The line number on which this tag appears in the
+ * template file.
+ *
+ * @throws InitializationException If a problem occurs while initializing
+ * this tag.
+ */
+ private void initializeInternal(TemplateFile templateFile, String[] arguments,
+ int lineNumber)
+ throws InitializationException
+ {
+ random = templateFile.getRandom();
+
+ if (arguments.length != 1)
+ {
+ int msgID = MSGID_MAKELDIF_TAG_INVALID_ARGUMENT_COUNT;
+ String message = getMessage(msgID, getName(), lineNumber, 1,
+ arguments.length);
+
+ throw new InitializationException(msgID, message);
+ }
+
+ try
+ {
+ percentage = Integer.parseInt(arguments[0]);
+
+ if (percentage < 0)
+ {
+ int msgID = MSGID_MAKELDIF_TAG_INTEGER_BELOW_LOWER_BOUND;
+ String message = getMessage(percentage, 0, getName(), lineNumber);
+ throw new InitializationException(msgID, message);
+ }
+ else if (percentage > 100)
+ {
+ int msgID = MSGID_MAKELDIF_TAG_INTEGER_ABOVE_UPPER_BOUND;
+ String message = getMessage(percentage, 100, getName(), lineNumber);
+ throw new InitializationException(msgID, message);
+ }
+ }
+ catch (NumberFormatException nfe)
+ {
+ int msgID = MSGID_MAKELDIF_TAG_CANNOT_PARSE_AS_INTEGER;
+ String message = getMessage(msgID, arguments[0], getName(), lineNumber);
+ throw new InitializationException(msgID, message);
+ }
+ }
+
+
+
+ /**
+ * Generates the content for this tag by appending it to the provided tag.
+ *
+ * @param templateEntry The entry for which this tag is being generated.
+ * @param templateValue The template value to which the generated content
+ * should be appended.
+ *
+ * @return The result of generating content for this tag.
+ */
+ public TagResult generateValue(TemplateEntry templateEntry,
+ TemplateValue templateValue)
+ {
+ int intValue = random.nextInt(100);
+ if (intValue < percentage)
+ {
+ return TagResult.SUCCESS_RESULT;
+ }
+ else
+ {
+ return TagResult.OMIT_FROM_ENTRY;
+ }
+ }
+}
+
diff --git a/opends/src/server/org/opends/server/tools/makeldif/RDNTag.java b/opends/src/server/org/opends/server/tools/makeldif/RDNTag.java
new file mode 100644
index 0000000..03fe525
--- /dev/null
+++ b/opends/src/server/org/opends/server/tools/makeldif/RDNTag.java
@@ -0,0 +1,172 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ * Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ * Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.tools.makeldif;
+
+
+
+import java.util.List;
+
+import org.opends.server.core.InitializationException;
+import org.opends.server.types.DN;
+
+import static org.opends.server.messages.MessageHandler.*;
+import static org.opends.server.messages.ToolMessages.*;
+
+
+
+/**
+ * This class defines a tag that is used to include the RDN of the current entry
+ * in the attribute value.
+ */
+public class RDNTag
+ extends Tag
+{
+ /**
+ * Creates a new instance of this RDN tag.
+ */
+ public RDNTag()
+ {
+ // No implementation required.
+ }
+
+
+
+ /**
+ * Retrieves the name for this tag.
+ *
+ * @return The name for this tag.
+ */
+ public String getName()
+ {
+ return "RDN";
+ }
+
+
+
+ /**
+ * Indicates whether this tag is allowed for use in the extra lines for
+ * branches.
+ *
+ * @return <CODE>true</CODE> if this tag may be used in branch definitions,
+ * or <CODE>false</CODE> if not.
+ */
+ public boolean allowedInBranch()
+ {
+ return true;
+ }
+
+
+
+ /**
+ * Performs any initialization for this tag that may be needed while parsing
+ * a branch definition.
+ *
+ * @param templateFile The template file in which this tag is used.
+ * @param branch The branch in which this tag is used.
+ * @param arguments The set of arguments provided for this tag.
+ * @param lineNumber The line number on which this tag appears in the
+ * template file.
+ * @param warnings A list into which any appropriate warning messages
+ * may be placed.
+ *
+ * @throws InitializationException If a problem occurs while initializing
+ * this tag.
+ */
+ public void initializeForBranch(TemplateFile templateFile, Branch branch,
+ String[] arguments, int lineNumber,
+ List<String> warnings)
+ throws InitializationException
+ {
+ if (arguments.length != 0)
+ {
+ int msgID = MSGID_MAKELDIF_TAG_INVALID_ARGUMENT_COUNT;
+ String message = getMessage(msgID, getName(), lineNumber, 0,
+ arguments.length);
+
+ throw new InitializationException(msgID, message);
+ }
+ }
+
+
+
+ /**
+ * Performs any initialization for this tag that may be needed while parsing
+ * a template definition.
+ *
+ * @param templateFile The template file in which this tag is used.
+ * @param template The template in which this tag is used.
+ * @param arguments The set of arguments provided for this tag.
+ * @param lineNumber The line number on which this tag appears in the
+ * template file.
+ * @param warnings A list into which any appropriate warning messages
+ * may be placed.
+ *
+ * @throws InitializationException If a problem occurs while initializing
+ * this tag.
+ */
+ public void initializeForTemplate(TemplateFile templateFile,
+ Template template, String[] arguments,
+ int lineNumber, List<String> warnings)
+ throws InitializationException
+ {
+ if (arguments.length != 0)
+ {
+ int msgID = MSGID_MAKELDIF_TAG_INVALID_ARGUMENT_COUNT;
+ String message = getMessage(msgID, getName(), lineNumber, 0,
+ arguments.length);
+
+ throw new InitializationException(msgID, message);
+ }
+ }
+
+
+
+ /**
+ * Generates the content for this tag by appending it to the provided tag.
+ *
+ * @param templateEntry The entry for which this tag is being generated.
+ * @param templateValue The template value to which the generated content
+ * should be appended.
+ *
+ * @return The result of generating content for this tag.
+ */
+ public TagResult generateValue(TemplateEntry templateEntry,
+ TemplateValue templateValue)
+ {
+ DN dn = templateEntry.getDN();
+ if ((dn == null) || dn.isNullDN())
+ {
+ return TagResult.SUCCESS_RESULT;
+ }
+ else
+ {
+ dn.getRDN().toString(templateValue.getValue());
+ return TagResult.SUCCESS_RESULT;
+ }
+ }
+}
+
diff --git a/opends/src/server/org/opends/server/tools/makeldif/RandomTag.java b/opends/src/server/org/opends/server/tools/makeldif/RandomTag.java
new file mode 100644
index 0000000..cb57a1a
--- /dev/null
+++ b/opends/src/server/org/opends/server/tools/makeldif/RandomTag.java
@@ -0,0 +1,696 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ * Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ * Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.tools.makeldif;
+
+
+
+import java.text.DecimalFormat;
+import java.util.List;
+import java.util.Random;
+
+import org.opends.server.core.InitializationException;
+
+import static org.opends.server.messages.MessageHandler.*;
+import static org.opends.server.messages.ToolMessages.*;
+import static org.opends.server.util.StaticUtils.*;
+
+
+
+/**
+ * This class defines a tag that may be used to generate random values. It has
+ * a number of subtypes based on the type of information that should be
+ * generated, including:
+ * <UL>
+ * <LI>alpha:length</LI>
+ * <LI>alpha:minlength:maxlength</LI>
+ * <LI>numeric:length</LI>
+ * <LI>numeric:minvalue:maxvalue</LI>
+ * <LI>numeric:minvalue:maxvalue:format</LI>
+ * <LI>alphanumeric:length</LI>
+ * <LI>alphanumeric:minlength:maxlength</LI>
+ * <LI>chars:characters:length</LI>
+ * <LI>chars:characters:minlength:maxlength</LI>
+ * <LI>hex:length</LI>
+ * <LI>hex:minlength:maxlength</LI>
+ * <LI>base64:length</LI>
+ * <LI>base64:minlength:maxlength</LI>
+ * <LI>month</LI>
+ * <LI>month:maxlength</LI>
+ * <LI>telephone</LI>
+ * </UL>
+ */
+public class RandomTag
+ extends Tag
+{
+ /**
+ * The value that indicates that the value is to be generated from a fixed
+ * number of characters from a given character set.
+ */
+ public static final int RANDOM_TYPE_CHARS_FIXED = 1;
+
+
+
+ /**
+ * The value that indicates that the value is to be generated from a variable
+ * number of characters from a given character set.
+ */
+ public static final int RANDOM_TYPE_CHARS_VARIABLE = 2;
+
+
+
+ /**
+ * The value that indicates that the value should be a random number.
+ */
+ public static final int RANDOM_TYPE_NUMERIC = 3;
+
+
+
+ /**
+ * The value that indicates that the value should be a random month.
+ */
+ public static final int RANDOM_TYPE_MONTH = 4;
+
+
+
+ /**
+ * The value that indicates that the value should be a telephone number.
+ */
+ public static final int RANDOM_TYPE_TELEPHONE = 5;
+
+
+
+ /**
+ * The character set that will be used for alphabetic characters.
+ */
+ public static final char[] ALPHA_CHARS =
+ "abcdefghijklmnopqrstuvwxyz".toCharArray();
+
+
+
+ /**
+ * The character set that will be used for numeric characters.
+ */
+ public static final char[] NUMERIC_CHARS = "01234567890".toCharArray();
+
+
+
+ /**
+ * The character set that will be used for alphanumeric characters.
+ */
+ public static final char[] ALPHANUMERIC_CHARS =
+ "abcdefghijklmnopqrstuvwxyz0123456789".toCharArray();
+
+
+
+ /**
+ * The character set that will be used for hexadecimal characters.
+ */
+ public static final char[] HEX_CHARS = "01234567890abcdef".toCharArray();
+
+
+
+ /**
+ * The character set that will be used for base64 characters.
+ */
+ public static final char[] BASE64_CHARS =
+ ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" +
+ "01234567890+/").toCharArray();
+
+
+
+ /**
+ * The set of month names that will be used.
+ */
+ public static final String[] MONTHS =
+ {
+ "January",
+ "February",
+ "March",
+ "April",
+ "May",
+ "June",
+ "July",
+ "August",
+ "September",
+ "October",
+ "November",
+ "December"
+ };
+
+
+
+ // The character set that should be used to generate the values.
+ private char[] characterSet;
+
+ // The decimal format used to format numeric values.
+ private DecimalFormat decimalFormat;
+
+ // The number of characters between the minimum and maximum length
+ // (inclusive).
+ private int lengthRange;
+
+ // The maximum number of characters to include in the value.
+ private int maxLength;
+
+ // The minimum number of characters to include in the value.
+ private int minLength;
+
+ // The type of random value that should be generated.
+ private int randomType;
+
+ // The maximum numeric value that should be generated.
+ private long maxValue;
+
+ // The minimum numeric value that should be generated.
+ private long minValue;
+
+ // The number of values between the minimum and maximum value (inclusive).
+ private long valueRange;
+
+ // The random number generator for this tag.
+ private Random random;
+
+
+
+ /**
+ * Creates a new instance of this random tag.
+ */
+ public RandomTag()
+ {
+ characterSet = null;
+ decimalFormat = null;
+ lengthRange = 1;
+ maxLength = 0;
+ minLength = 0;
+ randomType = 0;
+ maxValue = 0L;
+ minValue = 0L;
+ valueRange = 1L;
+ }
+
+
+
+ /**
+ * Retrieves the name for this tag.
+ *
+ * @return The name for this tag.
+ */
+ public String getName()
+ {
+ return "Random";
+ }
+
+
+
+ /**
+ * Indicates whether this tag is allowed for use in the extra lines for
+ * branches.
+ *
+ * @return <CODE>true</CODE> if this tag may be used in branch definitions,
+ * or <CODE>false</CODE> if not.
+ */
+ public boolean allowedInBranch()
+ {
+ return true;
+ }
+
+
+
+ /**
+ * Performs any initialization for this tag that may be needed while parsing
+ * a branch definition.
+ *
+ * @param templateFile The template file in which this tag is used.
+ * @param branch The branch in which this tag is used.
+ * @param arguments The set of arguments provided for this tag.
+ * @param lineNumber The line number on which this tag appears in the
+ * template file.
+ * @param warnings A list into which any appropriate warning messages
+ * may be placed.
+ *
+ * @throws InitializationException If a problem occurs while initializing
+ * this tag.
+ */
+ public void initializeForBranch(TemplateFile templateFile, Branch branch,
+ String[] arguments, int lineNumber,
+ List<String> warnings)
+ throws InitializationException
+ {
+ initializeInternal(templateFile, arguments, lineNumber, warnings);
+ }
+
+
+
+ /**
+ * Performs any initialization for this tag that may be needed while parsing
+ * a template definition.
+ *
+ * @param templateFile The template file in which this tag is used.
+ * @param template The template in which this tag is used.
+ * @param arguments The set of arguments provided for this tag.
+ * @param lineNumber The line number on which this tag appears in the
+ * template file.
+ * @param warnings A list into which any appropriate warning messages
+ * may be placed.
+ *
+ * @throws InitializationException If a problem occurs while initializing
+ * this tag.
+ */
+ public void initializeForTemplate(TemplateFile templateFile,
+ Template template, String[] arguments,
+ int lineNumber, List<String> warnings)
+ throws InitializationException
+ {
+ initializeInternal(templateFile, arguments, lineNumber, warnings);
+ }
+
+
+
+ /**
+ * Performs any initialization for this tag that may be needed while parsing
+ * either a branch or template definition.
+ *
+ * @param templateFile The template file in which this tag is used.
+ * @param arguments The set of arguments provided for this tag.
+ * @param lineNumber The line number on which this tag appears in the
+ * template file.
+ * @param warnings A list into which any appropriate warning messages
+ * may be placed.
+ *
+ * @throws InitializationException If a problem occurs while initializing
+ * this tag.
+ */
+ private void initializeInternal(TemplateFile templateFile, String[] arguments,
+ int lineNumber, List<String> warnings)
+ throws InitializationException
+ {
+ random = templateFile.getRandom();
+
+ // There must be at least one argument, to specify the type of random value
+ // to generate.
+ if ((arguments == null) || (arguments.length == 0))
+ {
+ int msgID = MSGID_MAKELDIF_TAG_NO_RANDOM_TYPE_ARGUMENT;
+ String message = getMessage(msgID, lineNumber);
+ throw new InitializationException(msgID, message);
+ }
+
+ int numArgs = arguments.length;
+ String randomTypeString = toLowerCase(arguments[0]);
+
+ if (randomTypeString.equals("alpha"))
+ {
+ characterSet = ALPHA_CHARS;
+ decodeLength(arguments, 1, lineNumber, warnings);
+ }
+ else if (randomTypeString.equals("numeric"))
+ {
+ if (numArgs == 2)
+ {
+ randomType = RANDOM_TYPE_CHARS_FIXED;
+ characterSet = NUMERIC_CHARS;
+
+ try
+ {
+ minLength = Integer.parseInt(arguments[1]);
+
+ if (minLength < 0)
+ {
+ int msgID = MSGID_MAKELDIF_TAG_INTEGER_BELOW_LOWER_BOUND;
+ String message = getMessage(msgID, minLength, 0, getName(),
+ lineNumber);
+ throw new InitializationException(msgID, message);
+ }
+ else if (minLength == 0)
+ {
+ int msgID = MSGID_MAKELDIF_TAG_WARNING_EMPTY_VALUE;
+ String message = getMessage(msgID, lineNumber);
+ warnings.add(message);
+ }
+ }
+ catch (NumberFormatException nfe)
+ {
+ int msgID = MSGID_MAKELDIF_TAG_CANNOT_PARSE_AS_INTEGER;
+ String message = getMessage(msgID, arguments[1], getName(),
+ lineNumber);
+ throw new InitializationException(msgID, message, nfe);
+ }
+ }
+ else if ((numArgs == 3) || (numArgs == 4))
+ {
+ randomType = RANDOM_TYPE_NUMERIC;
+
+ if (numArgs == 4)
+ {
+ try
+ {
+ decimalFormat = new DecimalFormat(arguments[3]);
+ }
+ catch (Exception e)
+ {
+ int msgID = MSGID_MAKELDIF_TAG_INVALID_FORMAT_STRING;
+ String message = getMessage(msgID, arguments[3], getName(),
+ lineNumber);
+ throw new InitializationException(msgID, message, e);
+ }
+ }
+ else
+ {
+ decimalFormat = null;
+ }
+
+ try
+ {
+ minValue = Long.parseLong(arguments[1]);
+ }
+ catch (NumberFormatException nfe)
+ {
+ int msgID = MSGID_MAKELDIF_TAG_CANNOT_PARSE_AS_INTEGER;
+ String message = getMessage(msgID, arguments[1], getName(),
+ lineNumber);
+ throw new InitializationException(msgID, message, nfe);
+ }
+
+ try
+ {
+ maxValue = Long.parseLong(arguments[2]);
+ if (maxValue < minValue)
+ {
+ int msgID = MSGID_MAKELDIF_TAG_INTEGER_BELOW_LOWER_BOUND;
+ String message = getMessage(msgID, maxValue, minValue, getName(),
+ lineNumber);
+ throw new InitializationException(msgID, message);
+ }
+
+ valueRange = maxValue - minValue + 1;
+ }
+ catch (NumberFormatException nfe)
+ {
+ int msgID = MSGID_MAKELDIF_TAG_CANNOT_PARSE_AS_INTEGER;
+ String message = getMessage(msgID, arguments[2], getName(),
+ lineNumber);
+ throw new InitializationException(msgID, message, nfe);
+ }
+ }
+ else
+ {
+ int msgID = MSGID_MAKELDIF_TAG_INVALID_ARGUMENT_RANGE_COUNT;
+ String message = getMessage(msgID, getName(), lineNumber, 2, 4,
+ numArgs);
+ throw new InitializationException(msgID, message);
+ }
+ }
+ else if (randomTypeString.equals("alphanumeric"))
+ {
+ characterSet = ALPHANUMERIC_CHARS;
+ decodeLength(arguments, 1, lineNumber, warnings);
+ }
+ else if (randomTypeString.equals("chars"))
+ {
+ if ((numArgs < 3) || (numArgs > 4))
+ {
+ int msgID = MSGID_MAKELDIF_TAG_INVALID_ARGUMENT_RANGE_COUNT;
+ String message = getMessage(msgID, getName(), lineNumber, 3, 4,
+ numArgs);
+ throw new InitializationException(msgID, message);
+ }
+
+ characterSet = arguments[1].toCharArray();
+ decodeLength(arguments, 2, lineNumber, warnings);
+ }
+ else if (randomTypeString.equals("hex"))
+ {
+ characterSet = HEX_CHARS;
+ decodeLength(arguments, 1, lineNumber, warnings);
+ }
+ else if (randomTypeString.equals("base64"))
+ {
+ characterSet = BASE64_CHARS;
+ decodeLength(arguments, 1, lineNumber, warnings);
+ }
+ else if (randomTypeString.equals("month"))
+ {
+ randomType = RANDOM_TYPE_MONTH;
+
+ if (numArgs == 1)
+ {
+ maxLength = 0;
+ }
+ else if (numArgs == 2)
+ {
+ try
+ {
+ maxLength = Integer.parseInt(arguments[1]);
+ if (maxLength <= 0)
+ {
+ int msgID = MSGID_MAKELDIF_TAG_INTEGER_BELOW_LOWER_BOUND;
+ String message = getMessage(msgID, maxLength, 1, getName(),
+ lineNumber);
+ throw new InitializationException(msgID, message);
+ }
+ }
+ catch (NumberFormatException nfe)
+ {
+ int msgID = MSGID_MAKELDIF_TAG_CANNOT_PARSE_AS_INTEGER;
+ String message = getMessage(msgID, arguments[1], getName(),
+ lineNumber);
+ throw new InitializationException(msgID, message, nfe);
+ }
+ }
+ else
+ {
+ int msgID = MSGID_MAKELDIF_TAG_INVALID_ARGUMENT_RANGE_COUNT;
+ String message = getMessage(msgID, getName(), lineNumber, 1, 2,
+ numArgs);
+ throw new InitializationException(msgID, message);
+ }
+ }
+ else if (randomTypeString.equals("telephone"))
+ {
+ randomType = RANDOM_TYPE_TELEPHONE;
+ }
+ else
+ {
+ int msgID = MSGID_MAKELDIF_TAG_UNKNOWN_RANDOM_TYPE;
+ String message = getMessage(msgID, lineNumber, randomTypeString);
+ throw new InitializationException(msgID, message);
+ }
+ }
+
+
+
+ /**
+ * Decodes the information in the provided argument list as either a single
+ * integer specifying the number of characters, or two integers specifying the
+ * minimum and maximum number of characters.
+ *
+ * @param arguments The set of arguments to be processed.
+ * @param startPos The position at which the first legth value should
+ * appear in the argument list.
+ * @param lineNumber The line number on which the tag appears in the
+ * template file.
+ * @param warnings A list into which any appropriate warning messages may
+ * be placed.
+ */
+ private void decodeLength(String[] arguments, int startPos, int lineNumber,
+ List<String> warnings)
+ throws InitializationException
+ {
+ int numArgs = arguments.length - startPos + 1;
+
+ if (numArgs == 2)
+ {
+ // There is a fixed number of characters in the value.
+ randomType = RANDOM_TYPE_CHARS_FIXED;
+
+ try
+ {
+ minLength = Integer.parseInt(arguments[startPos]);
+
+ if (minLength < 0)
+ {
+ int msgID = MSGID_MAKELDIF_TAG_INTEGER_BELOW_LOWER_BOUND;
+ String message = getMessage(msgID, minLength, 0, getName(),
+ lineNumber);
+ throw new InitializationException(msgID, message);
+ }
+ else if (minLength == 0)
+ {
+ int msgID = MSGID_MAKELDIF_TAG_WARNING_EMPTY_VALUE;
+ String message = getMessage(msgID, lineNumber);
+ warnings.add(message);
+ }
+ }
+ catch (NumberFormatException nfe)
+ {
+ int msgID = MSGID_MAKELDIF_TAG_CANNOT_PARSE_AS_INTEGER;
+ String message = getMessage(msgID, arguments[startPos], getName(),
+ lineNumber);
+ throw new InitializationException(msgID, message, nfe);
+ }
+ }
+ else if (numArgs == 3)
+ {
+ // There are minimum and maximum lengths.
+ randomType = RANDOM_TYPE_CHARS_VARIABLE;
+
+ try
+ {
+ minLength = Integer.parseInt(arguments[startPos]);
+
+ if (minLength < 0)
+ {
+ int msgID = MSGID_MAKELDIF_TAG_INTEGER_BELOW_LOWER_BOUND;
+ String message = getMessage(msgID, minLength, 0, getName(),
+ lineNumber);
+ throw new InitializationException(msgID, message);
+ }
+ }
+ catch (NumberFormatException nfe)
+ {
+ int msgID = MSGID_MAKELDIF_TAG_CANNOT_PARSE_AS_INTEGER;
+ String message = getMessage(msgID, arguments[startPos], getName(),
+ lineNumber);
+ throw new InitializationException(msgID, message, nfe);
+ }
+
+ try
+ {
+ maxLength = Integer.parseInt(arguments[startPos+1]);
+ lengthRange = maxLength - minLength + 1;
+
+ if (maxLength < minLength)
+ {
+ int msgID = MSGID_MAKELDIF_TAG_INTEGER_BELOW_LOWER_BOUND;
+ String message = getMessage(msgID, maxLength, minLength, getName(),
+ lineNumber);
+ throw new InitializationException(msgID, message);
+ }
+ else if (maxLength == 0)
+ {
+ int msgID = MSGID_MAKELDIF_TAG_WARNING_EMPTY_VALUE;
+ String message = getMessage(msgID, getName(), lineNumber);
+ warnings.add(message);
+ }
+ }
+ catch (NumberFormatException nfe)
+ {
+ int msgID = MSGID_MAKELDIF_TAG_CANNOT_PARSE_AS_INTEGER;
+ String message = getMessage(msgID, arguments[startPos+1], getName(),
+ lineNumber);
+ throw new InitializationException(msgID, message, nfe);
+ }
+ }
+ else
+ {
+ int msgID = MSGID_MAKELDIF_TAG_INVALID_ARGUMENT_RANGE_COUNT;
+ String message = getMessage(msgID, getName(), lineNumber, startPos+1,
+ startPos+2, numArgs);
+ throw new InitializationException(msgID, message);
+ }
+ }
+
+
+
+ /**
+ * Generates the content for this tag by appending it to the provided tag.
+ *
+ * @param templateEntry The entry for which this tag is being generated.
+ * @param templateValue The template value to which the generated content
+ * should be appended.
+ *
+ * @return The result of generating content for this tag.
+ */
+ public TagResult generateValue(TemplateEntry templateEntry,
+ TemplateValue templateValue)
+ {
+ StringBuilder buffer = templateValue.getValue();
+
+ switch (randomType)
+ {
+ case RANDOM_TYPE_CHARS_FIXED:
+ for (int i=0; i < minLength; i++)
+ {
+ buffer.append(characterSet[random.nextInt(characterSet.length)]);
+ }
+ break;
+
+ case RANDOM_TYPE_CHARS_VARIABLE:
+ int numChars = random.nextInt(lengthRange) + minLength;
+ for (int i=0; i < numChars; i++)
+ {
+ buffer.append(characterSet[random.nextInt(characterSet.length)]);
+ }
+ break;
+
+ case RANDOM_TYPE_NUMERIC:
+ long randomValue =
+ ((random.nextLong() & 0x7FFFFFFFFFFFFFFFL) % valueRange) + minValue;
+ if (decimalFormat == null)
+ {
+ buffer.append(randomValue);
+ }
+ else
+ {
+ buffer.append(decimalFormat.format(randomValue));
+ }
+ break;
+
+ case RANDOM_TYPE_MONTH:
+ String month = MONTHS[random.nextInt(MONTHS.length)];
+ if ((maxLength == 0) || (month.length() <= maxLength))
+ {
+ buffer.append(month);
+ }
+ else
+ {
+ buffer.append(month.substring(0, maxLength));
+ }
+ break;
+
+ case RANDOM_TYPE_TELEPHONE:
+ for (int i=0; i < 3; i++)
+ {
+ buffer.append(NUMERIC_CHARS[random.nextInt(NUMERIC_CHARS.length)]);
+ }
+ buffer.append('-');
+ for (int i=0; i < 3; i++)
+ {
+ buffer.append(NUMERIC_CHARS[random.nextInt(NUMERIC_CHARS.length)]);
+ }
+ buffer.append('-');
+ for (int i=0; i < 4; i++)
+ {
+ buffer.append(NUMERIC_CHARS[random.nextInt(NUMERIC_CHARS.length)]);
+ }
+ break;
+ }
+
+ return TagResult.SUCCESS_RESULT;
+ }
+}
+
diff --git a/opends/src/server/org/opends/server/tools/makeldif/SequentialTag.java b/opends/src/server/org/opends/server/tools/makeldif/SequentialTag.java
new file mode 100644
index 0000000..7501444
--- /dev/null
+++ b/opends/src/server/org/opends/server/tools/makeldif/SequentialTag.java
@@ -0,0 +1,257 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ * Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ * Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.tools.makeldif;
+
+
+
+import java.util.List;
+
+import org.opends.server.core.InitializationException;
+
+import static org.opends.server.messages.MessageHandler.*;
+import static org.opends.server.messages.ToolMessages.*;
+
+
+
+/**
+ * This class defines a tag that is used to include a sequentially-incrementing
+ * integer in the generated values.
+ */
+public class SequentialTag
+ extends Tag
+{
+ // Indicates whether to reset for each parent.
+ private boolean resetOnNewParents;
+
+ // The initial value in the sequence.
+ private int initialValue;
+
+ // The next value in the sequence.
+ private int nextValue;
+
+
+
+ /**
+ * Creates a new instance of this sequential tag.
+ */
+ public SequentialTag()
+ {
+ // No implementation required.
+ }
+
+
+
+ /**
+ * Retrieves the name for this tag.
+ *
+ * @return The name for this tag.
+ */
+ public String getName()
+ {
+ return "Sequential";
+ }
+
+
+
+ /**
+ * Indicates whether this tag is allowed for use in the extra lines for
+ * branches.
+ *
+ * @return <CODE>true</CODE> if this tag may be used in branch definitions,
+ * or <CODE>false</CODE> if not.
+ */
+ public boolean allowedInBranch()
+ {
+ return true;
+ }
+
+
+
+ /**
+ * Performs any initialization for this tag that may be needed while parsing
+ * a branch definition.
+ *
+ * @param templateFile The template file in which this tag is used.
+ * @param branch The branch in which this tag is used.
+ * @param arguments The set of arguments provided for this tag.
+ * @param lineNumber The line number on which this tag appears in the
+ * template file.
+ * @param warnings A list into which any appropriate warning messages
+ * may be placed.
+ *
+ * @throws InitializationException If a problem occurs while initializing
+ * this tag.
+ */
+ public void initializeForBranch(TemplateFile templateFile, Branch branch,
+ String[] arguments, int lineNumber,
+ List<String> warnings)
+ throws InitializationException
+ {
+ initializeInternal(templateFile, arguments, lineNumber);
+ }
+
+
+
+ /**
+ * Performs any initialization for this tag that may be needed while parsing
+ * a template definition.
+ *
+ * @param templateFile The template file in which this tag is used.
+ * @param template The template in which this tag is used.
+ * @param arguments The set of arguments provided for this tag.
+ * @param lineNumber The line number on which this tag appears in the
+ * template file.
+ * @param warnings A list into which any appropriate warning messages
+ * may be placed.
+ *
+ * @throws InitializationException If a problem occurs while initializing
+ * this tag.
+ */
+ public void initializeForTemplate(TemplateFile templateFile,
+ Template template, String[] arguments,
+ int lineNumber, List<String> warnings)
+ throws InitializationException
+ {
+ initializeInternal(templateFile, arguments, lineNumber);
+ }
+
+
+
+ /**
+ * Performs any initialization for this tag that may be needed for this tag.
+ *
+ * @param templateFile The template file in which this tag is used.
+ * @param arguments The set of arguments provided for this tag.
+ * @param lineNumber The line number on which this tag appears in the
+ * template file.
+ *
+ * @throws InitializationException If a problem occurs while initializing
+ * this tag.
+ */
+ private void initializeInternal(TemplateFile templateFile, String[] arguments,
+ int lineNumber)
+ throws InitializationException
+ {
+ switch (arguments.length)
+ {
+ case 0:
+ initialValue = 0;
+ nextValue = 0;
+ resetOnNewParents = true;
+ break;
+ case 1:
+ try
+ {
+ initialValue = Integer.parseInt(arguments[0]);
+ }
+ catch (NumberFormatException nfe)
+ {
+ int msgID = MSGID_MAKELDIF_TAG_CANNOT_PARSE_AS_INTEGER;
+ String message = getMessage(msgID, arguments[0], getName(),
+ lineNumber);
+ throw new InitializationException(msgID, message);
+ }
+
+ nextValue = initialValue;
+ resetOnNewParents = true;
+ break;
+ case 2:
+ try
+ {
+ initialValue = Integer.parseInt(arguments[0]);
+ }
+ catch (NumberFormatException nfe)
+ {
+ int msgID = MSGID_MAKELDIF_TAG_CANNOT_PARSE_AS_INTEGER;
+ String message = getMessage(msgID, arguments[0], getName(),
+ lineNumber);
+ throw new InitializationException(msgID, message);
+ }
+
+ if (arguments[1].equalsIgnoreCase("true"))
+ {
+ resetOnNewParents = true;
+ }
+ else if (arguments[1].equalsIgnoreCase("false"))
+ {
+ resetOnNewParents = false;
+ }
+ else
+ {
+ int msgID = MSGID_MAKELDIF_TAG_CANNOT_PARSE_AS_BOOLEAN;
+ String message = getMessage(msgID, arguments[1], getName(),
+ lineNumber);
+ throw new InitializationException(msgID, message);
+ }
+
+ nextValue = initialValue;
+ break;
+ default:
+ int msgID = MSGID_MAKELDIF_TAG_INVALID_ARGUMENT_RANGE_COUNT;
+ String message = getMessage(msgID, getName(), lineNumber, 0, 2,
+ arguments.length);
+
+ throw new InitializationException(msgID, message);
+ }
+ }
+
+
+
+ /**
+ * Performs any initialization for this tag that may be needed when starting
+ * to generate entries below a new parent.
+ *
+ * @param parentEntry The entry below which the new entries will be
+ * generated.
+ */
+ public void initializeForParent(TemplateEntry parentEntry)
+ {
+ if (resetOnNewParents)
+ {
+ nextValue = initialValue;
+ }
+ }
+
+
+
+ /**
+ * Generates the content for this tag by appending it to the provided tag.
+ *
+ * @param templateEntry The entry for which this tag is being generated.
+ * @param templateValue The template value to which the generated content
+ * should be appended.
+ *
+ * @return The result of generating content for this tag.
+ */
+ public TagResult generateValue(TemplateEntry templateEntry,
+ TemplateValue templateValue)
+ {
+ templateValue.getValue().append(nextValue++);
+ return TagResult.SUCCESS_RESULT;
+ }
+}
+
diff --git a/opends/src/server/org/opends/server/tools/makeldif/StaticTextTag.java b/opends/src/server/org/opends/server/tools/makeldif/StaticTextTag.java
new file mode 100644
index 0000000..ba98e5c
--- /dev/null
+++ b/opends/src/server/org/opends/server/tools/makeldif/StaticTextTag.java
@@ -0,0 +1,172 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ * Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ * Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.tools.makeldif;
+
+
+
+import java.util.List;
+
+import org.opends.server.core.InitializationException;
+
+import static org.opends.server.messages.MessageHandler.*;
+import static org.opends.server.messages.ToolMessages.*;
+
+
+
+/**
+ * This class defines a tag that is used to hold static text (i.e., text that
+ * appears outside of any tag).
+ */
+public class StaticTextTag
+ extends Tag
+{
+ // The static text to include in the LDIF.
+ private String text;
+
+
+
+ /**
+ * Creates a new instance of this static text tag.
+ */
+ public StaticTextTag()
+ {
+ text = "";
+ }
+
+
+
+ /**
+ * Retrieves the name for this tag.
+ *
+ * @return The name for this tag.
+ */
+ public String getName()
+ {
+ return "StaticText";
+ }
+
+
+
+ /**
+ * Indicates whether this tag is allowed for use in the extra lines for
+ * branches.
+ *
+ * @return <CODE>true</CODE> if this tag may be used in branch definitions,
+ * or <CODE>false</CODE> if not.
+ */
+ public boolean allowedInBranch()
+ {
+ return true;
+ }
+
+
+
+ /**
+ * Performs any initialization for this tag that may be needed while parsing
+ * a branch definition.
+ *
+ * @param templateFile The template file in which this tag is used.
+ * @param branch The branch in which this tag is used.
+ * @param arguments The set of arguments provided for this tag.
+ * @param lineNumber The line number on which this tag appears in the
+ * template file.
+ * @param warnings A list into which any appropriate warning messages
+ * may be placed.
+ *
+ * @throws InitializationException If a problem occurs while initializing
+ * this tag.
+ */
+ public void initializeForBranch(TemplateFile templateFile, Branch branch,
+ String[] arguments, int lineNumber,
+ List<String> warnings)
+ throws InitializationException
+ {
+ if (arguments.length != 1)
+ {
+ int msgID = MSGID_MAKELDIF_TAG_INVALID_ARGUMENT_COUNT;
+ String message = getMessage(msgID, getName(), lineNumber, 1,
+ arguments.length);
+
+ throw new InitializationException(msgID, message);
+ }
+
+ text = arguments[0];
+ }
+
+
+
+ /**
+ * Performs any initialization for this tag that may be needed while parsing
+ * a template definition.
+ *
+ * @param templateFile The template file in which this tag is used.
+ * @param template The template in which this tag is used.
+ * @param arguments The set of arguments provided for this tag.
+ * @param lineNumber The line number on which this tag appears in the
+ * template file.
+ * @param warnings A list into which any appropriate warning messages
+ * may be placed.
+ *
+ * @throws InitializationException If a problem occurs while initializing
+ * this tag.
+ */
+ public void initializeForTemplate(TemplateFile templateFile,
+ Template template, String[] arguments,
+ int lineNumber, List<String> warnings)
+ throws InitializationException
+ {
+ if (arguments.length != 1)
+ {
+ int msgID = MSGID_MAKELDIF_TAG_INVALID_ARGUMENT_COUNT;
+ String message = getMessage(msgID, getName(), lineNumber, 1,
+ arguments.length);
+
+ throw new InitializationException(msgID, message);
+ }
+
+ text = arguments[0];
+ }
+
+
+
+ /**
+ * Generates the content for this tag by appending it to the provided tag.
+ *
+ * @param templateEntry The entry for which this tag is being generated.
+ * @param templateValue The template value to which the generated content
+ * should be appended.
+ *
+ * @return The result of generating content for this tag.
+ */
+ public TagResult generateValue(TemplateEntry templateEntry,
+ TemplateValue templateValue)
+ {
+ templateValue.append(text);
+ return TagResult.SUCCESS_RESULT;
+ }
+}
+
diff --git a/opends/src/server/org/opends/server/tools/makeldif/Tag.java b/opends/src/server/org/opends/server/tools/makeldif/Tag.java
new file mode 100644
index 0000000..92ef549
--- /dev/null
+++ b/opends/src/server/org/opends/server/tools/makeldif/Tag.java
@@ -0,0 +1,137 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ * Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ * Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.tools.makeldif;
+
+
+
+import java.util.List;
+
+import org.opends.server.core.InitializationException;
+
+
+
+/**
+ * This class defines a tag that may be used in a template line. It can be used
+ * to generate content in the resulting LDIF.
+ */
+public abstract class Tag
+{
+ /**
+ * Retrieves the name for this tag.
+ *
+ * @return The name for this tag.
+ */
+ public abstract String getName();
+
+
+
+ /**
+ * Indicates whether this tag is allowed for use in the extra lines for
+ * branches.
+ *
+ * @return <CODE>true</CODE> if this tag may be used in branch definitions,
+ * or <CODE>false</CODE> if not.
+ */
+ public abstract boolean allowedInBranch();
+
+
+
+ /**
+ * Performs any initialization for this tag that may be needed while parsing
+ * a branch definition.
+ *
+ * @param templateFile The template file in which this tag is used.
+ * @param branch The branch in which this tag is used.
+ * @param arguments The set of arguments provided for this tag.
+ * @param lineNumber The line number on which this tag appears in the
+ * template file.
+ * @param warnings A list into which any appropriate warning messages
+ * may be placed.
+ *
+ * @throws InitializationException If a problem occurs while initializing
+ * this tag.
+ */
+ public void initializeForBranch(TemplateFile templateFile, Branch branch,
+ String[] arguments, int lineNumber,
+ List<String> warnings)
+ throws InitializationException
+ {
+ // No implementation required by default.
+ }
+
+
+
+ /**
+ * Performs any initialization for this tag that may be needed while parsing
+ * a template definition.
+ *
+ * @param templateFile The template file in which this tag is used.
+ * @param template The template in which this tag is used.
+ * @param arguments The set of arguments provided for this tag.
+ * @param lineNumber The line number on which this tag appears in the
+ * template file.
+ * @param warnings A list into which any appropriate warning messages
+ * may be placed.
+ *
+ * @throws InitializationException If a problem occurs while initializing
+ * this tag.
+ */
+ public abstract void initializeForTemplate(TemplateFile templateFile,
+ Template template,
+ String[] arguments, int lineNumber,
+ List<String> warnings)
+ throws InitializationException;
+
+
+
+ /**
+ * Performs any initialization for this tag that may be needed when starting
+ * to generate entries below a new parent.
+ *
+ * @param parentEntry The entry below which the new entries will be
+ * generated.
+ */
+ public void initializeForParent(TemplateEntry parentEntry)
+ {
+ // No implementation required by default.
+ }
+
+
+
+ /**
+ * Generates the content for this tag by appending it to the provided tag.
+ *
+ * @param templateEntry The entry for which this tag is being generated.
+ * @param templateValue The template value to which the generated content
+ * should be appended.
+ *
+ * @return The result of generating content for this tag.
+ */
+ public abstract TagResult generateValue(TemplateEntry templateEntry,
+ TemplateValue templateValue);
+}
+
diff --git a/opends/src/server/org/opends/server/tools/makeldif/TagResult.java b/opends/src/server/org/opends/server/tools/makeldif/TagResult.java
new file mode 100644
index 0000000..3312adc
--- /dev/null
+++ b/opends/src/server/org/opends/server/tools/makeldif/TagResult.java
@@ -0,0 +1,166 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ * Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ * Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.tools.makeldif;
+
+
+
+/**
+ * This class defines a data structure that provides information about the
+ * result of tag processing.
+ */
+public class TagResult
+{
+ /**
+ * A tag result in which all components have a value of <CODE>true</CODE>.
+ */
+ public static final TagResult SUCCESS_RESULT =
+ new TagResult(true, true, true, true);
+
+
+
+ /**
+ * A tag result that indicates the value should not be included in the entry,
+ * but all other processing should continue.
+ */
+ public static final TagResult OMIT_FROM_ENTRY =
+ new TagResult(false, true, true, true);
+
+
+
+ /**
+ * A tag result in whihc all components have a value of <CODE>false</CODE>.
+ */
+ public static final TagResult STOP_PROCESSING =
+ new TagResult(false, false, false, false);
+
+
+
+ // Indicates whether to keep processing the associated line.
+ private boolean keepProcessingLine;
+
+ // Indicates whether to keep processing the associated entry.
+ private boolean keepProcessingEntry;
+
+ // Indicates whether to keep processing entries below the associated parent.
+ private boolean keepProcessingParent;
+
+ // Indicates whether to keep processing entries for the template file.
+ private boolean keepProcessingTemplateFile;
+
+
+
+ /**
+ * Creates a new tag result object with the provided information.
+ *
+ * @param keepProcessingLine Indicates whether to continue
+ * processing for the current line. If
+ * not, then the line will not be included
+ * in the entry.
+ * @param keepProcessingEntry Indicates whether to continue
+ * processing for the current entry. If
+ * not, then the entry will not be
+ * included in the data.
+ * @param keepProcessingParent Indicates whether to continue
+ * processing entries below the current
+ * parent in the template file.
+ * @param keepProcessingTemplateFile Indicates whether to continue
+ * processing entries for the template
+ * file.
+ */
+ public TagResult(boolean keepProcessingLine, boolean keepProcessingEntry,
+ boolean keepProcessingParent,
+ boolean keepProcessingTemplateFile)
+ {
+ this.keepProcessingLine = keepProcessingLine;
+ this.keepProcessingEntry = keepProcessingEntry;
+ this.keepProcessingParent = keepProcessingParent;
+ this.keepProcessingTemplateFile = keepProcessingTemplateFile;
+ }
+
+
+
+ /**
+ * Indicates whether to continue processing for the current line. If this is
+ * <CODE>false</CODE>, then the current line will not be included in the
+ * entry. It will have no impact on whehter the entry itself is included in
+ * the generated LDIF.
+ *
+ * @return <CODE>true</CODE> if the line should be included in the entry, or
+ * <CODE>false</CODE> if not.
+ */
+ public boolean keepProcessingLine()
+ {
+ return keepProcessingLine;
+ }
+
+
+
+ /**
+ * Indicates whether to continue processing for the current entry. If this is
+ * <CODE>false</CODE>, then the current entry will not be included in the
+ * generated LDIF, and processing will resume with the next entry below the
+ * current parent.
+ *
+ * @return <CODE>true</CODE> if the entry should be included in the
+ * generated LDIF, or <CODE>false</CODE> if not.
+ */
+ public boolean keepProcessingEntry()
+ {
+ return keepProcessingEntry;
+ }
+
+
+
+ /**
+ * Indicates whether to continue processing entries below the current parent.
+ * If this is <CODE>false</CODE>, then the current entry will not be included,
+ * and processing will resume below the next parent in the template file.
+ *
+ * @return <CODE>true</CODE> if processing for the current parent should
+ * continue, or <CODE>false</CODE> if not.
+ */
+ public boolean keepProcessingParent()
+ {
+ return keepProcessingParent;
+ }
+
+
+
+ /**
+ * Indicates whether to keep processing entries for the template file. If
+ * this is <CODE>false</CODE>, then LDIF processing will end immediately (and
+ * the current entry will not be included).
+ *
+ * @return <CODE>true</CODE> if processing for the template file should
+ * continue, or <CODE>false</CODE> if not.
+ */
+ public boolean keepProcessingTemplateFile()
+ {
+ return keepProcessingTemplateFile;
+ }
+}
+
diff --git a/opends/src/server/org/opends/server/tools/makeldif/Template.java b/opends/src/server/org/opends/server/tools/makeldif/Template.java
new file mode 100644
index 0000000..8274f6e
--- /dev/null
+++ b/opends/src/server/org/opends/server/tools/makeldif/Template.java
@@ -0,0 +1,393 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ * Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ * Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.tools.makeldif;
+
+
+
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.Map;
+
+import org.opends.server.types.AttributeType;
+import org.opends.server.types.DN;
+import org.opends.server.types.Entry;
+
+import static org.opends.server.messages.MessageHandler.*;
+import static org.opends.server.messages.ToolMessages.*;
+import static org.opends.server.util.StaticUtils.*;
+
+
+
+/**
+ * This class defines a template, which is a pattern that may be used to
+ * generate entries. A template may be used either below a branch or below
+ * another template.
+ */
+public class Template
+{
+ // The attribute types that are used in the RDN for entries generated using
+ // this template.
+ private AttributeType[] rdnAttributes;
+
+ // The number of entries to create for each subordinate template.
+ private int[] numEntriesPerTemplate;
+
+ // The name for this template.
+ private String name;
+
+ // The names of the subordinate templates below this template.
+ private String[] subordinateTemplateNames;
+
+ // The subordinate templates below this template.
+ private Template[] subordinateTemplates;
+
+ // The template file that contains this template.
+ private TemplateFile templateFile;
+
+ // The set of template lines for this template.
+ private TemplateLine[] templateLines;
+
+
+
+ /**
+ * Creates a new template with the provided information.
+ *
+ * @param templateFile The template file that contains this
+ * template.
+ * @param name The name for this template.
+ * @param rdnAttributes The set of attribute types that are used
+ * in the RDN for entries generated using
+ * this template.
+ * @param subordinateTemplateNames The names of the subordinate templates
+ * below this template.
+ * @param numEntriesPerTemplate The number of entries to create below
+ * each subordinate template.
+ */
+ public Template(TemplateFile templateFile, String name,
+ AttributeType[] rdnAttributes,
+ String[] subordinateTemplateNames,
+ int[] numEntriesPerTemplate)
+ {
+ this.templateFile = templateFile;
+ this.name = name;
+ this.rdnAttributes = rdnAttributes;
+ this.subordinateTemplateNames = subordinateTemplateNames;
+ this.numEntriesPerTemplate = numEntriesPerTemplate;
+
+ templateLines = new TemplateLine[0];
+ subordinateTemplates = null;
+ }
+
+
+
+ /**
+ * Creates a new template with the provided information.
+ *
+ * @param templateFile The template file that contains this
+ * template.
+ * @param name The name for this template.
+ * @param rdnAttributes The set of attribute types that are used
+ * in the RDN for entries generated using
+ * this template.
+ * @param subordinateTemplateNames The names of the subordinate templates
+ * below this template.
+ * @param numEntriesPerTemplate The number of entries to create below
+ * each subordinate template.
+ * @param templateLines The set of template lines for this
+ * template.
+ */
+ public Template(TemplateFile templateFile, String name,
+ AttributeType[] rdnAttributes,
+ String[] subordinateTemplateNames,
+ int[] numEntriesPerTemplate, TemplateLine[] templateLines)
+ {
+ this.templateFile = templateFile;
+ this.name = name;
+ this.rdnAttributes = rdnAttributes;
+ this.subordinateTemplateNames = subordinateTemplateNames;
+ this.numEntriesPerTemplate = numEntriesPerTemplate;
+ this.templateLines = templateLines;
+
+ subordinateTemplates = null;
+ }
+
+
+
+ /**
+ * Performs any necessary processing to ensure that the template
+ * initialization is completed. In particular, it should make sure that all
+ * referenced subordinate templates actually exist in the template file, and
+ * that all of the RDN attributes are contained in the template lines.
+ *
+ * @param templates The set of templates defined in the template file.
+ *
+ * @throws MakeLDIFException If any of the subordinate templates are not
+ * defined in the template file.
+ */
+ public void completeTemplateInitialization(Map<String,Template> templates)
+ throws MakeLDIFException
+ {
+ // Make sure that all of the specified subordinate templates exist.
+ if (subordinateTemplateNames == null)
+ {
+ subordinateTemplateNames = new String[0];
+ subordinateTemplates = new Template[0];
+ }
+ else
+ {
+ subordinateTemplates = new Template[subordinateTemplateNames.length];
+ for (int i=0; i < subordinateTemplates.length; i++)
+ {
+ subordinateTemplates[i] =
+ templates.get(toLowerCase(subordinateTemplateNames[i]));
+ if (subordinateTemplates[i] == null)
+ {
+ int msgID = MSGID_MAKELDIF_UNDEFINED_TEMPLATE_SUBORDINATE;
+ String message = getMessage(msgID, subordinateTemplateNames[i], name);
+ throw new MakeLDIFException(msgID, message);
+ }
+ }
+ }
+
+
+ // Make sure that all of the RDN attributes are defined.
+ HashSet<AttributeType> rdnAttrs =
+ new HashSet<AttributeType>(rdnAttributes.length);
+ for (AttributeType t : rdnAttributes)
+ {
+ rdnAttrs.add(t);
+ }
+
+ for (TemplateLine l : templateLines)
+ {
+ if (rdnAttrs.remove(l.getAttributeType()))
+ {
+ if (rdnAttrs.isEmpty())
+ {
+ break;
+ }
+ }
+ }
+
+ if (! rdnAttrs.isEmpty())
+ {
+ AttributeType t = rdnAttrs.iterator().next();
+ int msgID = MSGID_MAKELDIF_TEMPLATE_MISSING_RDN_ATTR;
+ String message = getMessage(msgID, name, t.getNameOrOID());
+ throw new MakeLDIFException(msgID, message);
+ }
+ }
+
+
+
+ /**
+ * Retrieves the name for this template.
+ *
+ * @return The name for this template.
+ */
+ public String getName()
+ {
+ return name;
+ }
+
+
+
+ /**
+ * Retrieves the set of attribute types that are used in the RDN for entries
+ * generated using this template.
+ *
+ * @return The set of attribute types that are used in the RDN for entries
+ * generated using this template.
+ */
+ public AttributeType[] getRDNAttributes()
+ {
+ return rdnAttributes;
+ }
+
+
+
+ /**
+ * Retrieves the names of the subordinate templates used to generate entries
+ * below entries created by this template.
+ *
+ * @return The names of the subordinate templates used to generate entries
+ * below entries created by this template.
+ */
+ public String[] getSubordinateTemplateNames()
+ {
+ return subordinateTemplateNames;
+ }
+
+
+
+ /**
+ * Retrieves the subordinate templates used to generate entries below entries
+ * created by this template.
+ *
+ * @return The subordinate templates used to generate entries below entries
+ * created by this template.
+ */
+ public Template[] getSubordinateTemplates()
+ {
+ return subordinateTemplates;
+ }
+
+
+
+ /**
+ * Retrieves the number of entries that should be created for each subordinate
+ * template.
+ *
+ * @return The number of entries that should be created for each subordinate
+ * template.
+ */
+ public int[] getNumEntriesPerTemplate()
+ {
+ return numEntriesPerTemplate;
+ }
+
+
+
+ /**
+ * Retrieves the set of template lines for this template.
+ *
+ * @return The set of template lines for this template.
+ */
+ public TemplateLine[] getTemplateLines()
+ {
+ return templateLines;
+ }
+
+
+
+ /**
+ * Adds the provided template line to this template.
+ *
+ * @param line The template line to add to this template.
+ */
+ public void addTemplateLine(TemplateLine line)
+ {
+ TemplateLine[] newTemplateLines = new TemplateLine[templateLines.length+1];
+ System.arraycopy(templateLines, 0, newTemplateLines, 0,
+ templateLines.length);
+ newTemplateLines[templateLines.length] = line;
+ templateLines = newTemplateLines;
+ }
+
+
+
+ /**
+ * Indicates whether this template contains any template lines that reference
+ * the provided attribute type.
+ *
+ * @param attributeType The attribute type for which to make the
+ * determination.
+ *
+ * @return <CODE>true</CODE> if this template contains one or more template
+ * lines that reference the provided attribute type, or
+ * <CODE>false</CODE> if not.
+ */
+ public boolean hasAttribute(AttributeType attributeType)
+ {
+ for (TemplateLine l : templateLines)
+ {
+ if (l.getAttributeType().equals(attributeType))
+ {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+
+
+ /**
+ * Writes the entry for this template, as well as all appropriate subordinate
+ * entries.
+ *
+ * @param entryWriter The entry writer that will be used to write the
+ * entries.
+ * @param parentDN The DN of the entry below which the subordinate
+ * entries should be generated.
+ * @param count The number of entries to generate based on this
+ * template.
+ *
+ * @return The result that indicates whether processing should continue.
+ *
+ * @throws IOException If a problem occurs while attempting to write to the
+ * LDIF writer.
+ *
+ * @throws MakeLDIFException If some other problem occurs.
+ */
+ public TagResult writeEntries(EntryWriter entryWriter, DN parentDN, int count)
+ throws IOException, MakeLDIFException
+ {
+ for (int i=0; i < count; i++)
+ {
+ templateFile.nextFirstAndLastNames();
+ TemplateEntry templateEntry = new TemplateEntry(this, parentDN);
+
+ for (TemplateLine l : templateLines)
+ {
+ TagResult r = l.generateLine(templateEntry);
+ if (! (r.keepProcessingEntry() && r.keepProcessingParent() &&
+ r.keepProcessingTemplateFile()))
+ {
+ return r;
+ }
+ }
+
+ Entry entry = templateEntry.toEntry();
+ if (! entryWriter.writeEntry(entry))
+ {
+ return TagResult.STOP_PROCESSING;
+ }
+
+ for (int j=0; j < subordinateTemplates.length; j++)
+ {
+ TagResult r =
+ subordinateTemplates[j].writeEntries(entryWriter, entry.getDN(),
+ numEntriesPerTemplate[j]);
+ if (! (r.keepProcessingParent() && r.keepProcessingTemplateFile()))
+ {
+ if (r.keepProcessingTemplateFile())
+ {
+ // We don't want to propagate a "stop processing parent" all the
+ // way up the chain.
+ return TagResult.SUCCESS_RESULT;
+ }
+
+ return r;
+ }
+ }
+ }
+
+ return TagResult.SUCCESS_RESULT;
+ }
+}
+
diff --git a/opends/src/server/org/opends/server/tools/makeldif/TemplateEntry.java b/opends/src/server/org/opends/server/tools/makeldif/TemplateEntry.java
new file mode 100644
index 0000000..339f942
--- /dev/null
+++ b/opends/src/server/org/opends/server/tools/makeldif/TemplateEntry.java
@@ -0,0 +1,332 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ * Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ * Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.tools.makeldif;
+
+
+
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
+import java.util.List;
+
+import org.opends.server.core.DirectoryServer;
+import org.opends.server.types.Attribute;
+import org.opends.server.types.AttributeType;
+import org.opends.server.types.AttributeValue;
+import org.opends.server.types.DN;
+import org.opends.server.types.Entry;
+import org.opends.server.types.ObjectClass;
+import org.opends.server.types.RDN;
+
+import static org.opends.server.util.StaticUtils.*;
+
+
+
+/**
+ * This class defines an entry that is generated using a MakeLDIF branch or
+ * template.
+ */
+public class TemplateEntry
+{
+ // The branch used to generate this entry (if it is associated with a branch).
+ private Branch branch;
+
+ // The DN for this template entry, if it is known.
+ private DN dn;
+
+ // The DN of the parent entry for this template entry, if it is available.
+ private DN parentDN;
+
+ // The set of attributes associated with this template entry, mapped from the
+ // lowercase name of the attribute to the list of generated values.
+ private LinkedHashMap<AttributeType,ArrayList<TemplateValue>> attributes;
+
+ // The template used to generate this entry (if it is associated with a
+ // template).
+ private Template template;
+
+
+
+ /**
+ * Creates a new template entry that will be associated with the provided
+ * branch.
+ *
+ * @param branch The branch to use when creating this template entry.
+ */
+ public TemplateEntry(Branch branch)
+ {
+ this.branch = branch;
+
+ dn = branch.getBranchDN();
+ template = null;
+ parentDN = null;
+ attributes = new LinkedHashMap<AttributeType,ArrayList<TemplateValue>>();
+ }
+
+
+
+ /**
+ * Creates a new template entry that will be associated with the provided
+ * template.
+ *
+ * @param template The template used to generate this entry.
+ * @param parentDN The DN of the parent entry for this template entry.
+ */
+ public TemplateEntry(Template template, DN parentDN)
+ {
+ this.template = template;
+ this.parentDN = parentDN;
+
+ dn = null;
+ branch = null;
+ attributes = new LinkedHashMap<AttributeType,ArrayList<TemplateValue>>();
+ }
+
+
+
+ /**
+ * Retrieves the branch used to generate this entry.
+ *
+ * @return The branch used to generate this entry, or <CODE>null</CODE> if it
+ * is associated with a template instead of a branch.
+ */
+ public Branch getBranch()
+ {
+ return branch;
+ }
+
+
+
+ /**
+ * Retrieves the template used to generate this entry.
+ *
+ * @return The template used to generate this entry, or <CODE>null</CODE> if
+ * it is associated with a branch instead of a template.
+ */
+ public Template getTemplate()
+ {
+ return template;
+ }
+
+
+
+ /**
+ * Retrieves the DN of the parent entry for this template entry.
+ *
+ * @return The DN of the parent entry for this template entry, or
+ * <CODE>null</CODE> if there is no parent DN.
+ */
+ public DN getParentDN()
+ {
+ return parentDN;
+ }
+
+
+
+ /**
+ * Retrieves teh DN for this template entry, if it is known.
+ *
+ * @return The DN for this template entry if it is known, or
+ * <CODE>null</CODE> if it cannot yet be determined.
+ */
+ public DN getDN()
+ {
+ if (dn == null)
+ {
+ AttributeType[] rdnAttributes = template.getRDNAttributes();
+ String[] rdnNames = new String[rdnAttributes.length];
+ AttributeValue[] rdnValues = new AttributeValue[rdnAttributes.length];
+
+ for (int i=0; i < rdnAttributes.length; i++)
+ {
+ TemplateValue v = getValue(rdnAttributes[i]);
+ if (v == null)
+ {
+ return null;
+ }
+
+ rdnNames[i] = rdnAttributes[i].getNameOrOID();
+ rdnValues[i] = new AttributeValue(rdnAttributes[i],
+ v.getValue().toString());
+ }
+
+ RDN[] parentComponents = parentDN.getRDNComponents();
+ RDN[] dnComponents = new RDN[parentComponents.length+1];
+
+ dnComponents[0] = new RDN(rdnAttributes, rdnNames, rdnValues);
+ System.arraycopy(parentComponents, 0, dnComponents, 1,
+ parentComponents.length);
+
+ dn = new DN(dnComponents);
+ }
+
+ return dn;
+ }
+
+
+
+ /**
+ * Indicates whether this entry contains one or more values for the specified
+ * attribute type.
+ *
+ * @param attributeType The attribute type for which to make the
+ * determination.
+ *
+ * @return <CODE>true</CODE> if this entry contains one or more values for
+ * the specified attribute type, or <CODE>false</CODE> if not.
+ */
+ public boolean hasAttribute(AttributeType attributeType)
+ {
+ return attributes.containsKey(attributeType);
+ }
+
+
+
+ /**
+ * Retrieves the value for the specified attribute, if defined. If the
+ * specified attribute has multiple values, then the first will be returned.
+ *
+ * @param attributeType The attribute type for which to retrieve the value.
+ *
+ * @return The value for the specified attribute, or <CODE>null</CODE> if
+ * there are no values for that attribute type.
+ */
+ public TemplateValue getValue(AttributeType attributeType)
+ {
+ ArrayList<TemplateValue> valueList = attributes.get(attributeType);
+ if ((valueList == null) || valueList.isEmpty())
+ {
+ return null;
+ }
+ else
+ {
+ return valueList.get(0);
+ }
+ }
+
+
+
+ /**
+ * Retrieves the set of values for the specified attribute, if defined.
+ *
+ * @param attributeType The attribute type for which to retrieve the set of
+ * values.
+ *
+ * @return The set of values for the specified attribute, or
+ * <CODE>null</CODE> if there are no values for that attribute type.
+ */
+ public List<TemplateValue> getValues(AttributeType attributeType)
+ {
+ ArrayList<TemplateValue> valueList = attributes.get(attributeType);
+ return valueList;
+ }
+
+
+
+ /**
+ * Adds the provided template value to this entry.
+ *
+ * @param value The value to add to this entry.
+ */
+ public void addValue(TemplateValue value)
+ {
+ ArrayList<TemplateValue> valueList =
+ attributes.get(value.getAttributeType());
+ if (valueList == null)
+ {
+ valueList = new ArrayList<TemplateValue>();
+ valueList.add(value);
+ attributes.put(value.getAttributeType(), valueList);
+ }
+ else
+ {
+ valueList.add(value);
+ }
+ }
+
+
+
+ /**
+ * Retrieves this template entry as an <CODE>Entry</CODE> object.
+ *
+ * @return The <CODE>Entry</CODE> object for this template entry.
+ */
+ public Entry toEntry()
+ {
+ // Process all of the attributes for this entry.
+ LinkedHashMap<ObjectClass,String> objectClasses =
+ new LinkedHashMap<ObjectClass,String>();
+ LinkedHashMap<AttributeType,List<Attribute>> userAttributes =
+ new LinkedHashMap<AttributeType,List<Attribute>>();
+ LinkedHashMap<AttributeType,List<Attribute>> operationalAttributes =
+ new LinkedHashMap<AttributeType,List<Attribute>>();
+
+ for (AttributeType t : attributes.keySet())
+ {
+ ArrayList<TemplateValue> valueList = attributes.get(t);
+ if (t.isObjectClassType())
+ {
+ for (TemplateValue v : valueList)
+ {
+ String ocName = toLowerCase(v.getValue().toString());
+ ObjectClass oc = DirectoryServer.getObjectClass(ocName, true);
+ objectClasses.put(oc, ocName);
+ }
+ }
+ else if (t.isOperational())
+ {
+ LinkedHashSet<AttributeValue> values =
+ new LinkedHashSet<AttributeValue>();
+ for (TemplateValue v : valueList)
+ {
+ values.add(new AttributeValue(t, v.getValue().toString()));
+ }
+
+ ArrayList<Attribute> attrList = new ArrayList<Attribute>(1);
+ attrList.add(new Attribute(t, t.getNameOrOID(), values));
+ operationalAttributes.put(t, attrList);
+ }
+ else
+ {
+ LinkedHashSet<AttributeValue> values =
+ new LinkedHashSet<AttributeValue>();
+ for (TemplateValue v : valueList)
+ {
+ values.add(new AttributeValue(t, v.getValue().toString()));
+ }
+
+ ArrayList<Attribute> attrList = new ArrayList<Attribute>(1);
+ attrList.add(new Attribute(t, t.getNameOrOID(), values));
+ userAttributes.put(t, attrList);
+ }
+ }
+
+ return new Entry(getDN(), objectClasses, userAttributes,
+ operationalAttributes);
+ }
+}
+
diff --git a/opends/src/server/org/opends/server/tools/makeldif/TemplateFile.java b/opends/src/server/org/opends/server/tools/makeldif/TemplateFile.java
new file mode 100644
index 0000000..8d76937
--- /dev/null
+++ b/opends/src/server/org/opends/server/tools/makeldif/TemplateFile.java
@@ -0,0 +1,1759 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ * Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ * Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.tools.makeldif;
+
+
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+import java.util.StringTokenizer;
+
+import org.opends.server.core.DirectoryServer;
+import org.opends.server.core.InitializationException;
+import org.opends.server.types.AttributeType;
+import org.opends.server.types.DN;
+
+import static org.opends.server.messages.MessageHandler.*;
+import static org.opends.server.messages.ToolMessages.*;
+import static org.opends.server.util.StaticUtils.*;
+
+
+
+/**
+ * This class defines a template file, which is a collection of constant
+ * definitions, branches, and templates.
+ */
+public class TemplateFile
+{
+ /**
+ * The name of the file holding the list of first names.
+ */
+ public static final String FIRST_NAME_FILE = "first.names";
+
+
+
+ /**
+ * The name of the file holding the list of last names.
+ */
+ public static final String LAST_NAME_FILE = "last.names";
+
+
+
+ // A map of the contents of various text files used during the parsing
+ // process, mapped from absolute path to the array of lines in the file.
+ private HashMap<String,String[]> fileLines;
+
+ // The index of the next first name value that should be used.
+ private int firstNameIndex;
+
+ // The index of the next last name value that should be used.
+ private int lastNameIndex;
+
+ // A counter used to keep track of the number of times that the larger of the
+ // first/last name list has been completed.
+ private int nameLoopCounter;
+
+ // A counter that will be used in case we have exhausted all possible first
+ // and last name combinations.
+ private int nameUniquenessCounter;
+
+ // The set of branch definitions for this template file.
+ private LinkedHashMap<DN,Branch> branches;
+
+ // The set of constant definitions for this template file.
+ private LinkedHashMap<String,String> constants;
+
+ // The set of registered tags for this template file.
+ private LinkedHashMap<String,Tag> registeredTags;
+
+ // The set of template definitions for this template file.
+ private LinkedHashMap<String,Template> templates;
+
+ // The random number generator for this template file.
+ private Random random;
+
+ // The next first name that should be used.
+ private String firstName;
+
+ // The next last name that should be used.
+ private String lastName;
+
+ // The resource path to use for filesystem elements that cannot be found
+ // anywhere else.
+ private String resourcePath;
+
+ // The path to the directory containing the template file, if available.
+ private String templatePath;
+
+ // The set of first names to use when generating the LDIF.
+ private String[] firstNames;
+
+ // The set of last names to use when generating the LDIF.
+ private String[] lastNames;
+
+
+
+ /**
+ * Creates a new, empty template file structure.
+ *
+ * @param resourcePath The path to the directory that may contain additional
+ * resource files needed during the LDIF generation
+ * process.
+ */
+ public TemplateFile(String resourcePath)
+ {
+ this(resourcePath, new Random());
+ }
+
+
+
+ /**
+ * Creates a new, empty template file structure.
+ *
+ *
+ * @param resourcePath The path to the directory that may contain additional
+ * resource files needed during the LDIF generation
+ * process.
+ * @param random The random number generator for this template file.
+ */
+ public TemplateFile(String resourcePath, Random random)
+ {
+ this.resourcePath = resourcePath;
+ this.random = random;
+
+ fileLines = new HashMap<String,String[]>();
+ branches = new LinkedHashMap<DN,Branch>();
+ constants = new LinkedHashMap<String,String>();
+ registeredTags = new LinkedHashMap<String,Tag>();
+ templates = new LinkedHashMap<String,Template>();
+ templatePath = null;
+ firstNames = new String[0];
+ lastNames = new String[0];
+ firstName = null;
+ lastName = null;
+ firstNameIndex = 0;
+ lastNameIndex = 0;
+ nameLoopCounter = 0;
+ nameUniquenessCounter = 1;
+
+ registerDefaultTags();
+
+ try
+ {
+ readNameFiles();
+ }
+ catch (IOException ioe)
+ {
+ // FIXME -- What to do here?
+ ioe.printStackTrace();
+ firstNames = new String[] { "John" };
+ lastNames = new String[] { "Doe" };
+ }
+ }
+
+
+
+ /**
+ * Retrieves the set of tags that have been registered. They will be in the
+ * form of a mapping between the name of the tag (in all lowercase characters)
+ * and the corresponding tag implementation.
+ *
+ * @return The set of tags that have been registered.
+ */
+ public Map<String,Tag> getTags()
+ {
+ return registeredTags;
+ }
+
+
+
+ /**
+ * Retrieves the tag with the specified name.
+ *
+ * @param lowerName The name of the tag to retrieve, in all lowercase
+ * characters.
+ *
+ * @return The requested tag, or <CODE>null</CODE> if no such tag has been
+ * registered.
+ */
+ public Tag getTag(String lowerName)
+ {
+ return registeredTags.get(lowerName);
+ }
+
+
+
+ /**
+ * Registers the specified class as a tag that may be used in templates.
+ *
+ * @param tagClass The fully-qualified name of the class to register as a
+ * tag.
+ *
+ * @throws MakeLDIFException If a problem occurs while attempting to
+ * register the specified tag.
+ */
+ public void registerTag(String tagClass)
+ throws MakeLDIFException
+ {
+ Class c;
+ try
+ {
+ c = Class.forName(tagClass);
+ }
+ catch (Exception e)
+ {
+ int msgID = MSGID_MAKELDIF_CANNOT_LOAD_TAG_CLASS;
+ String message = getMessage(msgID, tagClass);
+ throw new MakeLDIFException(msgID, message, e);
+ }
+
+ Tag t;
+ try
+ {
+ t = (Tag) c.newInstance();
+ }
+ catch (Exception e)
+ {
+ int msgID = MSGID_MAKELDIF_CANNOT_INSTANTIATE_TAG;
+ String message = getMessage(msgID, tagClass);
+ throw new MakeLDIFException(msgID, message, e);
+ }
+
+ String lowerName = toLowerCase(t.getName());
+ if (registeredTags.containsKey(lowerName))
+ {
+ int msgID = MSGID_MAKELDIF_CONFLICTING_TAG_NAME;
+ String message = getMessage(msgID, tagClass, t.getName());
+ throw new MakeLDIFException(msgID, message);
+ }
+ else
+ {
+ registeredTags.put(lowerName, t);
+ }
+ }
+
+
+
+ /**
+ * Registers the set of tags that will always be available for use in
+ * templates.
+ */
+ private void registerDefaultTags()
+ {
+ Class[] defaultTagClasses = new Class[]
+ {
+ AttributeValueTag.class,
+ DNTag.class,
+ FileTag.class,
+ FirstNameTag.class,
+ GUIDTag.class,
+ IfAbsentTag.class,
+ IfPresentTag.class,
+ LastNameTag.class,
+ ParentDNTag.class,
+ PresenceTag.class,
+ RandomTag.class,
+ RDNTag.class,
+ SequentialTag.class,
+ StaticTextTag.class,
+ UnderscoreDNTag.class,
+ UnderscoreParentDNTag.class
+ };
+
+ for (Class c : defaultTagClasses)
+ {
+ try
+ {
+ Tag t = (Tag) c.newInstance();
+ registeredTags.put(toLowerCase(t.getName()), t);
+ }
+ catch (Exception e)
+ {
+ // This should never happen.
+ e.printStackTrace();
+ }
+ }
+ }
+
+
+
+ /**
+ * Retrieves the set of constants defined for this template file.
+ *
+ * @return The set of constants defined for this template file.
+ */
+ public Map<String,String> getConstants()
+ {
+ return constants;
+ }
+
+
+
+ /**
+ * Retrieves the value of the constant with the specified name.
+ *
+ * @param lowerName The name of the constant to retrieve, in all lowercase
+ * characters.
+ *
+ * @return The value of the constant with the specified name, or
+ * <CODE>null</CODE> if there is no such constant.
+ */
+ public String getConstant(String lowerName)
+ {
+ return constants.get(lowerName);
+ }
+
+
+
+ /**
+ * Registers the provided constant for use in the template.
+ *
+ * @param name The name for the constant.
+ * @param value The value for the constant.
+ */
+ public void registerConstant(String name, String value)
+ {
+ constants.put(toLowerCase(name), value);
+ }
+
+
+
+ /**
+ * Retrieves the set of branches defined in this template file.
+ *
+ * @return The set of branches defined in this template file.
+ */
+ public Map<DN,Branch> getBranches()
+ {
+ return branches;
+ }
+
+
+
+ /**
+ * Retrieves the branch registered with the specified DN.
+ *
+ * @param branchDN The DN for which to retrieve the corresponding branch.
+ *
+ * @return The requested branch, or <CODE>null</CODE> if no such branch has
+ * been registered.
+ */
+ public Branch getBranch(DN branchDN)
+ {
+ return branches.get(branchDN);
+ }
+
+
+
+ /**
+ * Registers the provided branch in this template file.
+ *
+ * @param branch The branch to be registered.
+ */
+ public void registerBranch(Branch branch)
+ {
+ branches.put(branch.getBranchDN(), branch);
+ }
+
+
+
+ /**
+ * Retrieves the set of templates defined in this template file.
+ *
+ * @return The set of templates defined in this template file.
+ */
+ public Map<String,Template> getTemplates()
+ {
+ return templates;
+ }
+
+
+
+ /**
+ * Retrieves the template with the specified name.
+ *
+ * @param lowerName The name of the template to retrieve, in all lowercase
+ * characters.
+ *
+ * @return The requested template, or <CODE>null</CODE> if there is no such
+ * template.
+ */
+ public Template getTemplate(String lowerName)
+ {
+ return templates.get(lowerName);
+ }
+
+
+
+ /**
+ * Registers the provided template for use in this template file.
+ *
+ * @param template The template to be registered.
+ */
+ public void registerTemplate(Template template)
+ {
+ templates.put(toLowerCase(template.getName()), template);
+ }
+
+
+
+ /**
+ * Retrieves the random number generator for this template file.
+ *
+ * @return The random number generator for this template file.
+ */
+ public Random getRandom()
+ {
+ return random;
+ }
+
+
+
+ /**
+ * Reads the contents of the first and last name files into the appropriate
+ * arrays and sets up the associated index pointers.
+ *
+ * @throws IOException If a problem occurs while reading either of the
+ * files.
+ */
+ private void readNameFiles()
+ throws IOException
+ {
+ File f = getFile(FIRST_NAME_FILE);
+ ArrayList<String> nameList = new ArrayList<String>();
+ BufferedReader reader = new BufferedReader(new FileReader(f));
+ while (true)
+ {
+ String line = reader.readLine();
+ if (line == null)
+ {
+ break;
+ }
+ else
+ {
+ nameList.add(line);
+ }
+ }
+ reader.close();
+ firstNames = new String[nameList.size()];
+ nameList.toArray(firstNames);
+
+ f = getFile(LAST_NAME_FILE);
+ nameList = new ArrayList<String>();
+ reader = new BufferedReader(new FileReader(f));
+ while (true)
+ {
+ String line = reader.readLine();
+ if (line == null)
+ {
+ break;
+ }
+ else
+ {
+ nameList.add(line);
+ }
+ }
+ reader.close();
+ lastNames = new String[nameList.size()];
+ nameList.toArray(lastNames);
+ }
+
+
+
+ /**
+ * Updates the first and last name indexes to choose new values. The
+ * algorithm used is designed to ensure that the combination of first and last
+ * names will never be repeated. It depends on the number of first names and
+ * the number of last names being relatively prime. This method should be
+ * called before beginning generation of each template entry.
+ */
+ public void nextFirstAndLastNames()
+ {
+ firstName = firstNames[firstNameIndex++];
+ lastName = lastNames[lastNameIndex++];
+
+
+ // If we've already exhausted every possible combination, then append an
+ // integer to the last name.
+ if (nameUniquenessCounter > 1)
+ {
+ lastName += nameUniquenessCounter;
+ }
+
+ if (firstNameIndex >= firstNames.length)
+ {
+ // We're at the end of the first name list, so start over. If the first
+ // name list is larger than the last name list, then we'll also need to
+ // set the last name index to the next loop counter position.
+ firstNameIndex = 0;
+ if (firstNames.length > lastNames.length)
+ {
+ lastNameIndex = ++nameLoopCounter;
+ if (lastNameIndex >= lastNames.length)
+ {
+ lastNameIndex = 0;
+ nameUniquenessCounter++;
+ }
+ }
+ }
+ else if (lastNameIndex >= lastNames.length)
+ {
+ // We're at the end of the last name list, so start over. If the last
+ // name list is larger than the first name list, then we'll also need to
+ // set the first name index to the next loop counter position.
+ lastNameIndex = 0;
+ if (lastNames.length > firstNames.length)
+ {
+ firstNameIndex = ++nameLoopCounter;
+ if (firstNameIndex >= firstNames.length)
+ {
+ firstNameIndex = 0;
+ nameUniquenessCounter++;
+ }
+ }
+ }
+ }
+
+
+
+ /**
+ * Retrieves the first name value that should be used for the current entry.
+ *
+ * @return The first name value that should be used for the current entry.
+ */
+ public String getFirstName()
+ {
+ return firstName;
+ }
+
+
+
+ /**
+ * Retrieves the last name value that should be used for the current entry.
+ *
+ * @return The last name value that should be used for the current entry.
+ */
+ public String getLastName()
+ {
+ return lastName;
+ }
+
+
+
+ /**
+ * Parses the contents of the specified file as a MakeLDIF template file
+ * definition.
+ *
+ * @param filename The name of the file containing the template data.
+ * @param warnings A list into which any warnings identified may be placed.
+ *
+ * @throws IOException If a problem occurs while attempting to read data
+ * from the specified file.
+ *
+ * @throws InitializationException If a problem occurs while initializing
+ * any of the MakeLDIF components.
+ *
+ * @throws MakeLDIFException If any other problem occurs while parsing the
+ * template file.
+ */
+ public void parse(String filename, List<String> warnings)
+ throws IOException, InitializationException, MakeLDIFException
+ {
+ ArrayList<String> fileLines = new ArrayList<String>();
+
+ templatePath = null;
+ File f = getFile(filename);
+ if ((f == null) || (! f.exists()))
+ {
+ int msgID = MSGID_MAKELDIF_COULD_NOT_FIND_TEMPLATE_FILE;
+ String message = getMessage(msgID, filename);
+ throw new IOException(message);
+ }
+ else
+ {
+ templatePath = f.getParentFile().getAbsolutePath();
+ }
+
+ BufferedReader reader = new BufferedReader(new FileReader(f));
+ while (true)
+ {
+ String line = reader.readLine();
+ if (line == null)
+ {
+ break;
+ }
+ else
+ {
+ fileLines.add(line);
+ }
+ }
+
+ reader.close();
+
+ String[] lines = new String[fileLines.size()];
+ fileLines.toArray(lines);
+ parse(lines, warnings);
+ }
+
+
+
+ /**
+ * Parses the data read from the provided input stream as a MakeLDIF template
+ * file definition.
+ *
+ * @param inputStream The input stream from which to read the template file
+ * data.
+ * @param warnings A list into which any warnings identified may be
+ * placed.
+ *
+ * @throws IOException If a problem occurs while attempting to read data
+ * from the provided input stream.
+ *
+ * @throws InitializationException If a problem occurs while initializing
+ * any of the MakeLDIF components.
+ *
+ * @throws MakeLDIFException If any other problem occurs while parsing the
+ * template file.
+ */
+ public void parse(InputStream inputStream, List<String> warnings)
+ throws IOException, InitializationException, MakeLDIFException
+ {
+ ArrayList<String> fileLines = new ArrayList<String>();
+
+ BufferedReader reader =
+ new BufferedReader(new InputStreamReader(inputStream));
+ while (true)
+ {
+ String line = reader.readLine();
+ if (line == null)
+ {
+ break;
+ }
+ else
+ {
+ fileLines.add(line);
+ }
+ }
+
+ reader.close();
+
+ String[] lines = new String[fileLines.size()];
+ fileLines.toArray(lines);
+ parse(lines, warnings);
+ }
+
+
+
+ /**
+ * Parses the provided data as a MakeLDIF template file definition.
+ *
+ * @param lines The lines that make up the template file.
+ * @param warnings A list into which any warnings identified may be placed.
+ *
+ * @throws InitializationException If a problem occurs while initializing
+ * any of the MakeLDIF components.
+ *
+ * @throws MakeLDIFException If any other problem occurs while parsing the
+ * template file.
+ */
+ public void parse(String[] lines, List<String> warnings)
+ throws InitializationException, MakeLDIFException
+ {
+ // Create temporary variables that will be used to hold the data read.
+ LinkedHashMap<String,Tag> templateFileIncludeTags =
+ new LinkedHashMap<String,Tag>();
+ LinkedHashMap<String,String> templateFileConstants =
+ new LinkedHashMap<String,String>();
+ LinkedHashMap<DN,Branch> templateFileBranches =
+ new LinkedHashMap<DN,Branch>();
+ LinkedHashMap<String,Template> templateFileTemplates =
+ new LinkedHashMap<String,Template>();
+
+ for (int lineNumber=0; lineNumber < lines.length; lineNumber++)
+ {
+ String line = lines[lineNumber];
+
+ // See if there are any constant definitions in the line that need to be
+ // replaced. We'll do that first before any further processing.
+ int closePos = line.lastIndexOf(']');
+ if (closePos > 0)
+ {
+ StringBuilder lineBuffer = new StringBuilder(line);
+ int openPos = line.lastIndexOf('[', closePos);
+ if (openPos >= 0)
+ {
+ String constantName =
+ toLowerCase(line.substring(openPos+1, closePos));
+ String constantValue = templateFileConstants.get(constantName);
+ if (constantValue == null)
+ {
+ int msgID = MSGID_MAKELDIF_WARNING_UNDEFINED_CONSTANT;
+ String message = getMessage(msgID, constantName, lineNumber);
+ warnings.add(message);
+ }
+ else
+ {
+ lineBuffer.replace(openPos, closePos+1, constantValue);
+ }
+ }
+
+ line = lineBuffer.toString();
+ }
+
+
+ String lowerLine = toLowerCase(line);
+ if ((line.length() == 0) || line.startsWith("#"))
+ {
+ // This is a comment or a blank line, so we'll ignore it.
+ continue;
+ }
+ else if (lowerLine.startsWith("include "))
+ {
+ // This should be an include definition. The next element should be the
+ // name of the class. Load and instantiate it and make sure there are
+ // no conflicts.
+ String className = line.substring(8).trim();
+
+ Class tagClass;
+ try
+ {
+ tagClass = Class.forName(className);
+ }
+ catch (Exception e)
+ {
+ int msgID = MSGID_MAKELDIF_CANNOT_LOAD_TAG_CLASS;
+ String message = getMessage(msgID, className);
+ throw new MakeLDIFException(msgID, message, e);
+ }
+
+ Tag tag;
+ try
+ {
+ tag = (Tag) tagClass.newInstance();
+ }
+ catch (Exception e)
+ {
+ int msgID = MSGID_MAKELDIF_CANNOT_INSTANTIATE_TAG;
+ String message = getMessage(msgID, className);
+ throw new MakeLDIFException(msgID, message, e);
+ }
+
+ String lowerName = toLowerCase(tag.getName());
+ if (registeredTags.containsKey(lowerName) ||
+ templateFileIncludeTags.containsKey(lowerName))
+ {
+ int msgID = MSGID_MAKELDIF_CONFLICTING_TAG_NAME;
+ String message = getMessage(msgID, className, tag.getName());
+ throw new MakeLDIFException(msgID, message);
+ }
+
+ templateFileIncludeTags.put(lowerName, tag);
+ }
+ else if (lowerLine.startsWith("define "))
+ {
+ // This should be a constant definition. The rest of the line should
+ // contain the constant name, an equal sign, and the constant value.
+ int equalPos = line.indexOf('=', 7);
+ if (equalPos < 0)
+ {
+ int msgID = MSGID_MAKELDIF_DEFINE_MISSING_EQUALS;
+ String message = getMessage(msgID, lineNumber);
+ throw new MakeLDIFException(msgID, message);
+ }
+
+ String name = line.substring(7, equalPos).trim();
+ if (name.length() == 0)
+ {
+ int msgID = MSGID_MAKELDIF_DEFINE_NAME_EMPTY;
+ String message = getMessage(msgID, lineNumber);
+ throw new MakeLDIFException(msgID, message);
+ }
+
+ String lowerName = toLowerCase(name);
+ if (templateFileConstants.containsKey(lowerName))
+ {
+ int msgID = MSGID_MAKELDIF_CONFLICTING_CONSTANT_NAME;
+ String message = getMessage(msgID, name, lineNumber);
+ throw new MakeLDIFException(msgID, message);
+ }
+
+ String value = line.substring(equalPos+1);
+ if (value.length() == 0)
+ {
+ int msgID = MSGID_MAKELDIF_WARNING_DEFINE_VALUE_EMPTY;
+ String message = getMessage(msgID, name, lineNumber);
+ warnings.add(message);
+ }
+
+ templateFileConstants.put(lowerName, value);
+ }
+ else if (lowerLine.startsWith("branch: "))
+ {
+ int startLineNumber = lineNumber;
+ ArrayList<String> lineList = new ArrayList<String>();
+ lineList.add(line);
+ while (true)
+ {
+ lineNumber++;
+ if (lineNumber >= lines.length)
+ {
+ break;
+ }
+
+ line = lines[lineNumber];
+ if (line.length() == 0)
+ {
+ break;
+ }
+ else
+ {
+ // See if there are any constant definitions in the line that need
+ // to be replaced. We'll do that first before any further
+ // processing.
+ closePos = line.lastIndexOf(']');
+ if (closePos > 0)
+ {
+ StringBuilder lineBuffer = new StringBuilder(line);
+ int openPos = line.lastIndexOf('[', closePos);
+ if (openPos >= 0)
+ {
+ String constantName =
+ toLowerCase(line.substring(openPos+1, closePos));
+ String constantValue = templateFileConstants.get(constantName);
+ if (constantValue == null)
+ {
+ int msgID = MSGID_MAKELDIF_WARNING_UNDEFINED_CONSTANT;
+ String message = getMessage(msgID, constantName, lineNumber);
+ warnings.add(message);
+ }
+ else
+ {
+ lineBuffer.replace(openPos, closePos+1, constantValue);
+ }
+ }
+
+ line = lineBuffer.toString();
+ }
+
+ lineList.add(line);
+ }
+ }
+
+ String[] branchLines = new String[lineList.size()];
+ lineList.toArray(branchLines);
+
+ Branch b = parseBranchDefinition(branchLines, lineNumber,
+ templateFileIncludeTags,
+ templateFileConstants, warnings);
+ DN branchDN = b.getBranchDN();
+ if (templateFileBranches.containsKey(branchDN))
+ {
+ int msgID = MSGID_MAKELDIF_CONFLICTING_BRANCH_DN;
+ String message = getMessage(msgID, String.valueOf(branchDN),
+ startLineNumber);
+ throw new MakeLDIFException(msgID, message);
+ }
+ else
+ {
+ templateFileBranches.put(branchDN, b);
+ }
+ }
+ else if (lowerLine.startsWith("template: "))
+ {
+ int startLineNumber = lineNumber;
+ ArrayList<String> lineList = new ArrayList<String>();
+ lineList.add(line);
+ while (true)
+ {
+ lineNumber++;
+ if (lineNumber >= lines.length)
+ {
+ break;
+ }
+
+ line = lines[lineNumber];
+ if (line.length() == 0)
+ {
+ break;
+ }
+ else
+ {
+ // See if there are any constant definitions in the line that need
+ // to be replaced. We'll do that first before any further
+ // processing.
+ closePos = line.lastIndexOf(']');
+ if (closePos > 0)
+ {
+ StringBuilder lineBuffer = new StringBuilder(line);
+ int openPos = line.lastIndexOf('[', closePos);
+ if (openPos >= 0)
+ {
+ String constantName =
+ toLowerCase(line.substring(openPos+1, closePos));
+ String constantValue = templateFileConstants.get(constantName);
+ if (constantValue == null)
+ {
+ int msgID = MSGID_MAKELDIF_WARNING_UNDEFINED_CONSTANT;
+ String message = getMessage(msgID, constantName, lineNumber);
+ warnings.add(message);
+ }
+ else
+ {
+ lineBuffer.replace(openPos, closePos+1, constantValue);
+ }
+ }
+
+ line = lineBuffer.toString();
+ }
+
+ lineList.add(line);
+ }
+ }
+
+ String[] templateLines = new String[lineList.size()];
+ lineList.toArray(templateLines);
+
+ Template t = parseTemplateDefinition(templateLines, lineNumber,
+ templateFileIncludeTags,
+ templateFileConstants, warnings);
+ String lowerName = toLowerCase(t.getName());
+ if (templateFileTemplates.containsKey(lowerName))
+ {
+ int msgID = MSGID_MAKELDIF_CONFLICTING_TEMPLATE_NAME;
+ String message = getMessage(msgID, String.valueOf(t.getName()),
+ startLineNumber);
+ throw new MakeLDIFException(msgID, message);
+ }
+ else
+ {
+ templateFileTemplates.put(lowerName, t);
+ }
+ }
+ else
+ {
+ int msgID = MSGID_MAKELDIF_UNEXPECTED_TEMPLATE_FILE_LINE;
+ String message = getMessage(msgID, line, lineNumber);
+ throw new MakeLDIFException(msgID, message);
+ }
+ }
+
+
+ // If we've gotten here, then we're almost done. We just need to finalize
+ // the branch and template definitions and then update the template file
+ // variables.
+ for (Branch b : templateFileBranches.values())
+ {
+ b.completeBranchInitialization(templateFileTemplates);
+ }
+
+ for (Template t : templateFileTemplates.values())
+ {
+ t.completeTemplateInitialization(templateFileTemplates);
+ }
+
+ registeredTags.putAll(templateFileIncludeTags);
+ constants.putAll(templateFileConstants);
+ branches.putAll(templateFileBranches);
+ templates.putAll(templateFileTemplates);
+ }
+
+
+
+ /**
+ * Parses the information contained in the provided set of lines as a MakeLDIF
+ * branch definition.
+ *
+ * @param branchLines The set of lines containing the branch definition.
+ * @param startLineNumber The line number in the template file on which the
+ * first of the branch lines appears.
+ * @param tags The set of defined tags from the template file.
+ * Note that this does not include the tags that are
+ * always registered by default.
+ * @param constants The set of constants defined in the template file.
+ * @param warnings A list into which any warnings identified may be
+ * placed.
+ *
+ * @return The decoded branch definition.
+ *
+ * @throws InitializationException If a problem occurs while initializing
+ * any of the branch elements.
+ *
+ * @throws MakeLDIFException If some other problem occurs during processing.
+ */
+ private Branch parseBranchDefinition(String[] branchLines,
+ int startLineNumber,
+ LinkedHashMap<String,Tag> tags,
+ LinkedHashMap<String,String> constants,
+ List<String> warnings)
+ throws InitializationException, MakeLDIFException
+ {
+ // The first line must be "branch: " followed by the branch DN.
+ String dnString = branchLines[0].substring(8).trim();
+ DN branchDN;
+ try
+ {
+ branchDN = DN.decode(dnString);
+ }
+ catch (Exception e)
+ {
+ int msgID = MSGID_MAKELDIF_CANNOT_DECODE_BRANCH_DN;
+ String message = getMessage(msgID, dnString, startLineNumber);
+ throw new MakeLDIFException(msgID, message);
+ }
+
+
+ // Create a new branch that will be used for the verification process.
+ Branch branch = new Branch(this, branchDN);
+
+ for (int i=1; i < branchLines.length; i++)
+ {
+ String line = branchLines[i];
+ String lowerLine = toLowerCase(line);
+ int lineNumber = startLineNumber + i;
+
+ if (lowerLine.startsWith("#"))
+ {
+ // It's a comment, so we should ignore it.
+ continue;
+ }
+ else if (lowerLine.startsWith("subordinatetemplate: "))
+ {
+ // It's a subordinate template, so we'll want to parse the name and the
+ // number of entries.
+ int colonPos = line.indexOf(':', 21);
+ if (colonPos <= 21)
+ {
+ int msgID = MSGID_MAKELDIF_BRANCH_SUBORDINATE_TEMPLATE_NO_COLON;
+ String message = getMessage(msgID, lineNumber, dnString);
+ throw new MakeLDIFException(msgID, message);
+ }
+
+ String templateName = line.substring(21, colonPos).trim();
+
+ int numEntries;
+ try
+ {
+ numEntries = Integer.parseInt(line.substring(colonPos+1).trim());
+ if (numEntries < 0)
+ {
+ int msgID = MSGID_MAKELDIF_BRANCH_SUBORDINATE_INVALID_NUM_ENTRIES;
+ String message = getMessage(msgID, lineNumber, dnString, numEntries,
+ templateName);
+ throw new MakeLDIFException(msgID, message);
+ }
+ else if (numEntries == 0)
+ {
+ int msgID = MSGID_MAKELDIF_BRANCH_SUBORDINATE_ZERO_ENTRIES;
+ String message = getMessage(msgID, lineNumber, dnString,
+ templateName);
+ warnings.add(message);
+ }
+
+ branch.addSubordinateTemplate(templateName, numEntries);
+ }
+ catch (NumberFormatException nfe)
+ {
+ int msgID = MSGID_MAKELDIF_BRANCH_SUBORDINATE_CANT_PARSE_NUMENTRIES;
+ String message = getMessage(msgID, templateName, lineNumber,
+ dnString);
+ throw new MakeLDIFException(msgID, message);
+ }
+ }
+ else
+ {
+ TemplateLine templateLine = parseTemplateLine(line, lowerLine,
+ lineNumber, branch, null,
+ tags, warnings);
+ branch.addExtraLine(templateLine);
+ }
+ }
+
+ return branch;
+ }
+
+
+
+ /**
+ * Parses the information contained in the provided set of lines as a MakeLDIF
+ * template definition.
+ *
+ * @param templateLines The set of lines containing the template
+ * definition.
+ * @param startLineNumber The line number in the template file on which the
+ * first of the template lines appears.
+ * @param tags The set of defined tags from the template file.
+ * Note that this does not include the tags that are
+ * always registered by default.
+ * @param constants The set of constants defined in the template file.
+ * @param warnings A list into which any warnings identified may be
+ * placed.
+ *
+ * @return The decoded template definition.
+ *
+ * @throws InitializationException If a problem occurs while initializing
+ * any of the template elements.
+ *
+ * @throws MakeLDIFException If some other problem occurs during processing.
+ */
+ private Template parseTemplateDefinition(String[] templateLines,
+ int startLineNumber,
+ LinkedHashMap<String,Tag> tags,
+ LinkedHashMap<String,String>
+ constants,
+ List<String> warnings)
+ throws InitializationException, MakeLDIFException
+ {
+ // The first line must be "template: " followed by the template name.
+ String templateName = templateLines[0].substring(10).trim();
+
+
+ // The next line may start with either "extends: ", "rdnAttr: ", or
+ // "subordinateTemplate: ". Keep reading until we find something that's
+ // not one of those.
+ int arrayLineNumber = 1;
+ String parentTemplateName = null;
+ AttributeType[] rdnAttributes = null;
+ ArrayList<String> subTemplateNames = new ArrayList<String>();
+ ArrayList<Integer> entriesPerTemplate = new ArrayList<Integer>();
+ for ( ; arrayLineNumber < templateLines.length; arrayLineNumber++)
+ {
+ int lineNumber = startLineNumber + arrayLineNumber;
+ String line = templateLines[arrayLineNumber];
+ String lowerLine = toLowerCase(line);
+
+ if (lowerLine.startsWith("#"))
+ {
+ // It's a comment. Ignore it.
+ continue;
+ }
+ else if (lowerLine.startsWith("extends: "))
+ {
+ parentTemplateName = line.substring(9).trim();
+ }
+ else if (lowerLine.startsWith("rdnattr: "))
+ {
+ // This is the set of RDN attributes. If there are multiple, they may
+ // be separated by plus signs.
+ ArrayList<AttributeType> attrList = new ArrayList<AttributeType>();
+ String rdnAttrNames = lowerLine.substring(9).trim();
+ StringTokenizer tokenizer = new StringTokenizer(rdnAttrNames, "+");
+ while (tokenizer.hasMoreTokens())
+ {
+ attrList.add(DirectoryServer.getAttributeType(tokenizer.nextToken(),
+ true));
+ }
+
+ rdnAttributes = new AttributeType[attrList.size()];
+ attrList.toArray(rdnAttributes);
+ }
+ else if (lowerLine.startsWith("subordinatetemplate: "))
+ {
+ // It's a subordinate template, so we'll want to parse the name and the
+ // number of entries.
+ int colonPos = line.indexOf(':', 21);
+ if (colonPos <= 21)
+ {
+ int msgID = MSGID_MAKELDIF_TEMPLATE_SUBORDINATE_TEMPLATE_NO_COLON;
+ String message = getMessage(msgID, lineNumber, templateName);
+ throw new MakeLDIFException(msgID, message);
+ }
+
+ String subTemplateName = line.substring(21, colonPos).trim();
+
+ int numEntries;
+ try
+ {
+ numEntries = Integer.parseInt(line.substring(colonPos+1).trim());
+ if (numEntries < 0)
+ {
+ int msgID = MSGID_MAKELDIF_TEMPLATE_SUBORDINATE_INVALID_NUM_ENTRIES;
+ String message = getMessage(msgID, lineNumber, templateName,
+ numEntries, subTemplateName);
+ throw new MakeLDIFException(msgID, message);
+ }
+ else if (numEntries == 0)
+ {
+ int msgID = MSGID_MAKELDIF_TEMPLATE_SUBORDINATE_ZERO_ENTRIES;
+ String message = getMessage(msgID, lineNumber, templateName,
+ subTemplateName);
+ warnings.add(message);
+ }
+
+ subTemplateNames.add(subTemplateName);
+ entriesPerTemplate.add(numEntries);
+ }
+ catch (NumberFormatException nfe)
+ {
+ int msgID = MSGID_MAKELDIF_TEMPLATE_SUBORDINATE_CANT_PARSE_NUMENTRIES;
+ String message = getMessage(msgID, subTemplateName, lineNumber,
+ templateName);
+ throw new MakeLDIFException(msgID, message);
+ }
+ }
+ else
+ {
+ // It's something we don't recognize, so it must be a template line.
+ break;
+ }
+ }
+
+ // Create a new template that will be used for the verification process.
+ String[] subordinateTemplateNames = new String[subTemplateNames.size()];
+ subTemplateNames.toArray(subordinateTemplateNames);
+
+ int[] numEntriesPerTemplate = new int[entriesPerTemplate.size()];
+ for (int i=0; i < numEntriesPerTemplate.length; i++)
+ {
+ numEntriesPerTemplate[i] = entriesPerTemplate.get(i);
+ }
+
+ Template template = new Template(this, templateName, rdnAttributes,
+ subordinateTemplateNames,
+ numEntriesPerTemplate);
+
+ for ( ; arrayLineNumber < templateLines.length; arrayLineNumber++)
+ {
+ String line = templateLines[arrayLineNumber];
+ String lowerLine = toLowerCase(line);
+ int lineNumber = startLineNumber + arrayLineNumber;
+
+ if (lowerLine.startsWith("#"))
+ {
+ // It's a comment, so we should ignore it.
+ continue;
+ }
+ else
+ {
+ TemplateLine templateLine = parseTemplateLine(line, lowerLine,
+ lineNumber, null,
+ template, tags, warnings);
+ template.addTemplateLine(templateLine);
+ }
+ }
+
+ return template;
+ }
+
+
+
+ /**
+ * Parses the provided line as a template line. Note that exactly one of the
+ * branch or template arguments must be non-null and the other must be null.
+ *
+ * @param line The text of the template line.
+ * @param lowerLine The template line in all lowercase characters.
+ * @param lineNumber The line number on which the template line appears.
+ * @param branch The branch with which the template line is associated.
+ * @param template The template with which the template line is
+ * associated.
+ * @param tags The set of defined tags from the template file. Note
+ * that this does not include the tags that are always
+ * registered by default.
+ * @param warnings A list into which any warnings identified may be
+ * placed.
+ *
+ * @return The template line that has been parsed.
+ *
+ * @throws InitializationException If a problem occurs while initializing
+ * any of the template elements.
+ *
+ * @throws MakeLDIFException If some other problem occurs during processing.
+ */
+ private TemplateLine parseTemplateLine(String line, String lowerLine,
+ int lineNumber, Branch branch,
+ Template template,
+ LinkedHashMap<String,Tag> tags,
+ List<String> warnings)
+ throws InitializationException, MakeLDIFException
+ {
+ // The first component must be the attribute type, followed by a colon.
+ int colonPos = lowerLine.indexOf(':');
+ if (colonPos < 0)
+ {
+ if (branch == null)
+ {
+ int msgID = MSGID_MAKELDIF_NO_COLON_IN_TEMPLATE_LINE;
+ String message = getMessage(msgID, lineNumber, template.getName());
+ throw new MakeLDIFException(msgID, message);
+ }
+ else
+ {
+ int msgID = MSGID_MAKELDIF_NO_COLON_IN_BRANCH_EXTRA_LINE;
+ String message = getMessage(msgID, lineNumber,
+ String.valueOf(branch.getBranchDN()));
+ throw new MakeLDIFException(msgID, message);
+ }
+ }
+ else if (colonPos == 0)
+ {
+ if (branch == null)
+ {
+ int msgID = MSGID_MAKELDIF_NO_ATTR_IN_TEMPLATE_LINE;
+ String message = getMessage(msgID, lineNumber, template.getName());
+ throw new MakeLDIFException(msgID, message);
+ }
+ else
+ {
+ int msgID = MSGID_MAKELDIF_NO_ATTR_IN_BRANCH_EXTRA_LINE;
+ String message = getMessage(msgID, lineNumber,
+ String.valueOf(branch.getBranchDN()));
+ throw new MakeLDIFException(msgID, message);
+ }
+ }
+
+ AttributeType attributeType =
+ DirectoryServer.getAttributeType(lowerLine.substring(0, colonPos),
+ true);
+
+
+ // First, find the position of the first non-blank character in the line.
+ int length = line.length();
+ int pos = colonPos + 1;
+ while ((pos < length) && (lowerLine.charAt(pos) == ' '))
+ {
+ pos++;
+ }
+
+ if (pos >= length)
+ {
+ // We've hit the end of the line with no value. We'll allow it, but add a
+ // warning.
+ if (branch == null)
+ {
+ int msgID = MSGID_MAKELDIF_NO_VALUE_IN_TEMPLATE_LINE;
+ String message = getMessage(msgID, lineNumber, template.getName());
+ warnings.add(message);
+ }
+ else
+ {
+ int msgID = MSGID_MAKELDIF_NO_VALUE_IN_BRANCH_EXTRA_LINE;
+ String message = getMessage(msgID, lineNumber,
+ String.valueOf(branch.getBranchDN()));
+ warnings.add(message);
+ }
+ }
+
+
+ // Define constants that specify what we're currently parsing.
+ final int PARSING_STATIC_TEXT = 0;
+ final int PARSING_REPLACEMENT_TAG = 1;
+ final int PARSING_ATTRIBUTE_TAG = 2;
+
+ int phase = PARSING_STATIC_TEXT;
+
+
+ ArrayList<Tag> tagList = new ArrayList<Tag>();
+ StringBuilder buffer = new StringBuilder();
+ for ( ; pos < length; pos++)
+ {
+ char c = line.charAt(pos);
+ switch (phase)
+ {
+ case PARSING_STATIC_TEXT:
+ switch (c)
+ {
+ case '<':
+ if (buffer.length() > 0)
+ {
+ StaticTextTag t = new StaticTextTag();
+ String[] args = new String[] { buffer.toString() };
+ t.initializeForBranch(this, branch, args, lineNumber,
+ warnings);
+ tagList.add(t);
+ buffer = new StringBuilder();
+ }
+
+ phase = PARSING_REPLACEMENT_TAG;
+ break;
+ case '{':
+ if (buffer.length() > 0)
+ {
+ StaticTextTag t = new StaticTextTag();
+ String[] args = new String[] { buffer.toString() };
+ t.initializeForBranch(this, branch, args, lineNumber,
+ warnings);
+ tagList.add(t);
+ buffer = new StringBuilder();
+ }
+
+ phase = PARSING_ATTRIBUTE_TAG;
+ break;
+ default:
+ buffer.append(c);
+ }
+ break;
+
+ case PARSING_REPLACEMENT_TAG:
+ switch (c)
+ {
+ case '>':
+ Tag t = parseReplacementTag(buffer.toString(), branch, template,
+ lineNumber, tags, warnings);
+ tagList.add(t);
+ buffer = new StringBuilder();
+
+ phase = PARSING_STATIC_TEXT;
+ break;
+ default:
+ buffer.append(c);
+ break;
+ }
+ break;
+
+ case PARSING_ATTRIBUTE_TAG:
+ switch (c)
+ {
+ case '}':
+ Tag t = parseAttributeTag(buffer.toString(), branch, template,
+ lineNumber, warnings);
+ tagList.add(t);
+ buffer = new StringBuilder();
+
+ phase = PARSING_STATIC_TEXT;
+ break;
+ default:
+ buffer.append(c);
+ break;
+ }
+ break;
+ }
+ }
+
+ if (phase == PARSING_STATIC_TEXT)
+ {
+ if (buffer.length() > 0)
+ {
+ StaticTextTag t = new StaticTextTag();
+ String[] args = new String[] { buffer.toString() };
+ t.initializeForBranch(this, branch, args, lineNumber, warnings);
+ tagList.add(t);
+ }
+ }
+ else
+ {
+ int msgID = MSGID_MAKELDIF_INCOMPLETE_TAG;
+ String message = getMessage(msgID, lineNumber);
+ throw new InitializationException(msgID, message);
+ }
+
+ Tag[] tagArray = new Tag[tagList.size()];
+ tagList.toArray(tagArray);
+ return new TemplateLine(attributeType, lineNumber, tagArray);
+ }
+
+
+
+ /**
+ * Parses the provided string as a replacement tag. Exactly one of the branch
+ * or template must be null, and the other must be non-null.
+ *
+ * @param tagString The string containing the encoded tag.
+ * @param branch The branch in which this tag appears.
+ * @param template The template in which this tag appears.
+ * @param lineNumber The line number on which this tag appears in the
+ * template file.
+ * @param tags The set of defined tags from the template file. Note
+ * that this does not include the tags that are always
+ * registered by default.
+ * @param warnings A list into which any warnings identified may be
+ * placed.
+ *
+ * @return The replacement tag parsed from the provided string.
+ *
+ * @throws InitializationException If a problem occurs while initializing
+ * the tag.
+ *
+ * @throws MakeLDIFException If some other problem occurs during processing.
+ */
+ private Tag parseReplacementTag(String tagString, Branch branch,
+ Template template, int lineNumber,
+ LinkedHashMap<String,Tag> tags,
+ List<String> warnings)
+ throws InitializationException, MakeLDIFException
+ {
+ // The components of the replacement tag will be separated by colons, with
+ // the first being the tag name and the remainder being arguments.
+ StringTokenizer tokenizer = new StringTokenizer(tagString, ":");
+ String tagName = tokenizer.nextToken().trim();
+ String lowerTagName = toLowerCase(tagName);
+
+ Tag t = getTag(lowerTagName);
+ if (t == null)
+ {
+ t = tags.get(lowerTagName);
+ if (t == null)
+ {
+ int msgID = MSGID_MAKELDIF_NO_SUCH_TAG;
+ String message = getMessage(msgID, tagName, lineNumber);
+ throw new MakeLDIFException(msgID, message);
+ }
+ }
+
+ ArrayList<String> argList = new ArrayList<String>();
+ while (tokenizer.hasMoreTokens())
+ {
+ argList.add(tokenizer.nextToken().trim());
+ }
+
+ String[] args = new String[argList.size()];
+ argList.toArray(args);
+
+
+ Tag newTag;
+ try
+ {
+ newTag = t.getClass().newInstance();
+ }
+ catch (Exception e)
+ {
+ int msgID = MSGID_MAKELDIF_CANNOT_INSTANTIATE_NEW_TAG;
+ String message = getMessage(msgID, tagName, lineNumber,
+ String.valueOf(e));
+ throw new MakeLDIFException(msgID, message, e);
+ }
+
+
+ if (branch == null)
+ {
+ newTag.initializeForTemplate(this, template, args, lineNumber, warnings);
+ }
+ else
+ {
+ if (newTag.allowedInBranch())
+ {
+ newTag.initializeForBranch(this, branch, args, lineNumber, warnings);
+ }
+ else
+ {
+ int msgID = MSGID_MAKELDIF_TAG_NOT_ALLOWED_IN_BRANCH;
+ String message = getMessage(msgID, newTag.getName(), lineNumber);
+ throw new MakeLDIFException(msgID, message);
+ }
+ }
+
+ return newTag;
+ }
+
+
+
+ /**
+ * Parses the provided string as an attribute tag. Exactly one of the branch
+ * or template must be null, and the other must be non-null.
+ *
+ * @param tagString The string containing the encoded tag.
+ * @param branch The branch in which this tag appears.
+ * @param template The template in which this tag appears.
+ * @param lineNumber The line number on which this tag appears in the
+ * template file.
+ * @param warnings A list into which any warnings identified may be
+ * placed.
+ *
+ * @return The attribute tag parsed from the provided string.
+ *
+ * @throws InitializationException If a problem occurs while initializing
+ * the tag.
+ *
+ * @throws MakeLDIFException If some other problem occurs during processing.
+ */
+ private Tag parseAttributeTag(String tagString, Branch branch,
+ Template template, int lineNumber,
+ List<String> warnings)
+ throws InitializationException, MakeLDIFException
+ {
+ // The attribute tag must have at least one argument, which is the name of
+ // the attribute to reference. It may have a second argument, which is the
+ // number of characters to use from the attribute value. The arguments will
+ // be delimited by colons.
+ StringTokenizer tokenizer = new StringTokenizer(tagString, ":");
+ ArrayList<String> argList = new ArrayList<String>();
+ while (tokenizer.hasMoreTokens())
+ {
+ argList.add(tokenizer.nextToken());
+ }
+
+ String[] args = new String[argList.size()];
+ argList.toArray(args);
+
+ AttributeValueTag tag = new AttributeValueTag();
+ if (branch == null)
+ {
+ tag.initializeForTemplate(this, template, args, lineNumber, warnings);
+ }
+ else
+ {
+ tag.initializeForBranch(this, branch, args, lineNumber, warnings);
+ }
+
+ return tag;
+ }
+
+
+
+ /**
+ * Retrieves a File object based on the provided path. If the given path is
+ * absolute, then that absolute path will be used. If it is relative, then it
+ * will first be evaluated relative to the current working directory. If that
+ * path doesn't exist, then it will be evaluated relative to the resource
+ * path. If that path doesn't exist, then it will be evaluated relative to
+ * the directory containing the template file.
+ *
+ * @param path The path provided for the file.
+ *
+ * @return The File object for the specified path, or <CODE>null</CODE> if
+ * the specified file could not be found.
+ */
+ public File getFile(String path)
+ {
+ // First, see if the file exists using the given path. This will work if
+ // the file is absolute, or it's relative to the current working directory.
+ File f = new File(path);
+ if (f.exists())
+ {
+ return f;
+ }
+
+
+ // If the provided path was absolute, then use it anyway, even though we
+ // couldn't find the file.
+ if (f.isAbsolute())
+ {
+ return f;
+ }
+
+
+ // Try a path relative to the resource directory.
+ String newPath = resourcePath + File.separator + path;
+ f = new File(newPath);
+ if (f.exists())
+ {
+ return f;
+ }
+
+
+ // Try a path relative to the template directory, if it's available.
+ if (templatePath != null)
+ {
+ newPath = templatePath = File.separator + path;
+ f = new File(newPath);
+ if (f.exists())
+ {
+ return f;
+ }
+ }
+
+ return null;
+ }
+
+
+
+ /**
+ * Retrieves the lines of the specified file as a string array. If the result
+ * is already cached, then it will be used. If the result is not cached, then
+ * the file data will be cached so that the contents can be re-used if there
+ * are multiple references to the same file.
+ *
+ * @param file The file for which to retrieve the contents.
+ *
+ * @return An array containing the lines of the specified file.
+ *
+ * @throws IOException If a problem occurs while reading the file.
+ */
+ public String[] getFileLines(File file)
+ throws IOException
+ {
+ String absolutePath = file.getAbsolutePath();
+ String[] lines = fileLines.get(absolutePath);
+ if (lines == null)
+ {
+ ArrayList<String> lineList = new ArrayList<String>();
+
+ BufferedReader reader = new BufferedReader(new FileReader(file));
+ while (true)
+ {
+ String line = reader.readLine();
+ if (line == null)
+ {
+ break;
+ }
+ else
+ {
+ lineList.add(line);
+ }
+ }
+
+ reader.close();
+
+ lines = new String[lineList.size()];
+ lineList.toArray(lines);
+ lineList.clear();
+ fileLines.put(absolutePath, lines);
+ }
+
+ return lines;
+ }
+
+
+
+ /**
+ * Generates the LDIF content and writes it to the provided LDIF writer.
+ *
+ * @param entryWriter The entry writer that should be used to write the
+ * entries.
+ *
+ * @return The result that indicates whether processing should continue.
+ *
+ * @throws IOException If an error occurs while writing to the LDIF file.
+ *
+ * @throws MakeLDIFException If some other problem occurs.
+ */
+ public TagResult generateLDIF(EntryWriter entryWriter)
+ throws IOException, MakeLDIFException
+ {
+ for (Branch b : branches.values())
+ {
+ TagResult result = b.writeEntries(entryWriter);
+ if (! (result.keepProcessingTemplateFile()))
+ {
+ return result;
+ }
+ }
+
+ entryWriter.closeEntryWriter();
+ return TagResult.SUCCESS_RESULT;
+ }
+}
+
diff --git a/opends/src/server/org/opends/server/tools/makeldif/TemplateLine.java b/opends/src/server/org/opends/server/tools/makeldif/TemplateLine.java
new file mode 100644
index 0000000..6706937
--- /dev/null
+++ b/opends/src/server/org/opends/server/tools/makeldif/TemplateLine.java
@@ -0,0 +1,136 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ * Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ * Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.tools.makeldif;
+
+
+
+import org.opends.server.types.AttributeType;
+
+import static org.opends.server.util.StaticUtils.*;
+
+
+
+/**
+ * This class defines a line that may appear in a template or branch. It may
+ * contain any number of tags to be evaluated.
+ */
+public class TemplateLine
+{
+ // The attribute type for this template line.
+ private AttributeType attributeType;
+
+ // The line number on which this template line appears in the template file.
+ private int lineNumber;
+
+ // The set of tags for this template line.
+ private Tag[] tags;
+
+
+
+ /**
+ * Creates a new template line with the provided information.
+ *
+ * @param attributeType The attribute type for this template line.
+ * @param lineNumber The line number on which this template line appears
+ * in the template file.
+ * @param tags The set of tags for this template line.
+ */
+ public TemplateLine(AttributeType attributeType, int lineNumber, Tag[] tags)
+ {
+ this.attributeType = attributeType;
+ this.lineNumber = lineNumber;
+ this.tags = tags;
+ }
+
+
+
+ /**
+ * Retrieves the attribute type for this template line.
+ *
+ * @return The attribute type for this template line.
+ */
+ public AttributeType getAttributeType()
+ {
+ return attributeType;
+ }
+
+
+
+ /**
+ * Retrieves the line number on which this template line appears in the
+ * template file.
+ *
+ * @return The line number on which this template line appears in the
+ * template file.
+ */
+ public int getLineNumber()
+ {
+ return lineNumber;
+ }
+
+
+
+ /**
+ * Retrieves the set of tags for this template line.
+ *
+ * @return The set of tags for this template line.
+ */
+ public Tag[] getTags()
+ {
+ return tags;
+ }
+
+
+
+ /**
+ * Generates the content for this template line and places it in the provided
+ * template entry.
+ *
+ * @param templateEntry The template entry being generated.
+ *
+ * @return The result of generating the template line.
+ */
+ public TagResult generateLine(TemplateEntry templateEntry)
+ {
+ TemplateValue value = new TemplateValue(this);
+
+ for (Tag t : tags)
+ {
+ TagResult result = t.generateValue(templateEntry, value);
+ if (! (result.keepProcessingLine() && result.keepProcessingEntry() &&
+ result.keepProcessingParent() &&
+ result.keepProcessingTemplateFile()))
+ {
+ return result;
+ }
+ }
+
+ templateEntry.addValue(value);
+ return TagResult.SUCCESS_RESULT;
+ }
+}
+
diff --git a/opends/src/server/org/opends/server/tools/makeldif/TemplateValue.java b/opends/src/server/org/opends/server/tools/makeldif/TemplateValue.java
new file mode 100644
index 0000000..0c2b702
--- /dev/null
+++ b/opends/src/server/org/opends/server/tools/makeldif/TemplateValue.java
@@ -0,0 +1,108 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ * Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ * Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.tools.makeldif;
+
+
+
+import org.opends.server.types.AttributeType;
+
+
+
+/**
+ * This class defines a value generated from a template line.
+ */
+public class TemplateValue
+{
+ // The generated template value.
+ private StringBuilder templateValue;
+
+ // The template line used to generate this value.
+ private TemplateLine templateLine;
+
+
+
+ /**
+ * Creates a new template value with the provided information.
+ *
+ * @param templateLine The template line used to generate this value.
+ */
+ public TemplateValue(TemplateLine templateLine)
+ {
+ this.templateLine = templateLine;
+
+ templateValue = new StringBuilder();
+ }
+
+
+
+ /**
+ * Retrieves the template line used to generate this value.
+ *
+ * @return The template line used to generate this value.
+ */
+ public TemplateLine getTemplateLine()
+ {
+ return templateLine;
+ }
+
+
+
+ /**
+ * Retrieves the attribute type for this template value.
+ *
+ * @return The attribute type for this template value.
+ */
+ public AttributeType getAttributeType()
+ {
+ return templateLine.getAttributeType();
+ }
+
+
+
+ /**
+ * Retrieves the generated value.
+ *
+ * @return The generated value.
+ */
+ public StringBuilder getValue()
+ {
+ return templateValue;
+ }
+
+
+
+ /**
+ * Appends the provided string to this template value.
+ *
+ * @param s The string to append to the template value.
+ */
+ public void append(String s)
+ {
+ templateValue.append(s);
+ }
+}
+
diff --git a/opends/src/server/org/opends/server/tools/makeldif/UnderscoreDNTag.java b/opends/src/server/org/opends/server/tools/makeldif/UnderscoreDNTag.java
new file mode 100644
index 0000000..1bf252c
--- /dev/null
+++ b/opends/src/server/org/opends/server/tools/makeldif/UnderscoreDNTag.java
@@ -0,0 +1,241 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ * Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ * Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.tools.makeldif;
+
+
+
+import java.util.List;
+
+import org.opends.server.core.InitializationException;
+import org.opends.server.types.DN;
+import org.opends.server.types.RDN;
+
+import static org.opends.server.messages.MessageHandler.*;
+import static org.opends.server.messages.ToolMessages.*;
+
+
+
+/**
+ * This class defines a tag that is used to include the DN of the current entry
+ * in the attribute value, with underscores in place of the commas.
+ */
+public class UnderscoreDNTag
+ extends Tag
+{
+ // The number of DN components to include.
+ private int numComponents;
+
+
+
+ /**
+ * Creates a new instance of this DN tag.
+ */
+ public UnderscoreDNTag()
+ {
+ numComponents = 0;
+ }
+
+
+
+ /**
+ * Retrieves the name for this tag.
+ *
+ * @return The name for this tag.
+ */
+ public String getName()
+ {
+ return "_DN";
+ }
+
+
+
+ /**
+ * Indicates whether this tag is allowed for use in the extra lines for
+ * branches.
+ *
+ * @return <CODE>true</CODE> if this tag may be used in branch definitions,
+ * or <CODE>false</CODE> if not.
+ */
+ public boolean allowedInBranch()
+ {
+ return true;
+ }
+
+
+
+ /**
+ * Performs any initialization for this tag that may be needed while parsing
+ * a branch definition.
+ *
+ * @param templateFile The template file in which this tag is used.
+ * @param branch The branch in which this tag is used.
+ * @param arguments The set of arguments provided for this tag.
+ * @param lineNumber The line number on which this tag appears in the
+ * template file.
+ * @param warnings A list into which any appropriate warning messages
+ * may be placed.
+ *
+ * @throws InitializationException If a problem occurs while initializing
+ * this tag.
+ */
+ public void initializeForBranch(TemplateFile templateFile, Branch branch,
+ String[] arguments, int lineNumber,
+ List<String> warnings)
+ throws InitializationException
+ {
+ initializeInternal(templateFile, arguments, lineNumber);
+ }
+
+
+
+ /**
+ * Performs any initialization for this tag that may be needed while parsing
+ * a template definition.
+ *
+ * @param templateFile The template file in which this tag is used.
+ * @param template The template in which this tag is used.
+ * @param arguments The set of arguments provided for this tag.
+ * @param lineNumber The line number on which this tag appears in the
+ * template file.
+ * @param warnings A list into which any appropriate warning messages
+ * may be placed.
+ *
+ * @throws InitializationException If a problem occurs while initializing
+ * this tag.
+ */
+ public void initializeForTemplate(TemplateFile templateFile,
+ Template template, String[] arguments,
+ int lineNumber, List<String> warnings)
+ throws InitializationException
+ {
+ initializeInternal(templateFile, arguments, lineNumber);
+ }
+
+
+
+ /**
+ * Performs any initialization for this tag that may be needed for this tag.
+ *
+ * @param templateFile The template file in which this tag is used.
+ * @param arguments The set of arguments provided for this tag.
+ * @param lineNumber The line number on which this tag appears in the
+ * template file.
+ *
+ * @throws InitializationException If a problem occurs while initializing
+ * this tag.
+ */
+ private void initializeInternal(TemplateFile templateFile, String[] arguments,
+ int lineNumber)
+ throws InitializationException
+ {
+ if (arguments.length == 0)
+ {
+ numComponents = 0;
+ }
+ else if (arguments.length == 1)
+ {
+ try
+ {
+ numComponents = Integer.parseInt(arguments[0]);
+ }
+ catch (NumberFormatException nfe)
+ {
+ int msgID = MSGID_MAKELDIF_TAG_CANNOT_PARSE_AS_INTEGER;
+ String message = getMessage(msgID, arguments[0], getName(), lineNumber);
+ throw new InitializationException(msgID, message);
+ }
+ }
+ else
+ {
+ int msgID = MSGID_MAKELDIF_TAG_INVALID_ARGUMENT_RANGE_COUNT;
+ String message = getMessage(msgID, getName(), lineNumber, 0, 1,
+ arguments.length);
+
+ throw new InitializationException(msgID, message);
+ }
+ }
+
+
+
+ /**
+ * Generates the content for this tag by appending it to the provided tag.
+ *
+ * @param templateEntry The entry for which this tag is being generated.
+ * @param templateValue The template value to which the generated content
+ * should be appended.
+ *
+ * @return The result of generating content for this tag.
+ */
+ public TagResult generateValue(TemplateEntry templateEntry,
+ TemplateValue templateValue)
+ {
+ DN dn = templateEntry.getDN();
+ if ((dn == null) || dn.isNullDN())
+ {
+ return TagResult.SUCCESS_RESULT;
+ }
+
+ if (numComponents == 0)
+ {
+ RDN[] rdnComps = dn.getRDNComponents();
+
+ rdnComps[0].toString(templateValue.getValue());
+ for (int i=1; i < rdnComps.length; i++)
+ {
+ templateValue.append("_");
+ rdnComps[i].toString(templateValue.getValue());
+ }
+ }
+ else if (numComponents > 0)
+ {
+ RDN[] rdnComps = dn.getRDNComponents();
+ int count = Math.min(numComponents, rdnComps.length);
+
+ rdnComps[0].toString(templateValue.getValue());
+ for (int i=1; i < count; i++)
+ {
+ templateValue.append("_");
+ rdnComps[i].toString(templateValue.getValue());
+ }
+ }
+ else
+ {
+ RDN[] rdnComps = dn.getRDNComponents();
+ int count = Math.min(Math.abs(numComponents), rdnComps.length);
+
+ rdnComps[rdnComps.length-count].toString(templateValue.getValue());
+ for (int i=1; i < count; i++)
+ {
+ templateValue.append("_");
+ rdnComps[rdnComps.length-count+i].toString(templateValue.getValue());
+ }
+ }
+
+ return TagResult.SUCCESS_RESULT;
+ }
+}
+
diff --git a/opends/src/server/org/opends/server/tools/makeldif/UnderscoreParentDNTag.java b/opends/src/server/org/opends/server/tools/makeldif/UnderscoreParentDNTag.java
new file mode 100644
index 0000000..6635480
--- /dev/null
+++ b/opends/src/server/org/opends/server/tools/makeldif/UnderscoreParentDNTag.java
@@ -0,0 +1,146 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ * Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ * Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.tools.makeldif;
+
+
+
+import java.util.List;
+
+import org.opends.server.core.InitializationException;
+import org.opends.server.types.DN;
+import org.opends.server.types.RDN;
+
+import static org.opends.server.messages.MessageHandler.*;
+import static org.opends.server.messages.ToolMessages.*;
+
+
+
+/**
+ * This class defines a tag that is used to include the DN of the parent entry
+ * in the attribute value, with underscores in place of commas.
+ */
+public class UnderscoreParentDNTag
+ extends Tag
+{
+ /**
+ * Creates a new instance of this underscore parent DN tag.
+ */
+ public UnderscoreParentDNTag()
+ {
+ // No implementation required.
+ }
+
+
+
+ /**
+ * Retrieves the name for this tag.
+ *
+ * @return The name for this tag.
+ */
+ public String getName()
+ {
+ return "_ParentDN";
+ }
+
+
+
+ /**
+ * Indicates whether this tag is allowed for use in the extra lines for
+ * branches.
+ *
+ * @return <CODE>true</CODE> if this tag may be used in branch definitions,
+ * or <CODE>false</CODE> if not.
+ */
+ public boolean allowedInBranch()
+ {
+ return false;
+ }
+
+
+
+ /**
+ * Performs any initialization for this tag that may be needed while parsing
+ * a template definition.
+ *
+ * @param templateFile The template file in which this tag is used.
+ * @param template The template in which this tag is used.
+ * @param arguments The set of arguments provided for this tag.
+ * @param lineNumber The line number on which this tag appears in the
+ * template file.
+ * @param warnings A list into which any appropriate warning messages
+ * may be placed.
+ *
+ * @throws InitializationException If a problem occurs while initializing
+ * this tag.
+ */
+ public void initializeForTemplate(TemplateFile templateFile,
+ Template template, String[] arguments,
+ int lineNumber, List<String> warnings)
+ throws InitializationException
+ {
+ if (arguments.length != 0)
+ {
+ int msgID = MSGID_MAKELDIF_TAG_INVALID_ARGUMENT_COUNT;
+ String message = getMessage(msgID, getName(), lineNumber, 0,
+ arguments.length);
+
+ throw new InitializationException(msgID, message);
+ }
+ }
+
+
+
+ /**
+ * Generates the content for this tag by appending it to the provided tag.
+ *
+ * @param templateEntry The entry for which this tag is being generated.
+ * @param templateValue The template value to which the generated content
+ * should be appended.
+ *
+ * @return The result of generating content for this tag.
+ */
+ public TagResult generateValue(TemplateEntry templateEntry,
+ TemplateValue templateValue)
+ {
+ DN parentDN = templateEntry.getParentDN();
+ if ((parentDN == null) || parentDN.isNullDN())
+ {
+ return TagResult.SUCCESS_RESULT;
+ }
+
+ RDN[] rdnComps = parentDN.getRDNComponents();
+ rdnComps[0].toString(templateValue.getValue());
+ for (int i=1; i < rdnComps.length; i++)
+ {
+ templateValue.append("_");
+ rdnComps[i].toString(templateValue.getValue());
+ }
+
+ return TagResult.SUCCESS_RESULT;
+ }
+}
+
diff --git a/opends/src/server/org/opends/server/types/AttributeType.java b/opends/src/server/org/opends/server/types/AttributeType.java
index 9cfe2c7..d2fc1e9 100644
--- a/opends/src/server/org/opends/server/types/AttributeType.java
+++ b/opends/src/server/org/opends/server/types/AttributeType.java
@@ -85,6 +85,9 @@
// "no-user-modification".
private boolean isNoUserModification;
+ // Indicates whether this attribute type is the objectclass type.
+ private boolean isObjectClassType;
+
// Indicates whether this attribute type is declared "obsolete".
private boolean isObsolete;
@@ -202,6 +205,22 @@
this.extraProperties =
new ConcurrentHashMap<String,
CopyOnWriteArrayList<String>>(0);
+
+ isObjectClassType = false;
+ if ((oid != null) && oid.equals(OBJECTCLASS_ATTRIBUTE_TYPE_OID))
+ {
+ isObjectClassType = true;
+ }
+ else
+ {
+ for (String lowerName : typeNames.keySet())
+ {
+ if (lowerName.equals(OBJECTCLASS_ATTRIBUTE_TYPE_NAME))
+ {
+ isObjectClassType = true;
+ }
+ }
+ }
}
@@ -377,6 +396,22 @@
{
this.substringMatchingRule = substringMatchingRule;
}
+
+ isObjectClassType = false;
+ if ((oid != null) && oid.equals(OBJECTCLASS_ATTRIBUTE_TYPE_OID))
+ {
+ isObjectClassType = true;
+ }
+ else
+ {
+ for (String lowerName : typeNames.keySet())
+ {
+ if (lowerName.equals(OBJECTCLASS_ATTRIBUTE_TYPE_NAME))
+ {
+ isObjectClassType = true;
+ }
+ }
+ }
}
@@ -1130,20 +1165,7 @@
{
assert debugEnter(CLASS_NAME, "isObjectClassType");
- if ((oid != null) && oid.equals(OBJECTCLASS_ATTRIBUTE_TYPE_OID))
- {
- return true;
- }
-
- for (String lowerName : typeNames.keySet())
- {
- if (lowerName.equals(OBJECTCLASS_ATTRIBUTE_TYPE_NAME))
- {
- return true;
- }
- }
-
- return false;
+ return isObjectClassType;
}
diff --git a/opends/src/server/org/opends/server/types/LDIFImportConfig.java b/opends/src/server/org/opends/server/types/LDIFImportConfig.java
index 2a82e05..6604a4d 100644
--- a/opends/src/server/org/opends/server/types/LDIFImportConfig.java
+++ b/opends/src/server/org/opends/server/types/LDIFImportConfig.java
@@ -46,6 +46,8 @@
import java.util.zip.GZIPInputStream;
import org.opends.server.core.DirectoryException;
+import org.opends.server.tools.makeldif.MakeLDIFInputStream;
+import org.opends.server.tools.makeldif.TemplateFile;
import static org.opends.server.loggers.Debug.*;
import static org.opends.server.messages.MessageHandler.*;
@@ -137,6 +139,10 @@
// The set of attribute types that should be included in the import.
private Set<AttributeType> includeAttributes;
+ // The MakeLDIF template file that should be used to generate
+ // entries (instead of having them read from a file).
+ private TemplateFile templateFile;
+
/**
@@ -247,6 +253,23 @@
/**
+ * Creates a new LDIF import configuration that will generate
+ * entries using the given MakeLDIF template file rather than
+ * reading them from an existing LDIF file.
+ *
+ * @param templateFile The template file to use to generate the
+ * entries.
+ */
+ public LDIFImportConfig(TemplateFile templateFile)
+ {
+ this(new MakeLDIFInputStream(templateFile));
+
+ assert debugConstructor(CLASS_NAME, String.valueOf(templateFile));
+ }
+
+
+
+ /**
* Retrieves the reader that should be used to read the LDIF data.
* Note that if the LDIF file is compressed and/or encrypted, then
* that must be indicated before this method is called for the first
--
Gitblit v1.10.0