Add a SQL schema and DAO for KmsSecretRevision (#840)

* Add a SQL schema and DAO for KmsSecretRevision

The dual-object nature of KmsSecret and KmsSecretRevision will not be
necessary once we have moved to SQL. In that world, the only object will
be the one now called KmsSecretRevision. KmsSecretRevision already
stores its parent so all we need to do is convert that key to the String
secretName (or from the secretName to the key, if loading from SQL) and
select the max revision ID for a given secret name.

In a future PR, we will add a dual-writing DAO to these objects and
perform the dual writes, similar to how ReservedList functions.

* Regenerate diagram

* Rename revisionId and cryptoKeyVersionName

* Fix SQL files and diagram
This commit is contained in:
gbrodman 2020-10-30 18:45:43 -04:00 committed by GitHub
parent e07629b42f
commit 2cb7ae7f5a
12 changed files with 1229 additions and 763 deletions

View file

@ -16,6 +16,7 @@ package google.registry.model.server;
import static google.registry.model.common.EntityGroupRoot.getCrossTldKey; import static google.registry.model.common.EntityGroupRoot.getCrossTldKey;
import com.google.common.collect.ImmutableList;
import com.googlecode.objectify.Key; import com.googlecode.objectify.Key;
import com.googlecode.objectify.annotation.Entity; import com.googlecode.objectify.annotation.Entity;
import com.googlecode.objectify.annotation.Id; import com.googlecode.objectify.annotation.Id;
@ -23,11 +24,13 @@ import com.googlecode.objectify.annotation.Parent;
import google.registry.model.ImmutableObject; import google.registry.model.ImmutableObject;
import google.registry.model.annotations.ReportedOn; import google.registry.model.annotations.ReportedOn;
import google.registry.model.common.EntityGroupRoot; import google.registry.model.common.EntityGroupRoot;
import google.registry.schema.replay.DatastoreEntity;
import google.registry.schema.replay.SqlEntity;
/** Pointer to the latest {@link KmsSecretRevision}. */ /** Pointer to the latest {@link KmsSecretRevision}. */
@Entity @Entity
@ReportedOn @ReportedOn
public class KmsSecret extends ImmutableObject { public class KmsSecret extends ImmutableObject implements DatastoreEntity {
/** The unique name of this {@link KmsSecret}. */ /** The unique name of this {@link KmsSecret}. */
@Id String name; @Id String name;
@ -45,6 +48,11 @@ public class KmsSecret extends ImmutableObject {
return latestRevision; return latestRevision;
} }
@Override
public ImmutableList<SqlEntity> toSqlEntities() {
return ImmutableList.of(); // not persisted in SQL
}
public static KmsSecret create(String name, KmsSecretRevision latestRevision) { public static KmsSecret create(String name, KmsSecretRevision latestRevision) {
KmsSecret instance = new KmsSecret(); KmsSecret instance = new KmsSecret();
instance.name = name; instance.name = name;

View file

@ -17,14 +17,24 @@ package google.registry.model.server;
import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkArgument;
import static google.registry.model.common.EntityGroupRoot.getCrossTldKey; import static google.registry.model.common.EntityGroupRoot.getCrossTldKey;
import com.google.common.collect.ImmutableList;
import com.googlecode.objectify.Key; import com.googlecode.objectify.Key;
import com.googlecode.objectify.annotation.Entity; import com.googlecode.objectify.annotation.Entity;
import com.googlecode.objectify.annotation.Id; import com.googlecode.objectify.annotation.Id;
import com.googlecode.objectify.annotation.Ignore;
import com.googlecode.objectify.annotation.OnLoad;
import com.googlecode.objectify.annotation.Parent; import com.googlecode.objectify.annotation.Parent;
import google.registry.model.Buildable; import google.registry.model.Buildable;
import google.registry.model.CreateAutoTimestamp; import google.registry.model.CreateAutoTimestamp;
import google.registry.model.ImmutableObject; import google.registry.model.ImmutableObject;
import google.registry.model.annotations.ReportedOn; import google.registry.model.annotations.ReportedOn;
import google.registry.schema.replay.DatastoreEntity;
import google.registry.schema.replay.SqlEntity;
import javax.persistence.Column;
import javax.persistence.Index;
import javax.persistence.PostLoad;
import javax.persistence.Table;
import javax.persistence.Transient;
/** /**
* An encrypted value. * An encrypted value.
@ -35,13 +45,22 @@ import google.registry.model.annotations.ReportedOn;
* *
* <p>The value can be encrypted and decrypted using Cloud KMS. * <p>The value can be encrypted and decrypted using Cloud KMS.
* *
* <p>Note that the primary key of this entity is {@link #revisionKey}, which is auto-generated by
* the database. So, if a retry of insertion happens after the previous attempt unexpectedly
* succeeds, we will end up with having two exact same revisions that differ only by revisionKey.
* This is fine though, because we only use the revision with the highest revisionKey.
*
* <p>TODO: remove Datastore-specific fields post-Registry-3.0-migration and rename to KmsSecret.
*
* @see <a href="https://cloud.google.com/kms/docs/">Google Cloud Key Management Service * @see <a href="https://cloud.google.com/kms/docs/">Google Cloud Key Management Service
* Documentation</a> * Documentation</a>
* @see google.registry.keyring.kms.KmsKeyring * @see google.registry.keyring.kms.KmsKeyring
*/ */
@Entity @Entity
@ReportedOn @ReportedOn
public class KmsSecretRevision extends ImmutableObject { @javax.persistence.Entity(name = "KmsSecret")
@Table(indexes = {@Index(columnList = "secretName")})
public class KmsSecretRevision extends ImmutableObject implements DatastoreEntity, SqlEntity {
/** /**
* The maximum allowable secret size. Although Datastore allows entities up to 1 MB in size, * The maximum allowable secret size. Although Datastore allows entities up to 1 MB in size,
@ -49,18 +68,31 @@ public class KmsSecretRevision extends ImmutableObject {
*/ */
private static final int MAX_SECRET_SIZE_BYTES = 64 * 1024 * 1024; private static final int MAX_SECRET_SIZE_BYTES = 64 * 1024 * 1024;
/** The revision of this secret. */ /**
@Id long revisionKey; * The revision of this secret.
*
* <p>TODO: change name of the variable to revisionId once we're off Datastore
*/
@Id
@javax.persistence.Id
@Column(name = "revisionId")
long revisionKey;
/** The parent {@link KmsSecret} which contains metadata about this {@link KmsSecretRevision}. */ /** The parent {@link KmsSecret} which contains metadata about this {@link KmsSecretRevision}. */
@Parent Key<KmsSecret> parent; @Parent @Transient Key<KmsSecret> parent;
@Column(nullable = false)
@Ignore
String secretName;
/** /**
* The name of the {@code cryptoKeyVersion} associated with this {@link KmsSecretRevision}. * The name of the {@code cryptoKeyVersion} associated with this {@link KmsSecretRevision}.
* *
* <p>TODO: change name of the variable to cryptoKeyVersionName once we're off Datastore
*
* @see <a * @see <a
* href="https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions">projects.locations.keyRings.cryptoKeys.cryptoKeyVersions</a> * href="https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions">projects.locations.keyRings.cryptoKeys.cryptoKeyVersions</a>
*/ */
@Column(nullable = false, name = "cryptoKeyVersionName")
String kmsCryptoKeyVersionName; String kmsCryptoKeyVersionName;
/** /**
@ -70,9 +102,11 @@ public class KmsSecretRevision extends ImmutableObject {
* @see <a * @see <a
* href="https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys/encrypt">projects.locations.keyRings.cryptoKeys.encrypt</a> * href="https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys/encrypt">projects.locations.keyRings.cryptoKeys.encrypt</a>
*/ */
@Column(nullable = false)
String encryptedValue; String encryptedValue;
/** An automatically managed creation timestamp. */ /** An automatically managed creation timestamp. */
@Column(nullable = false)
CreateAutoTimestamp creationTime = CreateAutoTimestamp.create(null); CreateAutoTimestamp creationTime = CreateAutoTimestamp.create(null);
public String getKmsCryptoKeyVersionName() { public String getKmsCryptoKeyVersionName() {
@ -83,6 +117,28 @@ public class KmsSecretRevision extends ImmutableObject {
return encryptedValue; return encryptedValue;
} }
// When loading from SQL, fill out the Datastore-specific field
@PostLoad
void postLoad() {
parent = Key.create(getCrossTldKey(), KmsSecret.class, secretName);
}
// When loading from Datastore, fill out the SQL-specific field
@OnLoad
void onLoad() {
secretName = parent.getName();
}
@Override
public ImmutableList<SqlEntity> toSqlEntities() {
return ImmutableList.of(); // This is dually-written, as we do not care about history
}
@Override
public ImmutableList<DatastoreEntity> toDatastoreEntities() {
return ImmutableList.of(); // This is dually-written, as we do not care about history
}
/** A builder for constructing {@link KmsSecretRevision} entities, since they are immutable. */ /** A builder for constructing {@link KmsSecretRevision} entities, since they are immutable. */
public static class Builder extends Buildable.Builder<KmsSecretRevision> { public static class Builder extends Buildable.Builder<KmsSecretRevision> {
@ -108,6 +164,7 @@ public class KmsSecretRevision extends ImmutableObject {
*/ */
public Builder setParent(String secretName) { public Builder setParent(String secretName) {
getInstance().parent = Key.create(getCrossTldKey(), KmsSecret.class, secretName); getInstance().parent = Key.create(getCrossTldKey(), KmsSecret.class, secretName);
getInstance().secretName = secretName;
return this; return this;
} }
} }

View file

@ -0,0 +1,54 @@
// Copyright 2020 The Nomulus Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package google.registry.model.server;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Strings.isNullOrEmpty;
import static google.registry.persistence.transaction.TransactionManagerFactory.jpaTm;
import static google.registry.util.PreconditionsUtils.checkArgumentNotNull;
import java.util.Optional;
/**
* A {@link KmsSecretRevision} DAO for Cloud SQL.
*
* <p>TODO: Rename this class to KmsSecretDao after migrating to Cloud SQL.
*/
public class KmsSecretRevisionSqlDao {
private KmsSecretRevisionSqlDao() {}
/** Saves the given KMS secret revision. */
public static void save(KmsSecretRevision kmsSecretRevision) {
checkArgumentNotNull(kmsSecretRevision, "kmsSecretRevision cannot be null");
jpaTm().assertInTransaction();
jpaTm().put(kmsSecretRevision);
}
/** Returns the latest revision for the secret name given, or absent if nonexistent. */
public static Optional<KmsSecretRevision> getLatestRevision(String secretName) {
checkArgument(!isNullOrEmpty(secretName), "secretName cannot be null or empty");
jpaTm().assertInTransaction();
return jpaTm()
.getEntityManager()
.createQuery(
"FROM KmsSecret ks WHERE ks.revisionKey IN (SELECT MAX(revisionKey) FROM "
+ "KmsSecret subKs WHERE subKs.secretName = :secretName)",
KmsSecretRevision.class)
.setParameter("secretName", secretName)
.getResultStream()
.findFirst();
}
}

View file

@ -62,6 +62,7 @@
<class>google.registry.model.registry.Registry</class> <class>google.registry.model.registry.Registry</class>
<class>google.registry.model.reporting.DomainTransactionRecord</class> <class>google.registry.model.reporting.DomainTransactionRecord</class>
<class>google.registry.model.reporting.Spec11ThreatMatch</class> <class>google.registry.model.reporting.Spec11ThreatMatch</class>
<class>google.registry.model.server.KmsSecretRevision</class>
<class>google.registry.model.smd.SignedMarkRevocationList</class> <class>google.registry.model.smd.SignedMarkRevocationList</class>
<class>google.registry.model.tmch.ClaimsListShard</class> <class>google.registry.model.tmch.ClaimsListShard</class>
<class>google.registry.persistence.transaction.TransactionEntity</class> <class>google.registry.persistence.transaction.TransactionEntity</class>

View file

@ -0,0 +1,86 @@
// Copyright 2020 The Nomulus Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package google.registry.model.server;
import static com.google.common.truth.Truth.assertThat;
import static google.registry.model.ImmutableObjectSubject.assertAboutImmutableObjects;
import static google.registry.persistence.transaction.TransactionManagerFactory.jpaTm;
import google.registry.persistence.transaction.JpaTestRules;
import google.registry.persistence.transaction.JpaTestRules.JpaIntegrationWithCoverageExtension;
import google.registry.testing.DatastoreEntityExtension;
import google.registry.testing.FakeClock;
import java.util.Optional;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
/** Tests for {@link google.registry.model.server.KmsSecretRevisionSqlDao}. */
public class KmsSecretRevisionSqlDaoTest {
private final FakeClock fakeClock = new FakeClock();
@RegisterExtension
@Order(value = 1)
DatastoreEntityExtension datastoreEntityExtension = new DatastoreEntityExtension();
@RegisterExtension
JpaIntegrationWithCoverageExtension jpa =
new JpaTestRules.Builder().withClock(fakeClock).buildIntegrationWithCoverageExtension();
@Test
void testSaveAndRetrieve() {
KmsSecretRevision revision = createRevision();
jpaTm().transact(() -> KmsSecretRevisionSqlDao.save(revision));
Optional<KmsSecretRevision> fromSql =
jpaTm().transact(() -> KmsSecretRevisionSqlDao.getLatestRevision("secretName"));
assertThat(fromSql.isPresent()).isTrue();
assertAboutImmutableObjects().that(revision).isEqualExceptFields(fromSql.get(), "creationTime");
}
@Test
void testMultipleRevisions() {
KmsSecretRevision revision = createRevision();
jpaTm().transact(() -> KmsSecretRevisionSqlDao.save(revision));
KmsSecretRevision secondRevision = createRevision();
secondRevision.encryptedValue = "someOtherValue";
jpaTm().transact(() -> KmsSecretRevisionSqlDao.save(secondRevision));
Optional<KmsSecretRevision> fromSql =
jpaTm().transact(() -> KmsSecretRevisionSqlDao.getLatestRevision("secretName"));
assertThat(fromSql.isPresent()).isTrue();
assertThat(fromSql.get().getEncryptedValue()).isEqualTo("someOtherValue");
}
@Test
void testNonexistent() {
KmsSecretRevision revision = createRevision();
jpaTm().transact(() -> KmsSecretRevisionSqlDao.save(revision));
assertThat(
jpaTm()
.transact(() -> KmsSecretRevisionSqlDao.getLatestRevision("someOtherSecretName"))
.isPresent())
.isFalse();
}
private KmsSecretRevision createRevision() {
return new KmsSecretRevision.Builder()
.setEncryptedValue("encrypted")
.setKmsCryptoKeyVersionName("version")
.setParent("secretName")
.build();
}
}

View file

@ -29,6 +29,7 @@ import google.registry.model.registry.RegistryLockDaoTest;
import google.registry.model.registry.RegistryTest; import google.registry.model.registry.RegistryTest;
import google.registry.model.registry.label.ReservedListSqlDaoTest; import google.registry.model.registry.label.ReservedListSqlDaoTest;
import google.registry.model.reporting.Spec11ThreatMatchTest; import google.registry.model.reporting.Spec11ThreatMatchTest;
import google.registry.model.server.KmsSecretRevisionSqlDaoTest;
import google.registry.model.smd.SignedMarkRevocationListDaoTest; import google.registry.model.smd.SignedMarkRevocationListDaoTest;
import google.registry.model.tmch.ClaimsListDaoTest; import google.registry.model.tmch.ClaimsListDaoTest;
import google.registry.persistence.transaction.JpaEntityCoverageExtension; import google.registry.persistence.transaction.JpaEntityCoverageExtension;
@ -85,6 +86,7 @@ import org.junit.runner.RunWith;
DomainBaseSqlTest.class, DomainBaseSqlTest.class,
DomainHistoryTest.class, DomainHistoryTest.class,
HostHistoryTest.class, HostHistoryTest.class,
KmsSecretRevisionSqlDaoTest.class,
LockDaoTest.class, LockDaoTest.class,
PollMessageTest.class, PollMessageTest.class,
PremiumListDaoTest.class, PremiumListDaoTest.class,

View file

@ -261,19 +261,19 @@ td.section {
</tr> </tr>
<tr> <tr>
<td class="property_name">generated on</td> <td class="property_name">generated on</td>
<td class="property_value">2020-10-30 20:47:04.047621</td> <td class="property_value">2020-10-30 21:56:22.867321</td>
</tr> </tr>
<tr> <tr>
<td class="property_name">last flyway file</td> <td class="property_name">last flyway file</td>
<td id="lastFlywayFile" class="property_value">V70__signed_mark_revocation_list.sql</td> <td id="lastFlywayFile" class="property_value">V71__create_kms_secret.sql</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
<p>&nbsp;</p> <p>&nbsp;</p>
<p>&nbsp;</p> <p>&nbsp;</p>
<svg viewbox="0.00 0.00 3524.79 2933.77" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="erDiagram" style="overflow: hidden; width: 100%; height: 800px"> <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 2929.77)"> <svg viewbox="0.00 0.00 3524.79 3018.77" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="erDiagram" style="overflow: hidden; width: 100%; height: 800px"> <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 3014.77)">
<title>SchemaCrawler_Diagram</title> <title>SchemaCrawler_Diagram</title>
<polygon fill="white" stroke="transparent" points="-4,4 -4,-2929.77 3520.79,-2929.77 3520.79,4 -4,4" /> <polygon fill="white" stroke="transparent" points="-4,4 -4,-3014.77 3520.79,-3014.77 3520.79,4 -4,4" />
<text text-anchor="start" x="3248.29" y="-29.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3248.29" y="-29.8" font-family="Helvetica,sans-Serif" font-size="14.00">
generated by generated by
</text> </text>
@ -284,7 +284,7 @@ td.section {
generated on generated on
</text> </text>
<text text-anchor="start" x="3331.29" y="-10.8" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3331.29" y="-10.8" font-family="Helvetica,sans-Serif" font-size="14.00">
2020-10-30 20:47:04.047621 2020-10-30 21:56:22.867321
</text> </text>
<polygon fill="none" stroke="#888888" points="3243.79,-4 3243.79,-44 3508.79,-44 3508.79,-4 3243.79,-4" /> <!-- allocationtoken_a08ccbef --> <polygon fill="none" stroke="#888888" points="3243.79,-4 3243.79,-44 3508.79,-44 3508.79,-4 3243.79,-4" /> <!-- allocationtoken_a08ccbef -->
<g id="node1" class="node"> <g id="node1" class="node">
@ -521,7 +521,7 @@ td.section {
fk_billing_cancellation_billing_recurrence_id fk_billing_cancellation_billing_recurrence_id
</text> </text>
</g> <!-- registrar_6e1503e3 --> </g> <!-- registrar_6e1503e3 -->
<g id="node25" class="node"> <g id="node26" class="node">
<title>registrar_6e1503e3</title> <title>registrar_6e1503e3</title>
<polygon fill="#ebcef2" stroke="transparent" points="9.5,-1217.27 9.5,-1236.27 116.5,-1236.27 116.5,-1217.27 9.5,-1217.27" /> <polygon fill="#ebcef2" stroke="transparent" points="9.5,-1217.27 9.5,-1236.27 116.5,-1236.27 116.5,-1217.27 9.5,-1217.27" />
<text text-anchor="start" x="11.5" y="-1224.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00"> <text text-anchor="start" x="11.5" y="-1224.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
@ -2182,484 +2182,512 @@ td.section {
<text text-anchor="start" x="550.5" y="-395.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="550.5" y="-395.07" font-family="Helvetica,sans-Serif" font-size="14.00">
fk3d09knnmxrt6iniwnp8j2ykga fk3d09knnmxrt6iniwnp8j2ykga
</text> </text>
</g> <!-- lock_f21d4861 --> </g> <!-- kmssecret_f3b28857 -->
<g id="node21" class="node"> <g id="node21" class="node">
<title>lock_f21d4861</title> <title>kmssecret_f3b28857</title>
<polygon fill="#ebcef2" stroke="transparent" points="3258.5,-1949.27 3258.5,-1968.27 3371.5,-1968.27 3371.5,-1949.27 3258.5,-1949.27" /> <polygon fill="#ebcef2" stroke="transparent" points="3255.5,-1949.27 3255.5,-1968.27 3374.5,-1968.27 3374.5,-1949.27 3255.5,-1949.27" />
<text text-anchor="start" x="3260.5" y="-1956.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00"> <text text-anchor="start" x="3257.5" y="-1956.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
public.Lock public.KmsSecret
</text> </text>
<polygon fill="#ebcef2" stroke="transparent" points="3371.5,-1949.27 3371.5,-1968.27 3445.5,-1968.27 3445.5,-1949.27 3371.5,-1949.27" /> <polygon fill="#ebcef2" stroke="transparent" points="3374.5,-1949.27 3374.5,-1968.27 3448.5,-1968.27 3448.5,-1949.27 3374.5,-1949.27" />
<text text-anchor="start" x="3406.5" y="-1955.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3409.5" y="-1955.07" font-family="Helvetica,sans-Serif" font-size="14.00">
[table] [table]
</text> </text>
<text text-anchor="start" x="3260.5" y="-1937.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00"> <text text-anchor="start" x="3257.5" y="-1937.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
resource_name
</text>
<text text-anchor="start" x="3365.5" y="-1936.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="3373.5" y="-1936.07" font-family="Helvetica,sans-Serif" font-size="14.00">
text not null
</text>
<text text-anchor="start" x="3260.5" y="-1918.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
tld
</text>
<text text-anchor="start" x="3365.5" y="-1917.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="3373.5" y="-1917.07" font-family="Helvetica,sans-Serif" font-size="14.00">
text not null
</text>
<polygon fill="none" stroke="#888888" points="3257,-1910.77 3257,-1969.77 3446,-1969.77 3446,-1910.77 3257,-1910.77" />
</g> <!-- premiumentry_b0060b91 -->
<g id="node22" class="node">
<title>premiumentry_b0060b91</title>
<polygon fill="#ebcef2" stroke="transparent" points="3243.5,-2034.27 3243.5,-2053.27 3385.5,-2053.27 3385.5,-2034.27 3243.5,-2034.27" />
<text text-anchor="start" x="3245.5" y="-2041.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
public.PremiumEntry
</text>
<polygon fill="#ebcef2" stroke="transparent" points="3385.5,-2034.27 3385.5,-2053.27 3459.5,-2053.27 3459.5,-2034.27 3385.5,-2034.27" />
<text text-anchor="start" x="3420.5" y="-2040.07" font-family="Helvetica,sans-Serif" font-size="14.00">
[table]
</text>
<text text-anchor="start" x="3245.5" y="-2022.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
revision_id revision_id
</text> </text>
<text text-anchor="start" x="3358.5" y="-2021.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3354.5" y="-1936.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text> </text>
<text text-anchor="start" x="3387.5" y="-2021.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3376.5" y="-1936.07" font-family="Helvetica,sans-Serif" font-size="14.00">
int8 not null int8 not null
</text> </text>
<text text-anchor="start" x="3245.5" y="-2003.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00"> <text text-anchor="start" x="3257.5" y="-1917.07" font-family="Helvetica,sans-Serif" font-size="14.00">
domain_label secret_name
</text> </text>
<text text-anchor="start" x="3358.5" y="-2002.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3354.5" y="-1917.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text> </text>
<text text-anchor="start" x="3387.5" y="-2002.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3376.5" y="-1917.07" font-family="Helvetica,sans-Serif" font-size="14.00">
text not null text not null
</text> </text>
<polygon fill="none" stroke="#888888" points="3242.5,-1995.77 3242.5,-2054.77 3460.5,-2054.77 3460.5,-1995.77 3242.5,-1995.77" /> <polygon fill="none" stroke="#888888" points="3254,-1910.77 3254,-1969.77 3449,-1969.77 3449,-1910.77 3254,-1910.77" />
</g> <!-- premiumlist_7c3ea68b --> </g> <!-- lock_f21d4861 -->
<g id="node23" class="node"> <g id="node22" class="node">
<title>premiumlist_7c3ea68b</title> <title>lock_f21d4861</title>
<polygon fill="#ebcef2" stroke="transparent" points="2656,-2033.27 2656,-2052.27 2787,-2052.27 2787,-2033.27 2656,-2033.27" /> <polygon fill="#ebcef2" stroke="transparent" points="3258.5,-2034.27 3258.5,-2053.27 3371.5,-2053.27 3371.5,-2034.27 3258.5,-2034.27" />
<text text-anchor="start" x="2658" y="-2040.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00"> <text text-anchor="start" x="3260.5" y="-2041.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
public.PremiumList public.Lock
</text> </text>
<polygon fill="#ebcef2" stroke="transparent" points="2787,-2033.27 2787,-2052.27 2897,-2052.27 2897,-2033.27 2787,-2033.27" /> <polygon fill="#ebcef2" stroke="transparent" points="3371.5,-2034.27 3371.5,-2053.27 3445.5,-2053.27 3445.5,-2034.27 3371.5,-2034.27" />
<text text-anchor="start" x="2858" y="-2039.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3406.5" y="-2040.07" font-family="Helvetica,sans-Serif" font-size="14.00">
[table] [table]
</text> </text>
<text text-anchor="start" x="2658" y="-2021.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00"> <text text-anchor="start" x="3260.5" y="-2022.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
revision_id resource_name
</text> </text>
<text text-anchor="start" x="2757" y="-2020.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3365.5" y="-2021.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text> </text>
<text text-anchor="start" x="2789" y="-2020.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3373.5" y="-2021.07" font-family="Helvetica,sans-Serif" font-size="14.00">
bigserial not null
</text>
<text text-anchor="start" x="2757" y="-2001.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="2789" y="-2001.07" font-family="Helvetica,sans-Serif" font-size="14.00">
auto-incremented
</text>
<text text-anchor="start" x="2658" y="-1982.07" font-family="Helvetica,sans-Serif" font-size="14.00">
name
</text>
<text text-anchor="start" x="2757" y="-1982.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="2789" y="-1982.07" font-family="Helvetica,sans-Serif" font-size="14.00">
text not null text not null
</text> </text>
<polygon fill="none" stroke="#888888" points="2654.5,-1975.27 2654.5,-2053.27 2897.5,-2053.27 2897.5,-1975.27 2654.5,-1975.27" /> <text text-anchor="start" x="3260.5" y="-2003.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
tld
</text>
<text text-anchor="start" x="3365.5" y="-2002.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="3373.5" y="-2002.07" font-family="Helvetica,sans-Serif" font-size="14.00">
text not null
</text>
<polygon fill="none" stroke="#888888" points="3257,-1995.77 3257,-2054.77 3446,-2054.77 3446,-1995.77 3257,-1995.77" />
</g> <!-- premiumentry_b0060b91 -->
<g id="node23" class="node">
<title>premiumentry_b0060b91</title>
<polygon fill="#ebcef2" stroke="transparent" points="3243.5,-2119.27 3243.5,-2138.27 3385.5,-2138.27 3385.5,-2119.27 3243.5,-2119.27" />
<text text-anchor="start" x="3245.5" y="-2126.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
public.PremiumEntry
</text>
<polygon fill="#ebcef2" stroke="transparent" points="3385.5,-2119.27 3385.5,-2138.27 3459.5,-2138.27 3459.5,-2119.27 3385.5,-2119.27" />
<text text-anchor="start" x="3420.5" y="-2125.07" font-family="Helvetica,sans-Serif" font-size="14.00">
[table]
</text>
<text text-anchor="start" x="3245.5" y="-2107.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
revision_id
</text>
<text text-anchor="start" x="3358.5" y="-2106.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="3387.5" y="-2106.07" font-family="Helvetica,sans-Serif" font-size="14.00">
int8 not null
</text>
<text text-anchor="start" x="3245.5" y="-2088.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
domain_label
</text>
<text text-anchor="start" x="3358.5" y="-2087.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="3387.5" y="-2087.07" font-family="Helvetica,sans-Serif" font-size="14.00">
text not null
</text>
<polygon fill="none" stroke="#888888" points="3242.5,-2080.77 3242.5,-2139.77 3460.5,-2139.77 3460.5,-2080.77 3242.5,-2080.77" />
</g> <!-- premiumlist_7c3ea68b -->
<g id="node24" class="node">
<title>premiumlist_7c3ea68b</title>
<polygon fill="#ebcef2" stroke="transparent" points="2656,-2118.27 2656,-2137.27 2787,-2137.27 2787,-2118.27 2656,-2118.27" />
<text text-anchor="start" x="2658" y="-2125.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
public.PremiumList
</text>
<polygon fill="#ebcef2" stroke="transparent" points="2787,-2118.27 2787,-2137.27 2897,-2137.27 2897,-2118.27 2787,-2118.27" />
<text text-anchor="start" x="2858" y="-2124.07" font-family="Helvetica,sans-Serif" font-size="14.00">
[table]
</text>
<text text-anchor="start" x="2658" y="-2106.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
revision_id
</text>
<text text-anchor="start" x="2757" y="-2105.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="2789" y="-2105.07" font-family="Helvetica,sans-Serif" font-size="14.00">
bigserial not null
</text>
<text text-anchor="start" x="2757" y="-2086.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="2789" y="-2086.07" font-family="Helvetica,sans-Serif" font-size="14.00">
auto-incremented
</text>
<text text-anchor="start" x="2658" y="-2067.07" font-family="Helvetica,sans-Serif" font-size="14.00">
name
</text>
<text text-anchor="start" x="2757" y="-2067.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="2789" y="-2067.07" font-family="Helvetica,sans-Serif" font-size="14.00">
text not null
</text>
<polygon fill="none" stroke="#888888" points="2654.5,-2060.27 2654.5,-2138.27 2897.5,-2138.27 2897.5,-2060.27 2654.5,-2060.27" />
</g> <!-- premiumentry_b0060b91&#45;&gt;premiumlist_7c3ea68b --> </g> <!-- premiumentry_b0060b91&#45;&gt;premiumlist_7c3ea68b -->
<g id="edge40" class="edge"> <g id="edge40" class="edge">
<title>premiumentry_b0060b91:w-&gt;premiumlist_7c3ea68b:e</title> <title>premiumentry_b0060b91:w-&gt;premiumlist_7c3ea68b:e</title>
<path fill="none" stroke="black" d="M3224.22,-2024.27C3089.29,-2024.27 3046.82,-2024.27 2908.15,-2024.27" /> <path fill="none" stroke="black" d="M3224.22,-2109.27C3089.29,-2109.27 3046.82,-2109.27 2908.15,-2109.27" />
<polygon fill="black" stroke="black" points="3232.5,-2024.27 3242.5,-2028.77 3237.5,-2024.27 3242.5,-2024.27 3242.5,-2024.27 3242.5,-2024.27 3237.5,-2024.27 3242.5,-2019.77 3232.5,-2024.27 3232.5,-2024.27" /> <polygon fill="black" stroke="black" points="3232.5,-2109.27 3242.5,-2113.77 3237.5,-2109.27 3242.5,-2109.27 3242.5,-2109.27 3242.5,-2109.27 3237.5,-2109.27 3242.5,-2104.77 3232.5,-2109.27 3232.5,-2109.27" />
<ellipse fill="none" stroke="black" cx="3228.5" cy="-2024.27" rx="4" ry="4" /> <ellipse fill="none" stroke="black" cx="3228.5" cy="-2109.27" rx="4" ry="4" />
<polygon fill="black" stroke="black" points="2899,-2029.27 2899,-2019.27 2901,-2019.27 2901,-2029.27 2899,-2029.27" /> <polygon fill="black" stroke="black" points="2899,-2114.27 2899,-2104.27 2901,-2104.27 2901,-2114.27 2899,-2114.27" />
<polyline fill="none" stroke="black" points="2898,-2024.27 2903,-2024.27 " /> <polyline fill="none" stroke="black" points="2898,-2109.27 2903,-2109.27 " />
<polygon fill="black" stroke="black" points="2904,-2029.27 2904,-2019.27 2906,-2019.27 2906,-2029.27 2904,-2029.27" /> <polygon fill="black" stroke="black" points="2904,-2114.27 2904,-2104.27 2906,-2104.27 2906,-2114.27 2904,-2114.27" />
<polyline fill="none" stroke="black" points="2903,-2024.27 2908,-2024.27 " /> <polyline fill="none" stroke="black" points="2903,-2109.27 2908,-2109.27 " />
<text text-anchor="start" x="2976.5" y="-2028.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="2976.5" y="-2113.07" font-family="Helvetica,sans-Serif" font-size="14.00">
fko0gw90lpo1tuee56l0nb6y6g5 fko0gw90lpo1tuee56l0nb6y6g5
</text> </text>
</g> <!-- rderevision_83396864 --> </g> <!-- rderevision_83396864 -->
<g id="node24" class="node"> <g id="node25" class="node">
<title>rderevision_83396864</title> <title>rderevision_83396864</title>
<polygon fill="#ebcef2" stroke="transparent" points="3247.5,-2139.27 3247.5,-2158.27 3377.5,-2158.27 3377.5,-2139.27 3247.5,-2139.27" /> <polygon fill="#ebcef2" stroke="transparent" points="3247.5,-2224.27 3247.5,-2243.27 3377.5,-2243.27 3377.5,-2224.27 3247.5,-2224.27" />
<text text-anchor="start" x="3249.5" y="-2146.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00"> <text text-anchor="start" x="3249.5" y="-2231.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
public.RdeRevision public.RdeRevision
</text> </text>
<polygon fill="#ebcef2" stroke="transparent" points="3377.5,-2139.27 3377.5,-2158.27 3455.5,-2158.27 3455.5,-2139.27 3377.5,-2139.27" /> <polygon fill="#ebcef2" stroke="transparent" points="3377.5,-2224.27 3377.5,-2243.27 3455.5,-2243.27 3455.5,-2224.27 3377.5,-2224.27" />
<text text-anchor="start" x="3416.5" y="-2145.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3416.5" y="-2230.07" font-family="Helvetica,sans-Serif" font-size="14.00">
[table] [table]
</text> </text>
<text text-anchor="start" x="3249.5" y="-2127.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00"> <text text-anchor="start" x="3249.5" y="-2212.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
tld tld
</text> </text>
<text text-anchor="start" x="3333.5" y="-2126.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3333.5" y="-2211.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text> </text>
<text text-anchor="start" x="3379.5" y="-2126.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3379.5" y="-2211.07" font-family="Helvetica,sans-Serif" font-size="14.00">
text not null text not null
</text> </text>
<text text-anchor="start" x="3249.5" y="-2108.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00"> <text text-anchor="start" x="3249.5" y="-2193.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
mode mode
</text> </text>
<text text-anchor="start" x="3333.5" y="-2107.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3333.5" y="-2192.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text> </text>
<text text-anchor="start" x="3379.5" y="-2107.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3379.5" y="-2192.07" font-family="Helvetica,sans-Serif" font-size="14.00">
text not null text not null
</text> </text>
<text text-anchor="start" x="3249.5" y="-2089.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00"> <text text-anchor="start" x="3249.5" y="-2174.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
"date" "date"
</text> </text>
<text text-anchor="start" x="3333.5" y="-2088.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3333.5" y="-2173.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text> </text>
<text text-anchor="start" x="3379.5" y="-2088.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3379.5" y="-2173.07" font-family="Helvetica,sans-Serif" font-size="14.00">
date not null date not null
</text> </text>
<polygon fill="none" stroke="#888888" points="3246.5,-2081.27 3246.5,-2159.27 3456.5,-2159.27 3456.5,-2081.27 3246.5,-2081.27" /> <polygon fill="none" stroke="#888888" points="3246.5,-2166.27 3246.5,-2244.27 3456.5,-2244.27 3456.5,-2166.27 3246.5,-2166.27" />
</g> <!-- registrarpoc_ab47054d --> </g> <!-- registrarpoc_ab47054d -->
<g id="node26" class="node"> <g id="node27" class="node">
<title>registrarpoc_ab47054d</title> <title>registrarpoc_ab47054d</title>
<polygon fill="#ebcef2" stroke="transparent" points="3248.5,-2243.27 3248.5,-2262.27 3380.5,-2262.27 3380.5,-2243.27 3248.5,-2243.27" /> <polygon fill="#ebcef2" stroke="transparent" points="3248.5,-2328.27 3248.5,-2347.27 3380.5,-2347.27 3380.5,-2328.27 3248.5,-2328.27" />
<text text-anchor="start" x="3250.5" y="-2250.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00"> <text text-anchor="start" x="3250.5" y="-2335.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
public.RegistrarPoc public.RegistrarPoc
</text> </text>
<polygon fill="#ebcef2" stroke="transparent" points="3380.5,-2243.27 3380.5,-2262.27 3454.5,-2262.27 3454.5,-2243.27 3380.5,-2243.27" /> <polygon fill="#ebcef2" stroke="transparent" points="3380.5,-2328.27 3380.5,-2347.27 3454.5,-2347.27 3454.5,-2328.27 3380.5,-2328.27" />
<text text-anchor="start" x="3415.5" y="-2249.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3415.5" y="-2334.07" font-family="Helvetica,sans-Serif" font-size="14.00">
[table] [table]
</text> </text>
<text text-anchor="start" x="3250.5" y="-2231.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00"> <text text-anchor="start" x="3250.5" y="-2316.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
email_address email_address
</text> </text>
<text text-anchor="start" x="3361.5" y="-2230.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3361.5" y="-2315.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text> </text>
<text text-anchor="start" x="3382.5" y="-2230.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3382.5" y="-2315.07" font-family="Helvetica,sans-Serif" font-size="14.00">
text not null text not null
</text> </text>
<text text-anchor="start" x="3250.5" y="-2211.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3250.5" y="-2296.07" font-family="Helvetica,sans-Serif" font-size="14.00">
gae_user_id gae_user_id
</text> </text>
<text text-anchor="start" x="3361.5" y="-2211.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3361.5" y="-2296.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text> </text>
<text text-anchor="start" x="3382.5" y="-2211.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3382.5" y="-2296.07" font-family="Helvetica,sans-Serif" font-size="14.00">
text text
</text> </text>
<text text-anchor="start" x="3250.5" y="-2193.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00"> <text text-anchor="start" x="3250.5" y="-2278.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
registrar_id registrar_id
</text> </text>
<text text-anchor="start" x="3361.5" y="-2192.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3361.5" y="-2277.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text> </text>
<text text-anchor="start" x="3382.5" y="-2192.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3382.5" y="-2277.07" font-family="Helvetica,sans-Serif" font-size="14.00">
text not null text not null
</text> </text>
<polygon fill="none" stroke="#888888" points="3247.5,-2185.27 3247.5,-2263.27 3455.5,-2263.27 3455.5,-2185.27 3247.5,-2185.27" /> <polygon fill="none" stroke="#888888" points="3247.5,-2270.27 3247.5,-2348.27 3455.5,-2348.27 3455.5,-2270.27 3247.5,-2270.27" />
</g> <!-- registrylock_ac88663e --> </g> <!-- registrylock_ac88663e -->
<g id="node27" class="node"> <g id="node28" class="node">
<title>registrylock_ac88663e</title> <title>registrylock_ac88663e</title>
<polygon fill="#ebcef2" stroke="transparent" points="3229.5,-2404.27 3229.5,-2423.27 3363.5,-2423.27 3363.5,-2404.27 3229.5,-2404.27" /> <polygon fill="#ebcef2" stroke="transparent" points="3229.5,-2489.27 3229.5,-2508.27 3363.5,-2508.27 3363.5,-2489.27 3229.5,-2489.27" />
<text text-anchor="start" x="3231.5" y="-2411.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00"> <text text-anchor="start" x="3231.5" y="-2496.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
public.RegistryLock public.RegistryLock
</text> </text>
<polygon fill="#ebcef2" stroke="transparent" points="3363.5,-2404.27 3363.5,-2423.27 3473.5,-2423.27 3473.5,-2404.27 3363.5,-2404.27" /> <polygon fill="#ebcef2" stroke="transparent" points="3363.5,-2489.27 3363.5,-2508.27 3473.5,-2508.27 3473.5,-2489.27 3363.5,-2489.27" />
<text text-anchor="start" x="3434.5" y="-2410.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3434.5" y="-2495.07" font-family="Helvetica,sans-Serif" font-size="14.00">
[table] [table]
</text> </text>
<text text-anchor="start" x="3231.5" y="-2392.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00"> <text text-anchor="start" x="3231.5" y="-2477.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
revision_id revision_id
</text> </text>
<text text-anchor="start" x="3350.5" y="-2391.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3350.5" y="-2476.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text> </text>
<text text-anchor="start" x="3365.5" y="-2391.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3365.5" y="-2476.07" font-family="Helvetica,sans-Serif" font-size="14.00">
bigserial not null bigserial not null
</text> </text>
<text text-anchor="start" x="3350.5" y="-2372.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3350.5" y="-2457.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text> </text>
<text text-anchor="start" x="3365.5" y="-2372.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3365.5" y="-2457.07" font-family="Helvetica,sans-Serif" font-size="14.00">
auto-incremented auto-incremented
</text> </text>
<text text-anchor="start" x="3231.5" y="-2353.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3231.5" y="-2438.07" font-family="Helvetica,sans-Serif" font-size="14.00">
registrar_id registrar_id
</text> </text>
<text text-anchor="start" x="3350.5" y="-2353.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3350.5" y="-2438.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text> </text>
<text text-anchor="start" x="3365.5" y="-2353.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3365.5" y="-2438.07" font-family="Helvetica,sans-Serif" font-size="14.00">
text not null text not null
</text> </text>
<text text-anchor="start" x="3231.5" y="-2334.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3231.5" y="-2419.07" font-family="Helvetica,sans-Serif" font-size="14.00">
repo_id repo_id
</text> </text>
<text text-anchor="start" x="3350.5" y="-2334.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3350.5" y="-2419.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text> </text>
<text text-anchor="start" x="3365.5" y="-2334.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3365.5" y="-2419.07" font-family="Helvetica,sans-Serif" font-size="14.00">
text not null text not null
</text> </text>
<text text-anchor="start" x="3231.5" y="-2315.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3231.5" y="-2400.07" font-family="Helvetica,sans-Serif" font-size="14.00">
verification_code verification_code
</text> </text>
<text text-anchor="start" x="3350.5" y="-2315.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3350.5" y="-2400.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text> </text>
<text text-anchor="start" x="3365.5" y="-2315.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3365.5" y="-2400.07" font-family="Helvetica,sans-Serif" font-size="14.00">
text not null text not null
</text> </text>
<text text-anchor="start" x="3231.5" y="-2296.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3231.5" y="-2381.07" font-family="Helvetica,sans-Serif" font-size="14.00">
relock_revision_id relock_revision_id
</text> </text>
<text text-anchor="start" x="3350.5" y="-2296.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3350.5" y="-2381.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text> </text>
<text text-anchor="start" x="3365.5" y="-2296.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3365.5" y="-2381.07" font-family="Helvetica,sans-Serif" font-size="14.00">
int8 int8
</text> </text>
<polygon fill="none" stroke="#888888" points="3228.5,-2289.77 3228.5,-2424.77 3474.5,-2424.77 3474.5,-2289.77 3228.5,-2289.77" /> <polygon fill="none" stroke="#888888" points="3228.5,-2374.77 3228.5,-2509.77 3474.5,-2509.77 3474.5,-2374.77 3228.5,-2374.77" />
</g> <!-- registrylock_ac88663e&#45;&gt;registrylock_ac88663e --> </g> <!-- registrylock_ac88663e&#45;&gt;registrylock_ac88663e -->
<g id="edge60" class="edge"> <g id="edge60" class="edge">
<title>registrylock_ac88663e:w-&gt;registrylock_ac88663e:e</title> <title>registrylock_ac88663e:w-&gt;registrylock_ac88663e:e</title>
<path fill="none" stroke="black" d="M3213.75,-2308.27C3160.79,-2347.62 3175.25,-2446.77 3351.5,-2446.77 3534.5,-2446.77 3543.08,-2427.09 3482.87,-2399.41" /> <path fill="none" stroke="black" d="M3213.75,-2393.27C3160.79,-2432.62 3175.25,-2531.77 3351.5,-2531.77 3534.5,-2531.77 3543.08,-2512.09 3482.87,-2484.41" />
<polygon fill="black" stroke="black" points="3220.82,-2304.24 3231.73,-2303.18 3225.16,-2301.75 3229.5,-2299.27 3229.5,-2299.27 3229.5,-2299.27 3225.16,-2301.75 3227.27,-2295.37 3220.82,-2304.24 3220.82,-2304.24" /> <polygon fill="black" stroke="black" points="3220.82,-2389.24 3231.73,-2388.18 3225.16,-2386.75 3229.5,-2384.27 3229.5,-2384.27 3229.5,-2384.27 3225.16,-2386.75 3227.27,-2380.37 3220.82,-2389.24 3220.82,-2389.24" />
<ellipse fill="none" stroke="black" cx="3217.35" cy="-2306.22" rx="4" ry="4" /> <ellipse fill="none" stroke="black" cx="3217.35" cy="-2391.22" rx="4" ry="4" />
<polygon fill="black" stroke="black" points="3472.39,-2400.25 3476.44,-2391.1 3478.26,-2391.91 3474.22,-2401.06 3472.39,-2400.25" /> <polygon fill="black" stroke="black" points="3472.39,-2485.25 3476.44,-2476.1 3478.26,-2476.91 3474.22,-2486.06 3472.39,-2485.25" />
<polyline fill="none" stroke="black" points="3473.5,-2395.27 3478.07,-2397.29 " /> <polyline fill="none" stroke="black" points="3473.5,-2480.27 3478.07,-2482.29 " />
<polygon fill="black" stroke="black" points="3476.97,-2402.27 3481.01,-2393.12 3482.84,-2393.93 3478.8,-2403.08 3476.97,-2402.27" /> <polygon fill="black" stroke="black" points="3476.97,-2487.27 3481.01,-2478.12 3482.84,-2478.93 3478.8,-2488.08 3476.97,-2487.27" />
<polyline fill="none" stroke="black" points="3478.07,-2397.29 3482.65,-2399.31 " /> <polyline fill="none" stroke="black" points="3478.07,-2482.29 3482.65,-2484.31 " />
<text text-anchor="start" x="3270" y="-2450.57" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3270" y="-2535.57" font-family="Helvetica,sans-Serif" font-size="14.00">
fk2lhcwpxlnqijr96irylrh1707 fk2lhcwpxlnqijr96irylrh1707
</text> </text>
</g> <!-- reservedentry_1a7b8520 --> </g> <!-- reservedentry_1a7b8520 -->
<g id="node28" class="node"> <g id="node29" class="node">
<title>reservedentry_1a7b8520</title> <title>reservedentry_1a7b8520</title>
<polygon fill="#ebcef2" stroke="transparent" points="3243.5,-2522.27 3243.5,-2541.27 3386.5,-2541.27 3386.5,-2522.27 3243.5,-2522.27" /> <polygon fill="#ebcef2" stroke="transparent" points="3243.5,-2607.27 3243.5,-2626.27 3386.5,-2626.27 3386.5,-2607.27 3243.5,-2607.27" />
<text text-anchor="start" x="3245.5" y="-2529.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00"> <text text-anchor="start" x="3245.5" y="-2614.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
public.ReservedEntry public.ReservedEntry
</text> </text>
<polygon fill="#ebcef2" stroke="transparent" points="3386.5,-2522.27 3386.5,-2541.27 3460.5,-2541.27 3460.5,-2522.27 3386.5,-2522.27" /> <polygon fill="#ebcef2" stroke="transparent" points="3386.5,-2607.27 3386.5,-2626.27 3460.5,-2626.27 3460.5,-2607.27 3386.5,-2607.27" />
<text text-anchor="start" x="3421.5" y="-2528.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3421.5" y="-2613.07" font-family="Helvetica,sans-Serif" font-size="14.00">
[table] [table]
</text> </text>
<text text-anchor="start" x="3245.5" y="-2510.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00"> <text text-anchor="start" x="3245.5" y="-2595.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
revision_id revision_id
</text> </text>
<text text-anchor="start" x="3358.5" y="-2509.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3358.5" y="-2594.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text> </text>
<text text-anchor="start" x="3388.5" y="-2509.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3388.5" y="-2594.07" font-family="Helvetica,sans-Serif" font-size="14.00">
int8 not null int8 not null
</text> </text>
<text text-anchor="start" x="3245.5" y="-2491.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00"> <text text-anchor="start" x="3245.5" y="-2576.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
domain_label domain_label
</text> </text>
<text text-anchor="start" x="3358.5" y="-2490.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3358.5" y="-2575.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text> </text>
<text text-anchor="start" x="3388.5" y="-2490.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3388.5" y="-2575.07" font-family="Helvetica,sans-Serif" font-size="14.00">
text not null text not null
</text> </text>
<polygon fill="none" stroke="#888888" points="3242,-2483.77 3242,-2542.77 3461,-2542.77 3461,-2483.77 3242,-2483.77" /> <polygon fill="none" stroke="#888888" points="3242,-2568.77 3242,-2627.77 3461,-2627.77 3461,-2568.77 3242,-2568.77" />
</g> <!-- reservedlist_b97c3f1c --> </g> <!-- reservedlist_b97c3f1c -->
<g id="node29" class="node"> <g id="node30" class="node">
<title>reservedlist_b97c3f1c</title> <title>reservedlist_b97c3f1c</title>
<polygon fill="#ebcef2" stroke="transparent" points="2655,-2521.27 2655,-2540.27 2788,-2540.27 2788,-2521.27 2655,-2521.27" /> <polygon fill="#ebcef2" stroke="transparent" points="2655,-2606.27 2655,-2625.27 2788,-2625.27 2788,-2606.27 2655,-2606.27" />
<text text-anchor="start" x="2657" y="-2528.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00"> <text text-anchor="start" x="2657" y="-2613.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
public.ReservedList public.ReservedList
</text> </text>
<polygon fill="#ebcef2" stroke="transparent" points="2788,-2521.27 2788,-2540.27 2898,-2540.27 2898,-2521.27 2788,-2521.27" /> <polygon fill="#ebcef2" stroke="transparent" points="2788,-2606.27 2788,-2625.27 2898,-2625.27 2898,-2606.27 2788,-2606.27" />
<text text-anchor="start" x="2859" y="-2527.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="2859" y="-2612.07" font-family="Helvetica,sans-Serif" font-size="14.00">
[table] [table]
</text> </text>
<text text-anchor="start" x="2657" y="-2509.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00"> <text text-anchor="start" x="2657" y="-2594.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
revision_id revision_id
</text> </text>
<text text-anchor="start" x="2757" y="-2508.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="2757" y="-2593.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text> </text>
<text text-anchor="start" x="2790" y="-2508.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="2790" y="-2593.07" font-family="Helvetica,sans-Serif" font-size="14.00">
bigserial not null bigserial not null
</text> </text>
<text text-anchor="start" x="2757" y="-2489.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="2757" y="-2574.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text> </text>
<text text-anchor="start" x="2790" y="-2489.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="2790" y="-2574.07" font-family="Helvetica,sans-Serif" font-size="14.00">
auto-incremented auto-incremented
</text> </text>
<text text-anchor="start" x="2657" y="-2470.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="2657" y="-2555.07" font-family="Helvetica,sans-Serif" font-size="14.00">
name name
</text> </text>
<text text-anchor="start" x="2757" y="-2470.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="2757" y="-2555.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text> </text>
<text text-anchor="start" x="2790" y="-2470.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="2790" y="-2555.07" font-family="Helvetica,sans-Serif" font-size="14.00">
text not null text not null
</text> </text>
<polygon fill="none" stroke="#888888" points="2653.5,-2463.27 2653.5,-2541.27 2898.5,-2541.27 2898.5,-2463.27 2653.5,-2463.27" /> <polygon fill="none" stroke="#888888" points="2653.5,-2548.27 2653.5,-2626.27 2898.5,-2626.27 2898.5,-2548.27 2653.5,-2548.27" />
</g> <!-- reservedentry_1a7b8520&#45;&gt;reservedlist_b97c3f1c --> </g> <!-- reservedentry_1a7b8520&#45;&gt;reservedlist_b97c3f1c -->
<g id="edge61" class="edge"> <g id="edge61" class="edge">
<title>reservedentry_1a7b8520:w-&gt;reservedlist_b97c3f1c:e</title> <title>reservedentry_1a7b8520:w-&gt;reservedlist_b97c3f1c:e</title>
<path fill="none" stroke="black" d="M3224.28,-2512.27C3089.74,-2512.27 3047.38,-2512.27 2909.12,-2512.27" /> <path fill="none" stroke="black" d="M3224.28,-2597.27C3089.74,-2597.27 3047.38,-2597.27 2909.12,-2597.27" />
<polygon fill="black" stroke="black" points="3232.5,-2512.27 3242.5,-2516.77 3237.5,-2512.27 3242.5,-2512.27 3242.5,-2512.27 3242.5,-2512.27 3237.5,-2512.27 3242.5,-2507.77 3232.5,-2512.27 3232.5,-2512.27" /> <polygon fill="black" stroke="black" points="3232.5,-2597.27 3242.5,-2601.77 3237.5,-2597.27 3242.5,-2597.27 3242.5,-2597.27 3242.5,-2597.27 3237.5,-2597.27 3242.5,-2592.77 3232.5,-2597.27 3232.5,-2597.27" />
<ellipse fill="none" stroke="black" cx="3228.5" cy="-2512.27" rx="4" ry="4" /> <ellipse fill="none" stroke="black" cx="3228.5" cy="-2597.27" rx="4" ry="4" />
<polygon fill="black" stroke="black" points="2900,-2517.27 2900,-2507.27 2902,-2507.27 2902,-2517.27 2900,-2517.27" /> <polygon fill="black" stroke="black" points="2900,-2602.27 2900,-2592.27 2902,-2592.27 2902,-2602.27 2900,-2602.27" />
<polyline fill="none" stroke="black" points="2899,-2512.27 2904,-2512.27 " /> <polyline fill="none" stroke="black" points="2899,-2597.27 2904,-2597.27 " />
<polygon fill="black" stroke="black" points="2905,-2517.27 2905,-2507.27 2907,-2507.27 2907,-2517.27 2905,-2517.27" /> <polygon fill="black" stroke="black" points="2905,-2602.27 2905,-2592.27 2907,-2592.27 2907,-2602.27 2905,-2602.27" />
<polyline fill="none" stroke="black" points="2904,-2512.27 2909,-2512.27 " /> <polyline fill="none" stroke="black" points="2904,-2597.27 2909,-2597.27 " />
<text text-anchor="start" x="2978" y="-2516.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="2978" y="-2601.07" font-family="Helvetica,sans-Serif" font-size="14.00">
fkgq03rk0bt1hb915dnyvd3vnfc fkgq03rk0bt1hb915dnyvd3vnfc
</text> </text>
</g> <!-- signedmarkrevocationentry_99c39721 --> </g> <!-- signedmarkrevocationentry_99c39721 -->
<g id="node30" class="node"> <g id="node31" class="node">
<title>signedmarkrevocationentry_99c39721</title> <title>signedmarkrevocationentry_99c39721</title>
<polygon fill="#ebcef2" stroke="transparent" points="3198.5,-2607.27 3198.5,-2626.27 3431.5,-2626.27 3431.5,-2607.27 3198.5,-2607.27" /> <polygon fill="#ebcef2" stroke="transparent" points="3198.5,-2692.27 3198.5,-2711.27 3431.5,-2711.27 3431.5,-2692.27 3198.5,-2692.27" />
<text text-anchor="start" x="3200.5" y="-2614.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00"> <text text-anchor="start" x="3200.5" y="-2699.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
public.SignedMarkRevocationEntry public.SignedMarkRevocationEntry
</text> </text>
<polygon fill="#ebcef2" stroke="transparent" points="3431.5,-2607.27 3431.5,-2626.27 3505.5,-2626.27 3505.5,-2607.27 3431.5,-2607.27" /> <polygon fill="#ebcef2" stroke="transparent" points="3431.5,-2692.27 3431.5,-2711.27 3505.5,-2711.27 3505.5,-2692.27 3431.5,-2692.27" />
<text text-anchor="start" x="3466.5" y="-2613.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3466.5" y="-2698.07" font-family="Helvetica,sans-Serif" font-size="14.00">
[table] [table]
</text> </text>
<text text-anchor="start" x="3200.5" y="-2595.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00"> <text text-anchor="start" x="3200.5" y="-2680.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
revision_id revision_id
</text> </text>
<text text-anchor="start" x="3350.5" y="-2594.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3350.5" y="-2679.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text> </text>
<text text-anchor="start" x="3433.5" y="-2594.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3433.5" y="-2679.07" font-family="Helvetica,sans-Serif" font-size="14.00">
int8 not null int8 not null
</text> </text>
<text text-anchor="start" x="3200.5" y="-2576.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00"> <text text-anchor="start" x="3200.5" y="-2661.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
smd_id smd_id
</text> </text>
<text text-anchor="start" x="3350.5" y="-2575.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3350.5" y="-2660.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text> </text>
<text text-anchor="start" x="3433.5" y="-2575.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3433.5" y="-2660.07" font-family="Helvetica,sans-Serif" font-size="14.00">
text not null text not null
</text> </text>
<polygon fill="none" stroke="#888888" points="3197,-2568.77 3197,-2627.77 3506,-2627.77 3506,-2568.77 3197,-2568.77" /> <polygon fill="none" stroke="#888888" points="3197,-2653.77 3197,-2712.77 3506,-2712.77 3506,-2653.77 3197,-2653.77" />
</g> <!-- signedmarkrevocationlist_c5d968fb --> </g> <!-- signedmarkrevocationlist_c5d968fb -->
<g id="node31" class="node"> <g id="node32" class="node">
<title>signedmarkrevocationlist_c5d968fb</title> <title>signedmarkrevocationlist_c5d968fb</title>
<polygon fill="#ebcef2" stroke="transparent" points="2610,-2607.27 2610,-2626.27 2832,-2626.27 2832,-2607.27 2610,-2607.27" /> <polygon fill="#ebcef2" stroke="transparent" points="2610,-2692.27 2610,-2711.27 2832,-2711.27 2832,-2692.27 2610,-2692.27" />
<text text-anchor="start" x="2612" y="-2614.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00"> <text text-anchor="start" x="2612" y="-2699.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
public.SignedMarkRevocationList public.SignedMarkRevocationList
</text> </text>
<polygon fill="#ebcef2" stroke="transparent" points="2832,-2607.27 2832,-2626.27 2942,-2626.27 2942,-2607.27 2832,-2607.27" /> <polygon fill="#ebcef2" stroke="transparent" points="2832,-2692.27 2832,-2711.27 2942,-2711.27 2942,-2692.27 2832,-2692.27" />
<text text-anchor="start" x="2903" y="-2613.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="2903" y="-2698.07" font-family="Helvetica,sans-Serif" font-size="14.00">
[table] [table]
</text> </text>
<text text-anchor="start" x="2612" y="-2595.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00"> <text text-anchor="start" x="2612" y="-2680.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
revision_id revision_id
</text> </text>
<text text-anchor="start" x="2757" y="-2594.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="2757" y="-2679.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text> </text>
<text text-anchor="start" x="2834" y="-2594.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="2834" y="-2679.07" font-family="Helvetica,sans-Serif" font-size="14.00">
bigserial not null bigserial not null
</text> </text>
<text text-anchor="start" x="2757" y="-2575.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="2757" y="-2660.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text> </text>
<text text-anchor="start" x="2834" y="-2575.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="2834" y="-2660.07" font-family="Helvetica,sans-Serif" font-size="14.00">
auto-incremented auto-incremented
</text> </text>
<polygon fill="none" stroke="#888888" points="2609,-2568.77 2609,-2627.77 2943,-2627.77 2943,-2568.77 2609,-2568.77" /> <polygon fill="none" stroke="#888888" points="2609,-2653.77 2609,-2712.77 2943,-2712.77 2943,-2653.77 2609,-2653.77" />
</g> <!-- signedmarkrevocationentry_99c39721&#45;&gt;signedmarkrevocationlist_c5d968fb --> </g> <!-- signedmarkrevocationentry_99c39721&#45;&gt;signedmarkrevocationlist_c5d968fb -->
<g id="edge62" class="edge"> <g id="edge62" class="edge">
<title>signedmarkrevocationentry_99c39721:w-&gt;signedmarkrevocationlist_c5d968fb:e</title> <title>signedmarkrevocationentry_99c39721:w-&gt;signedmarkrevocationlist_c5d968fb:e</title>
<path fill="none" stroke="black" d="M3179.37,-2597.27C3084.15,-2597.27 3051.89,-2597.27 2953.1,-2597.27" /> <path fill="none" stroke="black" d="M3179.37,-2682.27C3084.15,-2682.27 3051.89,-2682.27 2953.1,-2682.27" />
<polygon fill="black" stroke="black" points="3187.5,-2597.27 3197.5,-2601.77 3192.5,-2597.27 3197.5,-2597.27 3197.5,-2597.27 3197.5,-2597.27 3192.5,-2597.27 3197.5,-2592.77 3187.5,-2597.27 3187.5,-2597.27" /> <polygon fill="black" stroke="black" points="3187.5,-2682.27 3197.5,-2686.77 3192.5,-2682.27 3197.5,-2682.27 3197.5,-2682.27 3197.5,-2682.27 3192.5,-2682.27 3197.5,-2677.77 3187.5,-2682.27 3187.5,-2682.27" />
<ellipse fill="none" stroke="black" cx="3183.5" cy="-2597.27" rx="4" ry="4" /> <ellipse fill="none" stroke="black" cx="3183.5" cy="-2682.27" rx="4" ry="4" />
<polygon fill="black" stroke="black" points="2944,-2602.27 2944,-2592.27 2946,-2592.27 2946,-2602.27 2944,-2602.27" /> <polygon fill="black" stroke="black" points="2944,-2687.27 2944,-2677.27 2946,-2677.27 2946,-2687.27 2944,-2687.27" />
<polyline fill="none" stroke="black" points="2943,-2597.27 2948,-2597.27 " /> <polyline fill="none" stroke="black" points="2943,-2682.27 2948,-2682.27 " />
<polygon fill="black" stroke="black" points="2949,-2602.27 2949,-2592.27 2951,-2592.27 2951,-2602.27 2949,-2602.27" /> <polygon fill="black" stroke="black" points="2949,-2687.27 2949,-2677.27 2951,-2677.27 2951,-2687.27 2949,-2687.27" />
<polyline fill="none" stroke="black" points="2948,-2597.27 2953,-2597.27 " /> <polyline fill="none" stroke="black" points="2948,-2682.27 2953,-2682.27 " />
<text text-anchor="start" x="2987" y="-2601.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="2987" y="-2686.07" font-family="Helvetica,sans-Serif" font-size="14.00">
fk5ivlhvs3121yx2li5tqh54u4 fk5ivlhvs3121yx2li5tqh54u4
</text> </text>
</g> <!-- spec11threatmatch_a61228a6 --> </g> <!-- spec11threatmatch_a61228a6 -->
<g id="node32" class="node"> <g id="node33" class="node">
<title>spec11threatmatch_a61228a6</title> <title>spec11threatmatch_a61228a6</title>
<polygon fill="#ebcef2" stroke="transparent" points="3208.5,-2750.27 3208.5,-2769.27 3384.5,-2769.27 3384.5,-2750.27 3208.5,-2750.27" /> <polygon fill="#ebcef2" stroke="transparent" points="3208.5,-2835.27 3208.5,-2854.27 3384.5,-2854.27 3384.5,-2835.27 3208.5,-2835.27" />
<text text-anchor="start" x="3210.5" y="-2757.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00"> <text text-anchor="start" x="3210.5" y="-2842.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
public.Spec11ThreatMatch public.Spec11ThreatMatch
</text> </text>
<polygon fill="#ebcef2" stroke="transparent" points="3384.5,-2750.27 3384.5,-2769.27 3494.5,-2769.27 3494.5,-2750.27 3384.5,-2750.27" /> <polygon fill="#ebcef2" stroke="transparent" points="3384.5,-2835.27 3384.5,-2854.27 3494.5,-2854.27 3494.5,-2835.27 3384.5,-2835.27" />
<text text-anchor="start" x="3455.5" y="-2756.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3455.5" y="-2841.07" font-family="Helvetica,sans-Serif" font-size="14.00">
[table] [table]
</text> </text>
<text text-anchor="start" x="3210.5" y="-2738.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00"> <text text-anchor="start" x="3210.5" y="-2823.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
id id
</text> </text>
<text text-anchor="start" x="3331.5" y="-2737.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3331.5" y="-2822.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text> </text>
<text text-anchor="start" x="3386.5" y="-2737.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3386.5" y="-2822.07" font-family="Helvetica,sans-Serif" font-size="14.00">
bigserial not null bigserial not null
</text> </text>
<text text-anchor="start" x="3331.5" y="-2718.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3331.5" y="-2803.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text> </text>
<text text-anchor="start" x="3386.5" y="-2718.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3386.5" y="-2803.07" font-family="Helvetica,sans-Serif" font-size="14.00">
auto-incremented auto-incremented
</text> </text>
<text text-anchor="start" x="3210.5" y="-2699.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3210.5" y="-2784.07" font-family="Helvetica,sans-Serif" font-size="14.00">
check_date check_date
</text> </text>
<text text-anchor="start" x="3331.5" y="-2699.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3331.5" y="-2784.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text> </text>
<text text-anchor="start" x="3386.5" y="-2699.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3386.5" y="-2784.07" font-family="Helvetica,sans-Serif" font-size="14.00">
date not null date not null
</text> </text>
<text text-anchor="start" x="3210.5" y="-2680.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3210.5" y="-2765.07" font-family="Helvetica,sans-Serif" font-size="14.00">
registrar_id registrar_id
</text> </text>
<text text-anchor="start" x="3331.5" y="-2680.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3331.5" y="-2765.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text> </text>
<text text-anchor="start" x="3386.5" y="-2680.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3386.5" y="-2765.07" font-family="Helvetica,sans-Serif" font-size="14.00">
text not null text not null
</text> </text>
<text text-anchor="start" x="3210.5" y="-2661.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3210.5" y="-2746.07" font-family="Helvetica,sans-Serif" font-size="14.00">
tld tld
</text> </text>
<text text-anchor="start" x="3331.5" y="-2661.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3331.5" y="-2746.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text> </text>
<text text-anchor="start" x="3386.5" y="-2661.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3386.5" y="-2746.07" font-family="Helvetica,sans-Serif" font-size="14.00">
text not null text not null
</text> </text>
<polygon fill="none" stroke="#888888" points="3207.5,-2654.27 3207.5,-2770.27 3495.5,-2770.27 3495.5,-2654.27 3207.5,-2654.27" /> <polygon fill="none" stroke="#888888" points="3207.5,-2739.27 3207.5,-2855.27 3495.5,-2855.27 3495.5,-2739.27 3207.5,-2739.27" />
</g> <!-- tld_f1fa57e2 --> </g> <!-- tld_f1fa57e2 -->
<g id="node33" class="node"> <g id="node34" class="node">
<title>tld_f1fa57e2</title> <title>tld_f1fa57e2</title>
<polygon fill="#ebcef2" stroke="transparent" points="3278.5,-2816.27 3278.5,-2835.27 3351.5,-2835.27 3351.5,-2816.27 3278.5,-2816.27" /> <polygon fill="#ebcef2" stroke="transparent" points="3278.5,-2901.27 3278.5,-2920.27 3351.5,-2920.27 3351.5,-2901.27 3278.5,-2901.27" />
<text text-anchor="start" x="3280.5" y="-2823.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00"> <text text-anchor="start" x="3280.5" y="-2908.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
public.Tld public.Tld
</text> </text>
<polygon fill="#ebcef2" stroke="transparent" points="3351.5,-2816.27 3351.5,-2835.27 3425.5,-2835.27 3425.5,-2816.27 3351.5,-2816.27" /> <polygon fill="#ebcef2" stroke="transparent" points="3351.5,-2901.27 3351.5,-2920.27 3425.5,-2920.27 3425.5,-2901.27 3351.5,-2901.27" />
<text text-anchor="start" x="3386.5" y="-2822.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3386.5" y="-2907.07" font-family="Helvetica,sans-Serif" font-size="14.00">
[table] [table]
</text> </text>
<text text-anchor="start" x="3280.5" y="-2804.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00"> <text text-anchor="start" x="3280.5" y="-2889.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
tld_name tld_name
</text> </text>
<text text-anchor="start" x="3345.5" y="-2803.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3345.5" y="-2888.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text> </text>
<text text-anchor="start" x="3353.5" y="-2803.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3353.5" y="-2888.07" font-family="Helvetica,sans-Serif" font-size="14.00">
text not null text not null
</text> </text>
<polygon fill="none" stroke="#888888" points="3277,-2796.27 3277,-2836.27 3426,-2836.27 3426,-2796.27 3277,-2796.27" /> <polygon fill="none" stroke="#888888" points="3277,-2881.27 3277,-2921.27 3426,-2921.27 3426,-2881.27 3277,-2881.27" />
</g> <!-- transaction_d50389d4 --> </g> <!-- transaction_d50389d4 -->
<g id="node34" class="node"> <g id="node35" class="node">
<title>transaction_d50389d4</title> <title>transaction_d50389d4</title>
<polygon fill="#ebcef2" stroke="transparent" points="3234.5,-2901.27 3234.5,-2920.27 3359.5,-2920.27 3359.5,-2901.27 3234.5,-2901.27" /> <polygon fill="#ebcef2" stroke="transparent" points="3234.5,-2986.27 3234.5,-3005.27 3359.5,-3005.27 3359.5,-2986.27 3234.5,-2986.27" />
<text text-anchor="start" x="3236.5" y="-2908.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00"> <text text-anchor="start" x="3236.5" y="-2993.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
public.Transaction public.Transaction
</text> </text>
<polygon fill="#ebcef2" stroke="transparent" points="3359.5,-2901.27 3359.5,-2920.27 3469.5,-2920.27 3469.5,-2901.27 3359.5,-2901.27" /> <polygon fill="#ebcef2" stroke="transparent" points="3359.5,-2986.27 3359.5,-3005.27 3469.5,-3005.27 3469.5,-2986.27 3359.5,-2986.27" />
<text text-anchor="start" x="3430.5" y="-2907.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3430.5" y="-2992.07" font-family="Helvetica,sans-Serif" font-size="14.00">
[table] [table]
</text> </text>
<text text-anchor="start" x="3236.5" y="-2889.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00"> <text text-anchor="start" x="3236.5" y="-2974.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
id id
</text> </text>
<text text-anchor="start" x="3303.5" y="-2888.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3303.5" y="-2973.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text> </text>
<text text-anchor="start" x="3361.5" y="-2888.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3361.5" y="-2973.07" font-family="Helvetica,sans-Serif" font-size="14.00">
bigserial not null bigserial not null
</text> </text>
<text text-anchor="start" x="3303.5" y="-2869.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3303.5" y="-2954.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text> </text>
<text text-anchor="start" x="3361.5" y="-2869.07" font-family="Helvetica,sans-Serif" font-size="14.00"> <text text-anchor="start" x="3361.5" y="-2954.07" font-family="Helvetica,sans-Serif" font-size="14.00">
auto-incremented auto-incremented
</text> </text>
<polygon fill="none" stroke="#888888" points="3233,-2862.77 3233,-2921.77 3470,-2921.77 3470,-2862.77 3233,-2862.77" /> <polygon fill="none" stroke="#888888" points="3233,-2947.77 3233,-3006.77 3470,-3006.77 3470,-2947.77 3233,-2947.77" />
</g> </g>
</g> </g>
</svg> </svg>
@ -4673,6 +4701,41 @@ td.section {
</tbody> </tbody>
</table> </table>
<p>&nbsp;</p> <p>&nbsp;</p>
<table>
<caption style="background-color: #EBCEF2;"> <span id="kmssecret_f3b28857" class="caption_name">public.KmsSecret</span> <span class="caption_description">[table]</span>
</caption>
<tbody>
<tr>
<td class="spacer"></td>
<td class="minwidth"><b><i>revision_id</i></b></td>
<td class="minwidth">int8 not null</td>
</tr>
<tr>
<td class="spacer"></td>
<td class="minwidth">secret_name</td>
<td class="minwidth">text not null</td>
</tr>
<tr>
<td colspan="3"></td>
</tr>
<tr>
<td colspan="3" class="section">Primary Key</td>
</tr>
<tr>
<td colspan="3"></td>
</tr>
<tr>
<td colspan="2" class="name">KmsSecret_pkey</td>
<td class="description right">[primary key]</td>
</tr>
<tr>
<td class="spacer"></td>
<td class="minwidth">revision_id</td>
<td class="minwidth"></td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<table> <table>
<caption style="background-color: #EBCEF2;"> <span id="lock_f21d4861" class="caption_name">public.Lock</span> <span class="caption_description">[table]</span> <caption style="background-color: #EBCEF2;"> <span id="lock_f21d4861" class="caption_name">public.Lock</span> <span class="caption_description">[table]</span>
</caption> </caption>

File diff suppressed because it is too large Load diff

View file

@ -68,3 +68,4 @@ V67__grace_period_history_ids.sql
V68__make_reserved_list_nullable_in_registry.sql V68__make_reserved_list_nullable_in_registry.sql
V69__change_primary_key_and_add_history_table_for_delegation_signer.sql V69__change_primary_key_and_add_history_table_for_delegation_signer.sql
V70__signed_mark_revocation_list.sql V70__signed_mark_revocation_list.sql
V71__create_kms_secret.sql

View file

@ -0,0 +1,24 @@
-- Copyright 2020 The Nomulus Authors. All Rights Reserved.
--
-- Licensed under the Apache License, Version 2.0 (the "License");
-- you may not use this file except in compliance with the License.
-- You may obtain a copy of the License at
--
-- http://www.apache.org/licenses/LICENSE-2.0
--
-- Unless required by applicable law or agreed to in writing, software
-- distributed under the License is distributed on an "AS IS" BASIS,
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-- See the License for the specific language governing permissions and
-- limitations under the License.
CREATE TABLE "KmsSecret" (
revision_id int8 NOT NULL,
creation_time timestamptz NOT NULL,
encrypted_value text NOT NULL,
crypto_key_version_name text NOT NULL,
secret_name text NOT NULL,
PRIMARY KEY (revision_id)
);
CREATE INDEX IDXli9nil3s4t4p21i3xluvvilb7 ON "KmsSecret" (secret_name);

View file

@ -452,6 +452,15 @@
primary key (host_repo_id, history_revision_id) primary key (host_repo_id, history_revision_id)
); );
create table "KmsSecret" (
revision_id int8 not null,
creation_time timestamptz not null,
encrypted_value text not null,
crypto_key_version_name text not null,
secret_name text not null,
primary key (revision_id)
);
create table "Lock" ( create table "Lock" (
resource_name text not null, resource_name text not null,
tld text not null, tld text not null,
@ -727,6 +736,7 @@ create index IDX1iy7njgb7wjmj9piml4l2g0qi on "HostHistory" (history_registrar_id
create index IDXkkwbwcwvrdkkqothkiye4jiff on "HostHistory" (host_name); create index IDXkkwbwcwvrdkkqothkiye4jiff on "HostHistory" (host_name);
create index IDXknk8gmj7s47q56cwpa6rmpt5l on "HostHistory" (history_type); create index IDXknk8gmj7s47q56cwpa6rmpt5l on "HostHistory" (history_type);
create index IDX67qwkjtlq5q8dv6egtrtnhqi7 on "HostHistory" (history_modification_time); create index IDX67qwkjtlq5q8dv6egtrtnhqi7 on "HostHistory" (history_modification_time);
create index IDXli9nil3s4t4p21i3xluvvilb7 on "KmsSecret" (secret_name);
create index IDXe7wu46c7wpvfmfnj4565abibp on "PollMessage" (registrar_id); create index IDXe7wu46c7wpvfmfnj4565abibp on "PollMessage" (registrar_id);
create index IDXaydgox62uno9qx8cjlj5lauye on "PollMessage" (event_time); create index IDXaydgox62uno9qx8cjlj5lauye on "PollMessage" (event_time);
create index premiumlist_name_idx on "PremiumList" (name); create index premiumlist_name_idx on "PremiumList" (name);

View file

@ -590,6 +590,19 @@ CREATE TABLE public."HostHistory" (
); );
--
-- Name: KmsSecret; Type: TABLE; Schema: public; Owner: -
--
CREATE TABLE public."KmsSecret" (
revision_id bigint NOT NULL,
creation_time timestamp with time zone NOT NULL,
encrypted_value text NOT NULL,
crypto_key_version_name text NOT NULL,
secret_name text NOT NULL
);
-- --
-- Name: Lock; Type: TABLE; Schema: public; Owner: - -- Name: Lock; Type: TABLE; Schema: public; Owner: -
-- --
@ -1193,6 +1206,14 @@ ALTER TABLE ONLY public."Host"
ADD CONSTRAINT "Host_pkey" PRIMARY KEY (repo_id); ADD CONSTRAINT "Host_pkey" PRIMARY KEY (repo_id);
--
-- Name: KmsSecret KmsSecret_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--
ALTER TABLE ONLY public."KmsSecret"
ADD CONSTRAINT "KmsSecret_pkey" PRIMARY KEY (revision_id);
-- --
-- Name: Lock Lock_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- Name: Lock Lock_pkey; Type: CONSTRAINT; Schema: public; Owner: -
-- --
@ -1538,6 +1559,13 @@ CREATE INDEX idxkjt9yaq92876dstimd93hwckh ON public."Domain" USING btree (curren
CREATE INDEX idxknk8gmj7s47q56cwpa6rmpt5l ON public."HostHistory" USING btree (history_type); CREATE INDEX idxknk8gmj7s47q56cwpa6rmpt5l ON public."HostHistory" USING btree (history_type);
--
-- Name: idxli9nil3s4t4p21i3xluvvilb7; Type: INDEX; Schema: public; Owner: -
--
CREATE INDEX idxli9nil3s4t4p21i3xluvvilb7 ON public."KmsSecret" USING btree (secret_name);
-- --
-- Name: idxlrq7v63pc21uoh3auq6eybyhl; Type: INDEX; Schema: public; Owner: - -- Name: idxlrq7v63pc21uoh3auq6eybyhl; Type: INDEX; Schema: public; Owner: -
-- --