diff --git a/.babelrc b/.babelrc
index 1ff94f7..8d8afd6 100644
--- a/.babelrc
+++ b/.babelrc
@@ -1,3 +1,4 @@
 {
-  "presets": ["next/babel"]
-}
+  "presets": ["next/babel"],
+  "plugins": [["relay", { "artifactDirectory": "./gql/__generated__" }]]
+}
\ No newline at end of file
diff --git a/.env.local.example b/.env.local.example
index 30743ad..f698edb 100644
--- a/.env.local.example
+++ b/.env.local.example
@@ -6,6 +6,9 @@ METAPHYSICS_URL="https://metaphysics-production.artsy.net"
 NEXT_PUBLIC_GRAVITY_URL="https://api.artsy.net"
 NEXT_PUBLIC_METAPHYSICS_URL="https://metaphysics-production.artsy.net"
 
+NEXT_PUBLIC_CAUSALITY_URL="https://causality-staging.artsy.net"
+NEXT_PUBLIC_CAUSALITY_TEMP_JWT=
+
 # Gravity client application
 CLIENT_APPLICATION_ID=REPLACE
 CLIENT_APPLICATION_SECRET=REPLACE
diff --git a/.gitignore b/.gitignore
index 1437c53..371695a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,8 @@
 # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
 
+# Relay
+__generated__/
+
 # dependencies
 /node_modules
 /.pnp
diff --git a/gql/causality.graphql b/gql/causality.graphql
new file mode 100644
index 0000000..e09c255
--- /dev/null
+++ b/gql/causality.graphql
@@ -0,0 +1,314 @@
+
+# Type not included by sangria's SchemaRenderer
+scalar Long
+
+type ArtsyBidder {
+  id: ID!
+  paddleNumber: ID!
+  userId: ID
+}
+
+"an online (Artsy) bidder, or an offline bidder in the auction"
+union Bidder = ArtsyBidder | OfflineBidder
+
+"DateTime is a scalar value that represents an ISO8601 formatted date and time."
+scalar DateTime
+
+"A permanent schedule of increments to use in for upcoming asking prices for a lot."
+type IncrementPolicy {
+  id: ID!
+  groupTag: ID!
+  subgroupTag: ID!
+  createdAt: DateTime!
+  initialIncrementCents: Long!
+  changes: [IncrementPolicyChange!]!
+
+  "Generate a list of asking prices across a given range."
+  enumerate(from: Long = 0, until: Long = 0,
+
+    "Defines treatment of off-increment `from` values."
+    nextIncrementRule: NextIncrementRule = SnapToPresetIncrements): [Money!]!
+}
+
+"Change thresholds and amounts for IncrementPolicy."
+type IncrementPolicyChange {
+  thresholdCents: Long!
+  incrementCents: Long!
+  threshold: Money!
+  increment: Money!
+}
+
+"A change in increment amount, to take effect at the given threshold."
+input IncrementPolicyChangeInput {
+  thresholdCents: Long!
+  incrementCents: Long!
+}
+
+"A groupTag and list of IncrementPolicySubgroups"
+type IncrementPolicyGroup {
+  groupTag: ID!
+  subgroupTags: [ID!]!
+  subgroups: [IncrementPolicySubgroup!]!
+}
+
+type IncrementPolicySubgroup {
+  subgroupTag: ID!
+  group: IncrementPolicyGroup!
+  revisions: [IncrementPolicy!]!
+}
+
+"A lot in a sale"
+type Lot {
+  "The Gravity Lot ID."
+  id: ID!
+
+  "The Gravity Lot ID."
+  internalID: ID!
+
+  "The Gravity Sale ID."
+  saleId: ID!
+
+  "total number of bids placed on the lot"
+  bidCount: Int!
+
+  "selling price on the live auction floor"
+  floorSellingPrice: Money
+
+  "The bidder currently winning the online portion of the auction"
+  floorWinningBidder: Bidder
+
+  "asking price for online bidders"
+  onlineAskingPrice: Money!
+
+  "The bidder currently winning the online portion of the auction"
+  onlineSellingToBidder: Bidder
+
+  "Whether the lot is sold, for sale or passed"
+  soldStatus: SoldStatus!
+
+  "The current reserve status for the lot"
+  reserveStatus: ReserveStatus!
+}
+
+"A user's position on a lot"
+type LotStanding implements Node {
+  "The ID of an object"
+  id: ID!
+  rawId: String!
+
+  "The current leading bid on the lot, whether it is winning or not"
+  leadingBidAmount: Money!
+
+  "whether this user has the leading bid"
+  isHighestBidder: Boolean!
+
+  "whether this user has the leading bid"
+  lotState: Lot!
+}
+
+"A connection to a list of items."
+type LotStandingConnection {
+  "Information to aid in pagination."
+  pageInfo: PageInfo!
+
+  "A list of edges."
+  edges: [LotStandingEdge]
+}
+
+"An edge in a connection."
+type LotStandingEdge {
+  "The item at the end of the edge."
+  node: LotStanding!
+
+  "A cursor for use in pagination."
+  cursor: String!
+}
+
+"Represents currency units and formatting"
+type Money {
+  units: Long!
+
+  "Formatted string version of currency amount"
+  displayAmount(
+    "Number of decimal places for the currency."
+    fractionalDigits: Int = 2,
+
+    "The 1000s separator."
+    groupingSeparator: String = ",",
+
+    "The decimal separator."
+    decimalSeparator: String = ".",
+
+    "Whether to show the fractional units."
+    showFractionalDigits: Boolean = true): String!
+}
+
+type Mutation {
+  "Permanently add a new increment policy to the database. It cannot be removed once added"
+  addIncrementPolicy(newIncrementPolicy: NewIncrementPolicyInput!): IncrementPolicy
+  addSale(id: ID!): Sale
+  banUserFromSale(saleId: ID!, userId: ID!): Sale
+  unbanUserFromSale(userId: ID!, saleId: ID!): Sale
+}
+
+"A draft schedule of increments to use in for upcoming asking prices for a lot."
+type NewIncrementPolicy {
+  id: ID
+  groupTag: ID!
+  subgroupTag: ID!
+  initialIncrementCents: Long!
+  changes: [IncrementPolicyChange!]!
+
+  "A listing of increments by tier"
+  enumeratedIncrements: [[Money!]!]!
+
+  "A listing of increments by tier"
+  prettyPrintedIncrements(
+    "Number of decimal places for the currency."
+    fractionalDigits: Int = 2): [String!]!
+
+  "The minimum percentage change between increments (~4% is typical)."
+  minPercentChange: Float!
+
+  "The maximum percentage change between increments (~10% is typical)."
+  maxPercentChange: Float!
+
+  "Any non-fatal warnings to check before committing the increment policy."
+  warnings: [String!]!
+}
+
+input NewIncrementPolicyInput {
+  id: ID
+  groupTag: ID!
+  subgroupTag: ID!
+  initialIncrementCents: Long!
+  changes: [IncrementPolicyChangeInput!]!
+}
+
+enum NextIncrementRule {
+  AddToPastValue
+  SnapToPresetIncrements
+}
+
+"An object with an ID"
+interface Node {
+  "The id of the object."
+  id: ID!
+}
+
+"An offline bidder (in the auction room)"
+type OfflineBidder {
+  singletonDummyField: String
+}
+
+"Information about pagination in a connection."
+type PageInfo {
+  "When paginating forwards, are there more items?"
+  hasNextPage: Boolean!
+
+  "When paginating backwards, are there more items?"
+  hasPreviousPage: Boolean!
+
+  "When paginating backwards, the cursor to continue."
+  startCursor: String
+
+  "When paginating forwards, the cursor to continue."
+  endCursor: String
+}
+
+type Query {
+  "Lot standings for a user"
+  lotStandingConnection(userId: ID!, before: String, after: String, first: Int, last: Int): LotStandingConnection!
+
+  "Returns an increment policy with specific `id`."
+  incrementPolicy(id: ID!): IncrementPolicy
+
+  "Previews a draft of a new increment policy."
+  previewIncrementPolicy(newIncrementPolicy: NewIncrementPolicyInput!): NewIncrementPolicy!
+
+  "All increment polices"
+  incrementPolicies: [IncrementPolicy!]!
+
+  "All increment polices by Group"
+  incrementPolicyGroups: [IncrementPolicyGroup!]!
+
+  "Returns a lot with specific `id`."
+  lot(id: ID!): Lot
+
+  "Returns a sale with specific `id`."
+  sale(id: ID!): Sale
+
+  "Fetches an object given its ID"
+  node(
+    "The ID of an object"
+    id: ID!): Node
+
+  "Fetches objects given their IDs"
+  nodes(
+    "The IDs of objects"
+    ids: [ID!]!): [Node]!
+}
+
+enum ReserveStatus {
+  NoReserve
+  ReserveMet
+  ReserveNotMet
+}
+
+"A collection of lots."
+type Sale {
+  "Users not allowed to participate in the sale"
+  bannedUsers: [User!]!
+
+  "The current lot on block."
+  currentLot: Lot
+
+  "The Gravity Sale ID."
+  id: ID!
+
+  "The Gravity Lot ID."
+  internalID: ID!
+
+  "The lots belonging to this sale."
+  lots: [Lot!]!
+
+  "Lot ids without a FairWarning event"
+  lotIdsWithoutFairWarning: [String!]!
+
+  "Lot ids without a FinalCall event"
+  lotIdsWithoutFinalCall: [String!]!
+
+  "Lot ids that had an Artsy bid that was the highest bid on the lot but did not win"
+  lotIdsWithHigherArtsyBidNotWon: [String!]!
+
+  "Lot ids that had an Artsy bid that was the same max bid as the hammer price on the lot but did not win"
+  lotIdsWithSameArtsyBidNotWon: [String!]!
+
+  "Passed lot ids with bids from Artsy bidders"
+  passedLotIdsWithArtsyBids: [String!]!
+
+  "Re-opened lots ids"
+  reopenedLotIds: [String!]!
+
+  "Total Artsy GMV for the sale"
+  totalSoldGMVCents: Long!
+}
+
+enum SoldStatus {
+  ForSale
+  Passed
+  Sold
+}
+
+"An Artsy User"
+type User implements Node {
+  "The ID of an object"
+  id: ID!
+  rawId: String!
+
+  "The user's id"
+  userId: ID!
+
+  "The user's gravity id"
+  internalID: ID!
+}
\ No newline at end of file
diff --git a/gql/metaphysicsV2.graphql b/gql/metaphysicsV2.graphql
new file mode 100644
index 0000000..b7727ad
--- /dev/null
+++ b/gql/metaphysicsV2.graphql
@@ -0,0 +1,11250 @@
+directive @principalField on FIELD
+
+type AccountRequest {
+  # A globally unique ID.
+  id: ID!
+
+  # A type-specific ID likely used as a database ID.
+  internalID: ID!
+  notes: String
+}
+
+# Autogenerated input type of AddAssetToConsignmentSubmission
+input AddAssetToConsignmentSubmissionInput {
+  assetType: String
+
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+  geminiToken: String!
+  submissionID: ID!
+}
+
+# Autogenerated return type of AddAssetToConsignmentSubmission
+type AddAssetToConsignmentSubmissionPayload {
+  asset: ConsignmentSubmissionCategoryAsset
+
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+}
+
+# One item in an aggregation
+type AggregationCount {
+  count: Int!
+  name: String!
+  value: String!
+}
+
+type AnalyticsArtist {
+  entityId: String!
+}
+
+type AnalyticsArtwork {
+  entityId: String!
+}
+
+# Publish artwork Series Stats
+type AnalyticsArtworksPublishedStats {
+  percentageChanged: Int!
+  period: AnalyticsQueryPeriodEnum!
+  timeSeries: [AnalyticsPartnerTimeSeriesStats!]!
+  totalCount: Int!
+}
+
+# An ISO 8601 datetime
+scalar AnalyticsDateTime
+
+# Visitor countries, device, referals and session page
+type AnalyticsGroupedStats {
+  groupedEntity: AnalyticsGroupedStatsUnion!
+  period: AnalyticsQueryPeriodEnum!
+}
+
+# The connection type for GroupedStats.
+type AnalyticsGroupedStatsConnection {
+  # A list of edges.
+  edges: [AnalyticsGroupedStatsEdge]
+
+  # A list of nodes.
+  nodes: [AnalyticsGroupedStats]
+
+  # Information to aid in pagination.
+  pageInfo: AnalyticsPageInfo!
+}
+
+# An edge in a connection.
+type AnalyticsGroupedStatsEdge {
+  # A cursor for use in pagination.
+  cursor: String!
+
+  # The item at the end of the edge.
+  node: AnalyticsGroupedStats
+}
+
+enum AnalyticsGroupedStatsMetricEnum {
+  # visitor_by_device
+  VISITOR_BY_DEVICE
+
+  # visitor_by_landing_page
+  VISITOR_BY_LANDING_PAGE
+
+  # visitor_by_location
+  VISITOR_BY_LOCATION
+
+  # visitor_by_referral
+  VISITOR_BY_REFERRAL
+}
+
+enum AnalyticsGroupedStatsObjectTypeEnum {
+  # country
+  COUNTRY
+
+  # device type
+  DEVICE
+
+  # landing page
+  LANDING_PAGE
+
+  # referral
+  REFERRAL
+}
+
+# A grouped stat item: country or device etc.
+union AnalyticsGroupedStatsUnion =
+    AnalyticsVisitorsByCountry
+  | AnalyticsVisitorsByDevice
+  | AnalyticsVisitorsByLandingPage
+  | AnalyticsVisitorsByReferral
+
+# A histogram bin
+type AnalyticsHistogramBin {
+  maxPrice(
+    decimal: String = "."
+    format: String = "%s%v"
+    precision: Int = 0
+    symbol: String
+    thousand: String = ","
+  ): String
+  maxPriceCents: Int!
+  minPrice(
+    decimal: String = "."
+    format: String = "%s%v"
+    precision: Int = 0
+    symbol: String
+    thousand: String = ","
+  ): String
+  minPriceCents: Int!
+  numArtworks: Int!
+}
+
+# Information about pagination in a connection.
+type AnalyticsPageInfo {
+  # When paginating forwards, the cursor to continue.
+  endCursor: String
+
+  # When paginating forwards, are there more items?
+  hasNextPage: Boolean!
+
+  # When paginating backwards, are there more items?
+  hasPreviousPage: Boolean!
+
+  # When paginating backwards, the cursor to continue.
+  startCursor: String
+}
+
+# Stats for pageviews of partner content
+type AnalyticsPageviewStats {
+  artworkViews: Int
+  galleryViews: Int
+  percentageChanged: Int!
+  period: AnalyticsQueryPeriodEnum!
+  showViews: Int
+  timeSeries: [AnalyticsPartnerTimeSeriesStats!]!
+  totalCount: Int!
+  uniqueVisitors: Int
+}
+
+# Audience stats of a partner
+type AnalyticsPartnerAudienceStats {
+  commercialVisitors: Int!
+  partnerId: String!
+  period: AnalyticsQueryPeriodEnum!
+  uniqueVisitors: Int!
+}
+
+# Inquiry count time series data of a partner
+type AnalyticsPartnerInquiryCountTimeSeriesStats {
+  count: Int
+  endTime: AnalyticsDateTime
+  startTime: AnalyticsDateTime
+}
+
+# Inquiry stats of a partner
+type AnalyticsPartnerInquiryStats {
+  inquiryCount: Int!
+
+  # Inquiry response time in seconds
+  inquiryResponseTime: Int
+  partnerId: String!
+  period: AnalyticsQueryPeriodEnum!
+
+  # Partner inquiry count time series
+  timeSeries(
+    cumulative: Boolean = false
+  ): [AnalyticsPartnerInquiryCountTimeSeriesStats!]
+}
+
+# Sales stats of a partner
+type AnalyticsPartnerSalesStats {
+  orderCount: Int!
+
+  # Order response time in seconds
+  orderResponseTime: Int
+  partnerId: String!
+  period: AnalyticsQueryPeriodEnum!
+
+  # Partner sales time series
+  timeSeries(
+    cumulative: Boolean = false
+  ): [AnalyticsPartnerSalesTimeSeriesStats!]
+  total(
+    decimal: String = "."
+    format: String = "%s%v"
+    precision: Int = 0
+    symbol: String
+    thousand: String = ","
+  ): String
+  totalCents: Int!
+}
+
+# Sales time series data of a partner
+type AnalyticsPartnerSalesTimeSeriesStats {
+  count: Int
+  endTime: AnalyticsDateTime
+  startTime: AnalyticsDateTime
+  total(
+    decimal: String = "."
+    format: String = "%s%v"
+    precision: Int = 0
+    symbol: String
+    thousand: String = ","
+  ): String
+  totalCents: Int!
+}
+
+# Partner Stats
+type AnalyticsPartnerStats {
+  # Time series data on number of artworks published
+  artworkPublished(
+    period: AnalyticsQueryPeriodEnum!
+  ): AnalyticsPartnerStatsArtworksPublished
+
+  # Time series data on number of artworks published
+  artworksPublished(
+    period: AnalyticsQueryPeriodEnum!
+  ): AnalyticsArtworksPublishedStats
+    @deprecated(
+      reason: "Use artworkPublished for refactored time series bucket code"
+    )
+
+  # Audience stats
+  audience(period: AnalyticsQueryPeriodEnum!): AnalyticsPartnerAudienceStats
+
+  # Visitor countries, device, referals and session page
+  groupedStats(
+    # Returns the elements in the list that come after the specified cursor.
+    after: String
+
+    # Returns the elements in the list that come before the specified cursor.
+    before: String
+
+    # Returns the first _n_ elements from the list.
+    first: Int
+
+    # Returns the last _n_ elements from the list.
+    last: Int
+    metric: AnalyticsGroupedStatsMetricEnum!
+    objectType: AnalyticsGroupedStatsObjectTypeEnum!
+    period: AnalyticsQueryPeriodEnum!
+  ): AnalyticsGroupedStatsConnection
+
+  # Inquiry stats
+  inquiry(period: AnalyticsQueryPeriodEnum!): AnalyticsPartnerInquiryStats
+
+  # Different types of partner pageviews
+  pageview(period: AnalyticsQueryPeriodEnum!): AnalyticsPartnerStatsPageviews
+
+  # Different types of partner pageviews
+  pageviews(period: AnalyticsQueryPeriodEnum!): AnalyticsPageviewStats
+    @deprecated(reason: "Use pageview for refactored time series bucket code")
+  partnerId: String!
+
+  # Artworks, shows, or artists ranked by views. Capped at 20 by the underlying sql query.
+  rankedStats(
+    # Returns the elements in the list that come after the specified cursor.
+    after: String
+
+    # Returns the elements in the list that come before the specified cursor.
+    before: String
+
+    # Returns the first _n_ elements from the list.
+    first: Int
+
+    # Returns the last _n_ elements from the list.
+    last: Int
+    objectType: AnalyticsRankedStatsObjectTypeEnum!
+    period: AnalyticsQueryPeriodEnum!
+  ): AnalyticsRankedStatsConnection
+
+  # Sales stats
+  sales(period: AnalyticsQueryPeriodEnum!): AnalyticsPartnerSalesStats
+
+  # Top artworks ranked by views
+  topArtworks(
+    # Returns the elements in the list that come after the specified cursor.
+    after: String
+
+    # Returns the elements in the list that come before the specified cursor.
+    before: String
+
+    # Returns the first _n_ elements from the list.
+    first: Int
+
+    # Returns the last _n_ elements from the list.
+    last: Int
+  ): AnalyticsRankedStatsConnection
+    @deprecated(reason: "Use rankedStats(objectType: ) instead")
+
+  # Number of unique visitors
+  uniqueVisitors(period: AnalyticsQueryPeriodEnum!): Int
+    @deprecated(reason: "Use audience() { uniqueVisitors } instead")
+}
+
+# Publish artwork Series Stats
+type AnalyticsPartnerStatsArtworksPublished {
+  partnerId: String!
+  percentageChanged: Int!
+  period: AnalyticsQueryPeriodEnum!
+
+  # Partner artworks published count time series
+  timeSeries(
+    cumulative: Boolean = false
+  ): [AnalyticsPartnerStatsArtworksPublishedTimeSeries!]!
+  totalCount: Int!
+}
+
+# Artworks published time series data of a partner
+type AnalyticsPartnerStatsArtworksPublishedTimeSeries {
+  count: Int
+  endTime: AnalyticsDateTime
+  startTime: AnalyticsDateTime
+}
+
+# Stats for pageviews of partner content
+type AnalyticsPartnerStatsPageviews {
+  artworkViews: Int!
+  galleryViews: Int!
+  partnerId: String!
+  percentageChanged: Int!
+  period: AnalyticsQueryPeriodEnum!
+  showViews: Int!
+
+  # Pageviews time series
+  timeSeries(
+    cumulative: Boolean = false
+  ): [AnalyticsPartnerStatsPageviewsTimeSeries!]
+  totalCount: Int!
+  uniqueVisitors: Int!
+}
+
+# Pageviews time series data of a partner
+type AnalyticsPartnerStatsPageviewsTimeSeries {
+  count: Int
+  endTime: AnalyticsDateTime
+  startTime: AnalyticsDateTime
+}
+
+# Partner Time Series Stats
+type AnalyticsPartnerTimeSeriesStats {
+  count: Int
+  endTime: AnalyticsDateTime
+  startTime: AnalyticsDateTime
+}
+
+# Price Context Filter Type
+type AnalyticsPriceContextFilterType {
+  category: AnalyticsPricingContextCategoryEnum
+  dimension: AnalyticsPricingContextDimensionEnum
+}
+
+# Pricing Context Histogram
+type AnalyticsPricingContext {
+  appliedFilters: AnalyticsPriceContextFilterType!
+  appliedFiltersDisplay: String
+  bins: [AnalyticsHistogramBin!]!
+}
+
+enum AnalyticsPricingContextCategoryEnum {
+  # Architecture
+  ARCHITECTURE
+
+  # Books and Portfolios
+  BOOKS_AND_PORTFOLIOS
+
+  # Design/Decorative Art
+  DESIGN_DECORATIVE_ART
+
+  # Drawing, Collage or other Work on Paper
+  DRAWING_COLLAGE_OTHER_WORK_ON_PAPER
+
+  # Fashion Design and Wearable Art
+  FASHION
+
+  # Installation
+  INSTALLATION
+
+  # Jewelry
+  JEWELRY
+
+  # Mixed Media
+  MIXED_MEDIA
+
+  # Other
+  OTHER
+
+  # Painting
+  PAINTING
+
+  # Performance Art
+  PERFORMANCE
+
+  # Photography
+  PHOTOGRAPHY
+
+  # Posters
+  POSTERS
+
+  # Print
+  PRINT
+
+  # Sculpture
+  SCULPTURE
+
+  # Sound
+  SOUND
+
+  # Textile Arts
+  TEXTILE
+
+  # Video/Film/Animation
+  VIDEO_FILM_ANIMATION
+
+  # Work on Paper
+  WORK_ON_PAPER
+}
+
+enum AnalyticsPricingContextDimensionEnum {
+  # Large
+  LARGE
+
+  # Medium
+  MEDIUM
+
+  # Small
+  SMALL
+}
+
+enum AnalyticsQueryPeriodEnum {
+  # Four weeks
+  FOUR_WEEKS
+
+  # One year
+  ONE_YEAR
+
+  # Sixteen weeks
+  SIXTEEN_WEEKS
+}
+
+union AnalyticsRankedEntityUnion = Artist | Artwork | Show
+
+# Top artworks, shows, or artists from a partner
+type AnalyticsRankedStats {
+  entity: AnalyticsRankedEntityUnion
+  period: AnalyticsQueryPeriodEnum!
+  rankedEntity: AnalyticsRankedStatsUnion!
+  value: Int!
+}
+
+# The connection type for RankedStats.
+type AnalyticsRankedStatsConnection {
+  # A list of edges.
+  edges: [AnalyticsRankedStatsEdge]
+
+  # A list of nodes.
+  nodes: [AnalyticsRankedStats]
+
+  # Information to aid in pagination.
+  pageInfo: AnalyticsPageInfo!
+}
+
+# An edge in a connection.
+type AnalyticsRankedStatsEdge {
+  # A cursor for use in pagination.
+  cursor: String!
+
+  # The item at the end of the edge.
+  node: AnalyticsRankedStats
+}
+
+enum AnalyticsRankedStatsObjectTypeEnum {
+  # Artist
+  ARTIST
+
+  # Artwork
+  ARTWORK
+
+  # Show
+  SHOW
+}
+
+# An artwork, artist, or show
+union AnalyticsRankedStatsUnion =
+    AnalyticsArtist
+  | AnalyticsArtwork
+  | AnalyticsShow
+
+type AnalyticsShow {
+  entityId: String!
+}
+
+# Statistics for users
+type AnalyticsUserStats {
+  totalPurchaseCount: Int!
+  userId: String!
+}
+
+type AnalyticsVisitorsByCountry {
+  metric: String!
+  name: String!
+  percent: Float!
+  type: String!
+  value: Int!
+}
+
+type AnalyticsVisitorsByDevice {
+  metric: String!
+  name: String!
+  percent: Float!
+  type: String!
+  value: Int!
+}
+
+type AnalyticsVisitorsByLandingPage {
+  metric: String!
+  name: String!
+  percent: Float!
+  type: String!
+  value: Int!
+}
+
+type AnalyticsVisitorsByReferral {
+  metric: String!
+  name: String!
+  percent: Float!
+  type: String!
+  value: Int!
+}
+
+# App Authenticator Two-Factor Authentication factor
+type AppSecondFactor implements SecondFactor {
+  createdAt: ISO8601DateTime!
+  disabledAt: ISO8601DateTime
+  enabled: Boolean!
+  enabledAt: ISO8601DateTime
+  internalID: ID!
+  kind: SecondFactorKind!
+  name: String
+  otpProvisioningURI: String
+  otpSecret: String
+  updatedAt: ISO8601DateTime!
+}
+
+# Second factor input attributes
+input AppSecondFactorAttributes {
+  # Name of the second factor
+  name: String
+}
+
+# An app second factor or errors
+union AppSecondFactorOrErrorsUnion = AppSecondFactor | Errors
+
+type ARImage {
+  height: Int
+  imageURLs: ImageURLs
+  internalID: ID!
+  width: Int
+}
+
+input ARImageInput {
+  internalID: ID!
+}
+
+type Article implements Node {
+  author: Author
+  cached: Int
+  channelID: String
+  contributingAuthors: [Author]
+  href: String
+
+  # A globally unique ID.
+  id: ID!
+
+  # A type-specific ID.
+  internalID: ID!
+  publishedAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String
+  slug: String
+  thumbnailImage: Image
+  thumbnailTeaser: String
+  thumbnailTitle: String
+  tier: Int
+  title: String
+  updatedAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String
+}
+
+# A connection to a list of items.
+type ArticleConnection {
+  # A list of edges.
+  edges: [ArticleEdge]
+  pageCursors: PageCursors!
+
+  # Information to aid in pagination.
+  pageInfo: PageInfo!
+  totalCount: Int
+}
+
+# An edge in a connection.
+type ArticleEdge {
+  # A cursor for use in pagination
+  cursor: String!
+
+  # The item at the end of the edge
+  node: Article
+}
+
+enum ArticleSorts {
+  PUBLISHED_AT_ASC
+  PUBLISHED_AT_DESC
+}
+
+type Artist implements EntityWithFilterArtworksConnectionInterface & Node & Searchable {
+  alternateNames: [String]
+  articlesConnection(
+    after: String
+    before: String
+    first: Int
+    inEditorialFeed: Boolean
+    last: Int
+    limit: Int
+    sort: ArticleSorts
+  ): ArticleConnection
+  artistSeriesConnection(
+    after: String
+    before: String
+    first: Int
+    last: Int
+  ): ArtistSeriesConnection
+  artworksConnection(
+    after: String
+    before: String
+
+    # List of artwork IDs to exclude from the response.
+    exclude: [String]
+    filter: [ArtistArtworksFilters]
+    first: Int
+    last: Int
+    published: Boolean = true
+    sort: ArtworkSorts
+  ): ArtworkConnection
+  auctionResultsConnection(
+    after: String
+
+    # Filter auction results by empty artwork created date values
+    allowEmptyCreatedDates: Boolean = true
+    before: String
+
+    # Filter auction results by category (medium)
+    categories: [String]
+
+    # Filter auction results by earliest created at year
+    earliestCreatedYear: Int
+    first: Int
+    last: Int
+
+    # Filter auction results by latest created at year
+    latestCreatedYear: Int
+
+    # Filter auction results by organizations
+    organizations: [String]
+
+    # When true, will only return records for allowed artists.
+    recordsTrusted: Boolean = false
+
+    # Filter auction results by Artwork sizes
+    sizes: [ArtworkSizes]
+    sort: AuctionResultSorts
+  ): AuctionResultConnection
+
+  # In applicable contexts, this is what the artist (as a suggestion) is based on.
+  basedOn: Artist
+  bio: String
+
+  # The Artist biography article written by Artsy
+  biography: Article
+  biographyBlurb(
+    format: Format
+
+    # If true, will return featured bio over Artsy one.
+    partnerBio: Boolean = false
+  ): ArtistBlurb
+  birthday: String
+  blurb(format: Format): String
+  cached: Int
+  carousel: ArtistCarousel
+  collections: [String]
+  contemporary(
+    excludeArtistsWithoutArtworks: Boolean = true
+
+    # The number of Artists to return
+    size: Int
+  ): [Artist]
+  counts: ArtistCounts
+  currentEvent: CurrentEvent
+  deathday: String
+  disablePriceContext: Boolean
+  displayLabel: String
+
+  # Custom-sorted list of shows for an artist, in order of significance.
+  exhibitionHighlights(
+    # The number of Shows to return
+    size: Int = 5
+  ): [Show]
+
+  # Artworks Elastic Search results
+  filterArtworksConnection(
+    acquireable: Boolean
+    after: String
+    aggregationPartnerCities: [String]
+    aggregations: [ArtworkAggregation]
+    artistID: String
+    artistIDs: [String]
+    artistSeriesID: String
+    atAuction: Boolean
+    attributionClass: [String]
+    before: String
+    color: String
+    dimensionRange: String
+    excludeArtworkIDs: [String]
+    extraAggregationGeneIDs: [String]
+    first: Int
+    forSale: Boolean
+    geneID: String
+    geneIDs: [String]
+    height: String
+    includeArtworksByFollowedArtists: Boolean
+    includeMediumFilterInAggregation: Boolean
+    inquireableOnly: Boolean
+    keyword: String
+
+    # When true, will only return exact keyword match
+    keywordMatchExact: Boolean
+    last: Int
+    majorPeriods: [String]
+
+    # When true, will only return `marketable` works (not nude or provocative).
+    marketable: Boolean
+
+    # A string from the list of allocations, or * to denote all mediums
+    medium: String
+    offerable: Boolean
+    page: Int
+    partnerCities: [String]
+    partnerID: ID
+    period: String
+    periods: [String]
+    priceRange: String
+    saleID: ID
+    size: Int
+
+    # Filter results by Artwork sizes
+    sizes: [ArtworkSizes]
+    sort: String
+    tagID: String
+    width: String
+  ): FilterArtworksConnection
+
+  # A string showing the total number of works and those for sale
+  formattedArtworksCount: String
+
+  # A string of the form "Nationality, Birthday (or Birthday-Deathday)"
+  formattedNationalityAndBirthday: String
+  gender: String
+
+  # A list of genes associated with an artist
+  genes: [Gene]
+  hasMetadata: Boolean
+  highlights: ArtistHighlights
+  hometown: String
+  href: String
+
+  # A globally unique ID.
+  id: ID!
+  image: Image
+  imageUrl: String
+  initials(length: Int = 3): String
+  insights: [ArtistInsight]
+
+  # A type-specific ID likely used as a database ID.
+  internalID: ID!
+  isConsignable: Boolean
+
+  # Only specific Artists should show a link to auction results.
+  isDisplayAuctionLink: Boolean
+  isFollowed: Boolean
+  isPublic: Boolean
+  isShareable: Boolean
+  location: String
+  marketingCollections(
+    category: String
+    isFeaturedArtistContent: Boolean
+    randomizationSeed: String
+    showOnEditorial: Boolean
+    size: Int
+    slugs: [String!]
+  ): [MarketingCollection]
+  meta: ArtistMeta
+  name: String
+  nationality: String
+  partnerArtists(
+    # The number of PartnerArtists to return
+    size: Int
+  ): [PartnerArtist]
+  partnersConnection(
+    after: String
+    before: String
+    first: Int
+    last: Int
+    partnerCategory: [String]
+    representedBy: Boolean
+  ): PartnerArtistConnection
+  related: ArtistRelatedData
+  sales(
+    isAuction: Boolean
+    live: Boolean
+
+    # The number of Sales to return
+    size: Int
+    sort: SaleSorts
+  ): [Sale]
+  showsConnection(
+    active: Boolean
+    after: String
+    atAFair: Boolean
+    before: String
+    first: Int
+    isReference: Boolean
+    last: Int
+
+    # The number of PartnerShows to return
+    size: Int
+    soloShow: Boolean
+    sort: ShowSorts
+    status: String
+    topTier: Boolean
+    visibleToPublic: Boolean
+  ): ShowConnection
+
+  # A slug ID.
+  slug: ID!
+
+  # Use this attribute to sort by when sorting a collection of Artists
+  sortableID: String
+  statuses: ArtistStatuses
+  targetSupply: ArtistTargetSupply
+  years: String
+}
+
+type ArtistArtworkGrid implements ArtworkContextGrid {
+  artworksConnection(
+    after: String
+    before: String
+    first: Int
+    last: Int
+  ): ArtworkConnection
+  ctaHref: String
+  ctaTitle: String
+  title: String
+}
+
+enum ArtistArtworksFilters {
+  IS_FOR_SALE
+  IS_NOT_FOR_SALE
+}
+
+type ArtistBlurb {
+  credit: String
+
+  # The partner id of the partner who submitted the featured bio.
+  partnerID: String
+  text: String
+}
+
+type ArtistCarousel {
+  images: [Image]
+}
+
+# A connection to a list of items.
+type ArtistConnection {
+  # A list of edges.
+  edges: [ArtistEdge]
+  pageCursors: PageCursors!
+
+  # Information to aid in pagination.
+  pageInfo: PageInfo!
+  totalCount: Int
+}
+
+type ArtistCounts {
+  articles: Int
+  artworks(
+    # Returns a `String` when format is specified. e.g.`'0,0.0000''`
+    format: String
+    label: String
+  ): FormattedNumber
+  auctionArtworks(
+    # Returns a `String` when format is specified. e.g.`'0,0.0000''`
+    format: String
+    label: String
+  ): FormattedNumber
+  ecommerceArtworks(
+    # Returns a `String` when format is specified. e.g.`'0,0.0000''`
+    format: String
+    label: String
+  ): FormattedNumber
+  follows(
+    # Returns a `String` when format is specified. e.g.`'0,0.0000''`
+    format: String
+    label: String
+  ): FormattedNumber
+  forSaleArtworks(
+    # Returns a `String` when format is specified. e.g.`'0,0.0000''`
+    format: String
+    label: String
+  ): FormattedNumber
+  hasMakeOfferArtworks: Boolean
+  partnerShows(
+    # Returns a `String` when format is specified. e.g.`'0,0.0000''`
+    format: String
+    label: String
+  ): FormattedNumber
+  relatedArtists: Int
+}
+
+# An edge in a connection.
+type ArtistEdge {
+  # A cursor for use in pagination
+  cursor: String!
+
+  # The item at the end of the edge
+  node: Artist
+}
+
+type ArtistGroup {
+  # Artists sorted by last name
+  items: [Artist]
+
+  # Letter artists group belongs to
+  letter: String
+}
+
+type ArtistHighlights {
+  partnersConnection(
+    after: String
+    before: String
+    displayOnPartnerProfile: Boolean
+    first: Int
+    last: Int
+    partnerCategory: [String]
+    representedBy: Boolean
+  ): PartnerArtistConnection
+}
+
+type ArtistInsight {
+  # List of entities relevant to the insight.
+  entities: [String]
+
+  # Label to use when displaying the insight.
+  label: String
+
+  # The type of insight.
+  type: String
+}
+
+type ArtistMeta {
+  description: String
+  title: String
+}
+
+# A connection to a list of items.
+type ArtistPartnerConnection {
+  # A list of edges.
+  edges: [ArtistPartnerEdge]
+  pageCursors: PageCursors!
+
+  # Information to aid in pagination.
+  pageInfo: PageInfo!
+  totalCount: Int
+}
+
+# An edge in a connection.
+type ArtistPartnerEdge {
+  artist: Artist
+  biography: String
+  counts: PartnerArtistCounts
+
+  # A cursor for use in pagination
+  cursor: String!
+
+  # A globally unique ID.
+  id: ID!
+
+  # A type-specific ID.
+  internalID: ID!
+  isDisplayOnPartnerProfile: Boolean
+  isUseDefaultBiography: Boolean
+
+  # The item at the end of the edge
+  node: Artist
+  partner: Partner
+  representedBy: Boolean
+  sortableID: String
+}
+
+type ArtistRelatedData {
+  artistsConnection(
+    after: String
+    before: String
+    excludeArtistsWithoutArtworks: Boolean = true
+    first: Int
+    kind: RelatedArtistsKind
+    last: Int
+    minForsaleArtworks: Int
+  ): ArtistConnection
+  genes(after: String, before: String, first: Int, last: Int): GeneConnection
+
+  # A list of the current user’s suggested artists, based on a single artist
+  suggestedConnection(
+    after: String
+    before: String
+
+    # Exclude these ids from results, may result in all artists being excluded.
+    excludeArtistIDs: [String]
+
+    # Exclude artists without any artworks
+    excludeArtistsWithoutArtworks: Boolean
+
+    # Exclude artists without for sale works
+    excludeArtistsWithoutForsaleArtworks: Boolean
+
+    # Exclude artists the user already follows
+    excludeFollowedArtists: Boolean
+    first: Int
+    last: Int
+  ): ArtistConnection
+}
+
+type ArtistSeries {
+  # List of Mongo IDs for associated Artists
+  artistIDs: [String!]!
+  artists(page: Int, size: Int): [Artist]
+  artworkIDs: [ID!]!
+  artworksConnection(after: String, first: Int): ArtworkConnection
+  artworksCount: Int!
+
+  # A formatted string that shows the number of available works or
+  # (as a fallback) the number of works in general.
+  artworksCountMessage: String
+  description: String
+  descriptionFormatted(format: Format): String
+  featured: Boolean!
+  filterArtworksConnection(
+    acquireable: Boolean
+    after: String
+    aggregationPartnerCities: [String]
+    aggregations: [ArtworkAggregation]
+    artistID: String
+    artistIDs: [String]
+    artistSeriesID: String
+    atAuction: Boolean
+    attributionClass: [String]
+    before: String
+    color: String
+    dimensionRange: String
+    excludeArtworkIDs: [String]
+    extraAggregationGeneIDs: [String]
+    first: Int
+    forSale: Boolean
+    geneID: String
+    geneIDs: [String]
+    height: String
+    includeArtworksByFollowedArtists: Boolean
+    includeMediumFilterInAggregation: Boolean
+    inquireableOnly: Boolean
+    keyword: String
+    keywordMatchExact: Boolean
+    last: Int
+    majorPeriods: [String]
+    marketable: Boolean
+    medium: String
+    offerable: Boolean
+    page: Int
+    partnerCities: [String]
+    partnerID: ID
+    period: String
+    periods: [String]
+    priceRange: String
+    saleID: ID
+    size: Int
+    sizes: [ArtworkSizes]
+    sort: String
+    tagID: String
+    width: String
+  ): FilterArtworksConnection
+  forSaleArtworksCount: Int!
+  image: Image
+  imageHeight: Int
+  imageURL: String
+  imageWidth: Int
+
+  # Unique ID for this artist series
+  internalID: ID!
+  published: Boolean!
+  representativeArtworkID: ID
+  slug: String!
+  title: String!
+}
+
+# The connection type for ArtistSeries.
+type ArtistSeriesConnection {
+  # A list of edges.
+  edges: [ArtistSeriesEdge]
+
+  # A list of nodes.
+  nodes: [ArtistSeries]
+
+  # Information to aid in pagination.
+  pageInfo: PageInfo!
+
+  # Total count of matching nodes, before pagination
+  totalCount: Int!
+}
+
+# An edge in a connection.
+type ArtistSeriesEdge {
+  # A cursor for use in pagination.
+  cursor: String!
+
+  # The item at the end of the edge.
+  node: ArtistSeries
+}
+
+enum ArtistSorts {
+  SORTABLE_ID_ASC
+  SORTABLE_ID_DESC
+  TRENDING_DESC
+}
+
+type ArtistStatuses {
+  articles: Boolean
+  artists: Boolean
+  artworks: Boolean
+  auctionLots: Boolean
+  biography: Boolean
+  contemporary: Boolean
+  cv(
+    # Suppress the cv tab when artist show count is less than this.
+    minShowCount: Int = 15
+  ): Boolean
+  shows: Boolean
+}
+
+type ArtistTargetSupply {
+  # True if an artist is in the microfunnel list.
+  isInMicrofunnel: Boolean
+
+  # True if artist is in target supply list.
+  isTargetSupply: Boolean
+  microfunnel: ArtistTargetSupplyMicrofunnel
+}
+
+type ArtistTargetSupplyMicrofunnel {
+  artworks(
+    # Randomize the order of artworks for display purposes.
+    randomize: Boolean
+
+    # Number of artworks to return
+    size: Int
+  ): [ArtistTargetSupplyMicrofunnelArtwork]
+    @deprecated(
+      reason: "Prefer to use `artworksConnection`. [Will be removed in v2]"
+    )
+
+  # A list of recently sold artworks.
+  artworksConnection(
+    after: String
+    before: String
+    first: Int
+    last: Int
+
+    # Randomize the order of artworks for display purposes.
+    randomize: Boolean
+  ): ArtworkConnection
+  metadata: TargetSupplyMicrofunnelMetadata
+}
+
+type ArtistTargetSupplyMicrofunnelArtwork {
+  artwork: Artwork
+  realizedPrice: String
+}
+
+type Artwork implements Node & Searchable & Sellable {
+  additionalInformation(format: Format): String
+  articles(size: Int): [Article]
+  artist(
+    # Use whatever is in the original response instead of making a request
+    shallow: Boolean
+  ): Artist
+  artistNames: String
+  artists(
+    # Use whatever is in the original response instead of making a request
+    shallow: Boolean
+  ): [Artist]
+  artistSeriesConnection(
+    after: String
+    before: String
+    first: Int
+    last: Int
+  ): ArtistSeriesConnection
+
+  # Attribution class object
+  attributionClass: AttributionClass
+  availability: String
+  cached: Int
+
+  # Can a user request a lot conditions report for this artwork?
+  canRequestLotConditionsReport: Boolean
+  category: String
+
+  # Returns the display label and detail for artwork certificate of authenticity
+  certificateOfAuthenticity: ArtworkInfoRow
+  collectingInstitution: String
+  conditionDescription: ArtworkInfoRow
+  contactLabel: String
+
+  # Pre-filled inquiry text
+  contactMessage: String
+
+  # Returns the associated Fair/Sale/Show
+  context: ArtworkContext
+  contextGrids: [ArtworkContextGrid]
+
+  # The currency code used to pay for the artwork
+  costCurrencyCode: String
+
+  # The amount paid for the artwork, in cents
+  costMinor: Int
+  culturalMaker: String
+  date: String
+
+  # The depth as expressed by the original input metric
+  depth: String
+  description(format: Format): String
+  dimensions: dimensions
+  displayLabel: String
+  editionNumber: String
+  editionOf: String
+  editionSets(sort: EditionSetSorts): [EditionSet]
+  editionSize: String
+
+  # Returns an HTML string representing the embedded content (video)
+  embed(autoplay: Boolean = false, height: Int = 450, width: Int = 853): String
+
+  # Flags if artwork located in one of EU local shipping countries.
+  euShippingOrigin: Boolean
+  exhibitionHistory(format: Format): String
+  fair: Fair
+
+  # Formatted artwork metadata, including artist, title, date and partner; e.g., 'Andy Warhol, Truck, 1980, Westward Gallery'.
+  formattedMetadata: String
+  framed: ArtworkInfoRow
+
+  # Returns true when artwork has a certificate of authenticity
+  hasCertificateOfAuthenticity: Boolean
+
+  # The height as expressed by the original input metric
+  height: String
+
+  # If you need to render artwork dimensions as a string, prefer the `Artwork#dimensions` field
+  heightCm: Float
+
+  # Returns the highlighted shows and articles
+  highlights: [ArtworkHighlight]
+  href: String
+
+  # A globally unique ID.
+  id: ID!
+  image: Image
+  imageRights: String
+  images(size: Int): [Image]
+  imageTitle: String
+  imageUrl: String
+
+  # Structured questions a collector can inquire on about this work
+  inquiryQuestions: [InquiryQuestion]
+
+  # A type-specific ID likely used as a database ID.
+  internalID: ID!
+
+  # Private text field for partner use
+  inventoryId: String
+
+  # Whether a work can be purchased through e-commerce
+  isAcquireable: Boolean
+
+  # Is this artwork part of an auction that is currently running?
+  isBiddable: Boolean
+
+  # When in an auction, can the work be bought immediately
+  isBuyNowable: Boolean
+  isComparableWithAuctionResults: Boolean
+  isDownloadable: Boolean
+  isEmbeddableVideo: Boolean
+  isForSale: Boolean
+  isHangable: Boolean
+
+  # Is this artwork part of an auction?
+  isInAuction: Boolean
+
+  # Do we want to encourage inquiries on this work?
+  isInquireable: Boolean
+
+  # Is this artwork part of a current show
+  isInShow: Boolean
+  isNotForSale: String
+
+  # Whether a user can make an offer on a work
+  isOfferable: Boolean
+  isOnHold: String
+  isPriceHidden: Boolean
+  isPriceRange: Boolean
+  isSaved: Boolean
+  isShareable: Boolean
+  isSold: Boolean
+  isUnique: Boolean
+  layer(id: String): ArtworkLayer
+  layers: [ArtworkLayer]
+  listPrice: ListPrice
+  literature(format: Format): String
+  manufacturer(format: Format): String
+  medium: String
+  meta: ArtworkMeta
+
+  # The unit of length of the artwork, expressed in `in` or `cm`
+  metric: String
+  myLotStanding(live: Boolean = null): [LotStanding!]
+
+  # Is this work only available for shipping domestically?
+  onlyShipsDomestically: Boolean
+  partner(
+    # Use whatever is in the original response instead of making a request
+    shallow: Boolean
+  ): Partner
+  pickupAvailable: Boolean
+  priceCurrency: String
+  priceIncludesTax: Boolean
+  priceIncludesTaxDisplay: String
+  pricingContext: AnalyticsPricingContext
+  provenance(format: Format): String
+
+  # Whether this artwork is published or not
+  published: Boolean!
+  publisher(format: Format): String
+
+  # Price which an artwork was sold for. This generally only applies to artworks
+  # in the target supply microfunnel and (currently) queries against hardcoded
+  # spreadsheet data.
+  realizedPrice: String
+  related(size: Int): [Artwork]
+  sale: Sale
+  saleArtwork(saleID: String = null): SaleArtwork
+  saleMessage: String
+  series(format: Format): String
+
+  # The country an artwork will be shipped from.
+  shippingCountry: String
+
+  # The string that describes domestic and international shipping.
+  shippingInfo: String
+
+  # Minimal location information describing from where artwork will be shipped.
+  shippingOrigin: String
+
+  # Is this work available for shipping only within the Contenental US?
+  shipsToContinentalUSOnly: Boolean
+    @deprecated(
+      reason: "Prefer to use `onlyShipsDomestically`. [Will be removed in v2]"
+    )
+  show(active: Boolean, atAFair: Boolean, sort: ShowSorts): Show
+  shows(active: Boolean, atAFair: Boolean, size: Int, sort: ShowSorts): [Show]
+  signature(format: Format): String
+  signatureInfo: ArtworkInfoRow
+
+  # score assigned to an artwork based on its dimensions
+  sizeScore: Float
+
+  # A slug ID.
+  slug: ID!
+  title: String
+
+  # Whether this artwork is unlisted or not
+  unlisted: Boolean
+
+  # If the category is video, then it returns the href for the (youtube/vimeo) video, otherwise returns the website from CMS
+  website: String
+
+  # The width as expressed by the original input metric
+  width: String
+
+  # If you need to render artwork dimensions as a string, prefer the `Artwork#dimensions` field
+  widthCm: Float
+}
+
+enum ArtworkAggregation {
+  ARTIST
+  COLOR
+  DIMENSION_RANGE
+  FOLLOWED_ARTISTS
+  GALLERY
+  INSTITUTION
+  MAJOR_PERIOD
+  MEDIUM
+  MERCHANDISABLE_ARTISTS
+  PARTNER_CITY
+  PERIOD
+  PRICE_RANGE
+  TOTAL
+}
+
+# A connection to a list of items.
+type ArtworkConnection implements ArtworkConnectionInterface {
+  # A list of edges.
+  edges: [ArtworkEdge]
+  pageCursors: PageCursors!
+
+  # Information to aid in pagination.
+  pageInfo: PageInfo!
+  totalCount: Int
+}
+
+interface ArtworkConnectionInterface {
+  edges: [ArtworkEdgeInterface]
+  pageCursors: PageCursors!
+  pageInfo: PageInfo!
+}
+
+union ArtworkContext = Fair | Sale | Show
+
+# A specific grid.
+interface ArtworkContextGrid {
+  artworksConnection(
+    after: String
+    before: String
+    first: Int
+    last: Int
+  ): ArtworkConnection
+  ctaHref: String
+  ctaTitle: String
+  title: String
+}
+
+# An edge in a connection.
+type ArtworkEdge implements ArtworkEdgeInterface {
+  # A cursor for use in pagination
+  cursor: String!
+
+  # The item at the end of the edge
+  node: Artwork
+}
+
+interface ArtworkEdgeInterface {
+  cursor: String
+  node: Artwork
+}
+
+union ArtworkFilterFacet = Gene | Tag
+
+union ArtworkHighlight = Article | Show
+
+type ArtworkInfoRow {
+  # Additional details about given attribute
+  details: String
+
+  # Label for information row
+  label: String
+}
+
+# An inquiry on an Artwork
+type ArtworkInquiry {
+  artwork: Artwork!
+
+  # A globally unique ID.
+  id: ID!
+  impulseConversationID: String
+
+  # A type-specific ID likely used as a database ID.
+  internalID: ID!
+}
+
+# A connection to a list of items.
+type ArtworkInquiryConnection {
+  # A list of edges.
+  edges: [ArtworkInquiryEdge]
+
+  # Information to aid in pagination.
+  pageInfo: PageInfo!
+}
+
+# An edge in a connection.
+type ArtworkInquiryEdge {
+  # A cursor for use in pagination
+  cursor: String!
+
+  # The item at the end of the edge
+  node: ArtworkInquiry
+}
+
+type ArtworkLayer {
+  # A connection of artworks from a Layer.
+  artworksConnection(
+    after: String
+    before: String
+    first: Int
+    last: Int
+  ): ArtworkConnection
+  description: String
+  href: String
+
+  # A globally unique ID.
+  id: ID!
+
+  # A type-specific ID.
+  internalID: ID!
+  name: String
+  type: String
+}
+
+type ArtworkMeta {
+  description(limit: Int = 155): String
+  image: String
+  share: String
+  title: String
+}
+
+# The results for one of the requested aggregations
+type ArtworksAggregationResults {
+  counts: [AggregationCount]
+  slice: ArtworkAggregation
+}
+
+enum ArtworkSizes {
+  LARGE
+  MEDIUM
+  SMALL
+}
+
+enum ArtworkSorts {
+  AVAILABILITY_ASC
+  CREATED_AT_ASC
+  CREATED_AT_DESC
+  DELETED_AT_ASC
+  DELETED_AT_DESC
+  ICONICITY_DESC
+  MERCHANDISABILITY_DESC
+  PARTNER_UPDATED_AT_DESC
+  PUBLISHED_AT_ASC
+  PUBLISHED_AT_DESC
+  TITLE_ASC
+  TITLE_DESC
+}
+
+type ArtworkVersion implements Node {
+  # The names for the artists related to this Artwork Version
+  artistNames: String
+
+  # The artists related to this Artwork Version
+  artists: [Artist]
+
+  # The Image id
+  defaultImageID: String
+
+  # A globally unique ID.
+  id: ID!
+
+  # The image representing the Artwork Version
+  image: Image
+
+  # A type-specific ID likely used as a database ID.
+  internalID: ID!
+
+  # Artwork title
+  title: String
+}
+
+# Fields of an attachment (currently from Radiation)
+type Attachment {
+  # Content type of file.
+  contentType: String!
+
+  # URL of attachment.
+  downloadURL: String!
+
+  # File name.
+  fileName: String!
+
+  # A globally unique ID.
+  id: ID!
+
+  # A type-specific ID likely used as a database ID.
+  internalID: ID!
+}
+
+# Collection of fields that describe attribution class
+type AttributionClass {
+  # A globally unique ID.
+  id: ID!
+
+  # Descriptive phrase used as companion for attribution class name display
+  info: String
+
+  # A type-specific ID likely used as a database ID.
+  internalID: ID!
+
+  # Long descriptive phrase used as companion for short_description
+  longDescription: String
+
+  # Shortest form of attribution class display
+  name: String
+
+  # Longer version of attribution class display
+  shortDescription: String
+}
+
+type AuctionArtworkGrid implements ArtworkContextGrid {
+  artworksConnection(
+    after: String
+    before: String
+    first: Int
+    last: Int
+  ): ArtworkConnection
+  ctaHref: String
+  ctaTitle: String
+  title: String
+}
+
+# In centimeters.
+type AuctionLotDimensions {
+  depth: Float
+  height: Float
+  width: Float
+}
+
+type AuctionLotEstimate {
+  display: String
+  high: Float
+  low: Float
+}
+
+type AuctionLotImages {
+  larger: Image
+  thumbnail: Image
+}
+
+type AuctionResult implements Node {
+  artistID: String!
+  boughtIn: Boolean
+  categoryText: String
+  currency: String
+  date(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String
+  dateText: String
+  description: String
+  dimensions: AuctionLotDimensions
+  dimensionText: String
+  estimate: AuctionLotEstimate
+  externalURL: String
+
+  # A globally unique ID.
+  id: ID!
+  images: AuctionLotImages
+
+  # A type-specific ID likely used as a database ID.
+  internalID: ID!
+  mediumText: String
+  organization: String
+  priceRealized: AuctionResultPriceRealized
+  saleDate(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String
+  saleDateText: String
+  saleTitle: String
+  title: String
+}
+
+# A connection to a list of items.
+type AuctionResultConnection {
+  createdYearRange: YearRange
+
+  # A list of edges.
+  edges: [AuctionResultEdge]
+  pageCursors: PageCursors!
+
+  # Information to aid in pagination.
+  pageInfo: PageInfo!
+  totalCount: Int
+}
+
+# An edge in a connection.
+type AuctionResultEdge {
+  # A cursor for use in pagination
+  cursor: String!
+
+  # The item at the end of the edge
+  node: AuctionResult
+}
+
+type AuctionResultPriceRealized {
+  cents: Float
+  centsUSD: Float
+  display(
+    # Passes in to numeral, such as `'0.00'`
+    format: String = ""
+  ): String
+}
+
+enum AuctionResultSorts {
+  DATE_DESC
+  ESTIMATE_AND_DATE_DESC
+  PRICE_AND_DATE_DESC
+}
+
+type AuctionsArtsyBidder {
+  id: ID!
+  paddleNumber: ID!
+  userId: ID
+}
+
+# an online (Artsy) bidder, or an offline bidder in the auction
+union AuctionsBidder = AuctionsArtsyBidder | AuctionsOfflineBidder
+
+# DateTime is a scalar value that represents an ISO8601 formatted date and time.
+scalar AuctionsDateTime
+
+# A permanent schedule of increments to use in for upcoming asking prices for a lot.
+type AuctionsIncrementPolicy {
+  changes: [AuctionsIncrementPolicyChange!]!
+  createdAt: AuctionsDateTime!
+
+  # Generate a list of asking prices across a given range.
+  enumerate(
+    from: Long = 0
+
+    # Defines treatment of off-increment `from` values.
+    nextIncrementRule: AuctionsNextIncrementRule = SnapToPresetIncrements
+    until: Long = 0
+  ): [AuctionsMoney!]!
+  groupTag: ID!
+  id: ID!
+  initialIncrementCents: Long!
+  subgroupTag: ID!
+}
+
+# Change thresholds and amounts for IncrementPolicy.
+type AuctionsIncrementPolicyChange {
+  increment: AuctionsMoney!
+  incrementCents: Long!
+  threshold: AuctionsMoney!
+  thresholdCents: Long!
+}
+
+# A change in increment amount, to take effect at the given threshold.
+input AuctionsIncrementPolicyChangeInput {
+  incrementCents: Long!
+  thresholdCents: Long!
+}
+
+# A groupTag and list of IncrementPolicySubgroups
+type AuctionsIncrementPolicyGroup {
+  groupTag: ID!
+  subgroups: [AuctionsIncrementPolicySubgroup!]!
+  subgroupTags: [ID!]!
+}
+
+type AuctionsIncrementPolicySubgroup {
+  group: AuctionsIncrementPolicyGroup!
+  revisions: [AuctionsIncrementPolicy!]!
+  subgroupTag: ID!
+}
+
+# A user's position on a lot
+type AuctionsLotStanding implements AuctionsNode {
+  # The ID of an object
+  id: ID!
+
+  # whether this user has the leading bid
+  isHighestBidder: Boolean!
+
+  # The current leading bid on the lot, whether it is winning or not
+  leadingBidAmount: AuctionsMoney!
+
+  # whether this user has the leading bid
+  lotState: AuctionsLotState!
+  rawId: String!
+  saleArtwork: SaleArtwork
+}
+
+# A connection to a list of items.
+type AuctionsLotStandingConnection {
+  # A list of edges.
+  edges: [AuctionsLotStandingEdge]
+
+  # Information to aid in pagination.
+  pageInfo: AuctionsPageInfo!
+}
+
+# An edge in a connection.
+type AuctionsLotStandingEdge {
+  # A cursor for use in pagination.
+  cursor: String!
+
+  # The item at the end of the edge.
+  node: AuctionsLotStanding!
+}
+
+# A lot in a sale
+type AuctionsLotState {
+  # total number of bids placed on the lot
+  bidCount: Int!
+
+  # selling price on the live auction floor
+  floorSellingPrice: AuctionsMoney
+
+  # The bidder currently winning the online portion of the auction
+  floorWinningBidder: AuctionsBidder
+
+  # The Gravity Lot ID.
+  id: ID!
+
+  # The Gravity Lot ID.
+  internalID: ID!
+
+  # asking price for online bidders
+  onlineAskingPrice: AuctionsMoney!
+
+  # The bidder currently winning the online portion of the auction
+  onlineSellingToBidder: AuctionsBidder
+
+  # The current reserve status for the lot
+  reserveStatus: AuctionsReserveStatus!
+
+  # The Gravity Sale ID.
+  saleId: ID!
+
+  # Whether the lot is sold, for sale or passed
+  soldStatus: AuctionsSoldStatus!
+}
+
+# Represents currency units and formatting
+type AuctionsMoney {
+  # Formatted string version of currency amount
+  displayAmount(
+    # The decimal separator.
+    decimalSeparator: String = "."
+
+    # Number of decimal places for the currency.
+    fractionalDigits: Int = 2
+
+    # The 1000s separator.
+    groupingSeparator: String = ","
+
+    # Whether to show the fractional units.
+    showFractionalDigits: Boolean = true
+  ): String!
+  units: Long!
+}
+
+# A draft schedule of increments to use in for upcoming asking prices for a lot.
+type AuctionsNewIncrementPolicy {
+  changes: [AuctionsIncrementPolicyChange!]!
+
+  # A listing of increments by tier
+  enumeratedIncrements: [[AuctionsMoney!]!]!
+  groupTag: ID!
+  id: ID
+  initialIncrementCents: Long!
+
+  # The maximum percentage change between increments (~10% is typical).
+  maxPercentChange: Float!
+
+  # The minimum percentage change between increments (~4% is typical).
+  minPercentChange: Float!
+
+  # A listing of increments by tier
+  prettyPrintedIncrements(
+    # Number of decimal places for the currency.
+    fractionalDigits: Int = 2
+  ): [String!]!
+  subgroupTag: ID!
+
+  # Any non-fatal warnings to check before committing the increment policy.
+  warnings: [String!]!
+}
+
+input AuctionsNewIncrementPolicyInput {
+  changes: [AuctionsIncrementPolicyChangeInput!]!
+  groupTag: ID!
+  id: ID
+  initialIncrementCents: Long!
+  subgroupTag: ID!
+}
+
+enum AuctionsNextIncrementRule {
+  AddToPastValue
+  SnapToPresetIncrements
+}
+
+# An object with an ID
+interface AuctionsNode {
+  # The id of the object.
+  id: ID!
+}
+
+# An offline bidder (in the auction room)
+type AuctionsOfflineBidder {
+  singletonDummyField: String
+}
+
+# Information about pagination in a connection.
+type AuctionsPageInfo {
+  # When paginating forwards, the cursor to continue.
+  endCursor: String
+
+  # When paginating forwards, are there more items?
+  hasNextPage: Boolean!
+
+  # When paginating backwards, are there more items?
+  hasPreviousPage: Boolean!
+
+  # When paginating backwards, the cursor to continue.
+  startCursor: String
+}
+
+enum AuctionsReserveStatus {
+  NoReserve
+  ReserveMet
+  ReserveNotMet
+}
+
+# A collection of lots.
+type AuctionsSaleState {
+  # Users not allowed to participate in the sale
+  bannedUsers: [AuctionsUser!]!
+
+  # The current lot on block.
+  currentLot: AuctionsLotState
+
+  # The Gravity Sale ID.
+  id: ID!
+
+  # The Gravity Lot ID.
+  internalID: ID!
+
+  # Lot ids that had an Artsy bid that was the highest bid on the lot but did not win
+  lotIdsWithHigherArtsyBidNotWon: [String!]!
+
+  # Lot ids without a FairWarning event
+  lotIdsWithoutFairWarning: [String!]!
+
+  # Lot ids without a FinalCall event
+  lotIdsWithoutFinalCall: [String!]!
+
+  # Lot ids that had an Artsy bid that was the same max bid as the hammer price on the lot but did not win
+  lotIdsWithSameArtsyBidNotWon: [String!]!
+
+  # The lots belonging to this sale.
+  lots: [AuctionsLotState!]!
+
+  # Passed lot ids with bids from Artsy bidders
+  passedLotIdsWithArtsyBids: [String!]!
+
+  # Re-opened lots ids
+  reopenedLotIds: [String!]!
+
+  # Total Artsy GMV for the sale
+  totalSoldGMVCents: Long!
+}
+
+enum AuctionsSoldStatus {
+  ForSale
+  Passed
+  Sold
+}
+
+# An Artsy User
+type AuctionsUser implements AuctionsNode {
+  # The ID of an object
+  id: ID!
+
+  # The user's gravity id
+  internalID: ID!
+  rawId: String!
+
+  # The user's id
+  userId: ID!
+}
+
+type Author {
+  # A globally unique ID.
+  id: ID!
+
+  # A type-specific ID.
+  internalID: ID!
+  name: String
+  profileHandle: String
+}
+
+# Backup Two-Factor Authentication factor
+type BackupSecondFactor implements SecondFactor {
+  code: String!
+  createdAt: ISO8601DateTime!
+  disabledAt: ISO8601DateTime
+  enabled: Boolean!
+  enabledAt: ISO8601DateTime
+  internalID: ID!
+  kind: SecondFactorKind!
+  updatedAt: ISO8601DateTime!
+}
+
+type BackupSecondFactors {
+  secondFactors: [BackupSecondFactor!]!
+}
+
+# A list of backup second factors or errors
+union BackupSecondFactorsOrErrorsUnion = BackupSecondFactors | Errors
+
+type Bidder implements Node {
+  createdAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String
+
+  # A globally unique ID.
+  id: ID!
+
+  # A type-specific ID likely used as a database ID.
+  internalID: ID!
+  pin: String
+  qualifiedForBidding: Boolean
+  sale: Sale
+  user: User
+}
+
+type BidderPosition {
+  createdAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String
+  highestBid: HighestBid
+
+  # A globally unique ID.
+  id: ID!
+
+  # A type-specific ID likely used as a database ID.
+  internalID: ID!
+  isActive: Boolean
+  isRetracted: Boolean
+  isWinning: Boolean
+  isWithBidMax: Boolean
+  maxBid: BidderPositionMaxBid
+  processedAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String
+  saleArtwork: SaleArtwork
+  suggestedNextBid: BidderPositionSuggestedNextBid
+  updatedAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String
+}
+
+input BidderPositionInput {
+  artworkID: String!
+  clientMutationId: String
+  maxBidAmountCents: Float!
+  saleID: String!
+}
+
+type BidderPositionMaxBid {
+  # A formatted price with various currency formatting options.
+  amount(
+    decimal: String = "."
+
+    # Allows control of symbol position (%v = value, %s = symbol)
+    format: String = "%s%v"
+    precision: Int = 0
+    symbol: String
+    thousand: String = ","
+  ): String
+
+  # An amount of money expressed in cents.
+  cents: Float
+
+  # A pre-formatted price.
+  display: String
+}
+
+type BidderPositionPayload {
+  clientMutationId: String
+  result: BidderPositionResult
+}
+
+type BidderPositionResult {
+  messageDescriptionMD: String
+  messageHeader: String
+  position: BidderPosition
+  status: String!
+}
+
+type BidderPositionSuggestedNextBid {
+  # A formatted price with various currency formatting options.
+  amount(
+    decimal: String = "."
+
+    # Allows control of symbol position (%v = value, %s = symbol)
+    format: String = "%s%v"
+    precision: Int = 0
+    symbol: String
+    thousand: String = ","
+  ): String
+
+  # An amount of money expressed in cents.
+  cents: Float
+
+  # A pre-formatted price.
+  display: String
+}
+
+type BidIncrement {
+  amount: Int
+  from: Int
+  to: Int
+}
+
+type BidIncrementsFormatted {
+  cents: Float
+  display: String
+}
+
+# Represents non-fractional signed whole numeric values. Since the value may
+# exceed the size of a 32-bit integer, it's encoded as a string.
+scalar BigInt
+
+type BuyersPremium {
+  # A formatted price with various currency formatting options.
+  amount(
+    decimal: String = "."
+
+    # Allows control of symbol position (%v = value, %s = symbol)
+    format: String = "%s%v"
+    precision: Int = 0
+    symbol: String
+    thousand: String = ","
+  ): String
+  cents: Int
+  percent: Float
+}
+
+type CalculatedCost {
+  bidAmount: Money
+  buyersPremium: Money
+  subtotal: Money
+}
+
+# Autogenerated input type of CaptureHold
+input CaptureHoldInput {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+
+  # Globally unique ID for the hold.
+  inventoryHoldId: ID!
+
+  # Globally unique ID for the requester of the hold. Ex. Exchange Order ID.
+  referenceId: String!
+}
+
+# Autogenerated return type of CaptureHold
+type CaptureHoldPayload {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+  holdOrError: InventoryHoldOrErrorUnion!
+}
+
+type City {
+  coordinates: LatLng
+  fairsConnection(
+    after: String
+    before: String
+    first: Int
+    last: Int
+    sort: FairSorts
+    status: EventStatus
+  ): FairConnection
+  name: String
+  showsConnection(
+    after: String
+    before: String
+
+    # Only used when status is CLOSING_SOON or UPCOMING. Number of days used to filter upcoming and closing soon shows
+    dayThreshold: Int
+    first: Int
+
+    # Whether to include local discovery stubs
+    includeStubShows: Boolean
+    last: Int
+
+    # Filter shows by partner type
+    partnerType: PartnerShowPartnerType
+    sort: ShowSorts
+
+    # Filter shows by chronological event status
+    status: EventStatus = CURRENT
+  ): ShowConnection
+  slug: String
+  sponsoredContent: CitySponsoredContent
+}
+
+type CitySponsoredContent {
+  artGuideUrl: String
+  featuredShows: [Show]
+  introText: String
+  showsConnection(
+    after: String
+    before: String
+    first: Int
+    last: Int
+    sort: ShowSorts
+    status: EventStatus
+  ): ShowConnection
+}
+
+enum CollectionSorts {
+  POSITION_ASC
+  POSITION_DESC
+}
+
+type CollectorProfileType {
+  collectorLevel: Int
+  confirmedBuyerAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String
+  email: String
+
+  # A globally unique ID.
+  id: ID!
+  intents: [String]
+
+  # A type-specific ID likely used as a database ID.
+  internalID: ID!
+  loyaltyApplicantAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String
+  name: String
+  professionalBuyerAppliedAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String
+  professionalBuyerAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String
+  selfReportedPurchases: String
+}
+
+# Autogenerated input type of AddInitialOfferToOrder
+input CommerceAddInitialOfferToOrderInput {
+  amountCents: Int!
+
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+  note: String
+  orderId: ID!
+}
+
+# Autogenerated return type of AddInitialOfferToOrder
+type CommerceAddInitialOfferToOrderPayload {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+
+  # A union of success/failure
+  orderOrError: CommerceOrderOrFailureUnion!
+}
+
+# An generic error type for mutations
+type CommerceApplicationError {
+  # Code of this error
+  code: String!
+
+  # What caused the error
+  data: String
+
+  # Type of this error
+  type: String!
+}
+
+# Autogenerated input type of ApproveOrder
+input CommerceApproveOrderInput {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+  id: ID!
+}
+
+# Autogenerated return type of ApproveOrder
+type CommerceApproveOrderPayload {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+
+  # A union of success/failure
+  orderOrError: CommerceOrderOrFailureUnion!
+}
+
+# Autogenerated input type of BuyerAcceptOffer
+input CommerceBuyerAcceptOfferInput {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+  offerId: ID!
+}
+
+# Autogenerated return type of BuyerAcceptOffer
+type CommerceBuyerAcceptOfferPayload {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+
+  # A union of success/failure
+  orderOrError: CommerceOrderOrFailureUnion!
+}
+
+# Autogenerated input type of BuyerCounterOffer
+input CommerceBuyerCounterOfferInput {
+  amountCents: Int!
+
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+  note: String
+  offerId: ID!
+}
+
+# Autogenerated return type of BuyerCounterOffer
+type CommerceBuyerCounterOfferPayload {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+
+  # A union of success/failure
+  orderOrError: CommerceOrderOrFailureUnion!
+}
+
+# Autogenerated input type of BuyerRejectOffer
+input CommerceBuyerRejectOfferInput {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+  offerId: ID!
+  rejectReason: CommerceCancelReasonTypeEnum
+}
+
+# Autogenerated return type of BuyerRejectOffer
+type CommerceBuyerRejectOfferPayload {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+
+  # A union of success/failure
+  orderOrError: CommerceOrderOrFailureUnion!
+}
+
+type CommerceBuyOrder implements CommerceOrder {
+  buyer: CommerceOrderPartyUnion!
+  buyerDetails: OrderParty
+  buyerPhoneNumber: String
+  buyerTotal(
+    decimal: String = "."
+
+    # Allows control of symbol position (%v = value, %s = symbol)
+    format: String = "%s%v"
+    precision: Int = 0
+    symbol: String
+    thousand: String = ","
+  ): String
+  buyerTotalCents: Int
+  code: String!
+  commissionFee(
+    decimal: String = "."
+
+    # Allows control of symbol position (%v = value, %s = symbol)
+    format: String = "%s%v"
+    precision: Int = 0
+    symbol: String
+    thousand: String = ","
+  ): String
+  commissionFeeCents: Int
+  commissionRate: Float
+  createdAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String!
+  creditCard: CreditCard
+  creditCardId: String
+  currencyCode: String!
+  displayCommissionRate: String
+  id: ID!
+  internalID: ID!
+  itemsTotal(
+    decimal: String = "."
+
+    # Allows control of symbol position (%v = value, %s = symbol)
+    format: String = "%s%v"
+    precision: Int = 0
+    symbol: String
+    thousand: String = ","
+  ): String
+
+  # Item total in cents, for Offer Orders this field reflects current offer
+  itemsTotalCents: Int
+  lastApprovedAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String
+  lastSubmittedAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String
+  lastTransactionFailed: Boolean
+  lineItems(
+    # Returns the elements in the list that come after the specified cursor.
+    after: String
+
+    # Returns the elements in the list that come before the specified cursor.
+    before: String
+
+    # Returns the first _n_ elements from the list.
+    first: Int
+
+    # Returns the last _n_ elements from the list.
+    last: Int
+  ): CommerceLineItemConnection
+  mode: CommerceOrderModeEnum
+  requestedFulfillment: CommerceRequestedFulfillmentUnion
+  seller: CommerceOrderPartyUnion!
+  sellerDetails: OrderParty
+  sellerTotal(
+    decimal: String = "."
+
+    # Allows control of symbol position (%v = value, %s = symbol)
+    format: String = "%s%v"
+    precision: Int = 0
+    symbol: String
+    thousand: String = ","
+  ): String
+  sellerTotalCents: Int
+  shippingTotal(
+    decimal: String = "."
+
+    # Allows control of symbol position (%v = value, %s = symbol)
+    format: String = "%s%v"
+    precision: Int = 0
+    symbol: String
+    thousand: String = ","
+  ): String
+  shippingTotalCents: Int
+  state: CommerceOrderStateEnum!
+  stateExpiresAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String
+  stateReason: String
+  stateUpdatedAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String
+  taxTotal(
+    decimal: String = "."
+
+    # Allows control of symbol position (%v = value, %s = symbol)
+    format: String = "%s%v"
+    precision: Int = 0
+    symbol: String
+    thousand: String = ","
+  ): String
+  taxTotalCents: Int
+  totalListPrice(
+    decimal: String = "."
+
+    # Allows control of symbol position (%v = value, %s = symbol)
+    format: String = "%s%v"
+    precision: Int = 0
+    symbol: String
+    thousand: String = ","
+  ): String
+  totalListPriceCents: Int!
+  transactionFee(
+    decimal: String = "."
+
+    # Allows control of symbol position (%v = value, %s = symbol)
+    format: String = "%s%v"
+    precision: Int = 0
+    symbol: String
+    thousand: String = ","
+  ): String
+  transactionFeeCents: Int
+  updatedAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String!
+}
+
+enum CommerceCancelReasonTypeEnum {
+  # cancelation reason is: admin_canceled
+  ADMIN_CANCELED
+
+  # cancelation reason is: buyer_lapsed
+  BUYER_LAPSED
+
+  # cancelation reason is: buyer_rejected
+  BUYER_REJECTED
+
+  # cancelation reason is: seller_lapsed
+  SELLER_LAPSED
+
+  # cancelation reason is: seller_rejected
+  SELLER_REJECTED
+
+  # cancelation reason is: seller_rejected_artwork_unavailable
+  SELLER_REJECTED_ARTWORK_UNAVAILABLE
+
+  # cancelation reason is: seller_rejected_offer_too_low
+  SELLER_REJECTED_OFFER_TOO_LOW
+
+  # cancelation reason is: seller_rejected_other
+  SELLER_REJECTED_OTHER
+
+  # cancelation reason is: seller_rejected_shipping_unavailable
+  SELLER_REJECTED_SHIPPING_UNAVAILABLE
+}
+
+# Autogenerated input type of ConfirmFulfillment
+input CommerceConfirmFulfillmentInput {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+  id: ID!
+}
+
+# Autogenerated return type of ConfirmFulfillment
+type CommerceConfirmFulfillmentPayload {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+
+  # A union of success/failure
+  orderOrError: CommerceOrderOrFailureUnion!
+}
+
+# Autogenerated input type of ConfirmPickup
+input CommerceConfirmPickupInput {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+  id: ID!
+}
+
+# Autogenerated return type of ConfirmPickup
+type CommerceConfirmPickupPayload {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+
+  # A union of success/failure
+  orderOrError: CommerceOrderOrFailureUnion!
+}
+
+# Autogenerated input type of CreateOfferOrderWithArtwork
+input CommerceCreateOfferOrderWithArtworkInput {
+  # Artwork Id
+  artworkId: String!
+
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+
+  # EditionSet Id
+  editionSetId: String
+
+  # When set to false, we will create a new order. Otherwise if current user has
+  # pending/submitted orders on same artwork/edition with same quantity, we will return that
+  findActiveOrCreate: Boolean = true
+
+  # Number of items in the line item, default is 1
+  quantity: Int
+}
+
+# Autogenerated return type of CreateOfferOrderWithArtwork
+type CommerceCreateOfferOrderWithArtworkPayload {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+
+  # A union of success/failure. If find_active_or_create is not false, it will
+  # return existing pending/submitted order for current user if exists, otherwise
+  # it will return newly created order
+  orderOrError: CommerceOrderOrFailureUnion!
+}
+
+# Autogenerated input type of CreateOrderWithArtwork
+input CommerceCreateOrderWithArtworkInput {
+  # Artwork Id
+  artworkId: String!
+
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+
+  # EditionSet Id
+  editionSetId: String
+
+  # Number of items in the line item
+  quantity: Int
+}
+
+# Autogenerated return type of CreateOrderWithArtwork
+type CommerceCreateOrderWithArtworkPayload {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+
+  # A union of success/failure
+  orderOrError: CommerceOrderOrFailureUnion!
+}
+
+# Date in YYYY-MM-DD format
+scalar CommerceDate
+
+# An ISO 8601 datetime
+scalar CommerceDateTime
+
+# Autogenerated input type of FixFailedPayment
+input CommerceFixFailedPaymentInput {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+  creditCardId: String!
+  offerId: ID!
+}
+
+# Autogenerated return type of FixFailedPayment
+type CommerceFixFailedPaymentPayload {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+
+  # A union of success/failure
+  orderOrError: CommerceOrderOrFailureUnion!
+}
+
+# Autogenerated input type of FulfillAtOnce
+input CommerceFulfillAtOnceInput {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+  fulfillment: CommerceFulfillmentAttributes!
+  id: ID!
+}
+
+# Autogenerated return type of FulfillAtOnce
+type CommerceFulfillAtOncePayload {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+
+  # A union of success/failure
+  orderOrError: CommerceOrderOrFailureUnion!
+}
+
+# A Fulfillment for an order
+type CommerceFulfillment {
+  courier: String!
+  createdAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String!
+  estimatedDelivery(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String
+  id: ID!
+  internalID: ID!
+  notes: String
+  trackingId: String
+  updatedAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String!
+}
+
+# Attributes of a Fulfillment
+input CommerceFulfillmentAttributes {
+  courier: String!
+  estimatedDelivery: CommerceDate
+  notes: String
+  trackingId: String
+}
+
+# The connection type for Fulfillment.
+type CommerceFulfillmentConnection {
+  # A list of edges.
+  edges: [CommerceFulfillmentEdge]
+
+  # A list of nodes.
+  nodes: [CommerceFulfillment]
+
+  # Information to aid in pagination.
+  pageInfo: CommercePageInfo!
+}
+
+# An edge in a connection.
+type CommerceFulfillmentEdge {
+  # A cursor for use in pagination.
+  cursor: String!
+
+  # The item at the end of the edge.
+  node: CommerceFulfillment
+}
+
+# A Line Item
+type CommerceLineItem {
+  artwork: Artwork
+  artworkId: String!
+  artworkVersion: ArtworkVersion
+  artworkVersionId: String!
+  commissionFee(
+    decimal: String = "."
+
+    # Allows control of symbol position (%v = value, %s = symbol)
+    format: String = "%s%v"
+    precision: Int = 0
+    symbol: String
+    thousand: String = ","
+  ): String
+  commissionFeeCents: Int
+  createdAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String!
+  editionSetId: String
+  fulfillments(
+    # Returns the elements in the list that come after the specified cursor.
+    after: String
+
+    # Returns the elements in the list that come before the specified cursor.
+    before: String
+
+    # Returns the first _n_ elements from the list.
+    first: Int
+
+    # Returns the last _n_ elements from the list.
+    last: Int
+  ): CommerceFulfillmentConnection
+  id: ID!
+  internalID: ID!
+  listPrice(
+    decimal: String = "."
+
+    # Allows control of symbol position (%v = value, %s = symbol)
+    format: String = "%s%v"
+    precision: Int = 0
+    symbol: String
+    thousand: String = ","
+  ): String
+  listPriceCents: Int!
+  order: CommerceOrder!
+  priceCents: Int! @deprecated(reason: "switch to use listPriceCents")
+  quantity: Int!
+  shippingTotal(
+    decimal: String = "."
+
+    # Allows control of symbol position (%v = value, %s = symbol)
+    format: String = "%s%v"
+    precision: Int = 0
+    symbol: String
+    thousand: String = ","
+  ): String
+  shippingTotalCents: Int
+  updatedAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String!
+}
+
+# The connection type for LineItem.
+type CommerceLineItemConnection {
+  # A list of edges.
+  edges: [CommerceLineItemEdge]
+
+  # A list of nodes.
+  nodes: [CommerceLineItem]
+
+  # Information to aid in pagination.
+  pageInfo: CommercePageInfo!
+}
+
+# An edge in a connection.
+type CommerceLineItemEdge {
+  # A cursor for use in pagination.
+  cursor: String!
+
+  # The item at the end of the edge.
+  node: CommerceLineItem
+}
+
+# An Offer
+type CommerceOffer {
+  amount(
+    decimal: String = "."
+
+    # Allows control of symbol position (%v = value, %s = symbol)
+    format: String = "%s%v"
+    precision: Int = 0
+    symbol: String
+    thousand: String = ","
+  ): String
+  amountCents: Int!
+  buyerTotal(
+    decimal: String = "."
+
+    # Allows control of symbol position (%v = value, %s = symbol)
+    format: String = "%s%v"
+    precision: Int = 0
+    symbol: String
+    thousand: String = ","
+  ): String
+  buyerTotalCents: Int
+  createdAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String!
+  creatorId: String!
+  currencyCode: String!
+  from: CommerceOrderPartyUnion!
+  fromDetails: OrderParty
+  fromParticipant: CommerceOrderParticipantEnum
+  id: ID!
+  internalID: ID!
+  note: String
+  order: CommerceOrder!
+  respondsTo: CommerceOffer
+  shippingTotal(
+    decimal: String = "."
+
+    # Allows control of symbol position (%v = value, %s = symbol)
+    format: String = "%s%v"
+    precision: Int = 0
+    symbol: String
+    thousand: String = ","
+  ): String
+  shippingTotalCents: Int
+  submittedAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String
+  taxTotal(
+    decimal: String = "."
+
+    # Allows control of symbol position (%v = value, %s = symbol)
+    format: String = "%s%v"
+    precision: Int = 0
+    symbol: String
+    thousand: String = ","
+  ): String
+  taxTotalCents: Int
+}
+
+# The connection type for Offer.
+type CommerceOfferConnection {
+  # A list of edges.
+  edges: [CommerceOfferEdge]
+
+  # A list of nodes.
+  nodes: [CommerceOffer]
+
+  # Information to aid in pagination.
+  pageInfo: CommercePageInfo!
+}
+
+# An edge in a connection.
+type CommerceOfferEdge {
+  # A cursor for use in pagination.
+  cursor: String!
+
+  # The item at the end of the edge.
+  node: CommerceOffer
+}
+
+type CommerceOfferOrder implements CommerceOrder {
+  awaitingResponseFrom: CommerceOrderParticipantEnum
+  buyer: CommerceOrderPartyUnion!
+  buyerDetails: OrderParty
+  buyerPhoneNumber: String
+  buyerTotal(
+    decimal: String = "."
+
+    # Allows control of symbol position (%v = value, %s = symbol)
+    format: String = "%s%v"
+    precision: Int = 0
+    symbol: String
+    thousand: String = ","
+  ): String
+  buyerTotalCents: Int
+  code: String!
+  commissionFee(
+    decimal: String = "."
+
+    # Allows control of symbol position (%v = value, %s = symbol)
+    format: String = "%s%v"
+    precision: Int = 0
+    symbol: String
+    thousand: String = ","
+  ): String
+  commissionFeeCents: Int
+  commissionRate: Float
+  createdAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String!
+  creditCard: CreditCard
+  creditCardId: String
+  currencyCode: String!
+  displayCommissionRate: String
+  id: ID!
+  internalID: ID!
+  itemsTotal(
+    decimal: String = "."
+
+    # Allows control of symbol position (%v = value, %s = symbol)
+    format: String = "%s%v"
+    precision: Int = 0
+    symbol: String
+    thousand: String = ","
+  ): String
+
+  # Item total in cents, for Offer Orders this field reflects current offer
+  itemsTotalCents: Int
+  lastApprovedAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String
+
+  # Last submitted offer
+  lastOffer: CommerceOffer
+  lastSubmittedAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String
+  lastTransactionFailed: Boolean
+  lineItems(
+    # Returns the elements in the list that come after the specified cursor.
+    after: String
+
+    # Returns the elements in the list that come before the specified cursor.
+    before: String
+
+    # Returns the first _n_ elements from the list.
+    first: Int
+
+    # Returns the last _n_ elements from the list.
+    last: Int
+  ): CommerceLineItemConnection
+  mode: CommerceOrderModeEnum
+  myLastOffer: CommerceOffer
+  offers(
+    # Returns the elements in the list that come after the specified cursor.
+    after: String
+
+    # Returns the elements in the list that come before the specified cursor.
+    before: String
+
+    # Returns the first _n_ elements from the list.
+    first: Int
+    fromId: String
+    fromType: String
+
+    # Returns the last _n_ elements from the list.
+    last: Int
+  ): CommerceOfferConnection
+  offerTotal(
+    decimal: String = "."
+
+    # Allows control of symbol position (%v = value, %s = symbol)
+    format: String = "%s%v"
+    precision: Int = 0
+    symbol: String
+    thousand: String = ","
+  ): String
+  requestedFulfillment: CommerceRequestedFulfillmentUnion
+  seller: CommerceOrderPartyUnion!
+  sellerDetails: OrderParty
+  sellerTotal(
+    decimal: String = "."
+
+    # Allows control of symbol position (%v = value, %s = symbol)
+    format: String = "%s%v"
+    precision: Int = 0
+    symbol: String
+    thousand: String = ","
+  ): String
+  sellerTotalCents: Int
+  shippingTotal(
+    decimal: String = "."
+
+    # Allows control of symbol position (%v = value, %s = symbol)
+    format: String = "%s%v"
+    precision: Int = 0
+    symbol: String
+    thousand: String = ","
+  ): String
+  shippingTotalCents: Int
+  state: CommerceOrderStateEnum!
+  stateExpiresAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String
+  stateReason: String
+  stateUpdatedAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String
+  taxTotal(
+    decimal: String = "."
+
+    # Allows control of symbol position (%v = value, %s = symbol)
+    format: String = "%s%v"
+    precision: Int = 0
+    symbol: String
+    thousand: String = ","
+  ): String
+  taxTotalCents: Int
+  totalListPrice(
+    decimal: String = "."
+
+    # Allows control of symbol position (%v = value, %s = symbol)
+    format: String = "%s%v"
+    precision: Int = 0
+    symbol: String
+    thousand: String = ","
+  ): String
+  totalListPriceCents: Int!
+  transactionFee(
+    decimal: String = "."
+
+    # Allows control of symbol position (%v = value, %s = symbol)
+    format: String = "%s%v"
+    precision: Int = 0
+    symbol: String
+    thousand: String = ","
+  ): String
+  transactionFeeCents: Int
+  updatedAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String!
+}
+
+# Order
+interface CommerceOrder {
+  buyer: CommerceOrderPartyUnion!
+  buyerDetails: OrderParty
+  buyerPhoneNumber: String
+  buyerTotal(
+    decimal: String = "."
+
+    # Allows control of symbol position (%v = value, %s = symbol)
+    format: String = "%s%v"
+    precision: Int = 0
+    symbol: String
+    thousand: String = ","
+  ): String
+  buyerTotalCents: Int
+  code: String!
+  commissionFee(
+    decimal: String = "."
+
+    # Allows control of symbol position (%v = value, %s = symbol)
+    format: String = "%s%v"
+    precision: Int = 0
+    symbol: String
+    thousand: String = ","
+  ): String
+  commissionFeeCents: Int
+  commissionRate: Float
+  createdAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String!
+  creditCard: CreditCard
+  creditCardId: String
+  currencyCode: String!
+  displayCommissionRate: String
+  id: ID!
+  internalID: ID!
+  itemsTotal(
+    decimal: String = "."
+
+    # Allows control of symbol position (%v = value, %s = symbol)
+    format: String = "%s%v"
+    precision: Int = 0
+    symbol: String
+    thousand: String = ","
+  ): String
+
+  # Item total in cents, for Offer Orders this field reflects current offer
+  itemsTotalCents: Int
+  lastApprovedAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String
+  lastSubmittedAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String
+  lastTransactionFailed: Boolean
+  lineItems(
+    # Returns the elements in the list that come after the specified cursor.
+    after: String
+
+    # Returns the elements in the list that come before the specified cursor.
+    before: String
+
+    # Returns the first _n_ elements from the list.
+    first: Int
+
+    # Returns the last _n_ elements from the list.
+    last: Int
+  ): CommerceLineItemConnection
+  mode: CommerceOrderModeEnum
+  requestedFulfillment: CommerceRequestedFulfillmentUnion
+  seller: CommerceOrderPartyUnion!
+  sellerDetails: OrderParty
+  sellerTotal(
+    decimal: String = "."
+
+    # Allows control of symbol position (%v = value, %s = symbol)
+    format: String = "%s%v"
+    precision: Int = 0
+    symbol: String
+    thousand: String = ","
+  ): String
+  sellerTotalCents: Int
+  shippingTotal(
+    decimal: String = "."
+
+    # Allows control of symbol position (%v = value, %s = symbol)
+    format: String = "%s%v"
+    precision: Int = 0
+    symbol: String
+    thousand: String = ","
+  ): String
+  shippingTotalCents: Int
+  state: CommerceOrderStateEnum!
+  stateExpiresAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String
+  stateReason: String
+  stateUpdatedAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String
+  taxTotal(
+    decimal: String = "."
+
+    # Allows control of symbol position (%v = value, %s = symbol)
+    format: String = "%s%v"
+    precision: Int = 0
+    symbol: String
+    thousand: String = ","
+  ): String
+  taxTotalCents: Int
+  totalListPrice(
+    decimal: String = "."
+
+    # Allows control of symbol position (%v = value, %s = symbol)
+    format: String = "%s%v"
+    precision: Int = 0
+    symbol: String
+    thousand: String = ","
+  ): String
+  totalListPriceCents: Int!
+  transactionFee(
+    decimal: String = "."
+
+    # Allows control of symbol position (%v = value, %s = symbol)
+    format: String = "%s%v"
+    precision: Int = 0
+    symbol: String
+    thousand: String = ","
+  ): String
+  transactionFeeCents: Int
+  updatedAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String!
+}
+
+# Order Action data
+type CommerceOrderActionData {
+  clientSecret: String!
+}
+
+# Fields to sort by
+enum CommerceOrderConnectionSortEnum {
+  # Sort by the timestamp the state of the order expires at in ascending order
+  STATE_EXPIRES_AT_ASC
+
+  # Sort by the timestamp the state of the order expires at in descending order
+  STATE_EXPIRES_AT_DESC
+
+  # Sort by the timestamp the state of order was last updated in ascending order
+  STATE_UPDATED_AT_ASC
+
+  # Sort by the timestamp the state of order was last updated in descending order
+  STATE_UPDATED_AT_DESC
+
+  # Sort by the timestamp the order was last updated in ascending order
+  UPDATED_AT_ASC
+
+  # Sort by the timestamp the order was last updated in descending order
+  UPDATED_AT_DESC
+}
+
+# The connection type for Order.
+type CommerceOrderConnectionWithTotalCount {
+  # A list of edges.
+  edges: [CommerceOrderEdge]
+
+  # A list of nodes.
+  nodes: [CommerceOrder]
+  pageCursors: CommercePageCursors
+
+  # Information to aid in pagination.
+  pageInfo: CommercePageInfo!
+  totalCount: Int
+  totalPages: Int
+}
+
+# An edge in a connection.
+type CommerceOrderEdge {
+  # A cursor for use in pagination.
+  cursor: String!
+
+  # The item at the end of the edge.
+  node: CommerceOrder
+}
+
+enum CommerceOrderFulfillmentTypeEnum {
+  # fulfillment type is: pickup
+  PICKUP
+
+  # fulfillment type is: ship
+  SHIP
+}
+
+enum CommerceOrderModeEnum {
+  # Buy Order
+  BUY
+
+  # Offer Order
+  OFFER
+}
+
+# Represents either a resolved Order or a potential failure
+union CommerceOrderOrFailureUnion =
+    CommerceOrderRequiresAction
+  | CommerceOrderWithMutationFailure
+  | CommerceOrderWithMutationSuccess
+
+enum CommerceOrderParticipantEnum {
+  # Participant on the buyer side
+  BUYER
+
+  # Participant on the seller side
+  SELLER
+}
+
+# Represents either a partner or a user
+union CommerceOrderPartyUnion = CommercePartner | CommerceUser
+
+# Data reflecting actions required
+type CommerceOrderRequiresAction {
+  # Data related to action needed
+  actionData: CommerceOrderActionData!
+}
+
+enum CommerceOrderStateEnum {
+  # order is abandoned by buyer and never submitted
+  ABANDONED
+
+  # order is approved by seller
+  APPROVED
+
+  # order is canceled
+  CANCELED
+
+  # order is fulfilled by seller
+  FULFILLED
+
+  # order is still pending submission by buyer
+  PENDING
+
+  # order is refunded after being approved or fulfilled
+  REFUNDED
+
+  # order is submitted by buyer
+  SUBMITTED
+}
+
+# An error response for changes to an order
+type CommerceOrderWithMutationFailure {
+  error: CommerceApplicationError!
+}
+
+# A successfully returned order type
+type CommerceOrderWithMutationSuccess {
+  order: CommerceOrder!
+}
+
+type CommercePageCursor {
+  # first cursor on the page
+  cursor: String!
+
+  # is this the current page?
+  isCurrent: Boolean!
+
+  # page number out of totalPages
+  page: Int!
+}
+
+type CommercePageCursors {
+  around: [CommercePageCursor!]!
+
+  # optional, may be included in field around
+  first: CommercePageCursor
+
+  # optional, may be included in field around
+  last: CommercePageCursor
+  previous: CommercePageCursor
+}
+
+# Information about pagination in a connection.
+type CommercePageInfo {
+  # When paginating forwards, the cursor to continue.
+  endCursor: String
+
+  # When paginating forwards, are there more items?
+  hasNextPage: Boolean!
+
+  # When paginating backwards, are there more items?
+  hasPreviousPage: Boolean!
+
+  # When paginating backwards, the cursor to continue.
+  startCursor: String
+}
+
+type CommercePartner {
+  id: String!
+  type: String!
+}
+
+type CommercePickup {
+  fulfillmentType: String!
+  phoneNumber: String
+}
+
+# Autogenerated input type of RejectOrder
+input CommerceRejectOrderInput {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+  id: ID!
+}
+
+# Autogenerated return type of RejectOrder
+type CommerceRejectOrderPayload {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+
+  # A union of success/failure
+  orderOrError: CommerceOrderOrFailureUnion!
+}
+
+# Represents either a shipping information or pickup
+union CommerceRequestedFulfillmentUnion = CommercePickup | CommerceShip
+
+# Autogenerated input type of SellerAcceptOffer
+input CommerceSellerAcceptOfferInput {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+  offerId: ID!
+}
+
+# Autogenerated return type of SellerAcceptOffer
+type CommerceSellerAcceptOfferPayload {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+
+  # A union of success/failure
+  orderOrError: CommerceOrderOrFailureUnion!
+}
+
+# Autogenerated input type of SellerCounterOffer
+input CommerceSellerCounterOfferInput {
+  amountCents: Int!
+
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+  note: String
+  offerId: ID!
+}
+
+# Autogenerated return type of SellerCounterOffer
+type CommerceSellerCounterOfferPayload {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+
+  # A union of success/failure
+  orderOrError: CommerceOrderOrFailureUnion!
+}
+
+# Autogenerated input type of SellerRejectOffer
+input CommerceSellerRejectOfferInput {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+  offerId: ID!
+  rejectReason: CommerceCancelReasonTypeEnum
+}
+
+# Autogenerated return type of SellerRejectOffer
+type CommerceSellerRejectOfferPayload {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+
+  # A union of success/failure
+  orderOrError: CommerceOrderOrFailureUnion!
+}
+
+# Autogenerated input type of SetPayment
+input CommerceSetPaymentInput {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+  creditCardId: String!
+  id: ID!
+}
+
+# Autogenerated return type of SetPayment
+type CommerceSetPaymentPayload {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+
+  # A union of success/failure
+  orderOrError: CommerceOrderOrFailureUnion!
+}
+
+# Autogenerated input type of SetShipping
+input CommerceSetShippingInput {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+  fulfillmentType: CommerceOrderFulfillmentTypeEnum!
+  id: ID!
+  phoneNumber: String
+  shipping: CommerceShippingAttributes
+}
+
+# Autogenerated return type of SetShipping
+type CommerceSetShippingPayload {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+
+  # A union of success/failure
+  orderOrError: CommerceOrderOrFailureUnion!
+}
+
+type CommerceShip {
+  addressLine1: String
+  addressLine2: String
+  city: String
+  country: String
+  name: String
+  phoneNumber: String
+  postalCode: String
+  region: String
+}
+
+# Shipping information
+input CommerceShippingAttributes {
+  addressLine1: String
+  addressLine2: String
+  city: String
+  country: String
+  name: String
+  phoneNumber: String
+  postalCode: String
+  region: String
+}
+
+# Autogenerated input type of SubmitOrder
+input CommerceSubmitOrderInput {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+  id: ID!
+}
+
+# Autogenerated return type of SubmitOrder
+type CommerceSubmitOrderPayload {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+
+  # A union of success/failure
+  orderOrError: CommerceOrderOrFailureUnion!
+}
+
+# Autogenerated input type of SubmitOrderWithOffer
+input CommerceSubmitOrderWithOfferInput {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+  confirmedSetupIntentId: String
+  offerId: ID!
+}
+
+# Autogenerated return type of SubmitOrderWithOffer
+type CommerceSubmitOrderWithOfferPayload {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+
+  # A union of success/failure
+  orderOrError: CommerceOrderOrFailureUnion!
+}
+
+# Autogenerated input type of SubmitPendingOffer
+input CommerceSubmitPendingOfferInput {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+  offerId: ID!
+}
+
+# Autogenerated return type of SubmitPendingOffer
+type CommerceSubmitPendingOfferPayload {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+
+  # A union of success/failure
+  orderOrError: CommerceOrderOrFailureUnion!
+}
+
+type CommerceUser {
+  id: String!
+}
+
+type ConditionReportRequest {
+  internalID: ID!
+  saleArtworkID: ID
+  userID: ID
+}
+
+# Autogenerated input type of ConfirmPassword
+input ConfirmPasswordInput {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+
+  # User password to confirm.
+  password: String!
+}
+
+# Autogenerated return type of ConfirmPassword
+type ConfirmPasswordPayload {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+  valid: Boolean!
+}
+
+# Consignment
+type Consignment {
+  currency: String
+
+  # Uniq ID for this consignment
+  id: ID!
+  internalID: ID
+  saleDate: String
+  saleName: String
+  salePriceCents: Int
+  state: ConsignmentState
+  submission: ConsignmentSubmission!
+  submissionId: ID!
+  submissionID: ID
+}
+
+# The connection type for Consignment.
+type ConsignmentConnection {
+  # A list of edges.
+  edges: [ConsignmentEdge]
+
+  # A list of nodes.
+  nodes: [Consignment]
+  pageCursors: ConsignmentPageCursors
+
+  # Information to aid in pagination.
+  pageInfo: PageInfo!
+  totalCount: Int
+  totalPages: Int
+}
+
+# An edge in a connection.
+type ConsignmentEdge {
+  # A cursor for use in pagination.
+  cursor: String!
+
+  # The item at the end of the edge.
+  node: Consignment
+}
+
+# Consignment Offer
+type ConsignmentOffer {
+  commissionPercentWhole: Int
+  createdAt: ISO8601DateTime
+  createdById: ID
+  currency: String
+  deadlineToConsign: String
+  highEstimateAmount(
+    decimal: String = "."
+
+    # Allows control of symbol position (%v = value, %s = symbol)
+    format: String = "%s%v"
+    precision: Int = 0
+    symbol: String
+    thousand: String = ","
+  ): String
+  highEstimateCents: Int
+
+  # Uniq ID for this offer
+  id: ID!
+  insuranceInfo: String
+  lowEstimateAmount(
+    decimal: String = "."
+
+    # Allows control of symbol position (%v = value, %s = symbol)
+    format: String = "%s%v"
+    precision: Int = 0
+    symbol: String
+    thousand: String = ","
+  ): String
+  lowEstimateCents: Int
+  notes: String
+  offerType: String
+  otherFeesInfo: String
+  partnerInfo: String
+  photographyInfo: String
+  saleDate: String
+  saleLocation: String
+  saleName: String
+  shippingInfo: String
+  state: String
+  submission: ConsignmentSubmission!
+}
+
+# The connection type for Offer.
+type ConsignmentOfferConnection {
+  # A list of edges.
+  edges: [ConsignmentOfferEdge]
+
+  # A list of nodes.
+  nodes: [ConsignmentOffer]
+  pageCursors: ConsignmentPageCursors
+
+  # Information to aid in pagination.
+  pageInfo: PageInfo!
+  totalCount: Int
+  totalPages: Int
+}
+
+# An edge in a connection.
+type ConsignmentOfferEdge {
+  # A cursor for use in pagination.
+  cursor: String!
+
+  # The item at the end of the edge.
+  node: ConsignmentOffer
+}
+
+enum ConsignmentOfferSort {
+  # sort by commission_percent in ascending order
+  COMMISSION_PERCENT_ASC
+
+  # sort by commission_percent in descending order
+  COMMISSION_PERCENT_DESC
+
+  # sort by consigned_at in ascending order
+  CONSIGNED_AT_ASC
+
+  # sort by consigned_at in descending order
+  CONSIGNED_AT_DESC
+
+  # sort by created_at in ascending order
+  CREATED_AT_ASC
+
+  # sort by created_at in descending order
+  CREATED_AT_DESC
+
+  # sort by created_by_id in ascending order
+  CREATED_BY_ID_ASC
+
+  # sort by created_by_id in descending order
+  CREATED_BY_ID_DESC
+
+  # sort by currency in ascending order
+  CURRENCY_ASC
+
+  # sort by currency in descending order
+  CURRENCY_DESC
+
+  # sort by deadline_to_consign in ascending order
+  DEADLINE_TO_CONSIGN_ASC
+
+  # sort by deadline_to_consign in descending order
+  DEADLINE_TO_CONSIGN_DESC
+
+  # sort by high_estimate_cents in ascending order
+  HIGH_ESTIMATE_CENTS_ASC
+
+  # sort by high_estimate_cents in descending order
+  HIGH_ESTIMATE_CENTS_DESC
+
+  # sort by id in ascending order
+  ID_ASC
+
+  # sort by id in descending order
+  ID_DESC
+
+  # sort by insurance_info in ascending order
+  INSURANCE_INFO_ASC
+
+  # sort by insurance_info in descending order
+  INSURANCE_INFO_DESC
+
+  # sort by low_estimate_cents in ascending order
+  LOW_ESTIMATE_CENTS_ASC
+
+  # sort by low_estimate_cents in descending order
+  LOW_ESTIMATE_CENTS_DESC
+
+  # sort by notes in ascending order
+  NOTES_ASC
+
+  # sort by notes in descending order
+  NOTES_DESC
+
+  # sort by offer_type in ascending order
+  OFFER_TYPE_ASC
+
+  # sort by offer_type in descending order
+  OFFER_TYPE_DESC
+
+  # sort by other_fees_info in ascending order
+  OTHER_FEES_INFO_ASC
+
+  # sort by other_fees_info in descending order
+  OTHER_FEES_INFO_DESC
+
+  # sort by override_email in ascending order
+  OVERRIDE_EMAIL_ASC
+
+  # sort by override_email in descending order
+  OVERRIDE_EMAIL_DESC
+
+  # sort by partner_info in ascending order
+  PARTNER_INFO_ASC
+
+  # sort by partner_info in descending order
+  PARTNER_INFO_DESC
+
+  # sort by partner_submission_id in ascending order
+  PARTNER_SUBMISSION_ID_ASC
+
+  # sort by partner_submission_id in descending order
+  PARTNER_SUBMISSION_ID_DESC
+
+  # sort by photography_info in ascending order
+  PHOTOGRAPHY_INFO_ASC
+
+  # sort by photography_info in descending order
+  PHOTOGRAPHY_INFO_DESC
+
+  # sort by price_cents in ascending order
+  PRICE_CENTS_ASC
+
+  # sort by price_cents in descending order
+  PRICE_CENTS_DESC
+
+  # sort by reference_id in ascending order
+  REFERENCE_ID_ASC
+
+  # sort by reference_id in descending order
+  REFERENCE_ID_DESC
+
+  # sort by rejected_at in ascending order
+  REJECTED_AT_ASC
+
+  # sort by rejected_at in descending order
+  REJECTED_AT_DESC
+
+  # sort by rejected_by in ascending order
+  REJECTED_BY_ASC
+
+  # sort by rejected_by in descending order
+  REJECTED_BY_DESC
+
+  # sort by rejection_note in ascending order
+  REJECTION_NOTE_ASC
+
+  # sort by rejection_note in descending order
+  REJECTION_NOTE_DESC
+
+  # sort by rejection_reason in ascending order
+  REJECTION_REASON_ASC
+
+  # sort by rejection_reason in descending order
+  REJECTION_REASON_DESC
+
+  # sort by review_started_at in ascending order
+  REVIEW_STARTED_AT_ASC
+
+  # sort by review_started_at in descending order
+  REVIEW_STARTED_AT_DESC
+
+  # sort by sale_date in ascending order
+  SALE_DATE_ASC
+
+  # sort by sale_date in descending order
+  SALE_DATE_DESC
+
+  # sort by sale_location in ascending order
+  SALE_LOCATION_ASC
+
+  # sort by sale_location in descending order
+  SALE_LOCATION_DESC
+
+  # sort by sale_name in ascending order
+  SALE_NAME_ASC
+
+  # sort by sale_name in descending order
+  SALE_NAME_DESC
+
+  # sort by sale_period_end in ascending order
+  SALE_PERIOD_END_ASC
+
+  # sort by sale_period_end in descending order
+  SALE_PERIOD_END_DESC
+
+  # sort by sale_period_start in ascending order
+  SALE_PERIOD_START_ASC
+
+  # sort by sale_period_start in descending order
+  SALE_PERIOD_START_DESC
+
+  # sort by sent_at in ascending order
+  SENT_AT_ASC
+
+  # sort by sent_at in descending order
+  SENT_AT_DESC
+
+  # sort by sent_by in ascending order
+  SENT_BY_ASC
+
+  # sort by sent_by in descending order
+  SENT_BY_DESC
+
+  # sort by shipping_info in ascending order
+  SHIPPING_INFO_ASC
+
+  # sort by shipping_info in descending order
+  SHIPPING_INFO_DESC
+
+  # sort by state in ascending order
+  STATE_ASC
+
+  # sort by state in descending order
+  STATE_DESC
+
+  # sort by submission_id in ascending order
+  SUBMISSION_ID_ASC
+
+  # sort by submission_id in descending order
+  SUBMISSION_ID_DESC
+
+  # sort by updated_at in ascending order
+  UPDATED_AT_ASC
+
+  # sort by updated_at in descending order
+  UPDATED_AT_DESC
+}
+
+type ConsignmentPageCursor {
+  # first cursor on the page
+  cursor: String!
+
+  # is this the current page?
+  isCurrent: Boolean!
+
+  # page number out of totalPages
+  page: Int!
+}
+
+type ConsignmentPageCursors {
+  around: [ConsignmentPageCursor!]!
+
+  # optional, may be included in field around
+  first: ConsignmentPageCursor
+
+  # optional, may be included in field around
+  last: ConsignmentPageCursor
+  previous: ConsignmentPageCursor
+}
+
+enum ConsignmentSort {
+  # sort by accepted_offer_id in ascending order
+  ACCEPTED_OFFER_ID_ASC
+
+  # sort by accepted_offer_id in descending order
+  ACCEPTED_OFFER_ID_DESC
+
+  # sort by artsy_commission_percent in ascending order
+  ARTSY_COMMISSION_PERCENT_ASC
+
+  # sort by artsy_commission_percent in descending order
+  ARTSY_COMMISSION_PERCENT_DESC
+
+  # sort by canceled_reason in ascending order
+  CANCELED_REASON_ASC
+
+  # sort by canceled_reason in descending order
+  CANCELED_REASON_DESC
+
+  # sort by created_at in ascending order
+  CREATED_AT_ASC
+
+  # sort by created_at in descending order
+  CREATED_AT_DESC
+
+  # sort by currency in ascending order
+  CURRENCY_ASC
+
+  # sort by currency in descending order
+  CURRENCY_DESC
+
+  # sort by id in ascending order
+  ID_ASC
+
+  # sort by id in descending order
+  ID_DESC
+
+  # sort by notes in ascending order
+  NOTES_ASC
+
+  # sort by notes in descending order
+  NOTES_DESC
+
+  # sort by notified_at in ascending order
+  NOTIFIED_AT_ASC
+
+  # sort by notified_at in descending order
+  NOTIFIED_AT_DESC
+
+  # sort by partner_commission_percent in ascending order
+  PARTNER_COMMISSION_PERCENT_ASC
+
+  # sort by partner_commission_percent in descending order
+  PARTNER_COMMISSION_PERCENT_DESC
+
+  # sort by partner_id in ascending order
+  PARTNER_ID_ASC
+
+  # sort by partner_id in descending order
+  PARTNER_ID_DESC
+
+  # sort by partner_invoiced_at in ascending order
+  PARTNER_INVOICED_AT_ASC
+
+  # sort by partner_invoiced_at in descending order
+  PARTNER_INVOICED_AT_DESC
+
+  # sort by partner_paid_at in ascending order
+  PARTNER_PAID_AT_ASC
+
+  # sort by partner_paid_at in descending order
+  PARTNER_PAID_AT_DESC
+
+  # sort by reference_id in ascending order
+  REFERENCE_ID_ASC
+
+  # sort by reference_id in descending order
+  REFERENCE_ID_DESC
+
+  # sort by sale_date in ascending order
+  SALE_DATE_ASC
+
+  # sort by sale_date in descending order
+  SALE_DATE_DESC
+
+  # sort by sale_location in ascending order
+  SALE_LOCATION_ASC
+
+  # sort by sale_location in descending order
+  SALE_LOCATION_DESC
+
+  # sort by sale_lot_number in ascending order
+  SALE_LOT_NUMBER_ASC
+
+  # sort by sale_lot_number in descending order
+  SALE_LOT_NUMBER_DESC
+
+  # sort by sale_name in ascending order
+  SALE_NAME_ASC
+
+  # sort by sale_name in descending order
+  SALE_NAME_DESC
+
+  # sort by sale_price_cents in ascending order
+  SALE_PRICE_CENTS_ASC
+
+  # sort by sale_price_cents in descending order
+  SALE_PRICE_CENTS_DESC
+
+  # sort by state in ascending order
+  STATE_ASC
+
+  # sort by state in descending order
+  STATE_DESC
+
+  # sort by submission_id in ascending order
+  SUBMISSION_ID_ASC
+
+  # sort by submission_id in descending order
+  SUBMISSION_ID_DESC
+
+  # sort by updated_at in ascending order
+  UPDATED_AT_ASC
+
+  # sort by updated_at in descending order
+  UPDATED_AT_DESC
+}
+
+enum ConsignmentState {
+  BOUGHT_IN
+  CANCELLED
+  OPEN
+  SOLD
+}
+
+# Consignment Submission
+type ConsignmentSubmission {
+  additionalInfo: String
+  artist: Artist
+  artistId: String!
+  assets: [ConsignmentSubmissionCategoryAsset]
+  authenticityCertificate: Boolean
+  category: String
+  createdAt: ISO8601DateTime
+  currency: String
+  depth: String
+  dimensionsMetric: String
+  edition: String
+  editionNumber: String
+  editionSize: Int
+  height: String
+
+  # Uniq ID for this submission
+  id: ID!
+  internalID: ID
+  locationCity: String
+  locationCountry: String
+  locationState: String
+  medium: String
+  minimumPriceDollars: Int
+  offers(gravityPartnerId: ID!): [ConsignmentOffer!]!
+  primaryImage: ConsignmentSubmissionCategoryAsset
+  provenance: String
+  publishedAt: ISO8601DateTime
+  signature: Boolean
+  state: ConsignmentSubmissionStateAggregation
+  title: String
+  userAgent: String
+  userId: String!
+  width: String
+  year: String
+}
+
+enum ConsignmentSubmissionCategoryAggregation {
+  ARCHITECTURE
+  DESIGN_DECORATIVE_ART
+  DRAWING_COLLAGE_OR_OTHER_WORK_ON_PAPER
+  FASHION_DESIGN_AND_WEARABLE_ART
+  INSTALLATION
+  JEWELRY
+  MIXED_MEDIA
+  OTHER
+  PAINTING
+  PERFORMANCE_ART
+  PHOTOGRAPHY
+  PRINT
+  SCULPTURE
+  TEXTILE_ARTS
+  VIDEO_FILM_ANIMATION
+}
+
+# Submission Asset
+type ConsignmentSubmissionCategoryAsset {
+  # type of this Asset
+  assetType: String!
+
+  # gemini token for asset
+  geminiToken: String
+
+  # Uniq ID for this asset
+  id: ID!
+
+  # known image urls
+  imageUrls: JSON
+  submissionId: ID!
+  submissionID: ID
+}
+
+# The connection type for Submission.
+type ConsignmentSubmissionConnection {
+  # A list of edges.
+  edges: [SubmissionEdge]
+
+  # A list of nodes.
+  nodes: [ConsignmentSubmission]
+  pageCursors: ConsignmentPageCursors
+
+  # Information to aid in pagination.
+  pageInfo: PageInfo!
+  totalCount: Int
+  totalPages: Int
+}
+
+enum ConsignmentSubmissionSort {
+  # sort by additional_info in ascending order
+  ADDITIONAL_INFO_ASC
+
+  # sort by additional_info in descending order
+  ADDITIONAL_INFO_DESC
+
+  # sort by admin_receipt_sent_at in ascending order
+  ADMIN_RECEIPT_SENT_AT_ASC
+
+  # sort by admin_receipt_sent_at in descending order
+  ADMIN_RECEIPT_SENT_AT_DESC
+
+  # sort by approved_at in ascending order
+  APPROVED_AT_ASC
+
+  # sort by approved_at in descending order
+  APPROVED_AT_DESC
+
+  # sort by approved_by in ascending order
+  APPROVED_BY_ASC
+
+  # sort by approved_by in descending order
+  APPROVED_BY_DESC
+
+  # sort by artist_id in ascending order
+  ARTIST_ID_ASC
+
+  # sort by artist_id in descending order
+  ARTIST_ID_DESC
+
+  # sort by artist_score in ascending order
+  ARTIST_SCORE_ASC
+
+  # sort by artist_score in descending order
+  ARTIST_SCORE_DESC
+
+  # sort by assigned_to in ascending order
+  ASSIGNED_TO_ASC
+
+  # sort by assigned_to in descending order
+  ASSIGNED_TO_DESC
+
+  # sort by auction_score in ascending order
+  AUCTION_SCORE_ASC
+
+  # sort by auction_score in descending order
+  AUCTION_SCORE_DESC
+
+  # sort by authenticity_certificate in ascending order
+  AUTHENTICITY_CERTIFICATE_ASC
+
+  # sort by authenticity_certificate in descending order
+  AUTHENTICITY_CERTIFICATE_DESC
+
+  # sort by category in ascending order
+  CATEGORY_ASC
+
+  # sort by category in descending order
+  CATEGORY_DESC
+
+  # sort by consigned_partner_submission_id in ascending order
+  CONSIGNED_PARTNER_SUBMISSION_ID_ASC
+
+  # sort by consigned_partner_submission_id in descending order
+  CONSIGNED_PARTNER_SUBMISSION_ID_DESC
+
+  # sort by created_at in ascending order
+  CREATED_AT_ASC
+
+  # sort by created_at in descending order
+  CREATED_AT_DESC
+
+  # sort by currency in ascending order
+  CURRENCY_ASC
+
+  # sort by currency in descending order
+  CURRENCY_DESC
+
+  # sort by deadline_to_sell in ascending order
+  DEADLINE_TO_SELL_ASC
+
+  # sort by deadline_to_sell in descending order
+  DEADLINE_TO_SELL_DESC
+
+  # sort by deleted_at in ascending order
+  DELETED_AT_ASC
+
+  # sort by deleted_at in descending order
+  DELETED_AT_DESC
+
+  # sort by depth in ascending order
+  DEPTH_ASC
+
+  # sort by depth in descending order
+  DEPTH_DESC
+
+  # sort by dimensions_metric in ascending order
+  DIMENSIONS_METRIC_ASC
+
+  # sort by dimensions_metric in descending order
+  DIMENSIONS_METRIC_DESC
+
+  # sort by edition in ascending order
+  EDITION_ASC
+
+  # sort by edition in descending order
+  EDITION_DESC
+
+  # sort by edition_number in ascending order
+  EDITION_NUMBER_ASC
+
+  # sort by edition_number in descending order
+  EDITION_NUMBER_DESC
+
+  # sort by edition_size in ascending order
+  EDITION_SIZE_ASC
+
+  # sort by edition_size in descending order
+  EDITION_SIZE_DESC
+
+  # sort by ext_user_id in ascending order
+  EXT_USER_ID_ASC
+
+  # sort by ext_user_id in descending order
+  EXT_USER_ID_DESC
+
+  # sort by height in ascending order
+  HEIGHT_ASC
+
+  # sort by height in descending order
+  HEIGHT_DESC
+
+  # sort by id in ascending order
+  ID_ASC
+
+  # sort by id in descending order
+  ID_DESC
+
+  # sort by location_city in ascending order
+  LOCATION_CITY_ASC
+
+  # sort by location_city in descending order
+  LOCATION_CITY_DESC
+
+  # sort by location_country in ascending order
+  LOCATION_COUNTRY_ASC
+
+  # sort by location_country in descending order
+  LOCATION_COUNTRY_DESC
+
+  # sort by location_state in ascending order
+  LOCATION_STATE_ASC
+
+  # sort by location_state in descending order
+  LOCATION_STATE_DESC
+
+  # sort by medium in ascending order
+  MEDIUM_ASC
+
+  # sort by medium in descending order
+  MEDIUM_DESC
+
+  # sort by minimum_price_cents in ascending order
+  MINIMUM_PRICE_CENTS_ASC
+
+  # sort by minimum_price_cents in descending order
+  MINIMUM_PRICE_CENTS_DESC
+
+  # sort by offers_count in ascending order
+  OFFERS_COUNT_ASC
+
+  # sort by offers_count in descending order
+  OFFERS_COUNT_DESC
+
+  # sort by primary_image_id in ascending order
+  PRIMARY_IMAGE_ID_ASC
+
+  # sort by primary_image_id in descending order
+  PRIMARY_IMAGE_ID_DESC
+
+  # sort by provenance in ascending order
+  PROVENANCE_ASC
+
+  # sort by provenance in descending order
+  PROVENANCE_DESC
+
+  # sort by published_at in ascending order
+  PUBLISHED_AT_ASC
+
+  # sort by published_at in descending order
+  PUBLISHED_AT_DESC
+
+  # sort by qualified in ascending order
+  QUALIFIED_ASC
+
+  # sort by qualified in descending order
+  QUALIFIED_DESC
+
+  # sort by receipt_sent_at in ascending order
+  RECEIPT_SENT_AT_ASC
+
+  # sort by receipt_sent_at in descending order
+  RECEIPT_SENT_AT_DESC
+
+  # sort by rejected_at in ascending order
+  REJECTED_AT_ASC
+
+  # sort by rejected_at in descending order
+  REJECTED_AT_DESC
+
+  # sort by rejected_by in ascending order
+  REJECTED_BY_ASC
+
+  # sort by rejected_by in descending order
+  REJECTED_BY_DESC
+
+  # sort by reminders_sent_count in ascending order
+  REMINDERS_SENT_COUNT_ASC
+
+  # sort by reminders_sent_count in descending order
+  REMINDERS_SENT_COUNT_DESC
+
+  # sort by signature in ascending order
+  SIGNATURE_ASC
+
+  # sort by signature in descending order
+  SIGNATURE_DESC
+
+  # sort by state in ascending order
+  STATE_ASC
+
+  # sort by state in descending order
+  STATE_DESC
+
+  # sort by title in ascending order
+  TITLE_ASC
+
+  # sort by title in descending order
+  TITLE_DESC
+
+  # sort by updated_at in ascending order
+  UPDATED_AT_ASC
+
+  # sort by updated_at in descending order
+  UPDATED_AT_DESC
+
+  # sort by user_agent in ascending order
+  USER_AGENT_ASC
+
+  # sort by user_agent in descending order
+  USER_AGENT_DESC
+
+  # sort by user_email in ascending order
+  USER_EMAIL_ASC
+
+  # sort by user_email in descending order
+  USER_EMAIL_DESC
+
+  # sort by user_id in ascending order
+  USER_ID_ASC
+
+  # sort by user_id in descending order
+  USER_ID_DESC
+
+  # sort by width in ascending order
+  WIDTH_ASC
+
+  # sort by width in descending order
+  WIDTH_DESC
+
+  # sort by year in ascending order
+  YEAR_ASC
+
+  # sort by year in descending order
+  YEAR_DESC
+}
+
+enum ConsignmentSubmissionStateAggregation {
+  APPROVED
+  DRAFT
+  REJECTED
+  SUBMITTED
+}
+
+type ConvectionService {
+  geminiTemplateKey: String!
+}
+
+# A conversation.
+type Conversation implements Node {
+  # Only the artworks discussed in the conversation.
+  artworks: [Artwork]
+  buyerOutcome: String
+  buyerOutcomeAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String
+  createdAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String
+
+  # The participant who initiated the conversation
+  from: ConversationInitiator!
+  fromLastViewedMessageID: String
+
+  # A globally unique ID.
+  id: ID!
+  initialMessage: String!
+    @deprecated(
+      reason: "This field is no longer required. Prefer the first message from the MessageConnection."
+    )
+
+  # Gravity inquiry id.
+  inquiryID: String
+
+  # An optional type-specific ID.
+  internalID: ID
+
+  # True if user/conversation initiator is a recipient.
+  isLastMessageToUser: Boolean
+
+  # The artworks and/or partner shows discussed in the conversation.
+  items: [ConversationItem]
+
+  # This is a snippet of text from the last message.
+  lastMessage: String
+  lastMessageAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String
+
+  # Delivery id if the user is a recipient of the last message, null otherwise.
+  lastMessageDeliveryID: String
+
+  # Impulse id of the last message.
+  lastMessageID: String
+    @deprecated(
+      reason: "Prefer querying `messagesConnection(last:1) { edges { node { internalID } } }`"
+    )
+
+  # A connection for all messages in a single conversation
+  messages(
+    after: String
+    before: String
+    first: Int
+    last: Int
+    sort: sort
+  ): MessageConnection @deprecated(reason: "Prefer messagesConnection")
+
+  # A connection for all messages in a single conversation
+  messagesConnection(
+    after: String
+    before: String
+    first: Int
+    last: Int
+    sort: sort
+  ): MessageConnection
+
+  # The participant(s) responding to the conversation
+  to: ConversationResponder!
+
+  # True if there is an unread message by the user.
+  unread: Boolean
+}
+
+# A connection to a list of items.
+type ConversationConnection {
+  # A list of edges.
+  edges: [ConversationEdge]
+
+  # Information to aid in pagination.
+  pageInfo: PageInfo!
+  totalUnreadCount: Int
+}
+
+# An edge in a connection.
+type ConversationEdge {
+  # A cursor for use in pagination
+  cursor: String!
+
+  # The item at the end of the edge
+  node: Conversation
+}
+
+# The participant who started the conversation, currently always a User
+type ConversationInitiator {
+  email: String!
+
+  # A globally unique ID.
+  id: ID!
+  initials(length: Int = 3): String
+
+  # A type-specific ID likely used as a database ID.
+  internalID: ID!
+  name: String!
+
+  # The type of participant, e.g. Partner or User
+  type: String!
+}
+
+type ConversationItem {
+  item: ConversationItemType
+  permalink: String
+  title: String
+}
+
+union ConversationItemType = Artwork | Show
+
+# The participant responding to the conversation, currently always a Partner
+type ConversationResponder {
+  # A globally unique ID.
+  id: ID!
+  initials(length: Int = 3): String
+
+  # A type-specific ID likely used as a database ID.
+  internalID: ID!
+  name: String!
+
+  # An array of Impulse IDs that correspond to all email addresses that messages should be sent to
+  replyToImpulseIDs: [String]!
+
+  # The type of participant, e.g. Partner or User
+  type: String!
+}
+
+type CreateAccountRequestMutationFailure {
+  mutationError: GravityMutationError
+}
+
+input CreateAccountRequestMutationInput {
+  # Type of account request.
+  action: String
+  clientMutationId: String
+
+  # Email to associate with message.
+  email: String
+
+  # Name to associate with message.
+  name: String
+
+  # Message to be sent.
+  notes: String!
+
+  # Used when logged in.
+  userID: String
+}
+
+type CreateAccountRequestMutationPayload {
+  accountRequestOrError: CreateAccountRequestMutationType
+  clientMutationId: String
+}
+
+type CreateAccountRequestMutationSuccess {
+  accountRequest: AccountRequest
+}
+
+union CreateAccountRequestMutationType =
+    CreateAccountRequestMutationFailure
+  | CreateAccountRequestMutationSuccess
+
+# Autogenerated input type of CreateAppSecondFactor
+input CreateAppSecondFactorInput {
+  attributes: AppSecondFactorAttributes!
+
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+}
+
+# Autogenerated return type of CreateAppSecondFactor
+type CreateAppSecondFactorPayload {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+  secondFactorOrErrors: AppSecondFactorOrErrorsUnion!
+}
+
+# Autogenerated input type of CreateBackupSecondFactors
+input CreateBackupSecondFactorsInput {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+  password: String
+}
+
+# Autogenerated return type of CreateBackupSecondFactors
+type CreateBackupSecondFactorsPayload {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+  secondFactorsOrErrors: BackupSecondFactorsOrErrorsUnion!
+}
+
+input CreateBidderInput {
+  clientMutationId: String
+  saleID: String!
+}
+
+type CreateBidderPayload {
+  bidder: Bidder
+  clientMutationId: String
+}
+
+input CreateGeminiEntryForAssetInput {
+  clientMutationId: String
+
+  # Additional JSON data to pass through gemini, should definitely contain an `id` and a `_type`
+  metadata: JSON!
+
+  # The S3 bucket where the file was uploaded
+  sourceBucket: String!
+
+  # The path to the file
+  sourceKey: String!
+
+  # The template key, this is `name` in the asset request
+  templateKey: String!
+}
+
+type CreateGeminiEntryForAssetPayload {
+  asset: GeminiEntry
+  clientMutationId: String
+}
+
+# Autogenerated input type of CreateImage
+input CreateImageInput {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+
+  # The S3 url for the image to be processed
+  src: String!
+
+  # The Gemini template key that tells us which image versions we want to generate during processing
+  templateKey: String!
+}
+
+# Autogenerated return type of CreateImage
+type CreateImagePayload {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+  image: ARImage!
+}
+
+# Autogenerated input type of CreateOfferMutation
+input CreateOfferMutationInput {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+  commissionPercentWhole: Int!
+  createdById: String
+  currency: String
+  deadlineToConsign: String
+  gravityPartnerId: String!
+  highEstimateDollars: Int
+  insuranceInfo: String
+  lowEstimateDollars: Int
+  notes: String
+  offerType: String
+  otherFeesInfo: String
+  partnerInfo: String
+  photographyInfo: String
+  saleDate: Date
+  saleLocation: String
+  saleName: String
+  shippingInfo: String
+  state: String
+  submissionId: ID!
+}
+
+# Autogenerated return type of CreateOfferMutation
+type CreateOfferMutationPayload {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+  consignmentOffer: ConsignmentOffer
+}
+
+# Autogenerated input type of CreateSmsSecondFactor
+input CreateSmsSecondFactorInput {
+  attributes: SmsSecondFactorAttributes!
+
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+}
+
+# Autogenerated return type of CreateSmsSecondFactor
+type CreateSmsSecondFactorPayload {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+  secondFactorOrErrors: SmsSecondFactorOrErrorsUnion!
+}
+
+# Autogenerated input type of CreateSubmissionMutation
+input CreateSubmissionMutationInput {
+  additionalInfo: String
+  artistID: String!
+  authenticityCertificate: Boolean
+  category: ConsignmentSubmissionCategoryAggregation
+
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+  currency: String
+  depth: String
+  dimensionsMetric: String
+  edition: Boolean
+  editionNumber: String
+  editionSize: Int
+  height: String
+  locationCity: String
+  locationCountry: String
+  locationState: String
+  medium: String
+  minimumPriceDollars: Int
+  provenance: String
+  signature: Boolean
+  state: ConsignmentSubmissionStateAggregation
+  title: String
+  userAgent: String
+  width: String
+  year: String
+}
+
+# Autogenerated return type of CreateSubmissionMutation
+type CreateSubmissionMutationPayload {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+  consignmentSubmission: ConsignmentSubmission
+}
+
+# Autogenerated input type of CreateViewingRoom
+input CreateViewingRoomInput {
+  attributes: ViewingRoomAttributes
+
+  # Main text
+  body: String
+
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+
+  # End datetime
+  endAt: ISO8601DateTime
+  image: ARImageInput
+
+  # Introduction
+  introStatement: String
+
+  # Partner Id
+  partnerId: String
+  partnerID: String
+
+  # Pullquote
+  pullQuote: String
+
+  # Start datetime
+  startAt: ISO8601DateTime
+
+  # Timezone
+  timeZone: String
+
+  # Title
+  title: String
+}
+
+# Autogenerated return type of CreateViewingRoom
+type CreateViewingRoomPayload {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+  viewingRoomOrErrors: ViewingRoomOrErrorsUnion!
+}
+
+# An asset which is assigned to a consignment submission
+type Credentials {
+  # The key to use with S3.
+  credentials: String!
+
+  # The s3 policy document for your request
+  policyDocument: S3PolicyDocumentType!
+
+  # A base64 encoded version of the S3 policy
+  policyEncoded: String!
+
+  # The signature for your asset.
+  signature: String!
+}
+
+type CreditCard {
+  # Brand of credit card
+  brand: String!
+
+  # Billing address city
+  city: String
+
+  # Billing address country code
+  country: String
+
+  # Credit card's expiration month
+  expirationMonth: Int!
+
+  # Credit card's expiration year
+  expirationYear: Int!
+
+  # A globally unique ID.
+  id: ID!
+
+  # A type-specific ID likely used as a database ID.
+  internalID: ID!
+
+  # Last four digits on the credit card
+  lastDigits: String!
+
+  # Name on the credit card
+  name: String
+
+  # Billing address postal code
+  postalCode: String
+
+  # Billing address state
+  state: String
+
+  # Billing address street1
+  street1: String
+
+  # Billing address street2
+  street2: String
+}
+
+# A connection to a list of items.
+type CreditCardConnection {
+  # A list of edges.
+  edges: [CreditCardEdge]
+
+  # Information to aid in pagination.
+  pageInfo: PageInfo!
+}
+
+# An edge in a connection.
+type CreditCardEdge {
+  # A cursor for use in pagination
+  cursor: String!
+
+  # The item at the end of the edge
+  node: CreditCard
+}
+
+input CreditCardInput {
+  clientMutationId: String
+  oneTimeUse: Boolean = false
+  token: String!
+}
+
+type CreditCardMutationFailure {
+  mutationError: GravityMutationError
+}
+
+type CreditCardMutationSuccess {
+  creditCard: CreditCard
+  creditCardEdge: CreditCardEdge
+}
+
+union CreditCardMutationType =
+    CreditCardMutationFailure
+  | CreditCardMutationSuccess
+
+type CreditCardPayload {
+  clientMutationId: String
+  creditCardOrError: CreditCardMutationType
+}
+
+type CroppedImageUrl {
+  height: Int!
+  src: String!
+  srcSet: String!
+  url: String!
+  width: Int!
+}
+
+type CurrentEvent {
+  # Location and date of the event if available
+  details: String
+  event: UnderlyingCurrentEvent!
+
+  # Link to the event
+  href: String
+  image: Image
+
+  # Name of the event
+  name: String
+
+  # Name of the partner associated to the event
+  partner: String
+
+  # The state of the event
+  status: String
+}
+
+# Date in YYYY-MM-DD format
+scalar Date
+
+type DaySchedule {
+  dayOfWeek: String
+  endTime: Int
+  startTime: Int
+}
+
+type DeepZoom {
+  Image: DeepZoomImage
+}
+
+type DeepZoomImage {
+  Format: String
+  Overlap: Int
+  Size: DeepZoomImageSize
+  TileSize: Int
+  Url: String
+  xmlns: String
+}
+
+type DeepZoomImageSize {
+  Height: Int
+  Width: Int
+}
+
+input DeleteCreditCardInput {
+  clientMutationId: String
+  id: String!
+}
+
+type DeleteCreditCardPayload {
+  clientMutationId: String
+  creditCardOrError: CreditCardMutationType
+}
+
+# Autogenerated input type of DeleteViewingRoom
+input DeleteViewingRoomInput {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+  viewingRoomID: ID!
+}
+
+# Autogenerated return type of DeleteViewingRoom
+type DeleteViewingRoomPayload {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+  viewingRoom: ViewingRoom!
+}
+
+# Autogenerated input type of DeliverSecondFactor
+input DeliverSecondFactorInput {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+  secondFactorID: ID!
+}
+
+# Autogenerated return type of DeliverSecondFactor
+type DeliverSecondFactorPayload {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+  secondFactorOrErrors: SecondFactorOrErrorsUnion!
+}
+
+# Fields of a delivery (currently from Radiation)
+type Delivery {
+  bouncedAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String
+  clickedAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String
+  deliveredAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String
+
+  # Masked email w/ display name.
+  fullTransformedEmail: String!
+
+  # A globally unique ID.
+  id: ID!
+
+  # A type-specific ID likely used as a database ID.
+  internalID: ID!
+  openedAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String
+}
+
+type dimensions {
+  cm: String
+  in: String
+}
+
+# Autogenerated input type of DisableSecondFactor
+input DisableSecondFactorInput {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+  password: String
+  secondFactorID: ID!
+}
+
+# Autogenerated return type of DisableSecondFactor
+type DisableSecondFactorPayload {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+  secondFactorOrErrors: SecondFactorOrErrorsUnion!
+}
+
+type DoNotUseThisPartner {
+  display_name: String @deprecated(reason: "Use displayName")
+  displayName: String
+  given_name: String @deprecated(reason: "Use givenName")
+  givenName: String
+  id: ID!
+  relative_size: Int @deprecated(reason: "Use relativeSize")
+  relativeSize: Int
+  slug: String
+  subscription_state: String @deprecated(reason: "Use subscriptionState")
+  subscriptionState: String
+}
+
+input EditableLocation {
+  # First line of an address
+  address: String
+
+  # Second line of an address
+  address2: String
+
+  # The city the location is based in
+  city: String
+
+  # The county the location is based in
+  country: String
+
+  # Postal code for a string
+  postalCode: String
+
+  # The (optional) name of the state for location
+  state: String
+
+  # The (optional) state code of the state for location
+  stateCode: String
+
+  # An optional display string for the location
+  summary: String
+}
+
+type EditionSet implements Sellable {
+  dimensions: dimensions
+  editionOf: String
+
+  # If you need to render artwork dimensions as a string, prefer the `Artwork#dimensions` field
+  heightCm: Float
+
+  # A globally unique ID.
+  id: ID!
+
+  # A type-specific ID likely used as a database ID.
+  internalID: ID!
+  isAcquireable: Boolean
+  isForSale: Boolean
+  isOfferable: Boolean
+  isSold: Boolean
+  listPrice: ListPrice
+  saleMessage: String
+
+  # score assigned to an artwork based on its dimensions
+  sizeScore: Float
+
+  # If you need to render artwork dimensions as a string, prefer the `Artwork#dimensions` field
+  widthCm: Float
+}
+
+enum EditionSetSorts {
+  PRICE_ASC
+}
+
+# Autogenerated input type of EnableSecondFactor
+input EnableSecondFactorInput {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+  code: String!
+  password: String
+  secondFactorID: ID!
+}
+
+# Autogenerated return type of EnableSecondFactor
+type EnableSecondFactorPayload {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+  recoveryCodes: [String!]
+  secondFactorOrErrors: SecondFactorOrErrorsUnion!
+}
+
+input EndSaleInput {
+  clientMutationId: String
+  saleID: String
+}
+
+type EndSalePayload {
+  clientMutationId: String
+  sale: Sale
+}
+
+interface EntityWithFilterArtworksConnectionInterface {
+  filterArtworksConnection(
+    acquireable: Boolean
+    after: String
+    aggregationPartnerCities: [String]
+    aggregations: [ArtworkAggregation]
+    artistID: String
+    artistIDs: [String]
+    artistSeriesID: String
+    atAuction: Boolean
+    attributionClass: [String]
+    before: String
+    color: String
+    dimensionRange: String
+    excludeArtworkIDs: [String]
+    extraAggregationGeneIDs: [String]
+    first: Int
+    forSale: Boolean
+    geneID: String
+    geneIDs: [String]
+    height: String
+    includeArtworksByFollowedArtists: Boolean
+    includeMediumFilterInAggregation: Boolean
+    inquireableOnly: Boolean
+    keyword: String
+
+    # When true, will only return exact keyword match
+    keywordMatchExact: Boolean
+    last: Int
+    majorPeriods: [String]
+
+    # When true, will only return `marketable` works (not nude or provocative).
+    marketable: Boolean
+
+    # A string from the list of allocations, or * to denote all mediums
+    medium: String
+    offerable: Boolean
+    page: Int
+    partnerCities: [String]
+    partnerID: ID
+    period: String
+    periods: [String]
+    priceRange: String
+    saleID: ID
+    size: Int
+
+    # Filter results by Artwork sizes
+    sizes: [ArtworkSizes]
+    sort: String
+    tagID: String
+    width: String
+  ): FilterArtworksConnection
+
+  # A globally unique ID.
+  id: ID!
+}
+
+# A user-readable error
+type Error {
+  # Error code
+  code: String!
+
+  # Extra data about error.
+  data: JSON
+
+  # A description of the error
+  message: String!
+
+  # Which input value this error came from
+  path: [String!]
+}
+
+# A user-readable list of errors
+type Errors {
+  # List of Errors.
+  errors: [Error!]!
+}
+
+enum EventStatus {
+  # End date is in the past
+  CLOSED
+
+  # End date is in near future
+  CLOSING_SOON
+
+  # Start date or end date is in the future
+  CURRENT
+
+  # Start date is in the past and end date is in the future
+  RUNNING
+
+  # Special filtering option which is used to show running and upcoming shows
+  RUNNING_AND_UPCOMING
+
+  # Start date is in the future
+  UPCOMING
+}
+
+type ExternalPartner {
+  city: String
+
+  # A globally unique ID.
+  id: ID!
+
+  # A type-specific ID.
+  internalID: ID!
+  name: String
+}
+
+type Fair implements EntityWithFilterArtworksConnectionInterface & Node {
+  about(format: Format): String
+  activeStartAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String
+  articlesConnection(
+    after: String
+    before: String
+    first: Int
+    last: Int
+    sort: ArticleSorts
+  ): ArticleConnection
+  artistsConnection(
+    after: String
+    before: String
+    first: Int
+    last: Int
+
+    # Sorts for artists in a fair
+    sort: FairArtistSorts
+  ): ArtistConnection
+  bannerSize: String
+  cached: Int
+  contact(format: Format): String
+  counts: FairCounts
+  endAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String
+
+  # A formatted description of the start to end dates
+  exhibitionPeriod: String
+
+  # The exhibitors with booths in this fair with letter.
+  exhibitorsGroupedByName: [FairExhibitorsGroup]
+
+  # Artworks Elastic Search results
+  filterArtworksConnection(
+    acquireable: Boolean
+    after: String
+    aggregationPartnerCities: [String]
+    aggregations: [ArtworkAggregation]
+    artistID: String
+    artistIDs: [String]
+    artistSeriesID: String
+    atAuction: Boolean
+    attributionClass: [String]
+    before: String
+    color: String
+    dimensionRange: String
+    excludeArtworkIDs: [String]
+    extraAggregationGeneIDs: [String]
+    first: Int
+    forSale: Boolean
+    geneID: String
+    geneIDs: [String]
+    height: String
+    includeArtworksByFollowedArtists: Boolean
+    includeMediumFilterInAggregation: Boolean
+    inquireableOnly: Boolean
+    keyword: String
+
+    # When true, will only return exact keyword match
+    keywordMatchExact: Boolean
+    last: Int
+    majorPeriods: [String]
+
+    # When true, will only return `marketable` works (not nude or provocative).
+    marketable: Boolean
+
+    # A string from the list of allocations, or * to denote all mediums
+    medium: String
+    offerable: Boolean
+    page: Int
+    partnerCities: [String]
+    partnerID: ID
+    period: String
+    periods: [String]
+    priceRange: String
+    saleID: ID
+    size: Int
+
+    # Filter results by Artwork sizes
+    sizes: [ArtworkSizes]
+    sort: String
+    tagID: String
+    width: String
+  ): FilterArtworksConnection
+  followedContent: FollowedContent
+
+  # A formatted description of when the fair starts or closes or if it is closed
+  formattedOpeningHours: String
+  hasFullFeature: Boolean
+  hasHomepageSection: Boolean
+  hasLargeBanner: Boolean
+  hasListing: Boolean
+  hours(format: Format): String
+  href: String
+
+  # A globally unique ID.
+  id: ID!
+  image: Image
+
+  # A type-specific ID likely used as a database ID.
+  internalID: ID!
+
+  # Are we currently in the fair's active period?
+  isActive: Boolean
+  isPublished: Boolean
+  kawsCollectionSlugs: [String]!
+  links(format: Format): String
+  location: Location
+  marketingCollections(size: Int): [MarketingCollection]!
+  mobileImage: Image
+  name: String
+  organizer: organizer
+  profile: Profile
+
+  # This connection only supports forward pagination. We're replacing Relay's default cursor with one from Gravity.
+  showsConnection(
+    after: String
+    before: String
+    first: Int
+    last: Int
+
+    # Number of artworks to return
+    section: String
+
+    # Sorts for shows in a fair
+    sort: ShowSorts
+    totalCount: Boolean = false
+  ): ShowConnection
+
+  # A slug ID.
+  slug: ID!
+  sponsoredContent: FairSponsoredContent
+  startAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String
+  summary(format: Format): String
+  tagline: String
+  tickets(format: Format): String
+  ticketsLink: String
+}
+
+enum FairArtistSorts {
+  NAME_ASC
+  NAME_DESC
+}
+
+# A connection to a list of items.
+type FairConnection {
+  # A list of edges.
+  edges: [FairEdge]
+  pageCursors: PageCursors!
+
+  # Information to aid in pagination.
+  pageInfo: PageInfo!
+  totalCount: Int
+}
+
+type FairCounts {
+  artists(
+    # Returns a `String` when format is specified. e.g.`'0,0.0000''`
+    format: String
+    label: String
+  ): FormattedNumber
+  artworks(
+    # Returns a `String` when format is specified. e.g.`'0,0.0000''`
+    format: String
+    label: String
+  ): FormattedNumber
+  partners(
+    # Returns a `String` when format is specified. e.g.`'0,0.0000''`
+    format: String
+    label: String
+  ): FormattedNumber
+  partnerShows(
+    # Returns a `String` when format is specified. e.g.`'0,0.0000''`
+    format: String
+    label: String
+  ): FormattedNumber
+}
+
+# An edge in a connection.
+type FairEdge {
+  # A cursor for use in pagination
+  cursor: String!
+
+  # The item at the end of the edge
+  node: Fair
+}
+
+type FairExhibitor {
+  # Exhibitor name
+  name: String
+
+  # Exhibitors _id
+  partnerID: String
+
+  # Partner default profile id
+  profileID: String
+
+  # A slug ID.
+  slug: ID!
+}
+
+type FairExhibitorsGroup {
+  # The exhibitor data.
+  exhibitors: [FairExhibitor]
+
+  # Letter exhibitors group belongs to
+  letter: String
+}
+
+enum FairSorts {
+  CREATED_AT_ASC
+  CREATED_AT_DESC
+  NAME_ASC
+  NAME_DESC
+  START_AT_ASC
+  START_AT_DESC
+}
+
+type FairSponsoredContent {
+  activationText: String
+  pressReleaseUrl: String
+}
+
+# A Feature
+type Feature {
+  callout(format: Format): String
+  description(format: Format): String
+
+  # A globally unique ID.
+  id: ID!
+  image: Image
+
+  # A type-specific ID likely used as a database ID.
+  internalID: ID!
+  isActive: Boolean!
+  layout: FeatureLayouts!
+  meta: FeatureMeta!
+  name: String!
+
+  # Features are composed of sets, which are themselves composed of items of various types
+  setsConnection(
+    after: String
+    before: String
+    first: Int
+    last: Int
+    sort: OrderedSetSorts
+  ): OrderedSetConnection
+
+  # A slug ID.
+  slug: ID!
+  subheadline(format: Format): String
+}
+
+# An illustrated link chosen to highlight a Gene from a given GeneFamily
+type FeaturedGeneLink {
+  href: String!
+  image: Image
+  internalID: String!
+  title: String!
+}
+
+type FeaturedLink {
+  description(format: Format): String
+  href: String
+
+  # A globally unique ID.
+  id: ID!
+  image: Image
+  initials(length: Int = 3): String
+
+  # A type-specific ID likely used as a database ID.
+  internalID: String
+  subtitle(format: Format): String
+  title: String
+}
+
+enum FeatureLayouts {
+  DEFAULT
+  FULL
+}
+
+# Meta-tag related fields for Features
+type FeatureMeta {
+  description: String!
+  image: String
+  name: String!
+}
+
+type Feedback {
+  # A globally unique ID.
+  id: ID!
+
+  # A type-specific ID likely used as a database ID.
+  internalID: ID!
+
+  # Feedback message
+  message: String!
+}
+
+# A connection to a list of items.
+type FilterArtworksConnection implements ArtworkConnectionInterface & Node {
+  # Returns aggregation counts for the given filter query.
+  aggregations: [ArtworksAggregationResults]
+  counts: FilterArtworksCounts
+
+  # A list of edges.
+  edges: [FilterArtworksEdge]
+  facet: ArtworkFilterFacet
+
+  # Artwork results.
+  hits: [Artwork]
+    @deprecated(reason: "Prefer to use `edges`. [Will be removed in v2]")
+
+  # The ID of the object.
+  id: ID!
+
+  # Returns a list of merchandisable artists sorted by merch score.
+  merchandisableArtists(
+    # The number of artists to return
+    size: Int = 12
+  ): [Artist]
+  pageCursors: PageCursors!
+
+  # Information to aid in pagination.
+  pageInfo: PageInfo!
+}
+
+type FilterArtworksCounts {
+  followedArtists(
+    # Returns a `String` when format is specified. e.g.`'0,0.0000''`
+    format: String
+    label: String
+  ): FormattedNumber
+  total(
+    # Returns a `String` when format is specified. e.g.`'0,0.0000''`
+    format: String
+    label: String
+  ): FormattedNumber
+}
+
+# An edge in a connection.
+type FilterArtworksEdge implements ArtworkEdgeInterface {
+  # A cursor for use in pagination
+  cursor: String!
+
+  # The item at the end of the edge
+  node: Artwork
+}
+
+type FilterSaleArtworksCounts {
+  followedArtists(
+    # Returns a `String` when format is specified. e.g.`'0,0.0000''`
+    format: String
+    label: String
+  ): FormattedNumber
+  total(
+    # Returns a `String` when format is specified. e.g.`'0,0.0000''`
+    format: String
+    label: String
+  ): FormattedNumber
+}
+
+type FollowArtist {
+  artist: Artist
+  auto: Boolean
+
+  # A globally unique ID.
+  id: ID!
+
+  # A type-specific ID likely used as a database ID.
+  internalID: ID!
+}
+
+# A connection to a list of items.
+type FollowArtistConnection {
+  # A list of edges.
+  edges: [FollowArtistEdge]
+
+  # Information to aid in pagination.
+  pageInfo: PageInfo!
+}
+
+type FollowArtistCounts {
+  artists: Int
+}
+
+# An edge in a connection.
+type FollowArtistEdge {
+  # A cursor for use in pagination
+  cursor: String!
+
+  # The item at the end of the edge
+  node: FollowArtist
+}
+
+input FollowArtistInput {
+  artistID: String!
+  clientMutationId: String
+  unfollow: Boolean = false
+}
+
+type FollowArtistPayload {
+  artist: Artist
+  clientMutationId: String
+
+  # Popular artists
+  popularArtists(
+    # Exclude these ids from results, may result in all artists being excluded.
+    excludeArtistIDs: [String]
+
+    # If true, will exclude followed artists for the user
+    excludeFollowedArtists: Boolean
+
+    # Number of results to return
+    size: Int
+  ): [Artist]
+}
+
+type FollowArtists {
+  artists: [Artist]
+  counts: FollowArtistCounts
+}
+
+type FollowedArtistsArtworksGroup implements Node {
+  artists: String
+  artworksConnection(
+    after: String
+    before: String
+    first: Int
+    last: Int
+  ): ArtworkConnection
+  href: String
+
+  # A globally unique ID.
+  id: ID!
+  image: Image
+  publishedAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String
+  summary: String
+}
+
+# A connection to a list of items.
+type FollowedArtistsArtworksGroupConnection {
+  # A list of edges.
+  edges: [FollowedArtistsArtworksGroupEdge]
+
+  # Information to aid in pagination.
+  pageInfo: PageInfo!
+}
+
+# An edge in a connection.
+type FollowedArtistsArtworksGroupEdge {
+  # A cursor for use in pagination
+  cursor: String!
+
+  # The item at the end of the edge
+  node: FollowedArtistsArtworksGroup
+}
+
+type FollowedContent {
+  artists: [Artist]
+  galleries: [Partner]
+}
+
+# A connection to a list of items.
+type FollowedFairConnection {
+  # A list of edges.
+  edges: [FollowedFairEdge]
+
+  # Information to aid in pagination.
+  pageInfo: PageInfo!
+}
+
+# An edge in a connection.
+type FollowedFairEdge {
+  # A cursor for use in pagination
+  cursor: String!
+
+  # The item at the end of the edge
+  node: Fair
+}
+
+# A connection to a list of items.
+type FollowedGalleryConnection {
+  # A list of edges.
+  edges: [FollowedGalleryEdge]
+
+  # Information to aid in pagination.
+  pageInfo: PageInfo!
+}
+
+# An edge in a connection.
+type FollowedGalleryEdge {
+  # A cursor for use in pagination
+  cursor: String!
+
+  # The item at the end of the edge
+  node: Partner
+}
+
+# A connection to a list of items.
+type FollowedShowConnection {
+  # A list of edges.
+  edges: [FollowedShowEdge]
+
+  # Information to aid in pagination.
+  pageInfo: PageInfo!
+}
+
+# An edge in a connection.
+type FollowedShowEdge {
+  # A cursor for use in pagination
+  cursor: String!
+
+  # The item at the end of the edge
+  node: Show
+}
+
+type FollowGene {
+  gene: Gene
+
+  # A globally unique ID.
+  id: ID!
+
+  # A type-specific ID likely used as a database ID.
+  internalID: ID!
+}
+
+# A connection to a list of items.
+type FollowGeneConnection {
+  # A list of edges.
+  edges: [FollowGeneEdge]
+
+  # Information to aid in pagination.
+  pageInfo: PageInfo!
+}
+
+# An edge in a connection.
+type FollowGeneEdge {
+  # A cursor for use in pagination
+  cursor: String!
+
+  # The item at the end of the edge
+  node: FollowGene
+}
+
+input FollowGeneInput {
+  clientMutationId: String
+  geneID: String
+}
+
+type FollowGenePayload {
+  clientMutationId: String
+  gene: Gene
+}
+
+input FollowProfileInput {
+  clientMutationId: String
+  profileID: String
+  unfollow: Boolean = false
+}
+
+type FollowProfilePayload {
+  clientMutationId: String
+  profile: Profile
+}
+
+type FollowsAndSaves {
+  # A Connection of followed artists by current user
+  artistsConnection(
+    after: String
+    before: String
+    fairID: String
+    first: Int
+    last: Int
+  ): FollowArtistConnection
+  artworksConnection(
+    after: String
+    before: String
+    first: Int
+    last: Int
+    private: Boolean = false
+    sort: CollectionSorts
+  ): SavedArtworksConnection
+
+  # A list of published artworks by followed artists (grouped by date and artists).
+  bundledArtworksByArtistConnection(
+    after: String
+    before: String
+    first: Int
+    forSale: Boolean
+    last: Int
+    sort: ArtworkSorts
+  ): FollowedArtistsArtworksGroupConnection
+
+  # A list of the current user’s currently followed fair profiles
+  fairsConnection(
+    after: String
+    before: String
+    first: Int
+    last: Int
+  ): FollowedFairConnection
+
+  # A list of the current user’s currently followed gallery profiles
+  galleriesConnection(
+    after: String
+    before: String
+    first: Int
+    last: Int
+  ): FollowedGalleryConnection
+
+  # A list of the current user’s inquiry requests
+  genesConnection(
+    after: String
+    before: String
+    first: Int
+    last: Int
+  ): FollowGeneConnection
+
+  # A list of the current user’s currently followed shows
+  showsConnection(
+    after: String
+    before: String
+
+    # A string representing one of the supported cities in the City Guide, which
+    # are: new-york-ny-usa, los-angeles-ca-usa, london-united-kingdom,
+    # berlin-germany, paris-france, hong-kong-hong-kong
+    city: String
+
+    # Number of days which will be used to filter upcoming and closing soon shows
+    dayThreshold: Int
+    first: Int
+    last: Int
+    status: EventStatus
+  ): FollowedShowConnection
+}
+
+input FollowShowInput {
+  clientMutationId: String
+  partnerShowID: String
+  unfollow: Boolean = false
+}
+
+type FollowShowPayload {
+  clientMutationId: String
+  show: Show
+}
+
+enum Format {
+  HTML
+  MARKDOWN
+  PLAIN
+}
+
+type FormattedDaySchedules {
+  days: String
+  hours: String
+}
+
+# The `FormattedNumber` type represents a number that can optionally be returnedas
+# a formatted String. It does not try to coerce the type.
+scalar FormattedNumber
+
+# An entry from gemini
+type GeminiEntry {
+  # The token that represents the gemini entry.
+  token: String!
+}
+
+type Gene implements Node & Searchable {
+  artistsConnection(
+    after: String
+    before: String
+    first: Int
+    last: Int
+  ): ArtistConnection
+  cached: Int
+  description: String
+  displayLabel: String
+  displayName: String
+
+  # Artworks Elastic Search results
+  filterArtworksConnection(
+    acquireable: Boolean
+    after: String
+    aggregationPartnerCities: [String]
+    aggregations: [ArtworkAggregation]
+    artistID: String
+    artistIDs: [String]
+    artistSeriesID: String
+    atAuction: Boolean
+    attributionClass: [String]
+    before: String
+    color: String
+    dimensionRange: String
+    excludeArtworkIDs: [String]
+    extraAggregationGeneIDs: [String]
+    first: Int
+    forSale: Boolean
+    geneID: String
+    geneIDs: [String]
+    height: String
+    includeArtworksByFollowedArtists: Boolean
+    includeMediumFilterInAggregation: Boolean
+    inquireableOnly: Boolean
+    keyword: String
+
+    # When true, will only return exact keyword match
+    keywordMatchExact: Boolean
+    last: Int
+    majorPeriods: [String]
+
+    # When true, will only return `marketable` works (not nude or provocative).
+    marketable: Boolean
+
+    # A string from the list of allocations, or * to denote all mediums
+    medium: String
+    offerable: Boolean
+    page: Int
+    partnerCities: [String]
+    partnerID: ID
+    period: String
+    periods: [String]
+    priceRange: String
+    saleID: ID
+    size: Int
+
+    # Filter results by Artwork sizes
+    sizes: [ArtworkSizes]
+    sort: String
+    tagID: String
+    width: String
+  ): FilterArtworksConnection
+  href: String
+
+  # A globally unique ID.
+  id: ID!
+  image: Image
+  imageUrl: String
+
+  # A type-specific ID likely used as a database ID.
+  internalID: ID!
+  isFollowed: Boolean
+  isPublished: Boolean
+  mode: String
+  name: String
+
+  # A list of genes similar to the specified gene
+  similar(
+    after: String
+    before: String
+
+    # Array of gene ids (not slugs) to exclude, may result in all genes being excluded.
+    excludeGeneIDs: [String]
+    first: Int
+    last: Int
+  ): GeneConnection
+
+  # A slug ID.
+  slug: ID!
+  trendingArtists(sample: Int): [Artist]
+}
+
+# A connection to a list of items.
+type GeneConnection {
+  # A list of edges.
+  edges: [GeneEdge]
+
+  # Information to aid in pagination.
+  pageInfo: PageInfo!
+}
+
+# An edge in a connection.
+type GeneEdge {
+  # A cursor for use in pagination
+  cursor: String!
+
+  # The item at the end of the edge
+  node: Gene
+}
+
+# A user-facing thematic grouping of Genes
+type GeneFamily {
+  featuredGeneLinks: [FeaturedGeneLink]
+  genes: [Gene]
+
+  # A globally unique ID.
+  id: ID!
+
+  # A type-specific ID likely used as a database ID.
+  internalID: ID!
+  name: String!
+
+  # A slug ID.
+  slug: ID!
+}
+
+# A connection to a list of items.
+type GeneFamilyConnection {
+  # A list of edges.
+  edges: [GeneFamilyEdge]
+
+  # Information to aid in pagination.
+  pageInfo: PageInfo!
+}
+
+# An edge in a connection.
+type GeneFamilyEdge {
+  # A cursor for use in pagination
+  cursor: String!
+
+  # The item at the end of the edge
+  node: GeneFamily
+}
+
+type GravityMutationError {
+  detail: String
+  error: String
+  message: String
+  type: String
+}
+
+type HighestBid {
+  # A formatted price with various currency formatting options.
+  amount(
+    decimal: String = "."
+
+    # Allows control of symbol position (%v = value, %s = symbol)
+    format: String = "%s%v"
+    precision: Int = 0
+    symbol: String
+    thousand: String = ","
+  ): String
+  cents: Int
+  createdAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String
+  display: String
+
+  # A globally unique ID.
+  id: ID!
+
+  # A type-specific ID likely used as a database ID.
+  internalID: ID!
+  isCancelled: Boolean
+  number: Int
+}
+
+type Highlights {
+  # List of curated genes that are broad collecting. (Meant for e.g. suggestions in on-boarding.)
+  broadCollectingGenes: [Gene]
+
+  # Popular artists
+  popularArtists(
+    # Exclude these ids from results, may result in all artists being excluded.
+    excludeArtistIDs: [String]
+
+    # If true, will exclude followed artists for the user
+    excludeFollowedArtists: Boolean
+
+    # Number of results to return
+    size: Int
+  ): [Artist]
+}
+
+# Autogenerated input type of HoldInventory
+input HoldInventoryInput {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+  expiresInSeconds: Int
+  items: [InventoryHoldItemAttributes!]!
+
+  # Globally unique ID for the requester of this hold. Ex. Exchange Order ID.
+  referenceId: String!
+}
+
+# Autogenerated return type of HoldInventory
+type HoldInventoryPayload {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+  holdOrErrors: InventoryHoldOrErrorsUnion!
+}
+
+type HomePage {
+  # Single artist module to show on the home screen.
+  artistModule(
+    # Module identifier.
+    key: HomePageArtistModuleTypes
+  ): HomePageArtistModule
+
+  # Artist modules to show on the home screen
+  artistModules: [HomePageArtistModule]
+
+  # Single artwork module to show on the home screen
+  artworkModule(
+    # ID of followed artist to target for related artist rails
+    followedArtistID: String
+
+    # ID of generic gene rail to target
+    id: String
+
+    # Module key
+    key: String
+
+    # ID of related artist to target for related artist rails
+    relatedArtistID: String
+  ): HomePageArtworkModule
+
+  # Artwork modules to show on the home screen
+  artworkModules(
+    # Exclude certain modules
+    exclude: [HomePageArtworkModuleTypes] = []
+
+    # Maximum number of followed genes to return, disable with a negative number
+    maxFollowedGeneRails: Int = 1
+
+    # Maximum number of modules to return, disable limit with a negative number
+    maxRails: Int = 8
+
+    # The preferred order of modules, defaults to order returned by Gravity
+    order: [HomePageArtworkModuleTypes]
+  ): [HomePageArtworkModule]
+  fairsModule: HomePageFairsModule
+
+  # A list of enabled hero units to show on the requested platform
+  heroUnits(platform: HomePageHeroUnitPlatform!): [HomePageHeroUnit]
+  marketingCollectionsModule: HomePageMarketingCollectionsModule
+  salesModule: HomePageSalesModule
+}
+
+type HomePageArtistModule implements Node {
+  # A globally unique ID.
+  id: ID!
+
+  # Module identifier.
+  key: String
+  results: [Artist]
+}
+
+enum HomePageArtistModuleTypes {
+  # The most searched for artists.
+  POPULAR
+
+  # Artists recommended for the specific user.
+  SUGGESTED
+
+  # The trending artists.
+  TRENDING
+}
+
+type HomePageArtworkModule implements Node {
+  context: HomePageArtworkModuleContext
+
+  # A globally unique ID.
+  id: ID!
+  isDisplayable: Boolean
+  key: String
+  params: HomePageModulesParams
+  results: [Artwork]
+  title: String
+}
+
+union HomePageArtworkModuleContext =
+    Fair
+  | FollowArtists
+  | Gene
+  | HomePageFollowedArtistArtworkModule
+  | HomePageRelatedArtistArtworkModule
+  | Sale
+  | TrendingArtists
+
+enum HomePageArtworkModuleTypes {
+  ACTIVE_BIDS
+  CURRENT_FAIRS
+  FOLLOWED_ARTIST
+  FOLLOWED_ARTISTS
+  FOLLOWED_GALLERIES
+  FOLLOWED_GENES
+  GENERIC_GENES
+  LIVE_AUCTIONS
+  POPULAR_ARTISTS
+  RECENTLY_VIEWED_WORKS
+  RECOMMENDED_WORKS
+  RELATED_ARTISTS
+  SAVED_WORKS
+  SIMILAR_TO_RECENTLY_VIEWED
+  SIMILAR_TO_SAVED_WORKS
+}
+
+type HomePageFairsModule {
+  results: [Fair]!
+}
+
+type HomePageFollowedArtistArtworkModule {
+  artist: Artist
+}
+
+type HomePageHeroUnit {
+  # The image to show, on desktop this defaults to the wide version.
+  backgroundImageURL(version: HomePageHeroUnitImageVersion): String
+  cached: Int
+  creditLine: String
+  heading: String
+  href: String
+
+  # A globally unique ID.
+  id: ID!
+
+  # A type-specific ID likely used as a database ID.
+  internalID: ID!
+  linkText: String
+  mode: HomePageHeroUnitMode
+
+  # A slug ID.
+  slug: ID!
+  subtitle: String
+  title: String
+  titleImageURL(retina: Boolean): String
+}
+
+enum HomePageHeroUnitImageVersion {
+  NARROW
+  WIDE
+}
+
+enum HomePageHeroUnitMode {
+  CENTERED_DARK
+  CENTERED_LIGHT
+  LEFT_DARK
+  LEFT_LIGHT
+  RIGHT_DARK
+  RIGHT_LIGHT
+}
+
+enum HomePageHeroUnitPlatform {
+  DESKTOP
+  MARTSY
+  MOBILE
+}
+
+type HomePageMarketingCollectionsModule {
+  results: [MarketingCollection]!
+}
+
+type HomePageModulesParams {
+  followedArtistID: ID
+  geneID: String
+
+  # An optional type-specific ID.
+  internalID: ID
+  medium: String
+  priceRange: String
+  relatedArtistID: ID
+}
+
+type HomePageRelatedArtistArtworkModule {
+  artist: Artist
+  basedOn: Artist
+}
+
+type HomePageSalesModule {
+  results: [Sale]!
+}
+
+type IdentityVerification {
+  # A globally unique ID.
+  id: ID!
+
+  # A type-specific ID likely used as a database ID.
+  internalID: ID!
+  invitationExpiresAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String
+
+  # Where the identity verification is in its lifecycle
+  state: String!
+
+  # User ID of the identity verification's owner
+  userID: String!
+}
+
+type Image {
+  aspectRatio: Float!
+  caption: String
+  cropped(height: Int!, version: [String], width: Int!): CroppedImageUrl
+  deepZoom: DeepZoom
+  height: Int
+  href: String
+  imageURL: String
+  imageVersions: [String]
+
+  # An optional type-specific ID.
+  internalID: ID
+  isDefault: Boolean
+  isZoomable: Boolean
+  maxTiledHeight: Int
+  maxTiledWidth: Int
+  orientation: String
+  originalHeight: Int
+  originalWidth: Int
+
+  # Value to use when `padding-bottom` for fluid image placeholders
+  placeholder: String
+  position: Int
+  resized(height: Int, version: [String], width: Int): ResizedImageUrl
+  tileBaseURL: String
+  tileFormat: String
+  tileSize: Int
+  title: String
+  url(version: [String]): String
+  versions: [String]
+  width: Int
+}
+
+type ImageURLs {
+  normalized: String
+}
+
+union InquiryItemType = Artwork | Show
+
+type InquiryQuestion {
+  # A globally unique ID.
+  id: ID!
+
+  # A type-specific ID.
+  internalID: ID!
+  question: String!
+}
+
+input InquiryQuestionInput {
+  details: String
+  questionID: String!
+}
+
+# A request to inquire on an artwork
+type InquiryRequest {
+  # A globally unique ID.
+  id: ID!
+  inquireable: InquiryItemType
+  inquirer: User
+
+  # A type-specific ID likely used as a database ID.
+  internalID: ID!
+  questions: [String]
+  shippingLocation: Location
+}
+
+enum Intents {
+  BUY_ART_AND_DESIGN
+  FIND_ART_EXHIBITS
+  LEARN_ABOUT_ART
+  READ_ART_MARKET_NEWS
+  RESEARCH_ART_PRICES
+  SELL_ART_AND_DESIGN
+}
+
+type InventoryHold {
+  capturedAt: String
+  id: ID!
+  items(
+    # Returns the elements in the list that come after the specified cursor.
+    after: String
+
+    # Returns the elements in the list that come before the specified cursor.
+    before: String
+
+    # Returns the first _n_ elements from the list.
+    first: Int
+
+    # Returns the last _n_ elements from the list.
+    last: Int
+  ): InventoryHoldItemConnection
+  referenceId: String!
+}
+
+type InventoryHoldItem {
+  artworkId: String!
+  editionSetId: String
+  id: ID!
+  quantity: Int!
+}
+
+# Attributes for creating or updating an inventory hold item
+input InventoryHoldItemAttributes {
+  # ID of the artwork
+  artworkId: String!
+
+  # ID of edition set
+  editionSetId: String
+  quantity: Int!
+}
+
+# The connection type for InventoryHoldItem.
+type InventoryHoldItemConnection {
+  # A list of edges.
+  edges: [InventoryHoldItemEdge]
+
+  # A list of nodes.
+  nodes: [InventoryHoldItem]
+
+  # Information to aid in pagination.
+  pageInfo: PageInfo!
+
+  # Total count of matching nodes, before pagination
+  totalCount: Int!
+}
+
+# An edge in a connection.
+type InventoryHoldItemEdge {
+  # A cursor for use in pagination.
+  cursor: String!
+
+  # The item at the end of the edge.
+  node: InventoryHoldItem
+}
+
+# A hold or error object
+union InventoryHoldOrErrorsUnion = Errors | InventoryHold
+
+# A hold or error object
+union InventoryHoldOrErrorUnion = Error | InventoryHold
+
+# Fields of an invoice (currently from Lewitt)
+type Invoice implements Node {
+  # A globally unique ID.
+  id: ID!
+    @deprecated(
+      reason: "Payment Request was deprecated. The type was kept for legacy client support. [Will be removed in v2]"
+    )
+
+  # A type-specific ID likely used as a database ID.
+  internalID: ID!
+    @deprecated(
+      reason: "Payment Request was deprecated. The type was kept for legacy client support. [Will be removed in v2]"
+    )
+
+  # Lewitt's invoice id.
+  lewittInvoiceID: String!
+    @deprecated(
+      reason: "Payment Request was deprecated. The type was kept for legacy client support. [Will be removed in v2]"
+    )
+
+  # Link to public checkout page.
+  paymentURL: String
+    @deprecated(
+      reason: "Payment Request was deprecated. The type was kept for legacy client support. [Will be removed in v2]"
+    )
+
+  # Current state of invoice.
+  state: InvoiceState
+    @deprecated(
+      reason: "Payment Request was deprecated. The type was kept for legacy client support. [Will be removed in v2]"
+    )
+
+  # A formatted price with various currency formatting options.
+  total(
+    decimal: String = "."
+
+    # Allows control of symbol position (%v = value, %s = symbol)
+    format: String = "%s%v"
+    precision: Int = 0
+    symbol: String
+    thousand: String = ","
+  ): String
+    @deprecated(
+      reason: "Payment Request was deprecated. The type was kept for legacy client support. [Will be removed in v2]"
+    )
+}
+
+enum InvoiceState {
+  PAID
+  REFUNDED
+  UNPAID
+  VOID
+}
+
+# An ISO 8601-encoded datetime
+scalar ISO8601DateTime
+
+# Represents untyped JSON
+scalar JSON
+
+type LatLng {
+  lat: Float
+  lng: Float
+}
+
+union ListPrice = Money | PriceRange
+
+type Location {
+  address: String
+  address2: String
+  cached: Int
+  city: String
+  coordinates: LatLng
+  country: String
+  daySchedules: [DaySchedule]
+
+  # Alternate Markdown-supporting free text representation of a location's opening hours
+  dayScheduleText: String
+  display: String
+
+  # A globally unique ID.
+  id: ID!
+
+  # A type-specific ID.
+  internalID: ID!
+
+  # Union returning opening hours in formatted structure or a string
+  openingHours: OpeningHoursUnion
+  phone: String
+  postalCode: String
+  state: String
+  summary: String
+}
+
+# A connection to a list of items.
+type LocationConnection {
+  # A list of edges.
+  edges: [LocationEdge]
+  pageCursors: PageCursors!
+
+  # Information to aid in pagination.
+  pageInfo: PageInfo!
+  totalCount: Int
+}
+
+# An edge in a connection.
+type LocationEdge {
+  # A cursor for use in pagination
+  cursor: String!
+
+  # The item at the end of the edge
+  node: Location
+}
+
+scalar Long
+
+type LotStanding {
+  # Your bid if it is currently winning
+  activeBid: BidderPosition
+  bidder: Bidder
+
+  # You are winning and reserve is met
+  isHighestBidder: Boolean
+
+  # You are the leading bidder without regard to reserve
+  isLeadingBidder: Boolean
+
+  # Your most recent bid—which is not necessarily winning (may be higher or lower)
+  mostRecentBid: BidderPosition
+  sale: Sale
+  saleArtwork: SaleArtwork
+}
+
+# Object representing a collection page
+type MarketingCollection {
+  artworksConnection(
+    acquireable: Boolean
+    after: String
+    aggregationPartnerCities: [String]
+    aggregations: [ArtworkAggregation]
+    artistID: String
+    artistIDs: [String]
+    artistSeriesID: String
+    atAuction: Boolean
+    attributionClass: [String]
+    before: String
+    color: String
+    dimensionRange: String
+    excludeArtworkIDs: [String]
+    extraAggregationGeneIDs: [String]
+    first: Int
+    forSale: Boolean
+    geneID: String
+    geneIDs: [String]
+    height: String
+    includeArtworksByFollowedArtists: Boolean
+    includeMediumFilterInAggregation: Boolean
+    inquireableOnly: Boolean
+    keyword: String
+    keywordMatchExact: Boolean
+    last: Int
+    majorPeriods: [String]
+    marketable: Boolean
+    medium: String
+    offerable: Boolean
+    page: Int
+    partnerCities: [String]
+    partnerID: ID
+    period: String
+    periods: [String]
+    priceRange: String
+    saleID: ID
+    size: Int
+    sizes: [ArtworkSizes]
+    sort: String
+    tagID: String
+    width: String
+  ): FilterArtworksConnection
+
+  # Category of the collection
+  category: String!
+  createdAt: MarketingDateTime!
+
+  # Image credit for the header image
+  credit: String
+
+  # Description of the collection which can include links to other collections
+  description: String
+
+  # Markdown alternate of description field contents.
+  descriptionMarkdown: String
+
+  # IDs of artists that should be excluded from Featured Artists for this collection
+  featuredArtistExclusionIds: [String!]
+
+  # Background image for the header of the collection page
+  headerImage: String
+  id: ID!
+  internalID: ID!
+
+  # Collection has prioritized connection to artist
+  is_featured_artist_content: Boolean!
+    @deprecated(reason: "Prefer isFeaturedArtistContent")
+  isDepartment: Boolean!
+
+  # Collection has prioritized connection to artist
+  isFeaturedArtistContent: Boolean!
+
+  # Set of keywords used for SEO purposes
+  keywords: String!
+
+  # CollectionGroups of this collection
+  linkedCollections: [MarketingCollectionGroup!]!
+
+  # Suggested average price for included works
+  price_guidance: Float @deprecated(reason: "Prefer priceGuidance")
+
+  # Suggested average price for included works
+  priceGuidance: Float
+
+  # Structured object used to build filtered artworks query
+  query: MarketingCollectionQuery!
+  relatedCollections(size: Int = 10): [MarketingCollection!]!
+
+  # Collection can be surfaced on editorial pages
+  show_on_editorial: Boolean! @deprecated(reason: "Prefer showOnEditorial")
+
+  # Collection can be surfaced on editorial pages
+  showOnEditorial: Boolean!
+
+  # slug version of title, used for pretty URLs (e.g. `kaws-prints` for Kaws Prints
+  slug: String!
+
+  # URL for Thumbnail image to be used when this collection is displayed.
+  thumbnail: String
+
+  # Name of the collection
+  title: String!
+  updatedAt: MarketingDateTime!
+}
+
+type MarketingCollectionCategory {
+  collections: [MarketingCollection!]!
+  name: String!
+}
+
+type MarketingCollectionGroup {
+  groupType: MarketingGroupTypes!
+  internalID: ID
+  members: [MarketingCollection!]!
+  name: String!
+}
+
+type MarketingCollectionQuery {
+  acquireable: Boolean
+  aggregations: [String!]
+  artist_id: String @deprecated(reason: "Prefer artistID")
+  artist_ids: [String!] @deprecated(reason: "Prefer artistIDs")
+  artistID: String
+  artistIDs: [String!]
+  at_auction: Boolean @deprecated(reason: "Prefer atAuction")
+  atAuction: Boolean
+  color: String
+  dimension_range: String @deprecated(reason: "Prefer dimensionRange")
+  dimensionRange: String
+  extra_aggregation_gene_ids: [String!]
+    @deprecated(reason: "prefer extraAggregationGeneIDs")
+  extraAggregationGeneIDs: [String!]
+  for_sale: Boolean @deprecated(reason: "Prefer forSale")
+  forSale: Boolean
+  gene_id: String @deprecated(reason: "Prefer geneID")
+  gene_ids: [String!] @deprecated(reason: "Prefer geneIDs")
+  geneID: String
+  geneIDs: [String!]
+  height: String
+  id: ID
+  include_artworks_by_followed_artists: Boolean
+    @deprecated(reason: "Prefer includeArtworksByFollowedArtists")
+  include_medium_filter_in_aggregation: Boolean
+    @deprecated(reason: "Prefer includeMediumFilterInAggregation")
+  includeArtworksByFollowedArtists: Boolean
+  includeMediumFilterInAggregation: Boolean
+  inquireable_only: Boolean @deprecated(reason: "Prefer inquireableOnly")
+  inquireableOnly: Boolean
+  internalID: ID
+  keyword: String
+  major_periods: [String!] @deprecated(reason: "Prefer majorPeriods")
+  majorPeriods: [String!]
+  medium: String
+  page: Int
+  partner_cities: [String!] @deprecated(reason: "Prefer partnerCities")
+  partner_id: ID @deprecated(reason: "Prefer partnerID")
+  partnerCities: [String!]
+  partnerID: ID
+  period: String
+  periods: [String!]
+  price_range: String @deprecated(reason: "Prefer priceRange")
+  priceRange: String
+  sale_id: ID @deprecated(reason: "Prefer saleID")
+  saleID: ID
+  size: Int
+  sort: String
+  tag_id: String @deprecated(reason: "Prefer tagID")
+  tagID: String
+  width: String
+}
+
+scalar MarketingDateTime
+
+# Available types of CollectionGroup
+enum MarketingGroupTypes {
+  ArtistSeries
+  FeaturedCollections
+  OtherCollections
+}
+
+# Market Price Insights
+type MarketPriceInsights {
+  annualLotsSold: Int
+  annualValueSoldCents: BigInt
+  artistId: ID
+  artistName: String
+  artsyQInventory: Int
+  createdAt: ISO8601DateTime
+  demandRank: Float
+  demandTrend: Float
+  highRangeCents: BigInt
+  largeHighRangeCents: BigInt
+  largeLowRangeCents: BigInt
+  largeMidRangeCents: BigInt
+  liquidityRank: Float
+  lowRangeCents: BigInt
+  medianSaleToEstimateRatio: Float
+  medium: String
+  mediumHighRangeCents: BigInt
+  mediumLowRangeCents: BigInt
+  mediumMidRangeCents: BigInt
+  midRangeCents: BigInt
+  sellThroughRate: Float
+  smallHighRangeCents: BigInt
+  smallLowRangeCents: BigInt
+  smallMidRangeCents: BigInt
+  updatedAt: ISO8601DateTime
+}
+
+type Me implements Node {
+  # A list of the current user’s inquiry requests
+  artworkInquiriesConnection(
+    after: String
+    before: String
+    first: Int
+    last: Int
+  ): ArtworkInquiryConnection
+  auctionsLotStandingConnection(
+    after: String
+    before: String
+    first: Int
+    last: Int
+  ): AuctionsLotStandingConnection!
+
+  # Returns a single bidder position
+  bidderPosition(id: String!): BidderPositionResult
+
+  # A list of the current user's bidder positions
+  bidderPositions(
+    # Only the bidder positions on a specific artwork
+    artworkID: String
+
+    # Only the most recent bidder positions per artwork.
+    current: Boolean
+
+    # Only the bidder positions for a specific auction
+    saleID: String
+  ): [BidderPosition]
+
+  # A list of the current user’s bidder registrations
+  bidders(
+    # Limit results to bidders in active auctions
+    active: Boolean
+
+    # The slug or ID of a Sale
+    saleID: String
+  ): [Bidder]
+
+  # The current user's status relating to bids on artworks
+  bidderStatus(artworkID: String!, saleID: String!): LotStanding
+
+  # Whether user is allowed to request email confirmation
+  canRequestEmailConfirmation: Boolean!
+
+  # A collector profile.
+  collectorProfile: CollectorProfileType
+
+  # A conversation, usually between a user and a partner
+  conversation(
+    # The ID of the Conversation
+    id: String!
+  ): Conversation
+
+  # Conversations, usually between a user and partner.
+  conversationsConnection(
+    after: String
+    before: String
+    first: Int
+    last: Int
+  ): ConversationConnection
+  createdAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String
+
+  # A list of the current user’s credit cards
+  creditCards(
+    after: String
+    before: String
+    first: Int
+    last: Int
+  ): CreditCardConnection
+  email: String
+  followsAndSaves: FollowsAndSaves
+  hasCreditCards: Boolean
+  hasPassword: Boolean!
+  hasQualifiedCreditCards: Boolean
+  hasSecondFactorEnabled: Boolean!
+
+  # A globally unique ID.
+  id: ID!
+
+  # An identity verification that the user has access to
+  identityVerification(
+    # ID of the IdentityVerification
+    id: String!
+  ): IdentityVerification
+  identityVerified: Boolean
+  initials(length: Int = 3): String
+
+  # A type-specific ID.
+  internalID: ID!
+
+  # An invoice
+  invoice(
+    # The ID of the Conversation
+    conversationId: String!
+
+    # The ID of the invoice
+    invoiceId: String!
+  ): Invoice
+    @deprecated(
+      reason: "Payment Request was deprecated. The field was kept for legacy client support. [Will be removed in v2]"
+    )
+
+  # List of lab features for this user
+  labFeatures: [String!]!
+
+  # Sale Artworks search results
+  lotsByFollowedArtistsConnection(
+    after: String
+
+    # Please make sure to supply the TOTAL aggregation if you will be setting any aggregations
+    aggregations: [SaleArtworkAggregation]
+    artistIDs: [String]
+    before: String
+    estimateRange: String
+    first: Int
+    geneIDs: [String]
+
+    # When called under the Me field, this defaults to true. Otherwise it defaults to false
+    includeArtworksByFollowedArtists: Boolean
+    isAuction: Boolean
+    last: Int
+    liveSale: Boolean
+    page: Int
+    saleID: ID
+    size: Int
+    sort: String
+  ): SaleArtworksConnection
+
+  # The current user's status relating to bids on artworks
+  lotStanding(
+    artworkID: String
+    saleArtworkID: String
+    saleID: String
+  ): LotStanding
+
+  # A list of the current user's auction standings for given lots
+  lotStandings(
+    # Only includes lots on which you have a leading bidder position.
+    activePositions: Boolean
+
+    # Only the lot standings on a specific artwork
+    artworkID: String
+
+    # Only the lot standings for currently open or closed auctions.
+    live: Boolean
+    saleArtworkID: String
+
+    # Only the lot standings for a specific auction
+    saleID: String
+  ): [LotStanding]
+  myCollectionConnection(
+    after: String
+    before: String
+    first: Int
+    last: Int
+    sort: MyCollectionArtworkSorts
+  ): MyCollectionConnection
+  name: String
+  orders(
+    after: String
+    before: String
+    first: Int
+    last: Int
+    mode: CommerceOrderModeEnum
+    sellerId: String
+    sort: CommerceOrderConnectionSortEnum
+    states: [CommerceOrderStateEnum!]
+  ): CommerceOrderConnectionWithTotalCount
+  paddleNumber: String
+
+  # The user's most current pending identity verification, if it exists
+  pendingIdentityVerification: IdentityVerification
+  phone: String
+
+  # This user should receive lot opening notifications
+  receiveLotOpeningSoonNotification: Boolean
+
+  # This user should receive new sales notifications
+  receiveNewSalesNotification: Boolean
+
+  # This user should receive new works notifications
+  receiveNewWorksNotification: Boolean
+
+  # This user should receive outbid notifications
+  receiveOutbidNotification: Boolean
+
+  # This user should receive promotional notifications
+  receivePromotionNotification: Boolean
+
+  # This user should receive purchase notifications
+  receivePurchaseNotification: Boolean
+
+  # This user should receive sale opening/closing notifications
+  receiveSaleOpeningClosingNotification: Boolean
+  recentlyViewedArtworkIds: [String]!
+
+  # A list of the current user’s recently viewed artworks.
+  recentlyViewedArtworksConnection(
+    after: String
+    before: String
+    first: Int
+    last: Int
+  ): ArtworkConnection
+  secondFactors(kinds: [SecondFactorKind]): [SecondFactor]
+  type: String
+
+  # The count of conversations with unread messages.
+  unreadConversationCount: Int!
+
+  # A count of unread notifications.
+  unreadNotificationsCount: Int!
+}
+
+# A message in a conversation.
+type Message implements Node {
+  attachments: [Attachment]
+
+  # Unaltered text if possible, otherwise `body`: a parsed/sanitized version from Sendgrid.
+  body: String
+  createdAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String
+  deliveries: [Delivery]
+  from: MessageInitiator
+
+  # A globally unique ID.
+  id: ID!
+
+  # Impulse message id.
+  impulseID: String! @deprecated(reason: "Prefer internalID")
+
+  # A type-specific ID likely used as a database ID.
+  internalID: ID!
+  invoice: Invoice
+    @deprecated(
+      reason: "Payment Request was deprecated. The field was kept for legacy client support. [Will be removed in v2]"
+    )
+
+  # True if message is the first in the conversation.
+  isFirstMessage: Boolean
+
+  # True if message is from the user to the partner.
+  isFromUser: Boolean
+
+  # True if message is an invoice message
+  isInvoice: Boolean
+    @deprecated(
+      reason: "Payment Request was deprecated. The field was kept for legacy client support. [Will be removed in v2]"
+    )
+}
+
+# A connection to a list of items.
+type MessageConnection {
+  # A list of edges.
+  edges: [MessageEdge]
+
+  # Information to aid in pagination.
+  pageInfo: PageInfo!
+  totalCount: Int
+}
+
+# An edge in a connection.
+type MessageEdge {
+  # A cursor for use in pagination
+  cursor: String!
+
+  # The item at the end of the edge
+  node: Message
+}
+
+# The participant who sent the message.
+type MessageInitiator {
+  email: String
+  name: String
+}
+
+type MetaphysicsService {
+  environment: String!
+  heapDumps: Boolean!
+  queryTracing: Boolean!
+  stitching: Boolean!
+  stitchingConvection: Boolean!
+  stitchingExchange: Boolean!
+  stitchingGravity: Boolean!
+  stitchingKaws: Boolean!
+}
+
+type Money {
+  # The ISO-4217 alphabetic currency code, as per https://en.wikipedia.org/wiki/ISO_4217
+  currencyCode: String!
+
+  # A pre-formatted price.
+  display: String
+
+  # An amount of money expressed in major units (like dollars).
+  major(
+    # ISO-4217 code of a destination currency for conversion
+    convertTo: String
+  ): Float!
+
+  # An amount of money expressed in minor units (like cents).
+  minor: Int!
+}
+
+# A money object with amount in minor currency and a currency code, or an error object
+union MoneyOrErrorUnion = Error
+
+type Mutation {
+  addAssetToConsignmentSubmission(
+    input: AddAssetToConsignmentSubmissionInput!
+  ): AddAssetToConsignmentSubmissionPayload
+  captureHold(input: CaptureHoldInput!): CaptureHoldPayload
+  commerceAddInitialOfferToOrder(
+    input: CommerceAddInitialOfferToOrderInput!
+  ): CommerceAddInitialOfferToOrderPayload
+  commerceApproveOrder(
+    input: CommerceApproveOrderInput!
+  ): CommerceApproveOrderPayload
+  commerceBuyerAcceptOffer(
+    input: CommerceBuyerAcceptOfferInput!
+  ): CommerceBuyerAcceptOfferPayload
+  commerceBuyerCounterOffer(
+    input: CommerceBuyerCounterOfferInput!
+  ): CommerceBuyerCounterOfferPayload
+  commerceBuyerRejectOffer(
+    input: CommerceBuyerRejectOfferInput!
+  ): CommerceBuyerRejectOfferPayload
+  commerceConfirmFulfillment(
+    input: CommerceConfirmFulfillmentInput!
+  ): CommerceConfirmFulfillmentPayload
+  commerceConfirmPickup(
+    input: CommerceConfirmPickupInput!
+  ): CommerceConfirmPickupPayload
+  commerceCreateOfferOrderWithArtwork(
+    input: CommerceCreateOfferOrderWithArtworkInput!
+  ): CommerceCreateOfferOrderWithArtworkPayload
+  commerceCreateOrderWithArtwork(
+    input: CommerceCreateOrderWithArtworkInput!
+  ): CommerceCreateOrderWithArtworkPayload
+  commerceFixFailedPayment(
+    input: CommerceFixFailedPaymentInput!
+  ): CommerceFixFailedPaymentPayload
+
+  # Fulfill an order with one Fulfillment, it sets this fulfillment to each line item in order
+  commerceFulfillAtOnce(
+    input: CommerceFulfillAtOnceInput!
+  ): CommerceFulfillAtOncePayload
+  commerceRejectOrder(
+    input: CommerceRejectOrderInput!
+  ): CommerceRejectOrderPayload
+  commerceSellerAcceptOffer(
+    input: CommerceSellerAcceptOfferInput!
+  ): CommerceSellerAcceptOfferPayload
+  commerceSellerCounterOffer(
+    input: CommerceSellerCounterOfferInput!
+  ): CommerceSellerCounterOfferPayload
+  commerceSellerRejectOffer(
+    input: CommerceSellerRejectOfferInput!
+  ): CommerceSellerRejectOfferPayload
+  commerceSetPayment(input: CommerceSetPaymentInput!): CommerceSetPaymentPayload
+  commerceSetShipping(
+    input: CommerceSetShippingInput!
+  ): CommerceSetShippingPayload
+  commerceSubmitOrder(
+    input: CommerceSubmitOrderInput!
+  ): CommerceSubmitOrderPayload
+  commerceSubmitOrderWithOffer(
+    input: CommerceSubmitOrderWithOfferInput!
+  ): CommerceSubmitOrderWithOfferPayload
+  commerceSubmitPendingOffer(
+    input: CommerceSubmitPendingOfferInput!
+  ): CommerceSubmitPendingOfferPayload
+  confirmPassword(input: ConfirmPasswordInput!): ConfirmPasswordPayload
+
+  # Create an account request
+  createAccountRequest(
+    input: CreateAccountRequestMutationInput!
+  ): CreateAccountRequestMutationPayload
+  createAppSecondFactor(
+    input: CreateAppSecondFactorInput!
+  ): CreateAppSecondFactorPayload
+  createBackupSecondFactors(
+    input: CreateBackupSecondFactorsInput!
+  ): CreateBackupSecondFactorsPayload
+
+  # Create a bidder
+  createBidder(input: CreateBidderInput!): CreateBidderPayload
+
+  # Creates a bidder position
+  createBidderPosition(input: BidderPositionInput!): BidderPositionPayload
+  createConsignmentOffer(
+    input: CreateOfferMutationInput!
+  ): CreateOfferMutationPayload
+  createConsignmentSubmission(
+    input: CreateSubmissionMutationInput!
+  ): CreateSubmissionMutationPayload
+
+  # Create a credit card
+  createCreditCard(input: CreditCardInput!): CreditCardPayload
+
+  # Attach an gemini asset to a consignment submission
+  createGeminiEntryForAsset(
+    input: CreateGeminiEntryForAssetInput!
+  ): CreateGeminiEntryForAssetPayload
+  createImage(input: CreateImageInput!): CreateImagePayload
+  createSmsSecondFactor(
+    input: CreateSmsSecondFactorInput!
+  ): CreateSmsSecondFactorPayload
+  createViewingRoom(input: CreateViewingRoomInput!): CreateViewingRoomPayload
+
+  # Remove a credit card
+  deleteCreditCard(input: DeleteCreditCardInput!): DeleteCreditCardPayload
+  deleteViewingRoom(input: DeleteViewingRoomInput!): DeleteViewingRoomPayload
+  deliverSecondFactor(
+    input: DeliverSecondFactorInput!
+  ): DeliverSecondFactorPayload
+  disableSecondFactor(
+    input: DisableSecondFactorInput!
+  ): DisableSecondFactorPayload
+  enableSecondFactor(input: EnableSecondFactorInput!): EnableSecondFactorPayload
+
+  # Mark sale as ended.
+  endSale(input: EndSaleInput!): EndSalePayload
+
+  # Follow (or unfollow) an artist
+  followArtist(input: FollowArtistInput!): FollowArtistPayload
+
+  # Follow (or unfollow) an gene
+  followGene(input: FollowGeneInput!): FollowGenePayload
+
+  # Follow (or unfollow) a profile
+  followProfile(input: FollowProfileInput!): FollowProfilePayload
+
+  # Follow (or unfollow) a show
+  followShow(input: FollowShowInput!): FollowShowPayload
+  holdInventory(input: HoldInventoryInput!): HoldInventoryPayload
+
+  # Create an artwork in my collection
+  myCollectionCreateArtwork(
+    input: MyCollectionCreateArtworkInput!
+  ): MyCollectionCreateArtworkPayload
+
+  # Deletes an artwork from my collection
+  myCollectionDeleteArtwork(
+    input: MyCollectionDeleteArtworkInput!
+  ): MyCollectionDeleteArtworkPayload
+
+  # Update an artwork in my collection
+  myCollectionUpdateArtwork(
+    input: MyCollectionUpdateArtworkInput!
+  ): MyCollectionUpdateArtworkPayload
+  publishViewingRoom(input: PublishViewingRoomInput!): PublishViewingRoomPayload
+  recordArtworkView(input: RecordArtworkViewInput!): RecordArtworkViewPayload
+  requestConditionReport(
+    input: RequestConditionReportInput!
+  ): RequestConditionReportPayload
+
+  # Attach an gemini asset to a consignment submission
+  requestCredentialsForAssetUpload(
+    input: RequestCredentialsForAssetUploadInput!
+  ): RequestCredentialsForAssetUploadPayload
+
+  # Save (or remove) an artwork to (from) a users default collection.
+  saveArtwork(input: SaveArtworkInput!): SaveArtworkPayload
+
+  # Send a confirmation email
+  sendConfirmationEmail(
+    input: SendConfirmationEmailMutationInput!
+  ): SendConfirmationEmailMutationPayload
+
+  # Appending a message to a conversation thread
+  sendConversationMessage(
+    input: SendConversationMessageMutationInput!
+  ): SendConversationMessageMutationPayload
+
+  # Send a feedback message
+  sendFeedback(input: SendFeedbackMutationInput!): SendFeedbackMutationPayload
+
+  # Start an identity verification flow for a pending identity verification
+  startIdentityVerification(
+    input: startIdentityVerificationMutationInput!
+  ): startIdentityVerificationMutationPayload
+
+  # Create an artwork inquiry request
+  submitInquiryRequestMutation(
+    input: SubmitInquiryRequestMutationInput!
+  ): SubmitInquiryRequestMutationPayload
+  unpublishViewingRoom(
+    input: UnpublishViewingRoomInput!
+  ): UnpublishViewingRoomPayload
+  updateAppSecondFactor(
+    input: UpdateAppSecondFactorInput!
+  ): UpdateAppSecondFactorPayload
+
+  # Updating a collector profile (loyalty applicant status).
+  updateCollectorProfile(
+    input: UpdateCollectorProfileInput!
+  ): UpdateCollectorProfilePayload
+  updateConsignmentSubmission(
+    input: UpdateSubmissionMutationInput!
+  ): UpdateSubmissionMutationPayload
+
+  # Update a conversation.
+  updateConversation(
+    input: UpdateConversationMutationInput!
+  ): UpdateConversationMutationPayload
+
+  # Update the current logged in user.
+  updateMyUserProfile(input: UpdateMyProfileInput!): UpdateMyProfilePayload
+  updateSmsSecondFactor(
+    input: UpdateSmsSecondFactorInput!
+  ): UpdateSmsSecondFactorPayload
+  updateViewingRoom(input: UpdateViewingRoomInput!): UpdateViewingRoomPayload
+  updateViewingRoomArtworks(
+    input: UpdateViewingRoomArtworksInput!
+  ): UpdateViewingRoomArtworksPayload
+  updateViewingRoomSubsections(
+    input: UpdateViewingRoomSubsectionsInput!
+  ): UpdateViewingRoomSubsectionsPayload
+}
+
+type MyCollectionArtworkMutationDeleteSuccess {
+  success: Boolean
+}
+
+type MyCollectionArtworkMutationFailure {
+  mutationError: GravityMutationError
+}
+
+type MyCollectionArtworkMutationSuccess {
+  artwork: Artwork
+  artworkEdge: MyCollectionEdge
+}
+
+union MyCollectionArtworkMutationType =
+    MyCollectionArtworkMutationDeleteSuccess
+  | MyCollectionArtworkMutationFailure
+  | MyCollectionArtworkMutationSuccess
+
+enum MyCollectionArtworkSorts {
+  CREATED_AT_ASC
+  CREATED_AT_DESC
+  POSITION_ASC
+  POSITION_DESC
+}
+
+# A connection to a list of items.
+type MyCollectionConnection {
+  default: Boolean!
+  description: String!
+
+  # A list of edges.
+  edges: [MyCollectionEdge]
+  name: String!
+  pageCursors: PageCursors!
+
+  # Information to aid in pagination.
+  pageInfo: PageInfo!
+  private: Boolean!
+  totalCount: Int
+}
+
+input MyCollectionCreateArtworkInput {
+  artistIds: [String]!
+  category: String
+  clientMutationId: String
+  costCurrencyCode: String
+  costMinor: Int
+  date: String
+  depth: String
+  editionNumber: String
+  editionSize: String
+  externalImageUrls: [String]
+  height: String
+  medium: String!
+  metric: String
+  title: String
+  width: String
+}
+
+type MyCollectionCreateArtworkPayload {
+  artworkOrError: MyCollectionArtworkMutationType
+  clientMutationId: String
+}
+
+input MyCollectionDeleteArtworkInput {
+  artworkId: String!
+  clientMutationId: String
+}
+
+type MyCollectionDeleteArtworkPayload {
+  artworkOrError: MyCollectionArtworkMutationType
+  clientMutationId: String
+}
+
+# An edge in a connection.
+type MyCollectionEdge {
+  # A cursor for use in pagination
+  cursor: String!
+
+  # The item at the end of the edge
+  node: Artwork
+}
+
+input MyCollectionUpdateArtworkInput {
+  artistIds: [String]
+  artworkId: String!
+  category: String
+  clientMutationId: String
+  costCurrencyCode: String
+  costMinor: Int
+  date: String
+  depth: String
+  editionNumber: String
+  editionSize: String
+  externalImageUrls: [String]
+  height: String
+  medium: String
+  metric: String
+  title: String
+  width: String
+}
+
+type MyCollectionUpdateArtworkPayload {
+  artworkOrError: MyCollectionArtworkMutationType
+  clientMutationId: String
+}
+
+input Near {
+  lat: Float!
+  lng: Float!
+  maxDistance: Float
+}
+
+# An object with a Globally Unique ID
+interface Node {
+  # A globally unique ID.
+  id: ID!
+}
+
+type OpeningHoursArray {
+  schedules: [FormattedDaySchedules]
+}
+
+type OpeningHoursText {
+  text: String
+}
+
+union OpeningHoursUnion = OpeningHoursArray | OpeningHoursText
+
+type OrderedSet {
+  cached: Int
+  description(format: Format): String
+
+  # A globally unique ID.
+  id: ID!
+
+  # A type-specific ID.
+  internalID: ID!
+  items: [OrderedSetItem]
+
+  # Returns a connection of the items. Only Artwork supported right now.
+  itemsConnection(
+    after: String
+    before: String
+    first: Int
+    last: Int
+  ): ArtworkConnection
+    @deprecated(reason: "Utilize `orderedItemsConnection` for union type")
+  itemType: String
+  key: String
+  layout: OrderedSetLayouts!
+  name: String
+  orderedItemsConnection(
+    after: String
+    before: String
+    first: Int
+    last: Int
+  ): OrderedSetItemConnection!
+}
+
+# A connection to a list of items.
+type OrderedSetConnection {
+  # A list of edges.
+  edges: [OrderedSetEdge]
+  pageCursors: PageCursors!
+
+  # Information to aid in pagination.
+  pageInfo: PageInfo!
+  totalCount: Int
+}
+
+# An edge in a connection.
+type OrderedSetEdge {
+  # A cursor for use in pagination
+  cursor: String!
+
+  # The item at the end of the edge
+  node: OrderedSet
+}
+
+union OrderedSetItem = Artist | Artwork | FeaturedLink | Gene | Sale | Show
+
+# A connection to a list of items.
+type OrderedSetItemConnection {
+  # A list of edges.
+  edges: [OrderedSetItemEdge]
+  pageCursors: PageCursors!
+
+  # Information to aid in pagination.
+  pageInfo: PageInfo!
+  totalCount: Int
+}
+
+# An edge in a connection.
+type OrderedSetItemEdge {
+  # A cursor for use in pagination
+  cursor: String!
+
+  # The item at the end of the edge
+  node: OrderedSetItem
+}
+
+enum OrderedSetLayouts {
+  DEFAULT
+  FULL
+}
+
+enum OrderedSetSorts {
+  CREATED_AT_ASC
+  CREATED_AT_DESC
+  ID_ASC
+  ID_DESC
+  INTERNAL_NAME_ASC
+  INTERNAL_NAME_DESC
+  ITEM_TYPE_ASC
+  ITEM_TYPE_DESC
+  KEY_ASC
+  KEY_DESC
+  NAME_ASC
+  NAME_DESC
+  OWNER_ID_ASC
+  OWNER_ID_DESC
+  OWNER_TYPE_ASC
+  OWNER_TYPE_DESC
+}
+
+union OrderParty = Partner | User
+
+type organizer {
+  # A globally unique ID.
+  id: ID!
+
+  # A type-specific ID likely used as a database ID.
+  internalID: ID!
+  profile: Profile
+  profileID: ID
+
+  # A slug ID.
+  slug: ID!
+  website: String
+}
+
+type PageCursor {
+  # first cursor on the page
+  cursor: String!
+
+  # is this the current page?
+  isCurrent: Boolean!
+
+  # page number out of totalPages
+  page: Int!
+}
+
+type PageCursors {
+  around: [PageCursor!]!
+
+  # optional, may be included in field around
+  first: PageCursor
+
+  # optional, may be included in field around
+  last: PageCursor
+  previous: PageCursor
+}
+
+# Information about pagination in a connection.
+type PageInfo {
+  # When paginating forwards, the cursor to continue.
+  endCursor: String
+
+  # When paginating forwards, are there more items?
+  hasNextPage: Boolean!
+
+  # When paginating backwards, are there more items?
+  hasPreviousPage: Boolean!
+
+  # When paginating backwards, the cursor to continue.
+  startCursor: String
+}
+
+type Partner implements Node {
+  analytics: AnalyticsPartnerStats
+
+  # A connection of artists at a partner.
+  artistsConnection(
+    after: String
+    before: String
+    first: Int
+    last: Int
+    representedBy: Boolean
+    sort: ArtistSorts
+  ): ArtistPartnerConnection
+
+  # A connection of artworks from a Partner.
+  artworksConnection(
+    after: String
+    before: String
+    exclude: [String]
+    first: Int
+    forSale: Boolean
+    last: Int
+    sort: ArtworkSorts
+  ): ArtworkConnection
+  cached: Int
+  categories: [PartnerCategory]
+
+  # A list of the partners unique city locations
+  cities(size: Int = 25): [String]
+  collectingInstitution: String
+  counts: PartnerCounts
+  defaultProfileID: String
+  hasFairPartnership: Boolean
+  href: String
+
+  # A globally unique ID.
+  id: ID!
+  initials(length: Int = 3): String
+
+  # A type-specific ID likely used as a database ID.
+  internalID: ID!
+  isDefaultProfilePublic: Boolean
+  isLinkable: Boolean
+  isPreQualify: Boolean
+
+  # Indicates the partner is a trusted seller on Artsy
+  isVerifiedSeller: Boolean
+
+  # This field is deprecated and is being used in Eigen release predating the 6.0 release
+  locations(size: Int = 25): [Location]
+    @deprecated(
+      reason: "Prefer to use `locationsConnection`. [Will be removed in v2]"
+    )
+
+  # A connection of locations from a Partner.
+  locationsConnection(
+    after: String
+    before: String
+    first: Int
+    last: Int
+  ): LocationConnection
+  name: String
+  profile: Profile
+
+  # A connection of shows from a Partner.
+  showsConnection(
+    after: String
+    before: String
+
+    # Only used when status is CLOSING_SOON or UPCOMING. Number of days used to filter upcoming and closing soon shows
+    dayThreshold: Int
+    first: Int
+    last: Int
+    sort: ShowSorts
+
+    # Filter shows by chronological event status
+    status: EventStatus
+  ): ShowConnection
+
+  # A slug ID.
+  slug: ID!
+  type: String
+  viewingRoomsConnection(
+    after: String
+    first: Int
+    published: Boolean = true
+    statuses: [ViewingRoomStatusEnum!]
+  ): ViewingRoomsConnection
+
+  # The gallery partner's web address
+  website: String
+}
+
+type PartnerArtist {
+  artist: Artist
+  biography: String
+  counts: PartnerArtistCounts
+
+  # A globally unique ID.
+  id: ID!
+
+  # A type-specific ID.
+  internalID: ID!
+  isDisplayOnPartnerProfile: Boolean
+  isUseDefaultBiography: Boolean
+  partner: Partner
+  representedBy: Boolean
+  sortableID: String
+}
+
+# A connection to a list of items.
+type PartnerArtistConnection {
+  # A list of edges.
+  edges: [PartnerArtistEdge]
+
+  # Information to aid in pagination.
+  pageInfo: PageInfo!
+}
+
+type PartnerArtistCounts {
+  artworks(
+    # Returns a `String` when format is specified. e.g.`'0,0.0000''`
+    format: String
+    label: String
+  ): FormattedNumber
+  forSaleArtworks(
+    # Returns a `String` when format is specified. e.g.`'0,0.0000''`
+    format: String
+    label: String
+  ): FormattedNumber
+}
+
+# An edge in a connection.
+type PartnerArtistEdge {
+  artist: Artist
+  biography: String
+  counts: PartnerArtistCounts
+
+  # A cursor for use in pagination
+  cursor: String!
+
+  # A globally unique ID.
+  id: ID!
+
+  # A type-specific ID.
+  internalID: ID!
+  isDisplayOnPartnerProfile: Boolean
+  isUseDefaultBiography: Boolean
+
+  # The item at the end of the edge
+  node: Partner
+  partner: Partner
+  representedBy: Boolean
+  sortableID: String
+}
+
+type PartnerArtworkGrid implements ArtworkContextGrid {
+  artworksConnection(
+    after: String
+    before: String
+    first: Int
+    last: Int
+  ): ArtworkConnection
+  ctaHref: String
+  ctaTitle: String
+  title: String
+}
+
+type PartnerCategory {
+  cached: Int
+  categoryType: PartnerCategoryType
+
+  # A globally unique ID.
+  id: ID!
+  internal: Boolean
+
+  # A type-specific ID likely used as a database ID.
+  internalID: ID!
+  name: String
+  partners(
+    defaultProfilePublic: Boolean
+    eligibleForCarousel: Boolean
+
+    # Indicates an active subscription
+    eligibleForListing: Boolean
+
+    # Indicates tier 1/2 for gallery, 1 for institution
+    eligibleForPrimaryBucket: Boolean
+
+    # Indicates tier 3/4 for gallery, 2 for institution
+    eligibleForSecondaryBucket: Boolean
+    hasFullProfile: Boolean
+    ids: [String]
+
+    # Coordinates to find partners closest to
+    near: String
+    page: Int
+
+    #
+    #         Only return partners of the specified partner categories.
+    #         Accepts list of slugs.
+    #
+    partnerCategories: [String]
+    size: Int
+    sort: PartnersSortType
+
+    # term used for searching Partners
+    term: String
+    type: [PartnerClassification]
+  ): [Partner]
+
+  # A slug ID.
+  slug: ID!
+}
+
+enum PartnerCategoryType {
+  GALLERY
+  INSTITUTION
+}
+
+enum PartnerClassification {
+  AUCTION
+  BRAND
+  DEMO
+  GALLERY
+  INSTITUTION
+  INSTITUTIONAL_SELLER
+  PRIVATE_COLLECTOR
+  PRIVATE_DEALER
+}
+
+# A connection to a list of items.
+type PartnerConnection {
+  # A list of edges.
+  edges: [PartnerEdge]
+  pageCursors: PageCursors!
+
+  # Information to aid in pagination.
+  pageInfo: PageInfo!
+  totalCount: Int
+}
+
+type PartnerCounts {
+  artistDocuments(
+    # Returns a `String` when format is specified. e.g.`'0,0.0000''`
+    format: String
+    label: String
+  ): FormattedNumber
+  artists(
+    # Returns a `String` when format is specified. e.g.`'0,0.0000''`
+    format: String
+    label: String
+  ): FormattedNumber
+  artworks(
+    # Returns a `String` when format is specified. e.g.`'0,0.0000''`
+    format: String
+    label: String
+  ): FormattedNumber
+  currentDisplayableShows(
+    # Returns a `String` when format is specified. e.g.`'0,0.0000''`
+    format: String
+    label: String
+  ): FormattedNumber
+  displayableShows(
+    # Returns a `String` when format is specified. e.g.`'0,0.0000''`
+    format: String
+    label: String
+  ): FormattedNumber
+  eligibleArtworks(
+    # Returns a `String` when format is specified. e.g.`'0,0.0000''`
+    format: String
+    label: String
+  ): FormattedNumber
+  partnerArtists(
+    # Returns a `String` when format is specified. e.g.`'0,0.0000''`
+    format: String
+    label: String
+  ): FormattedNumber
+  partnerShowDocuments(
+    # Returns a `String` when format is specified. e.g.`'0,0.0000''`
+    format: String
+    label: String
+  ): FormattedNumber
+  publishedForSaleArtworks(
+    # Returns a `String` when format is specified. e.g.`'0,0.0000''`
+    format: String
+    label: String
+  ): FormattedNumber
+  publishedNotForSaleArtworks(
+    # Returns a `String` when format is specified. e.g.`'0,0.0000''`
+    format: String
+    label: String
+  ): FormattedNumber
+  shows(
+    # Returns a `String` when format is specified. e.g.`'0,0.0000''`
+    format: String
+    label: String
+  ): FormattedNumber
+}
+
+# An edge in a connection.
+type PartnerEdge {
+  # A cursor for use in pagination
+  cursor: String!
+
+  # The item at the end of the edge
+  node: Partner
+}
+
+enum PartnerShowPartnerType {
+  GALLERY
+  MUSEUM
+}
+
+enum PartnersSortType {
+  CREATED_AT_ASC
+  CREATED_AT_DESC
+  PUBLISHED_AT_DESC
+  RANDOM_SCORE_DESC
+  RELATIVE_SIZE_ASC
+  RELATIVE_SIZE_DESC
+  SORTABLE_ID_ASC
+  SORTABLE_ID_DESC
+}
+
+union PartnerTypes = ExternalPartner | Partner
+
+# The connection type for MarketPriceInsights.
+type PriceInsightConnection {
+  # A list of edges.
+  edges: [PriceInsightEdge]
+
+  # A list of nodes.
+  nodes: [MarketPriceInsights]
+  pageCursors: PageCursors
+
+  # Information to aid in pagination.
+  pageInfo: PageInfo!
+  totalCount: Int
+  totalPages: Int
+}
+
+# An edge in a connection.
+type PriceInsightEdge {
+  # A cursor for use in pagination.
+  cursor: String!
+
+  # The item at the end of the edge.
+  node: MarketPriceInsights
+}
+
+enum PriceInsightSort {
+  # sort by annual_lots_sold in ascending order
+  ANNUAL_LOTS_SOLD_ASC
+
+  # sort by annual_lots_sold in descending order
+  ANNUAL_LOTS_SOLD_DESC
+
+  # sort by annual_value_sold_cents in ascending order
+  ANNUAL_VALUE_SOLD_CENTS_ASC
+
+  # sort by annual_value_sold_cents in descending order
+  ANNUAL_VALUE_SOLD_CENTS_DESC
+
+  # sort by artist_id in ascending order
+  ARTIST_ID_ASC
+
+  # sort by artist_id in descending order
+  ARTIST_ID_DESC
+
+  # sort by artist_name in ascending order
+  ARTIST_NAME_ASC
+
+  # sort by artist_name in descending order
+  ARTIST_NAME_DESC
+
+  # sort by artsy_q_inventory in ascending order
+  ARTSY_Q_INVENTORY_ASC
+
+  # sort by artsy_q_inventory in descending order
+  ARTSY_Q_INVENTORY_DESC
+
+  # sort by created_at in ascending order
+  CREATED_AT_ASC
+
+  # sort by created_at in descending order
+  CREATED_AT_DESC
+
+  # sort by demand_rank in ascending order
+  DEMAND_RANK_ASC
+
+  # sort by demand_rank in descending order
+  DEMAND_RANK_DESC
+
+  # sort by demand_trend in ascending order
+  DEMAND_TREND_ASC
+
+  # sort by demand_trend in descending order
+  DEMAND_TREND_DESC
+
+  # sort by high_range_cents in ascending order
+  HIGH_RANGE_CENTS_ASC
+
+  # sort by high_range_cents in descending order
+  HIGH_RANGE_CENTS_DESC
+
+  # sort by id in ascending order
+  ID_ASC
+
+  # sort by id in descending order
+  ID_DESC
+
+  # sort by large_high_range_cents in ascending order
+  LARGE_HIGH_RANGE_CENTS_ASC
+
+  # sort by large_high_range_cents in descending order
+  LARGE_HIGH_RANGE_CENTS_DESC
+
+  # sort by large_low_range_cents in ascending order
+  LARGE_LOW_RANGE_CENTS_ASC
+
+  # sort by large_low_range_cents in descending order
+  LARGE_LOW_RANGE_CENTS_DESC
+
+  # sort by large_mid_range_cents in ascending order
+  LARGE_MID_RANGE_CENTS_ASC
+
+  # sort by large_mid_range_cents in descending order
+  LARGE_MID_RANGE_CENTS_DESC
+
+  # sort by liquidity_rank in ascending order
+  LIQUIDITY_RANK_ASC
+
+  # sort by liquidity_rank in descending order
+  LIQUIDITY_RANK_DESC
+
+  # sort by low_range_cents in ascending order
+  LOW_RANGE_CENTS_ASC
+
+  # sort by low_range_cents in descending order
+  LOW_RANGE_CENTS_DESC
+
+  # sort by median_sale_to_estimate_ratio in ascending order
+  MEDIAN_SALE_TO_ESTIMATE_RATIO_ASC
+
+  # sort by median_sale_to_estimate_ratio in descending order
+  MEDIAN_SALE_TO_ESTIMATE_RATIO_DESC
+
+  # sort by medium in ascending order
+  MEDIUM_ASC
+
+  # sort by medium in descending order
+  MEDIUM_DESC
+
+  # sort by medium_high_range_cents in ascending order
+  MEDIUM_HIGH_RANGE_CENTS_ASC
+
+  # sort by medium_high_range_cents in descending order
+  MEDIUM_HIGH_RANGE_CENTS_DESC
+
+  # sort by medium_low_range_cents in ascending order
+  MEDIUM_LOW_RANGE_CENTS_ASC
+
+  # sort by medium_low_range_cents in descending order
+  MEDIUM_LOW_RANGE_CENTS_DESC
+
+  # sort by medium_mid_range_cents in ascending order
+  MEDIUM_MID_RANGE_CENTS_ASC
+
+  # sort by medium_mid_range_cents in descending order
+  MEDIUM_MID_RANGE_CENTS_DESC
+
+  # sort by mid_range_cents in ascending order
+  MID_RANGE_CENTS_ASC
+
+  # sort by mid_range_cents in descending order
+  MID_RANGE_CENTS_DESC
+
+  # sort by sell_through_rate in ascending order
+  SELL_THROUGH_RATE_ASC
+
+  # sort by sell_through_rate in descending order
+  SELL_THROUGH_RATE_DESC
+
+  # sort by small_high_range_cents in ascending order
+  SMALL_HIGH_RANGE_CENTS_ASC
+
+  # sort by small_high_range_cents in descending order
+  SMALL_HIGH_RANGE_CENTS_DESC
+
+  # sort by small_low_range_cents in ascending order
+  SMALL_LOW_RANGE_CENTS_ASC
+
+  # sort by small_low_range_cents in descending order
+  SMALL_LOW_RANGE_CENTS_DESC
+
+  # sort by small_mid_range_cents in ascending order
+  SMALL_MID_RANGE_CENTS_ASC
+
+  # sort by small_mid_range_cents in descending order
+  SMALL_MID_RANGE_CENTS_DESC
+
+  # sort by updated_at in ascending order
+  UPDATED_AT_ASC
+
+  # sort by updated_at in descending order
+  UPDATED_AT_DESC
+}
+
+type PriceRange {
+  display: String
+  maxPrice: Money
+  minPrice: Money
+}
+
+type Profile {
+  bio: String
+  cached: Int
+  counts: ProfileCounts
+  href: String
+  icon: Image
+
+  # A globally unique ID.
+  id: ID!
+  image: Image
+  initials(length: Int = 3): String
+
+  # A type-specific ID likely used as a database ID.
+  internalID: ID!
+  isFollowed: Boolean
+  isPubliclyVisible: Boolean
+  isPublished: Boolean
+  name: String
+
+  # A slug ID.
+  slug: ID!
+}
+
+type ProfileCounts {
+  follows(
+    # Returns a `String` when format is specified. e.g.`'0,0.0000''`
+    format: String
+    label: String
+  ): FormattedNumber
+}
+
+# Autogenerated input type of PublishViewingRoom
+input PublishViewingRoomInput {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+  viewingRoomID: ID!
+}
+
+# Autogenerated return type of PublishViewingRoom
+type PublishViewingRoomPayload {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+  viewingRoom: ViewingRoom!
+}
+
+type Query {
+  # Do not use (only used internally for stitching)
+  _do_not_use_image: Image
+
+  # Lot standings for a user
+  _unused_auctionsLotStandingConnection(
+    after: String
+    before: String
+    first: Int
+    last: Int
+    userId: ID!
+  ): AuctionsLotStandingConnection!
+
+  # Autocomplete resolvers.
+  _unused_gravity_match_partners(
+    match_type: String
+    page: Int = 1
+    size: Int = 5
+    term: String!
+  ): [DoNotUseThisPartner!] @deprecated(reason: "Use matchPartners")
+
+  # Autocomplete resolvers.
+  _unused_gravity_matchPartners(
+    matchType: String
+    page: Int = 1
+    size: Int = 5
+    term: String!
+  ): [DoNotUseThisPartner!]
+
+  # Find partners by IDs
+  _unused_gravity_partners(ids: [ID!]!): [DoNotUseThisPartner!]
+
+  # List enabled Two-Factor Authentication factors
+  _unused_gravity_secondFactors(
+    kinds: [SecondFactorKind!] = [app, sms, backup]
+  ): [SecondFactor!]!
+
+  # List viewing rooms
+  _unused_gravity_viewingRoomsConnection(
+    # Returns the elements in the list that come after the specified cursor.
+    after: String
+
+    # Returns the elements in the list that come before the specified cursor.
+    before: String
+    featured: Boolean
+
+    # Returns the first _n_ elements from the list.
+    first: Int
+    ids: [ID!]
+
+    # Returns the last _n_ elements from the list.
+    last: Int
+    partnerID: ID
+
+    # (Deprecated) Use statuses
+    published: Boolean
+
+    # Returns only viewing rooms with these statuses
+    statuses: [ViewingRoomStatusEnum!] = [live]
+  ): ViewingRoomsConnection
+
+  # Last updated timestamp
+  analyticsLastUpdatedAt: AnalyticsDateTime
+
+  # Find PartnerStats
+  analyticsPartnerStats(partnerId: String!): AnalyticsPartnerStats
+
+  # Query UserStats
+  analyticsUserStats(userId: String!): AnalyticsUserStats
+
+  # An Article
+  article(
+    # The ID of the Article
+    id: String!
+  ): Article
+
+  # A list of Articles
+  articles(
+    auctionID: String
+
+    #
+    #         Only return articles matching specified ids.
+    #         Accepts list of ids.
+    #
+    ids: [String]
+    published: Boolean = true
+    showID: String
+    sort: ArticleSorts
+  ): [Article]
+
+  # An Artist
+  artist(
+    # The slug or ID of the Artist
+    id: String!
+  ): Artist
+
+  # A list of Artists
+  artists(
+    #
+    #         Only return artists matching specified ids.
+    #         Accepts list of ids.
+    #
+    ids: [String]
+    page: Int = 1
+    size: Int
+
+    #
+    #         Only return artists matching specified slugs.
+    #         Accepts list of slugs. (e.g. 'andy-warhol', 'banksy')
+    #
+    slugs: [String]
+    sort: ArtistSorts
+  ): [Artist]
+
+  # Find an artist series by ID
+  artistSeries(id: ID!): ArtistSeries
+
+  # List all artist series, optionally filtered by artist or artwork
+  artistSeriesConnection(
+    # Returns the elements in the list that come after the specified cursor.
+    after: String
+
+    # ID of the artist by which to filter results
+    artistID: ID
+
+    # ID of the artwork by which to filter results
+    artworkID: ID
+
+    # Returns the elements in the list that come before the specified cursor.
+    before: String
+
+    # Array of IDs of artist series that should be excluded from results
+    excludeIDs: [ID!]
+
+    # Returns the first _n_ elements from the list.
+    first: Int
+
+    # Returns the last _n_ elements from the list.
+    last: Int
+  ): ArtistSeriesConnection
+
+  # An Artwork
+  artwork(
+    # The slug or ID of the Artwork
+    id: String!
+
+    # Include unlisted artwork or not
+    includeUnlisted: Boolean
+  ): Artwork
+
+  # List of all artwork attribution classes
+  artworkAttributionClasses: [AttributionClass]
+
+  # A list of Artworks
+  artworks(
+    after: String
+    before: String
+    first: Int
+    ids: [String]
+    last: Int
+    respectParamsOrder: Boolean = false
+  ): ArtworkConnection
+    @deprecated(
+      reason: "This is only for use in resolving stitched queries, not for first-class client use."
+    )
+
+  # Artworks Elastic Search results
+  artworksConnection(
+    acquireable: Boolean
+    after: String
+    aggregationPartnerCities: [String]
+    aggregations: [ArtworkAggregation]
+    artistID: String
+    artistIDs: [String]
+    artistSeriesID: String
+    atAuction: Boolean
+    attributionClass: [String]
+    before: String
+    color: String
+    dimensionRange: String
+    excludeArtworkIDs: [String]
+    extraAggregationGeneIDs: [String]
+    first: Int
+    forSale: Boolean
+    geneID: String
+    geneIDs: [String]
+    height: String
+    includeArtworksByFollowedArtists: Boolean
+    includeMediumFilterInAggregation: Boolean
+    inquireableOnly: Boolean
+    keyword: String
+
+    # When true, will only return exact keyword match
+    keywordMatchExact: Boolean
+    last: Int
+    majorPeriods: [String]
+
+    # When true, will only return `marketable` works (not nude or provocative).
+    marketable: Boolean
+
+    # A string from the list of allocations, or * to denote all mediums
+    medium: String
+    offerable: Boolean
+    page: Int
+    partnerCities: [String]
+    partnerID: ID
+    period: String
+    periods: [String]
+    priceRange: String
+    saleID: ID
+    size: Int
+
+    # Filter results by Artwork sizes
+    sizes: [ArtworkSizes]
+    sort: String
+    tagID: String
+    width: String
+  ): FilterArtworksConnection
+
+  # A city-based entry point for local discovery
+  city(
+    # A point which will be used to locate the nearest local discovery city within a threshold
+    near: Near
+
+    # A slug for the city, conforming to Gravity's city slug naming conventions
+    slug: String
+  ): City
+
+  # Find list of competing orders
+  commerceCompetingOrders(
+    # Returns the elements in the list that come after the specified cursor.
+    after: String
+
+    # Returns the elements in the list that come before the specified cursor.
+    before: String
+
+    # Returns the first _n_ elements from the list.
+    first: Int
+
+    # Returns the last _n_ elements from the list.
+    last: Int
+    orderId: ID!
+  ): CommerceOrderConnectionWithTotalCount
+  commerceLineItems(
+    # Returns the elements in the list that come after the specified cursor.
+    after: String
+    artworkId: String
+
+    # Returns the elements in the list that come before the specified cursor.
+    before: String
+    editionSetId: String
+
+    # Returns the first _n_ elements from the list.
+    first: Int
+
+    # Returns the last _n_ elements from the list.
+    last: Int
+    orderStates: [CommerceOrderStateEnum!]
+  ): CommerceLineItemConnection
+
+  # Return my orders
+  commerceMyOrders(
+    # Returns the elements in the list that come after the specified cursor.
+    after: String
+
+    # Returns the elements in the list that come before the specified cursor.
+    before: String
+
+    # Returns the first _n_ elements from the list.
+    first: Int
+
+    # Returns the last _n_ elements from the list.
+    last: Int
+    mode: CommerceOrderModeEnum
+    sellerId: String
+    sort: CommerceOrderConnectionSortEnum
+    states: [CommerceOrderStateEnum!]
+  ): CommerceOrderConnectionWithTotalCount
+
+  # Find an order by ID
+  commerceOrder(code: String, id: ID): CommerceOrder
+
+  # Find list of orders
+  commerceOrders(
+    # Returns the elements in the list that come after the specified cursor.
+    after: String
+
+    # Returns the elements in the list that come before the specified cursor.
+    before: String
+    buyerId: String
+    buyerType: String
+
+    # Returns the first _n_ elements from the list.
+    first: Int
+
+    # Returns the last _n_ elements from the list.
+    last: Int
+    mode: CommerceOrderModeEnum
+    sellerId: String
+    sellerType: String
+    sort: CommerceOrderConnectionSortEnum
+    state: CommerceOrderStateEnum
+  ): CommerceOrderConnectionWithTotalCount
+
+  # Sold or bought-in consignments
+  consignments(
+    # Returns the elements in the list that come after the specified cursor.
+    after: String
+
+    # Returns the elements in the list that come before the specified cursor.
+    before: String
+
+    # Returns the first _n_ elements from the list.
+    first: Int
+
+    # Return sold or bought-in consignments for the given partner
+    gravityPartnerId: ID!
+
+    # Returns the last _n_ elements from the list.
+    last: Int
+
+    # Return consignments sorted by input (default sort by id)
+    sort: ConsignmentSort
+  ): ConsignmentConnection
+
+  # A user's credit card
+  creditCard(
+    # The ID of the Credit Card
+    id: String!
+  ): CreditCard
+
+  # A Fair
+  fair(
+    # The slug or ID of the Fair
+    id: String!
+  ): Fair
+
+  # A list of Fairs
+  fairs(
+    fairOrganizerID: String
+    hasFullFeature: Boolean
+    hasHomepageSection: Boolean
+    hasListing: Boolean
+
+    #
+    #         Only return fairs matching specified ids.
+    #         Accepts list of ids.
+    #
+    ids: [String]
+    near: Near
+    page: Int
+    size: Int
+    sort: FairSorts
+    status: EventStatus
+  ): [Fair]
+
+  # A Feature
+  feature(
+    # The slug or ID of the Feature
+    id: ID
+  ): Feature
+  gene(
+    # The slug or ID of the Gene
+    id: String!
+  ): Gene
+
+  # A list of Gene Families
+  geneFamiliesConnection(
+    after: String
+    before: String
+    first: Int
+    last: Int
+  ): GeneFamilyConnection
+
+  # A list of Genes
+  genes(
+    size: Int
+
+    #
+    #         Only return genes matching specified slugs.
+    #         Accepts list of slugs.
+    #
+    slugs: [String]
+  ): [Gene]
+  highlights: Highlights
+
+  # Home screen content
+  homePage: HomePage
+  marketingCategories: [MarketingCollectionCategory!]!
+  marketingCollection(slug: String!): MarketingCollection
+  marketingCollections(
+    artistID: String
+    category: String
+    isFeaturedArtistContent: Boolean
+    randomizationSeed: String
+    showOnEditorial: Boolean
+    size: Int
+    slugs: [String!]
+  ): [MarketingCollection!]!
+  marketingHubCollections: [MarketingCollection!]!
+
+  # Get price insights for a market.
+  marketPriceInsights(artistId: ID!, medium: String!): MarketPriceInsights
+  me: Me
+
+  # Fetches an object given its globally unique ID.
+  node(
+    # The globally unique ID of the node.
+    id: ID!
+  ): Node
+
+  # Get an Offer
+  offer(
+    # Return offers for the given partner
+    gravityPartnerId: ID!
+    id: ID!
+  ): ConsignmentOffer
+
+  # List offers
+  offers(
+    # Returns the elements in the list that come after the specified cursor.
+    after: String
+
+    # Returns the elements in the list that come before the specified cursor.
+    before: String
+
+    # Returns the first _n_ elements from the list.
+    first: Int
+
+    # Return offers for the given partner
+    gravityPartnerId: ID!
+
+    # Returns the last _n_ elements from the list.
+    last: Int
+
+    # Return offers sorted this way
+    sort: ConsignmentOfferSort
+
+    # Return only offers with matching states
+    states: [String!]
+  ): ConsignmentOfferConnection
+
+  # An OrderedSet
+  orderedSet(
+    # The ID of the OrderedSet
+    id: String!
+  ): OrderedSet
+
+  # A collection of OrderedSets
+  orderedSets(
+    # Key to the OrderedSet or group of OrderedSets
+    key: String!
+    public: Boolean = true
+  ): [OrderedSet]
+
+  # A Partner
+  partner(
+    # The slug or ID of the Partner
+    id: String!
+  ): Partner
+
+  # A list of Artworks for a partner
+  partnerArtworks(
+    after: String
+    before: String
+    first: Int
+    last: Int
+    partnerID: String!
+    private: Boolean
+    viewingRoomID: String
+  ): ArtworkConnection
+    @deprecated(
+      reason: "This is only for use in resolving stitched queries, not for first-class client use."
+    )
+
+  # A list of Partners
+  partnersConnection(
+    after: String
+    before: String
+    first: Int
+    ids: [String]
+    last: Int
+  ): PartnerConnection
+
+  # Get all price insights for an artist.
+  priceInsights(
+    # Returns the elements in the list that come after the specified cursor.
+    after: String
+    artistId: ID!
+
+    # Returns the elements in the list that come before the specified cursor.
+    before: String
+
+    # Returns the first _n_ elements from the list.
+    first: Int
+
+    # Returns the last _n_ elements from the list.
+    last: Int
+
+    # Return price insights sorted this way
+    sort: PriceInsightSort
+  ): PriceInsightConnection
+
+  # A Sale
+  sale(
+    # The slug or ID of the Sale
+    id: String!
+  ): Sale
+
+  # A Sale Artwork
+  saleArtwork(
+    # The slug or ID of the SaleArtwork
+    id: String!
+  ): SaleArtwork
+
+  # Sale Artworks search results
+  saleArtworksConnection(
+    after: String
+
+    # Please make sure to supply the TOTAL aggregation if you will be setting any aggregations
+    aggregations: [SaleArtworkAggregation]
+    artistIDs: [String]
+    before: String
+    estimateRange: String
+    first: Int
+    geneIDs: [String]
+
+    # When called under the Me field, this defaults to true. Otherwise it defaults to false
+    includeArtworksByFollowedArtists: Boolean
+    isAuction: Boolean
+    last: Int
+    liveSale: Boolean
+    page: Int
+    saleID: ID
+    size: Int
+    sort: String
+  ): SaleArtworksConnection
+
+  # A list of Sales
+  salesConnection(
+    after: String
+    before: String
+    first: Int
+
+    #
+    #         Only return sales matching specified ids.
+    #         Accepts list of ids.
+    #
+    ids: [String]
+
+    # Limit by auction.
+    isAuction: Boolean = true
+    last: Int
+
+    # Limit by live status.
+    live: Boolean = true
+
+    # Limit by published status.
+    published: Boolean = true
+
+    # Returns sales the user has registered for if true, returns sales the user has not registered for if false.
+    registered: Boolean
+    sort: SaleSorts
+  ): SaleConnection
+
+  # Global search
+  searchConnection(
+    after: String
+    aggregations: [SearchAggregation]
+    before: String
+
+    # Entities to include in search. Default: [ARTIST, ARTWORK].
+    entities: [SearchEntity]
+    first: Int
+    last: Int
+
+    # Mode of search to execute. Default: SITE.
+    mode: SearchMode
+
+    # If present, will be used for pagination instead of cursors.
+    page: Int
+
+    # Search query to perform. Required.
+    query: String!
+  ): SearchableConnection
+
+  # A Show
+  show(
+    # The slug or ID of the Show
+    id: String!
+  ): Show
+
+  # A list of Shows
+  showsConnection(
+    after: String
+    before: String
+    first: Int
+    ids: [String]
+    last: Int
+  ): ShowConnection
+
+  # Content for a specific page or view
+  staticContent(
+    # The slug or id for the view
+    id: String!
+  ): StaticContent
+
+  # Get a Submission
+  submission(id: ID): ConsignmentSubmission
+
+  # Filter all submission
+  submissions(
+    # Returns the elements in the list that come after the specified cursor.
+    after: String
+
+    # If true return only available submissions
+    available: Boolean
+
+    # Returns the elements in the list that come before the specified cursor.
+    before: String
+
+    # Get submissions filtered by category
+    filterByCategory: ConsignmentSubmissionCategoryAggregation
+
+    # Returns the first _n_ elements from the list.
+    first: Int
+
+    # Get all submissions with these IDs
+    ids: [ID!]
+
+    # Returns the last _n_ elements from the list.
+    last: Int
+
+    # Return submissions sorted this way
+    sort: ConsignmentSubmissionSort
+
+    # Get all submissions with these user IDs
+    userId: [ID!]
+  ): ConsignmentSubmissionConnection
+
+  # Fields related to internal systems.
+  system: System
+  tag(
+    # The slug or ID of the Tag
+    id: String!
+  ): Tag
+  targetSupply: TargetSupply
+  user(
+    # Email to search for user by
+    email: String
+
+    # ID of the user
+    id: String
+  ): User
+
+  # A list of Users
+  usersConnection(
+    after: String
+    before: String
+    first: Int
+    ids: [String]
+    last: Int
+  ): UserConnection
+
+  # A Partner or Fair
+  vanityURLEntity(
+    # The slug or ID of the Profile to get a partner or fair for
+    id: String!
+  ): VanityURLEntityType
+
+  # A wildcard used to support complex root queries in Relay
+  viewer: Viewer
+
+  # Find a viewing room by ID
+  viewingRoom(id: ID!): ViewingRoom
+
+  # (Deprecate) use viewingRoomsConnection
+  viewingRooms(
+    # Returns the elements in the list that come after the specified cursor.
+    after: String
+
+    # Returns the elements in the list that come before the specified cursor.
+    before: String
+    featured: Boolean
+
+    # Returns the first _n_ elements from the list.
+    first: Int
+
+    # Returns the last _n_ elements from the list.
+    last: Int
+    partnerID: ID
+
+    # (Deprecated) Use statuses
+    published: Boolean
+
+    # Returns only viewing rooms with these statuses
+    statuses: [ViewingRoomStatusEnum!] = [live]
+  ): ViewingRoomConnection @deprecated(reason: "Use viewingRoomsConnection")
+}
+
+# Autogenerated input type of RecordArtworkView
+input RecordArtworkViewInput {
+  artwork_id: String!
+
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+}
+
+# Autogenerated return type of RecordArtworkView
+type RecordArtworkViewPayload {
+  # Id of viewed artwork
+  artwork_id: String! @deprecated(reason: "Use artworkId")
+
+  # Id of viewed artwork
+  artworkId: String!
+
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+}
+
+enum RelatedArtistsKind {
+  CONTEMPORARY
+  MAIN
+}
+
+type RelatedArtworkGrid implements ArtworkContextGrid {
+  artworksConnection(
+    after: String
+    before: String
+    first: Int
+    last: Int
+  ): ArtworkConnection
+  ctaHref: String
+  ctaTitle: String
+  title: String
+}
+
+# Autogenerated input type of RequestConditionReport
+input RequestConditionReportInput {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+
+  # ID of the sale artwork.
+  saleArtworkID: String!
+}
+
+# Autogenerated return type of RequestConditionReport
+type RequestConditionReportPayload {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+  conditionReportRequest: ConditionReportRequest!
+}
+
+input RequestCredentialsForAssetUploadInput {
+  # The desired access control
+  acl: String!
+  clientMutationId: String
+
+  # The gemini template you want to request
+  name: String!
+}
+
+type RequestCredentialsForAssetUploadPayload {
+  asset: Credentials
+  clientMutationId: String
+}
+
+type ResizedImageUrl {
+  factor: Float!
+  height: Int
+  src: String!
+  srcSet: String!
+  url: String!
+  width: Int
+}
+
+enum Role {
+  OPERATOR
+  PARTICIPANT
+}
+
+# The conditions for uploading assets to media.artsy.net
+type S3PolicyConditionsType {
+  # The assigned access control
+  acl: String!
+
+  # The bucket to upload to.
+  bucket: String!
+
+  # A key which is prefixed on your file
+  geminiKey: String!
+
+  # The returned status code, currently always 201
+  successActionStatus: String!
+}
+
+# An policy for uploading assets to media.artsy.net
+type S3PolicyDocumentType {
+  # The details for the upload
+  conditions: S3PolicyConditionsType!
+
+  # An expiration date string.
+  expiration: String!
+}
+
+type Sale implements Node {
+  # Returns a connection of artworks for a sale.
+  artworksConnection(
+    after: String
+    before: String
+
+    # List of artwork IDs to exclude from the response (irrespective of size)
+    exclude: [String]
+    first: Int
+    last: Int
+  ): ArtworkConnection
+  associatedSale: Sale
+
+  # A bid increment policy that explains minimum bids in ranges.
+  bidIncrements: [BidIncrement]
+
+  # Auction's buyer's premium policy.
+  buyersPremium: [BuyersPremium]
+  cached: Int
+  collectPayments: Boolean!
+  coverImage: Image
+  currency: String
+  description: String
+  displayTimelyAt: String
+  eligibleSaleArtworksCount: Int
+  endAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String
+  eventEndAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String
+  eventStartAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String
+
+  # A formatted description of when the auction starts or ends or if it has ended
+  formattedStartDateTime: String
+  href: String
+
+  # A globally unique ID.
+  id: ID!
+  initials(length: Int = 3): String
+
+  # A type-specific ID likely used as a database ID.
+  internalID: ID!
+  isArtsyLicensed: Boolean!
+  isAuction: Boolean
+  isAuctionPromo: Boolean
+  isBenefit: Boolean
+  isClosed: Boolean
+  isGalleryAuction: Boolean
+  isLiveOpen: Boolean
+  isLotConditionsReportEnabled: Boolean
+  isOpen: Boolean
+  isPreliminary: Boolean
+  isPreview: Boolean
+  isRegistrationClosed: Boolean
+  isWithBuyersPremium: Boolean
+  liveStartAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String
+
+  # Returns a live auctions url if the sale is open and start time is after now
+  liveURLIfOpen: String
+  name: String
+  partner: Partner
+  profile: Profile
+  promotedSale: Sale
+  registrationEndsAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String
+
+  # A registration for this sale or null
+  registrationStatus: Bidder
+  requireBidderApproval: Boolean
+  requireIdentityVerification: Boolean
+  saleArtwork(id: String!): SaleArtwork
+  saleArtworksConnection(
+    after: String
+    all: Boolean = false
+    before: String
+    first: Int
+
+    # List of sale artwork internal IDs to fetch
+    internalIDs: [ID]
+    last: Int
+  ): SaleArtworkConnection
+  saleType: String
+
+  # A slug ID.
+  slug: ID!
+  startAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String
+  status: String
+  symbol: String
+  timeZone: String
+
+  # True if the current user needs to undergo identity verification for this sale, false otherwise
+  userNeedsIdentityVerification: Boolean
+}
+
+type SaleArtwork implements ArtworkEdgeInterface & Node {
+  artwork: Artwork
+  cached: Int
+  calculatedCost(
+    # Max bid price for the sale artwork
+    bidAmountMinor: Int!
+  ): CalculatedCost
+  counts: SaleArtworkCounts
+
+  # Currency abbreviation (e.g. "USD")
+  currency: String
+  currentBid: SaleArtworkCurrentBid
+  cursor: String
+  estimate: String
+
+  # Singular estimate field, if specified
+  estimateCents: Int
+  highestBid: SaleArtworkHighestBid
+  highEstimate: SaleArtworkHighEstimate
+
+  # A globally unique ID.
+  id: ID!
+  increments(
+    # Whether or not to start the increments at the user's latest bid
+    useMyMaxBid: Boolean
+  ): [BidIncrementsFormatted]
+
+  # A type-specific ID likely used as a database ID.
+  internalID: ID!
+
+  # Can bids be placed on the artwork?
+  isBiddable: Boolean
+  isBidOn: Boolean
+  isWithReserve: Boolean
+  lotLabel: String
+  lowEstimate: SaleArtworkLowEstimate
+  minimumNextBid: SaleArtworkMinimumNextBid
+  node: Artwork
+  openingBid: SaleArtworkOpeningBid
+  position: Float
+  reserve: SaleArtworkReserve
+  reserveMessage: String
+  reserveStatus: String
+  sale: Sale
+  saleID: String
+
+  # A slug ID.
+  slug: ID!
+
+  # Currency symbol (e.g. "$")
+  symbol: String
+}
+
+enum SaleArtworkAggregation {
+  ARTIST
+  FOLLOWED_ARTISTS
+  MEDIUM
+  TOTAL
+}
+
+# A connection to a list of items.
+type SaleArtworkConnection {
+  # A list of edges.
+  edges: [SaleArtworkEdge]
+
+  # Information to aid in pagination.
+  pageInfo: PageInfo!
+}
+
+type SaleArtworkCounts {
+  bidderPositions(
+    # Returns a `String` when format is specified. e.g.`'0,0.0000''`
+    format: String
+    label: String
+  ): FormattedNumber
+}
+
+type SaleArtworkCurrentBid {
+  # A formatted price with various currency formatting options.
+  amount(
+    decimal: String = "."
+
+    # Allows control of symbol position (%v = value, %s = symbol)
+    format: String = "%s%v"
+    precision: Int = 0
+    symbol: String
+    thousand: String = ","
+  ): String
+
+  # An amount of money expressed in cents.
+  cents: Float
+
+  # A pre-formatted price.
+  display: String
+}
+
+# An edge in a connection.
+type SaleArtworkEdge {
+  # A cursor for use in pagination
+  cursor: String!
+
+  # The item at the end of the edge
+  node: SaleArtwork
+}
+
+type SaleArtworkHighestBid {
+  # A formatted price with various currency formatting options.
+  amount(
+    decimal: String = "."
+
+    # Allows control of symbol position (%v = value, %s = symbol)
+    format: String = "%s%v"
+    precision: Int = 0
+    symbol: String
+    thousand: String = ","
+  ): String
+  cents: Int
+  createdAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String
+  display: String
+  isCancelled: Boolean
+}
+
+type SaleArtworkHighEstimate {
+  # A formatted price with various currency formatting options.
+  amount(
+    decimal: String = "."
+
+    # Allows control of symbol position (%v = value, %s = symbol)
+    format: String = "%s%v"
+    precision: Int = 0
+    symbol: String
+    thousand: String = ","
+  ): String
+
+  # An amount of money expressed in cents.
+  cents: Float
+
+  # A pre-formatted price.
+  display: String
+}
+
+type SaleArtworkLowEstimate {
+  # A formatted price with various currency formatting options.
+  amount(
+    decimal: String = "."
+
+    # Allows control of symbol position (%v = value, %s = symbol)
+    format: String = "%s%v"
+    precision: Int = 0
+    symbol: String
+    thousand: String = ","
+  ): String
+
+  # An amount of money expressed in cents.
+  cents: Float
+
+  # A pre-formatted price.
+  display: String
+}
+
+type SaleArtworkMinimumNextBid {
+  # A formatted price with various currency formatting options.
+  amount(
+    decimal: String = "."
+
+    # Allows control of symbol position (%v = value, %s = symbol)
+    format: String = "%s%v"
+    precision: Int = 0
+    symbol: String
+    thousand: String = ","
+  ): String
+
+  # An amount of money expressed in cents.
+  cents: Float
+
+  # A pre-formatted price.
+  display: String
+}
+
+type SaleArtworkOpeningBid {
+  # A formatted price with various currency formatting options.
+  amount(
+    decimal: String = "."
+
+    # Allows control of symbol position (%v = value, %s = symbol)
+    format: String = "%s%v"
+    precision: Int = 0
+    symbol: String
+    thousand: String = ","
+  ): String
+
+  # An amount of money expressed in cents.
+  cents: Float
+
+  # A pre-formatted price.
+  display: String
+}
+
+type SaleArtworkReserve {
+  # A formatted price with various currency formatting options.
+  amount(
+    decimal: String = "."
+
+    # Allows control of symbol position (%v = value, %s = symbol)
+    format: String = "%s%v"
+    precision: Int = 0
+    symbol: String
+    thousand: String = ","
+  ): String
+
+  # An amount of money expressed in cents.
+  cents: Float
+
+  # A pre-formatted price.
+  display: String
+}
+
+# The results for one of the requested aggregations
+type SaleArtworksAggregationResults {
+  counts: [AggregationCount]
+  slice: SaleArtworkAggregation
+}
+
+# A connection to a list of items.
+type SaleArtworksConnection implements ArtworkConnectionInterface {
+  # Returns aggregation counts for the given filter query.
+  aggregations: [SaleArtworksAggregationResults]
+  counts: FilterSaleArtworksCounts
+
+  # A list of edges.
+  edges: [SaleArtwork]
+  pageCursors: PageCursors!
+
+  # Information to aid in pagination.
+  pageInfo: PageInfo!
+  totalCount: Int
+}
+
+# A connection to a list of items.
+type SaleConnection {
+  # A list of edges.
+  edges: [SaleEdge]
+  pageCursors: PageCursors!
+
+  # Information to aid in pagination.
+  pageInfo: PageInfo!
+  totalCount: Int
+}
+
+# An edge in a connection.
+type SaleEdge {
+  # A cursor for use in pagination
+  cursor: String!
+
+  # The item at the end of the edge
+  node: Sale
+}
+
+enum SaleSorts {
+  _ID_ASC
+  _ID_DESC
+  CREATED_AT_ASC
+  CREATED_AT_DESC
+  ELIGIBLE_SALE_ARTWORKS_COUNT_ASC
+  ELIGIBLE_SALE_ARTWORKS_COUNT_DESC
+  END_AT_ASC
+  END_AT_DESC
+  NAME_ASC
+  NAME_DESC
+  START_AT_ASC
+  START_AT_DESC
+  TIMELY_AT_NAME_ASC
+  TIMELY_AT_NAME_DESC
+}
+
+input SaveArtworkInput {
+  artworkID: String
+  clientMutationId: String
+  remove: Boolean
+}
+
+type SaveArtworkPayload {
+  artwork: Artwork
+  clientMutationId: String
+}
+
+# A connection to a list of items.
+type SavedArtworksConnection {
+  default: Boolean!
+  description: String!
+
+  # A list of edges.
+  edges: [SavedArtworksEdge]
+  name: String!
+  pageCursors: PageCursors!
+
+  # Information to aid in pagination.
+  pageInfo: PageInfo!
+  private: Boolean!
+  totalCount: Int
+}
+
+# An edge in a connection.
+type SavedArtworksEdge {
+  # A cursor for use in pagination
+  cursor: String!
+
+  # The item at the end of the edge
+  node: Artwork
+}
+
+# An object that may be searched for
+interface Searchable {
+  displayLabel: String
+  href: String
+  imageUrl: String
+}
+
+# A connection to a list of items.
+type SearchableConnection {
+  # Returns aggregation counts for the given filter query.
+  aggregations: [SearchAggregationResults]
+
+  # A list of edges.
+  edges: [SearchableEdge]
+  pageCursors: PageCursors!
+
+  # Information to aid in pagination.
+  pageInfo: PageInfo!
+  totalCount: Int
+}
+
+# An edge in a connection.
+type SearchableEdge {
+  # A cursor for use in pagination
+  cursor: String!
+
+  # The item at the end of the edge
+  node: Searchable
+}
+
+type SearchableItem implements Node & Searchable {
+  description: String
+  displayLabel: String
+  displayType: String
+  href: String
+
+  # A globally unique ID.
+  id: ID!
+  imageUrl: String
+
+  # A type-specific ID likely used as a database ID.
+  internalID: ID!
+
+  # A slug ID.
+  slug: ID!
+}
+
+enum SearchAggregation {
+  TYPE
+}
+
+# The results for a requested aggregations
+type SearchAggregationResults {
+  counts: [AggregationCount]
+  slice: SearchAggregation
+}
+
+enum SearchEntity {
+  ARTICLE
+  ARTIST
+  ARTIST_SERIES
+  ARTWORK
+  CITY
+  COLLECTION
+  FAIR
+  FEATURE
+  GALLERY
+  GENE
+  INSTITUTION
+  PAGE
+  PROFILE
+  SALE
+  SHOW
+  TAG
+  VIEWING_ROOM
+}
+
+enum SearchMode {
+  AUTOSUGGEST
+  SITE
+}
+
+interface SecondFactor {
+  createdAt: ISO8601DateTime!
+  disabledAt: ISO8601DateTime
+  enabled: Boolean!
+  enabledAt: ISO8601DateTime
+  internalID: ID!
+  kind: SecondFactorKind!
+  updatedAt: ISO8601DateTime!
+}
+
+# Two-Factor Authentication (2FA) Method
+enum SecondFactorKind {
+  # App authenticator 2FA method
+  app
+
+  # Backup 2FA method
+  backup
+
+  # SMS 2FA method
+  sms
+}
+
+# A second factor or errors
+union SecondFactorOrErrorsUnion = AppSecondFactor | Errors | SmsSecondFactor
+
+# A piece that can be sold
+interface Sellable {
+  dimensions: dimensions
+  editionOf: String
+
+  # Whether a piece can be purchased through e-commerce
+  isAcquireable: Boolean
+  isForSale: Boolean
+
+  # Whether a user can make an offer on the work
+  isOfferable: Boolean
+  isSold: Boolean
+  saleMessage: String
+}
+
+type SendConfirmationEmailMutationFailure {
+  mutationError: GravityMutationError
+}
+
+input SendConfirmationEmailMutationInput {
+  clientMutationId: String
+}
+
+type SendConfirmationEmailMutationPayload {
+  clientMutationId: String
+  confirmationOrError: SendConfirmationEmailMutationType
+}
+
+type SendConfirmationEmailMutationSuccess {
+  confirmationSentAt: String
+  unconfirmedEmail: String
+}
+
+union SendConfirmationEmailMutationType =
+    SendConfirmationEmailMutationFailure
+  | SendConfirmationEmailMutationSuccess
+
+input SendConversationMessageMutationInput {
+  bodyText: String!
+  clientMutationId: String
+
+  # The email address of the message sender
+  from: String!
+
+  # The id of the conversation to be updated
+  id: String!
+
+  # The message being replied to
+  replyToMessageID: String!
+}
+
+type SendConversationMessageMutationPayload {
+  clientMutationId: String
+  conversation: Conversation
+  messageEdge: MessageEdge
+}
+
+type SendFeedbackMutationFailure {
+  mutationError: GravityMutationError
+}
+
+input SendFeedbackMutationInput {
+  clientMutationId: String
+
+  # Email to associate with message (only used if logged out).
+  email: String
+
+  # Message to be sent.
+  message: String!
+
+  # Name to associate with message (only used if logged out).
+  name: String
+
+  # URL of page where feedback originated.
+  url: String
+}
+
+type SendFeedbackMutationPayload {
+  clientMutationId: String
+  feedbackOrError: SendFeedbackMutationType
+}
+
+type SendFeedbackMutationSuccess {
+  feedback: Feedback
+}
+
+union SendFeedbackMutationType =
+    SendFeedbackMutationFailure
+  | SendFeedbackMutationSuccess
+
+type Services {
+  convection: ConvectionService!
+  metaphysics: MetaphysicsService!
+}
+
+type Show implements EntityWithFilterArtworksConnectionInterface & Node {
+  # The Artists presenting in this show
+  artists: [Artist]
+
+  # Artists in the show grouped by last name
+  artistsGroupedByName: [ArtistGroup]
+
+  # Artists inside the show who do not have artworks present
+  artistsWithoutArtworks: [Artist]
+
+  # The artworks featured in the show
+  artworksConnection(
+    after: String
+    before: String
+
+    # List of artwork IDs to exclude from the response (irrespective of size)
+    exclude: [String]
+    first: Int
+    forSale: Boolean = false
+    last: Int
+    published: Boolean = true
+  ): ArtworkConnection
+  cached: Int
+
+  # The general city, derived from a fair location, a show location or a potential city
+  city: String
+
+  # An object that represents some of the numbers you might want to highlight
+  counts: ShowCounts
+
+  # The image you should use to represent this show
+  coverImage: Image
+  createdAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String
+
+  # A description of the show
+  description: String
+  endAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String
+
+  # Events from the partner that runs this show
+  events: [ShowEventType]
+
+  # A formatted description of the start to end dates
+  exhibitionPeriod: String
+
+  # If the show is in a Fair, then that fair
+  fair: Fair
+
+  # Artworks Elastic Search results
+  filterArtworksConnection(
+    acquireable: Boolean
+    after: String
+    aggregationPartnerCities: [String]
+    aggregations: [ArtworkAggregation]
+    artistID: String
+    artistIDs: [String]
+    artistSeriesID: String
+    atAuction: Boolean
+    attributionClass: [String]
+    before: String
+    color: String
+    dimensionRange: String
+    excludeArtworkIDs: [String]
+    extraAggregationGeneIDs: [String]
+    first: Int
+    forSale: Boolean
+    geneID: String
+    geneIDs: [String]
+    height: String
+    includeArtworksByFollowedArtists: Boolean
+    includeMediumFilterInAggregation: Boolean
+    inquireableOnly: Boolean
+    keyword: String
+
+    # When true, will only return exact keyword match
+    keywordMatchExact: Boolean
+    last: Int
+    majorPeriods: [String]
+
+    # When true, will only return `marketable` works (not nude or provocative).
+    marketable: Boolean
+
+    # A string from the list of allocations, or * to denote all mediums
+    medium: String
+    offerable: Boolean
+    page: Int
+    partnerCities: [String]
+    partnerID: ID
+    period: String
+    periods: [String]
+    priceRange: String
+    saleID: ID
+    size: Int
+
+    # Filter results by Artwork sizes
+    sizes: [ArtworkSizes]
+    sort: String
+    tagID: String
+    width: String
+  ): FilterArtworksConnection
+
+  # A Connection of followed artists by current user for this show
+  followedArtistsConnection(
+    after: String
+    before: String
+    first: Int
+    last: Int
+  ): ShowFollowArtistConnection
+
+  # Flag showing if show has any location.
+  hasLocation: Boolean
+
+  # A path to the show on Artsy
+  href: String
+
+  # A globally unique ID.
+  id: ID!
+
+  # Images that represent the show, you may be interested in meta_image or cover_image for a definitive thumbnail
+  images(
+    # Pass true/false to include cover or not
+    default: Boolean
+    page: Int
+
+    # Number of images to return
+    size: Int
+  ): [Image]
+
+  # A type-specific ID likely used as a database ID.
+  internalID: ID!
+
+  # Gravity doesn’t expose the `active` flag. Temporarily re-state its logic.
+  isActive: Boolean
+
+  # Is this something we can display to the front-end?
+  isDisplayable: Boolean
+
+  # Does the show exist as a fair booth?
+  isFairBooth: Boolean
+
+  # Is the user following this show
+  isFollowed: Boolean
+
+  # Is it a show provided for historical reference?
+  isReference: Boolean
+
+  # Is it an outsourced local discovery stub show?
+  isStubShow: Boolean
+
+  # Whether the show is in a fair, group or solo
+  kind: String
+
+  # Where the show is located (Could also be a fair location)
+  location: Location
+
+  # An image representing the show, or a sharable image from an artwork in the show
+  metaImage: Image
+
+  # The exhibition title
+  name: String
+
+  # Shows that are near (~75km) from this show
+  nearbyShowsConnection(
+    after: String
+    before: String
+
+    # Whether to include local discovery stubs as well as displayable shows
+    discoverable: Boolean
+    first: Int
+    last: Int
+    sort: ShowSorts
+
+    # By default show only current shows
+    status: EventStatus = CURRENT
+  ): ShowConnection
+
+  # Alternate Markdown-supporting free text representation of the opening reception event’s date/time
+  openingReceptionText: String
+
+  # The partner that represents this show, could be a non-Artsy partner
+  partner: PartnerTypes
+
+  # The press release for this show
+  pressRelease(format: Format): String
+
+  # Link to the press release for this show
+  pressReleaseUrl: String
+
+  # A slug ID.
+  slug: ID!
+
+  # When this show starts
+  startAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String
+
+  # Is this show running, upcoming or closed?
+  status: String
+
+  # A formatted update on upcoming status changes
+  statusUpdate(
+    # Before this many days no update will be generated
+    maxDays: Int
+  ): String
+
+  # Is it a fair booth or a show?
+  type: String
+  viewingRoomIDs: [String!]!
+  viewingRoomsConnection: ViewingRoomsConnection
+}
+
+type ShowArtworkGrid implements ArtworkContextGrid {
+  artworksConnection(
+    after: String
+    before: String
+    first: Int
+    last: Int
+  ): ArtworkConnection
+  ctaHref: String
+  ctaTitle: String
+  title: String
+}
+
+# A connection to a list of items.
+type ShowConnection {
+  # A list of edges.
+  edges: [ShowEdge]
+  pageCursors: PageCursors!
+
+  # Information to aid in pagination.
+  pageInfo: PageInfo!
+  totalCount: Int
+}
+
+type ShowCounts {
+  artists: Int
+  artworks(
+    # The slug or ID of an artist in the show.
+    artistID: String
+  ): Int
+  eligibleArtworks(
+    # Returns a `String` when format is specified. e.g.`'0,0.0000''`
+    format: String
+    label: String
+  ): FormattedNumber
+}
+
+# An edge in a connection.
+type ShowEdge {
+  # A cursor for use in pagination
+  cursor: String!
+
+  # The item at the end of the edge
+  node: Show
+}
+
+type ShowEventType {
+  # A formatted description of the dates with hours
+  dateTimeRange: String
+  description: String
+  endAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String
+  eventType: String
+
+  # A formatted description of the start to end dates
+  exhibitionPeriod: String
+  startAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String
+  title: String
+}
+
+type ShowFollowArtist {
+  artist: Artist
+}
+
+# A connection to a list of items.
+type ShowFollowArtistConnection {
+  # A list of edges.
+  edges: [ShowFollowArtistEdge]
+
+  # Information to aid in pagination.
+  pageInfo: PageInfo!
+}
+
+# An edge in a connection.
+type ShowFollowArtistEdge {
+  # A cursor for use in pagination
+  cursor: String!
+
+  # The item at the end of the edge
+  node: ShowFollowArtist
+}
+
+enum ShowSorts {
+  END_AT_ASC
+  END_AT_DESC
+  FEATURED_ASC
+  FEATURED_DESC
+  NAME_ASC
+  NAME_DESC
+  PARTNER_ASC
+  SORTABLE_NAME_ASC
+  SORTABLE_NAME_DESC
+  START_AT_ASC
+  START_AT_DESC
+  UPDATED_AT_ASC
+  UPDATED_AT_DESC
+}
+
+# SMS Two-Factor Authentication factor
+type SmsSecondFactor implements SecondFactor {
+  countryCode: String
+  createdAt: ISO8601DateTime!
+  disabledAt: ISO8601DateTime
+  enabled: Boolean!
+  enabledAt: ISO8601DateTime
+  formattedPhoneNumber: String
+  internalID: ID!
+  kind: SecondFactorKind!
+  lastDeliveredAt: ISO8601DateTime
+  maskedPhone: String @deprecated(reason: "Use formattedPhoneNumber instead")
+  phoneNumber: String
+  updatedAt: ISO8601DateTime!
+}
+
+# SMS second factor input attributes
+input SmsSecondFactorAttributes {
+  # ISO 3166 country code for the SMS second factor
+  countryCode: String
+
+  # Phone number of the SMS second factor
+  phoneNumber: String
+}
+
+# An SMS second factor or errors
+union SmsSecondFactorOrErrorsUnion = Errors | SmsSecondFactor
+
+enum sort {
+  ASC
+  DESC
+}
+
+type StartIdentityVerificationFailure {
+  mutationError: GravityMutationError
+}
+
+input startIdentityVerificationMutationInput {
+  clientMutationId: String
+
+  # Primary ID of the identity verification to be started
+  identityVerificationId: String!
+}
+
+type startIdentityVerificationMutationPayload {
+  clientMutationId: String
+  startIdentityVerificationResponseOrError: StartIdentityVerificationResponseOrError
+}
+
+union StartIdentityVerificationResponseOrError =
+    StartIdentityVerificationFailure
+  | StartIdentityVerificationSuccess
+
+type StartIdentityVerificationSuccess {
+  # URL that hosts the user-facing identity verification flow (Jumio)
+  identityVerificationFlowUrl: String
+
+  # Primary ID of the started identity verification
+  identityVerificationId: String
+}
+
+type StaticContent {
+  content: String
+
+  # A globally unique ID.
+  id: ID!
+
+  # A type-specific ID likely used as a database ID.
+  internalID: ID!
+  name: String
+
+  # A slug ID.
+  slug: ID!
+}
+
+# An edge in a connection.
+type SubmissionEdge {
+  # A cursor for use in pagination.
+  cursor: String!
+
+  # The item at the end of the edge.
+  node: ConsignmentSubmission
+}
+
+input SubmitInquiryRequestMutationInput {
+  clientMutationId: String
+
+  # The inquireable object id (Artwork ID or Show ID)
+  inquireableID: String!
+
+  # The type of inquireable object (Artwork or Show)
+  inquireableType: String!
+
+  # Optional inquiry message
+  message: String
+
+  # List of structured inquiry questions
+  questions: [InquiryQuestionInput]
+}
+
+type SubmitInquiryRequestMutationPayload {
+  clientMutationId: String
+
+  # Artwork Inquiry request
+  inquiryRequest: InquiryRequest
+}
+
+type System {
+  # Creates, and authorizes, a JWT custom for Causality
+  causalityJWT(
+    role: Role
+
+    # The id of the auction to participate in
+    saleID: String!
+  ): String
+
+  # The schema for difference micro-service settings
+  services: Services
+
+  # Gravity system time, necessary for synchronizing device clocks.
+  time: SystemTime
+}
+
+type SystemTime {
+  day: Int
+  dst: Boolean
+  hour: Int
+  iso8601: String
+  min: Int
+  month: Int
+  sec: Int
+  unix: Int
+  utcOffset: Int
+  wday: Int
+  year: Int
+  zone: String
+}
+
+type Tag implements Node {
+  cached: Int
+  count: Int
+  description: String
+
+  # Artworks Elastic Search results
+  filterArtworksConnection(
+    acquireable: Boolean
+    after: String
+    aggregationPartnerCities: [String]
+    aggregations: [ArtworkAggregation]
+    artistID: String
+    artistIDs: [String]
+    artistSeriesID: String
+    atAuction: Boolean
+    attributionClass: [String]
+    before: String
+    color: String
+    dimensionRange: String
+    excludeArtworkIDs: [String]
+    extraAggregationGeneIDs: [String]
+    first: Int
+    forSale: Boolean
+    geneID: String
+    geneIDs: [String]
+    height: String
+    includeArtworksByFollowedArtists: Boolean
+    includeMediumFilterInAggregation: Boolean
+    inquireableOnly: Boolean
+    keyword: String
+
+    # When true, will only return exact keyword match
+    keywordMatchExact: Boolean
+    last: Int
+    majorPeriods: [String]
+
+    # When true, will only return `marketable` works (not nude or provocative).
+    marketable: Boolean
+
+    # A string from the list of allocations, or * to denote all mediums
+    medium: String
+    offerable: Boolean
+    page: Int
+    partnerCities: [String]
+    partnerID: ID
+    period: String
+    periods: [String]
+    priceRange: String
+    saleID: ID
+    size: Int
+
+    # Filter results by Artwork sizes
+    sizes: [ArtworkSizes]
+    sort: String
+    tagID: String
+    width: String
+  ): FilterArtworksConnection
+  href: String
+
+  # A globally unique ID.
+  id: ID!
+  image: Image
+
+  # A type-specific ID likely used as a database ID.
+  internalID: ID!
+  name: String
+
+  # A slug ID.
+  slug: ID!
+}
+
+type TargetSupply {
+  microfunnel: [TargetSupplyMicrofunnelItem]
+}
+
+type TargetSupplyMicrofunnelItem {
+  artist: Artist
+
+  # A list of recently sold artworks.
+  artworksConnection(
+    after: String
+    before: String
+    first: Int
+    last: Int
+
+    # Randomize the order of artworks for display purposes.
+    randomize: Boolean
+  ): ArtworkConnection
+  metadata: TargetSupplyMicrofunnelMetadata
+}
+
+type TargetSupplyMicrofunnelMetadata {
+  highestRealized: String
+  realized: String
+  recentlySoldArtworkIDs: [String]
+  roundedUniqueVisitors: String
+  roundedViews: String
+  str: String
+  uniqueVisitors: String
+  views: String
+}
+
+type TrendingArtists {
+  artists: [Artist]
+}
+
+union UnderlyingCurrentEvent = Sale | Show
+
+# Autogenerated input type of UnpublishViewingRoom
+input UnpublishViewingRoomInput {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+  viewingRoomID: ID!
+}
+
+# Autogenerated return type of UnpublishViewingRoom
+type UnpublishViewingRoomPayload {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+  viewingRoom: ViewingRoom!
+}
+
+# Autogenerated input type of UpdateAppSecondFactor
+input UpdateAppSecondFactorInput {
+  attributes: AppSecondFactorAttributes!
+
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+  secondFactorID: ID!
+}
+
+# Autogenerated return type of UpdateAppSecondFactor
+type UpdateAppSecondFactorPayload {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+  secondFactorOrErrors: AppSecondFactorOrErrorsUnion!
+}
+
+input UpdateCollectorProfileInput {
+  clientMutationId: String
+  intents: [Intents]
+  loyaltyApplicant: Boolean
+  professionalBuyer: Boolean
+  selfReportedPurchases: String
+}
+
+type UpdateCollectorProfilePayload {
+  clientMutationId: String
+  collectorLevel: Int
+  confirmedBuyerAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String
+  email: String
+
+  # A globally unique ID.
+  id: ID!
+  intents: [String]
+
+  # A type-specific ID likely used as a database ID.
+  internalID: ID!
+  loyaltyApplicantAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String
+  name: String
+  professionalBuyerAppliedAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String
+  professionalBuyerAt(
+    format: String
+
+    # A tz database time zone, otherwise falls back to `X-TIMEZONE` header
+    timezone: String
+  ): String
+  selfReportedPurchases: String
+}
+
+input UpdateConversationMutationInput {
+  clientMutationId: String
+
+  # The id of the conversation to be updated.
+  conversationId: String!
+
+  # The message id to mark as read.
+  fromLastViewedMessageId: String!
+}
+
+type UpdateConversationMutationPayload {
+  clientMutationId: String
+  conversation: Conversation
+}
+
+input UpdateMyProfileInput {
+  clientMutationId: String
+
+  # The collector level for the user
+  collectorLevel: Int
+
+  # The given email of the user.
+  email: String
+
+  # The given location of the user as structured data
+  location: EditableLocation
+
+  # The given name of the user.
+  name: String
+
+  # The given phone number of the user.
+  phone: String
+
+  # The maximum price collector has selected
+  priceRangeMax: Float
+
+  # The minimum price collector has selected
+  priceRangeMin: Int
+
+  # This user should receive lot opening notifications
+  receiveLotOpeningSoonNotification: Boolean
+
+  # This user should receive new sales notifications
+  receiveNewSalesNotification: Boolean
+
+  # This user should receive new works notifications
+  receiveNewWorksNotification: Boolean
+
+  # This user should receive outbid notifications
+  receiveOutbidNotification: Boolean
+
+  # This user should receive promotional notifications
+  receivePromotionNotification: Boolean
+
+  # This user should receive purchase notifications
+  receivePurchaseNotification: Boolean
+
+  # This user should receive sale opening/closing notifications
+  receiveSaleOpeningClosingNotification: Boolean
+}
+
+type UpdateMyProfilePayload {
+  clientMutationId: String
+  me: Me
+  user: User
+}
+
+# Autogenerated input type of UpdateSmsSecondFactor
+input UpdateSmsSecondFactorInput {
+  attributes: SmsSecondFactorAttributes!
+
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+  secondFactorID: ID!
+}
+
+# Autogenerated return type of UpdateSmsSecondFactor
+type UpdateSmsSecondFactorPayload {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+  secondFactorOrErrors: SmsSecondFactorOrErrorsUnion!
+}
+
+# Autogenerated input type of UpdateSubmissionMutation
+input UpdateSubmissionMutationInput {
+  additionalInfo: String
+  artistID: String
+  authenticityCertificate: Boolean
+  category: ConsignmentSubmissionCategoryAggregation
+
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+  currency: String
+  depth: String
+  dimensionsMetric: String
+  edition: Boolean
+  editionNumber: String
+  editionSize: Int
+  height: String
+  id: ID!
+  locationCity: String
+  locationCountry: String
+  locationState: String
+  medium: String
+  minimumPriceDollars: Int
+  provenance: String
+  signature: Boolean
+  state: ConsignmentSubmissionStateAggregation
+  title: String
+  width: String
+  year: String
+}
+
+# Autogenerated return type of UpdateSubmissionMutation
+type UpdateSubmissionMutationPayload {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+  consignmentSubmission: ConsignmentSubmission
+}
+
+# Autogenerated input type of UpdateViewingRoomArtworks
+input UpdateViewingRoomArtworksInput {
+  artworks: [ViewingRoomArtworkInput!]!
+
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+  viewingRoomID: String!
+}
+
+# Autogenerated return type of UpdateViewingRoomArtworks
+type UpdateViewingRoomArtworksPayload {
+  artworkIDs: [String!]!
+
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+}
+
+# Autogenerated input type of UpdateViewingRoom
+input UpdateViewingRoomInput {
+  attributes: ViewingRoomAttributes!
+
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+  image: ARImageInput
+  viewingRoomID: String!
+}
+
+# Autogenerated return type of UpdateViewingRoom
+type UpdateViewingRoomPayload {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+  viewingRoomOrErrors: ViewingRoomOrErrorsUnion!
+}
+
+# Autogenerated input type of UpdateViewingRoomSubsections
+input UpdateViewingRoomSubsectionsInput {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+  subsections: [ViewingRoomSubsectionInput!]!
+  viewingRoomID: ID!
+}
+
+# Autogenerated return type of UpdateViewingRoomSubsections
+type UpdateViewingRoomSubsectionsPayload {
+  # A unique identifier for the client performing the mutation.
+  clientMutationId: String
+  subsections: [ViewingRoomSubsection!]!
+}
+
+type User {
+  analytics: AnalyticsUserStats
+  cached: Int
+
+  # The given email of the user.
+  email: String!
+
+  # A globally unique ID.
+  id: ID!
+
+  # A type-specific ID likely used as a database ID.
+  internalID: ID!
+
+  # The given location of the user as structured data
+  location: Location
+
+  # The given name of the user.
+  name: String!
+
+  # The paddle number of the user
+  paddleNumber: String
+
+  # The given phone number of the user.
+  phone: String
+
+  # Pin for bidding at an auction
+  pin: String
+
+  # The price range the collector has selected
+  priceRange: String
+
+  # This user should receive lot opening notifications
+  receiveLotOpeningSoonNotification: Boolean
+
+  # This user should receive new sales notifications
+  receiveNewSalesNotification: Boolean
+
+  # This user should receive new works notifications
+  receiveNewWorksNotification: Boolean
+
+  # This user should receive outbid notifications
+  receiveOutbidNotification: Boolean
+
+  # This user should receive promotional notifications
+  receivePromotionNotification: Boolean
+
+  # This user should receive purchase notifications
+  receivePurchaseNotification: Boolean
+
+  # This user should receive sale opening/closing notifications
+  receiveSaleOpeningClosingNotification: Boolean
+
+  # Check whether a user exists by email address before creating an account.
+  userAlreadyExists: Boolean
+}
+
+# A connection to a list of items.
+type UserConnection {
+  # A list of edges.
+  edges: [UserEdge]
+  pageCursors: PageCursors!
+
+  # Information to aid in pagination.
+  pageInfo: PageInfo!
+  totalCount: Int
+}
+
+# An edge in a connection.
+type UserEdge {
+  # A cursor for use in pagination
+  cursor: String!
+
+  # The item at the end of the edge
+  node: User
+}
+
+union VanityURLEntityType = Fair | Partner
+
+# A wildcard used to support complex root queries in Relay
+type Viewer {
+  # Do not use (only used internally for stitching)
+  _do_not_use_image: Image
+
+  # An Article
+  article(
+    # The ID of the Article
+    id: String!
+  ): Article
+
+  # A list of Articles
+  articles(
+    auctionID: String
+
+    #
+    #         Only return articles matching specified ids.
+    #         Accepts list of ids.
+    #
+    ids: [String]
+    published: Boolean = true
+    showID: String
+    sort: ArticleSorts
+  ): [Article]
+
+  # An Artist
+  artist(
+    # The slug or ID of the Artist
+    id: String!
+  ): Artist
+
+  # A list of Artists
+  artists(
+    #
+    #         Only return artists matching specified ids.
+    #         Accepts list of ids.
+    #
+    ids: [String]
+    page: Int = 1
+    size: Int
+
+    #
+    #         Only return artists matching specified slugs.
+    #         Accepts list of slugs. (e.g. 'andy-warhol', 'banksy')
+    #
+    slugs: [String]
+    sort: ArtistSorts
+  ): [Artist]
+
+  # An Artwork
+  artwork(
+    # The slug or ID of the Artwork
+    id: String!
+
+    # Include unlisted artwork or not
+    includeUnlisted: Boolean
+  ): Artwork
+
+  # List of all artwork attribution classes
+  artworkAttributionClasses: [AttributionClass]
+
+  # A list of Artworks
+  artworks(
+    after: String
+    before: String
+    first: Int
+    ids: [String]
+    last: Int
+    respectParamsOrder: Boolean = false
+  ): ArtworkConnection
+    @deprecated(
+      reason: "This is only for use in resolving stitched queries, not for first-class client use."
+    )
+
+  # Artworks Elastic Search results
+  artworksConnection(
+    acquireable: Boolean
+    after: String
+    aggregationPartnerCities: [String]
+    aggregations: [ArtworkAggregation]
+    artistID: String
+    artistIDs: [String]
+    artistSeriesID: String
+    atAuction: Boolean
+    attributionClass: [String]
+    before: String
+    color: String
+    dimensionRange: String
+    excludeArtworkIDs: [String]
+    extraAggregationGeneIDs: [String]
+    first: Int
+    forSale: Boolean
+    geneID: String
+    geneIDs: [String]
+    height: String
+    includeArtworksByFollowedArtists: Boolean
+    includeMediumFilterInAggregation: Boolean
+    inquireableOnly: Boolean
+    keyword: String
+
+    # When true, will only return exact keyword match
+    keywordMatchExact: Boolean
+    last: Int
+    majorPeriods: [String]
+
+    # When true, will only return `marketable` works (not nude or provocative).
+    marketable: Boolean
+
+    # A string from the list of allocations, or * to denote all mediums
+    medium: String
+    offerable: Boolean
+    page: Int
+    partnerCities: [String]
+    partnerID: ID
+    period: String
+    periods: [String]
+    priceRange: String
+    saleID: ID
+    size: Int
+
+    # Filter results by Artwork sizes
+    sizes: [ArtworkSizes]
+    sort: String
+    tagID: String
+    width: String
+  ): FilterArtworksConnection
+
+  # A city-based entry point for local discovery
+  city(
+    # A point which will be used to locate the nearest local discovery city within a threshold
+    near: Near
+
+    # A slug for the city, conforming to Gravity's city slug naming conventions
+    slug: String
+  ): City
+
+  # A user's credit card
+  creditCard(
+    # The ID of the Credit Card
+    id: String!
+  ): CreditCard
+
+  # A Fair
+  fair(
+    # The slug or ID of the Fair
+    id: String!
+  ): Fair
+
+  # A list of Fairs
+  fairs(
+    fairOrganizerID: String
+    hasFullFeature: Boolean
+    hasHomepageSection: Boolean
+    hasListing: Boolean
+
+    #
+    #         Only return fairs matching specified ids.
+    #         Accepts list of ids.
+    #
+    ids: [String]
+    near: Near
+    page: Int
+    size: Int
+    sort: FairSorts
+    status: EventStatus
+  ): [Fair]
+
+  # A Feature
+  feature(
+    # The slug or ID of the Feature
+    id: ID
+  ): Feature
+  gene(
+    # The slug or ID of the Gene
+    id: String!
+  ): Gene
+
+  # A list of Gene Families
+  geneFamiliesConnection(
+    after: String
+    before: String
+    first: Int
+    last: Int
+  ): GeneFamilyConnection
+
+  # A list of Genes
+  genes(
+    size: Int
+
+    #
+    #         Only return genes matching specified slugs.
+    #         Accepts list of slugs.
+    #
+    slugs: [String]
+  ): [Gene]
+  highlights: Highlights
+
+  # Home screen content
+  homePage: HomePage
+  marketingCollections(
+    artistID: String
+    category: String
+    isFeaturedArtistContent: Boolean
+    randomizationSeed: String
+    showOnEditorial: Boolean
+    size: Int
+    slugs: [String!]
+  ): [MarketingCollection]
+  me: Me
+
+  # Fetches an object given its globally unique ID.
+  node(
+    # The globally unique ID of the node.
+    id: ID!
+  ): Node
+
+  # An OrderedSet
+  orderedSet(
+    # The ID of the OrderedSet
+    id: String!
+  ): OrderedSet
+
+  # A collection of OrderedSets
+  orderedSets(
+    # Key to the OrderedSet or group of OrderedSets
+    key: String!
+    public: Boolean = true
+  ): [OrderedSet]
+
+  # A Partner
+  partner(
+    # The slug or ID of the Partner
+    id: String!
+  ): Partner
+
+  # A list of Artworks for a partner
+  partnerArtworks(
+    after: String
+    before: String
+    first: Int
+    last: Int
+    partnerID: String!
+    private: Boolean
+    viewingRoomID: String
+  ): ArtworkConnection
+    @deprecated(
+      reason: "This is only for use in resolving stitched queries, not for first-class client use."
+    )
+
+  # A list of Partners
+  partnersConnection(
+    after: String
+    before: String
+    first: Int
+    ids: [String]
+    last: Int
+  ): PartnerConnection
+
+  # A Sale
+  sale(
+    # The slug or ID of the Sale
+    id: String!
+  ): Sale
+
+  # A Sale Artwork
+  saleArtwork(
+    # The slug or ID of the SaleArtwork
+    id: String!
+  ): SaleArtwork
+
+  # Sale Artworks search results
+  saleArtworksConnection(
+    after: String
+
+    # Please make sure to supply the TOTAL aggregation if you will be setting any aggregations
+    aggregations: [SaleArtworkAggregation]
+    artistIDs: [String]
+    before: String
+    estimateRange: String
+    first: Int
+    geneIDs: [String]
+
+    # When called under the Me field, this defaults to true. Otherwise it defaults to false
+    includeArtworksByFollowedArtists: Boolean
+    isAuction: Boolean
+    last: Int
+    liveSale: Boolean
+    page: Int
+    saleID: ID
+    size: Int
+    sort: String
+  ): SaleArtworksConnection
+
+  # A list of Sales
+  salesConnection(
+    after: String
+    before: String
+    first: Int
+
+    #
+    #         Only return sales matching specified ids.
+    #         Accepts list of ids.
+    #
+    ids: [String]
+
+    # Limit by auction.
+    isAuction: Boolean = true
+    last: Int
+
+    # Limit by live status.
+    live: Boolean = true
+
+    # Limit by published status.
+    published: Boolean = true
+
+    # Returns sales the user has registered for if true, returns sales the user has not registered for if false.
+    registered: Boolean
+    sort: SaleSorts
+  ): SaleConnection
+
+  # Global search
+  searchConnection(
+    after: String
+    aggregations: [SearchAggregation]
+    before: String
+
+    # Entities to include in search. Default: [ARTIST, ARTWORK].
+    entities: [SearchEntity]
+    first: Int
+    last: Int
+
+    # Mode of search to execute. Default: SITE.
+    mode: SearchMode
+
+    # If present, will be used for pagination instead of cursors.
+    page: Int
+
+    # Search query to perform. Required.
+    query: String!
+  ): SearchableConnection
+
+  # A Show
+  show(
+    # The slug or ID of the Show
+    id: String!
+  ): Show
+
+  # A list of Shows
+  showsConnection(
+    after: String
+    before: String
+    first: Int
+    ids: [String]
+    last: Int
+  ): ShowConnection
+
+  # Content for a specific page or view
+  staticContent(
+    # The slug or id for the view
+    id: String!
+  ): StaticContent
+
+  # Fields related to internal systems.
+  system: System
+  tag(
+    # The slug or ID of the Tag
+    id: String!
+  ): Tag
+  targetSupply: TargetSupply
+  user(
+    # Email to search for user by
+    email: String
+
+    # ID of the user
+    id: String
+  ): User
+
+  # A list of Users
+  usersConnection(
+    after: String
+    before: String
+    first: Int
+    ids: [String]
+    last: Int
+  ): UserConnection
+
+  # A Partner or Fair
+  vanityURLEntity(
+    # The slug or ID of the Profile to get a partner or fair for
+    id: String!
+  ): VanityURLEntityType
+  viewingRoomsConnection(
+    after: String
+    first: Int
+    partnerID: ID
+    published: Boolean = true
+    statuses: [ViewingRoomStatusEnum!]
+  ): ViewingRoomsConnection
+}
+
+# An artwork viewing room
+type ViewingRoom {
+  artworkIDs: [String!]!
+  artworksConnection(
+    after: String
+    before: String
+    first: Int
+    last: Int
+  ): ArtworkConnection
+
+  # Body copy
+  body: String
+  distanceToClose(short: Boolean! = false): String
+  distanceToOpen(short: Boolean! = false): String
+
+  # Datetime after which the viewing room is no longer viewable
+  endAt: ISO8601DateTime
+  heroImageURL: String @deprecated(reason: "Use image field instead")
+  href: String
+  image: ARImage
+
+  # Unique ID for this room
+  internalID: ID!
+
+  # Introductory paragraph
+  introStatement: String
+  partner: Partner
+  partnerArtworksConnection(
+    after: String
+    before: String
+    first: Int
+    last: Int
+  ): ArtworkConnection
+
+  # ID of the partner associated with this viewing room
+  partnerID: String!
+  published: Boolean!
+  pullQuote: String
+  slug: String!
+
+  # Datetime when the viewing room is viewable
+  startAt: ISO8601DateTime
+
+  # Calculated field to reflect visibility and state of this viewing room
+  status: String!
+  subsections: [ViewingRoomSubsection!]!
+  timeZone: String
+
+  # Viewing room name
+  title: String!
+  viewingRoomArtworks: [ViewingRoomArtwork!]!
+}
+
+# Relationship between a Viewing Room and an Artwork
+type ViewingRoomArtwork {
+  artworkID: ID!
+  internalID: ID!
+  published: Boolean!
+}
+
+# An input type for a Viewing Room artwork
+input ViewingRoomArtworkInput {
+  artworkID: ID!
+  delete: Boolean = false
+  internalID: ID
+  position: Int
+}
+
+# Basic viewing room attributes
+input ViewingRoomAttributes {
+  body: String
+
+  # Datetime (in UTC) when Viewing Room closes
+  endAt: ISO8601DateTime
+  introStatement: String
+  pullQuote: String
+
+  # Datetime (in UTC) when Viewing Room opens
+  startAt: ISO8601DateTime
+
+  # Time zone (tz database format, e.g. America/New_York) in which start_at/end_at attributes were input
+  timeZone: String
+
+  # Title
+  title: String
+}
+
+# The connection type for ViewingRoom.
+type ViewingRoomConnection {
+  # A list of edges.
+  edges: [ViewingRoomEdge]
+
+  # A list of nodes.
+  nodes: [ViewingRoom]
+
+  # Information to aid in pagination.
+  pageInfo: PageInfo!
+
+  # Total count of matching nodes, before pagination
+  totalCount: Int!
+}
+
+# An edge in a connection.
+type ViewingRoomEdge {
+  # A cursor for use in pagination.
+  cursor: String!
+
+  # The item at the end of the edge.
+  node: ViewingRoom
+}
+
+# A viewing room or errors object
+union ViewingRoomOrErrorsUnion = Errors | ViewingRoom
+
+# The connection type for ViewingRoom.
+type ViewingRoomsConnection {
+  # A list of edges.
+  edges: [ViewingRoomsEdge]
+
+  # A list of nodes.
+  nodes: [ViewingRoom]
+  pageCursors: PageCursors
+
+  # Information to aid in pagination.
+  pageInfo: PageInfo!
+  totalCount: Int
+  totalPages: Int
+}
+
+# An edge in a connection.
+type ViewingRoomsEdge {
+  # A cursor for use in pagination.
+  cursor: String!
+
+  # The item at the end of the edge.
+  node: ViewingRoom
+}
+
+enum ViewingRoomStatusEnum {
+  closed
+  draft
+  live
+  scheduled
+}
+
+# Title, image, text, and caption for a viewing room section
+type ViewingRoomSubsection {
+  # Body copy
+  body: String
+
+  # Image caption
+  caption: String
+  image: ARImage
+
+  # Image URL
+  imageURL: String
+
+  # Unique ID for this subsection
+  internalID: ID!
+
+  # Section header
+  title: String
+}
+
+# Attributes for creating or updating a viewing room subsection
+input ViewingRoomSubsectionAttributes {
+  body: String
+  caption: String
+  title: String
+}
+
+# An input type for the creation of viewing room subsections
+input ViewingRoomSubsectionInput {
+  attributes: ViewingRoomSubsectionAttributes
+
+  # If true, delete this subsection from the database
+  delete: Boolean = false
+  image: ARImageInput
+  internalID: ID
+}
+
+type YearRange {
+  # The last year of the year range
+  endAt: Int
+
+  # The first year of the year range
+  startAt: Int
+}
diff --git a/package.json b/package.json
index 28f88f8..a149d8e 100644
--- a/package.json
+++ b/package.json
@@ -4,14 +4,17 @@
   "license": "MIT",
   "version": "1.0.0",
   "scripts": {
-    "dev": "next dev",
     "build": "next build",
-    "start": "next start",
-    "type-check": "tsc --pretty --noEmit",
+    "dev": "next dev",
     "format": "prettier --write .",
     "lint": "eslint . --ext ts --ext tsx --ext js",
+    "relay:causality": "relay-compiler --src ./src --schema ./gql/causality.graphql --extensions ts tsx --artifactDirectory './gql/__generated__' --exclude '**/.next/**' '**/node_modules/**' '**/test/**'  '**/__generated__/**' --exclude '**/gql/**'  ",
+    "relay:metaphysics": "echo 'hmmm... how to get 2 relay compilers running nicely together ... '",
+    "watch": "concurrently --kill-others 'yarn type-check --watch' 'yarn relay:causality --watch' 'yarn relay:metaphysics'",
+    "start": "next start",
+    "test-all": "yarn lint && yarn type-check && yarn test",
     "test": "jest",
-    "test-all": "yarn lint && yarn type-check && yarn test"
+    "type-check": "tsc --pretty --noEmit"
   },
   "husky": {
     "hooks": {
@@ -32,6 +35,10 @@
     "next": "latest",
     "react": "^16.13.1",
     "react-dom": "^16.13.1",
+    "react-relay": "^10.0.1",
+    "react-relay-network-modern": "^5.0.1",
+    "react-relay-network-modern-ssr": "^1.4.0",
+    "relay-hooks": "^3.7.0",
     "styled-components": "^4",
     "swr": "^0.3.8"
   },
@@ -40,17 +47,23 @@
     "@types/jest": "^25.1.4",
     "@types/node": "^13.9.5",
     "@types/react": "^16.9.27",
+    "@types/react-relay": "^7.0.17",
     "@typescript-eslint/eslint-plugin": "^2.25.0",
     "@typescript-eslint/parser": "^2.25.0",
     "babel-jest": "^25.2.3",
+    "babel-plugin-relay": "^10.0.1",
+    "concurrently": "^5.3.0",
     "eslint": "^6.8.0",
     "eslint-config-prettier": "^6.10.1",
     "eslint-plugin-react": "^7.19.0",
+    "graphql": "^15.4.0",
     "husky": "^4.2.3",
     "jest": "^25.2.3",
     "jest-watch-typeahead": "^0.5.0",
     "lint-staged": "^10.0.10",
     "prettier": "^2.0.2",
-    "typescript": "^3.8.3"
+    "relay-compiler": "^10.0.1",
+    "typescript": "^3.8.3",
+    "watchman": "^1.0.0"
   }
 }
diff --git a/src/lib/auth/user.ts b/src/lib/auth/user.ts
index 4420f20..8b35833 100644
--- a/src/lib/auth/user.ts
+++ b/src/lib/auth/user.ts
@@ -10,10 +10,12 @@ export interface UserSessionData {
 export async function findUser({ username, password, otp }) {
   const accessToken = await getGravityAccessToken({ username, password, otp })
   const userProfile = await getUserProfile(accessToken)
+  // const causalityJwt = await getCausalityJwt(accessToken)
 
   return {
     ...userProfile,
     accessToken,
+    // causalityJwt,
   }
 }
 
diff --git a/src/lib/causality/createEnvironment/client.ts b/src/lib/causality/createEnvironment/client.ts
new file mode 100644
index 0000000..cef4e4b
--- /dev/null
+++ b/src/lib/causality/createEnvironment/client.ts
@@ -0,0 +1,44 @@
+import {
+  RelayNetworkLayer,
+  cacheMiddleware,
+  authMiddleware,
+  urlMiddleware,
+} from 'react-relay-network-modern/node8'
+import RelaySSR from 'react-relay-network-modern-ssr/node8/client'
+import { Environment, RecordSource, Store } from 'relay-runtime'
+import { fetchJwt } from './fetchJwt'
+
+const source = new RecordSource()
+const store = new Store(source)
+
+let storeEnvironment = null
+
+export default {
+  createEnvironment: (relayData) => {
+    if (storeEnvironment) return storeEnvironment
+
+    storeEnvironment = new Environment({
+      store,
+
+      network: new RelayNetworkLayer([
+        urlMiddleware({
+          url: `${process.env.NEXT_PUBLIC_CAUSALITY_URL}/graphql`,
+          method: 'POST',
+          headers: {
+            Authorization: `Bearer ${process.env.NEXT_PUBLIC_CAUSALITY_TEMP_JWT}`,
+            'content-type': 'application/json',
+          },
+        }),
+        cacheMiddleware({
+          size: 100,
+          ttl: 60 * 1000,
+        }),
+        new RelaySSR(relayData).getMiddleware({
+          lookup: false,
+        }),
+      ]),
+    })
+
+    return storeEnvironment
+  },
+}
diff --git a/src/lib/causality/createEnvironment/fetchJwt.ts b/src/lib/causality/createEnvironment/fetchJwt.ts
new file mode 100644
index 0000000..c4b7a55
--- /dev/null
+++ b/src/lib/causality/createEnvironment/fetchJwt.ts
@@ -0,0 +1,10 @@
+import { metaphysicsFetcher } from 'lib/auth/hooks/metaphysics'
+
+export const fetchJwt = (): Promise<string> =>
+  metaphysicsFetcher(
+    `
+     query client_JwtQuery {
+       causalityJwt
+     }
+   `
+  ).then((res) => res.data.causalityJwt)
diff --git a/src/lib/causality/createEnvironment/index.ts b/src/lib/causality/createEnvironment/index.ts
new file mode 100644
index 0000000..217178c
--- /dev/null
+++ b/src/lib/causality/createEnvironment/index.ts
@@ -0,0 +1,5 @@
+export const { initEnvironment, createEnvironment } = (typeof window ===
+'undefined'
+  ? require('./server')
+  : require('./client')
+).default
diff --git a/src/lib/causality/createEnvironment/server.ts b/src/lib/causality/createEnvironment/server.ts
new file mode 100644
index 0000000..314062e
--- /dev/null
+++ b/src/lib/causality/createEnvironment/server.ts
@@ -0,0 +1,46 @@
+import {
+  authMiddleware,
+  RelayNetworkLayer,
+  urlMiddleware,
+} from 'react-relay-network-modern/node8'
+import RelaySSR from 'react-relay-network-modern-ssr/node8/server'
+import { Network, Environment, RecordSource, Store } from 'relay-runtime'
+// import { fetchJwt } from './fetchJwt'
+
+export default {
+  initEnvironment: () => {
+    const source = new RecordSource()
+    const store = new Store(source)
+    const relaySSR = new RelaySSR()
+
+    return {
+      relaySSR,
+
+      environment: new Environment({
+        store,
+        network: new RelayNetworkLayer([
+          urlMiddleware({
+            url: `${process.env.NEXT_PUBLIC_CAUSALITY_URL}/graphql`,
+            method: 'POST',
+            headers: {
+              // FIXME: This hard-coded admin jwt cannot be used on client, how to add it from the user? Set it in cookie with access token?
+              Authorization: `Bearer ${process.env.NEXT_PUBLIC_CAUSALITY_TEMP_JWT}`,
+              'content-type': 'application/json',
+            },
+          }),
+
+          relaySSR.getMiddleware(),
+        ]),
+      }),
+    }
+  },
+  createEnvironment: (relayData) => {
+    const source = new RecordSource()
+    const store = new Store(source)
+
+    return new Environment({
+      store,
+      network: Network.create(() => relayData?.[0][1] || Promise.resolve()),
+    })
+  },
+}
diff --git a/src/lib/causality/index.ts b/src/lib/causality/index.ts
new file mode 100644
index 0000000..5e84192
--- /dev/null
+++ b/src/lib/causality/index.ts
@@ -0,0 +1,21 @@
+import { GraphQLTaggedNode } from 'react-relay'
+import { RenderProps, useQuery } from 'relay-hooks'
+import { OperationType } from 'relay-runtime'
+
+export async function useCausality<RP extends OperationType>({
+  jwt = null,
+  query,
+  variables = {},
+}: {
+  jwt: string | null
+  query: GraphQLTaggedNode
+  variables: object
+}): Promise<RenderProps<RP>> {
+  if (!jwt) {
+    jwt = await getJwt()
+  }
+
+  return useQuery(query, variables, {})
+}
+
+const getJwt = () => 'foo'
diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx
index da92e14..ba6060f 100644
--- a/src/pages/_app.tsx
+++ b/src/pages/_app.tsx
@@ -1,10 +1,23 @@
 import { Theme } from '@artsy/palette'
+import { createEnvironment } from 'lib/causality/createEnvironment'
+import React from 'react'
+import { RelayEnvironmentProvider } from 'relay-hooks'
 import '../styles.css'
 
 export default function App({ Component, pageProps }) {
+  console.log({ pageProps })
   return (
-    <Theme>
-      <Component {...pageProps} />
-    </Theme>
+    /* Our causality relay environment */
+    /*
+     */
+    <RelayEnvironmentProvider
+      environment={createEnvironment(pageProps.relayData)}
+    >
+      <Theme>
+        <Component {...pageProps} />
+      </Theme>
+    </RelayEnvironmentProvider>
+    /*
+     */
   )
 }
diff --git a/src/pages/auctions/[id].tsx b/src/pages/auctions/[id].tsx
index b93e3c7..c5914dd 100644
--- a/src/pages/auctions/[id].tsx
+++ b/src/pages/auctions/[id].tsx
@@ -1,10 +1,47 @@
 import React from 'react'
 import { metaphysicsFetcher } from 'lib/auth/hooks/metaphysics'
+import { graphql } from 'react-relay'
+import { useQuery } from 'relay-hooks'
+import { Box, Flex, Text } from '@artsy/palette'
+import { Layout } from 'components/Layout'
+
+const auctionDataQuery = graphql`
+  query Id_auctionDataQuery($saleId: ID!) {
+    sale(id: $saleId) {
+      lots {
+        id
+      }
+    }
+  }
+`
+
+const Debug = ({ value }): JSX.Element => (
+  <Flex borderRadius={4} style={{ overflow: 'scroll' }} px={1} bg="black10">
+    <Text height="300px" as="pre" fontFamily="courier">
+      {JSON.stringify(value, null, 2)}
+    </Text>
+  </Flex>
+)
 
 export default function Auction(props) {
-  console.log(props)
+  console.warn('FFFF ' + process.env.NEXT_PUBLIC_CAUSALITY_TEMP_JWT)
+  if (!props?.sale?.internalID) return null
+  console.log({ props })
+  const { error, props: auctionData } = useQuery(auctionDataQuery, {
+    saleId: props.sale.internalID,
+  })
+  if (error) return <div>{error.message}</div>
+
+  if (!auctionData) return <div>Loading</div>
+  // console.log({ auctionData })
+  // debugger
   return (
-    <h1>test</h1>
+    <Layout>
+      <Box p={4}>
+        <h1>test</h1>
+        <Debug value={{ props }} />
+      </Box>
+    </Layout>
   )
 }
 
@@ -101,9 +138,9 @@ export const getStaticProps = async ({ params: { id } }) => {
       // notFound: !res.status(200)
     }
   } catch (error) {
-    console.error(error)
+    console.error({ error })
     return {
-      notFound: true
+      notFound: true,
     }
   }
   // const auction = await res.json()
diff --git a/yarn.lock b/yarn.lock
index 5cceb43..593e4e6 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -115,7 +115,7 @@
     semver "^5.4.1"
     source-map "^0.5.0"
 
-"@babel/core@^7.1.0", "@babel/core@^7.7.5":
+"@babel/core@^7.0.0", "@babel/core@^7.1.0", "@babel/core@^7.7.5":
   version "7.12.3"
   resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.3.tgz#1b436884e1e3bff6fb1328dc02b208759de92ad8"
   integrity sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==
@@ -137,7 +137,7 @@
     semver "^5.4.1"
     source-map "^0.5.0"
 
-"@babel/generator@^7.12.1", "@babel/generator@^7.12.5", "@babel/generator@^7.7.7":
+"@babel/generator@^7.12.1", "@babel/generator@^7.12.5", "@babel/generator@^7.5.0", "@babel/generator@^7.7.7":
   version "7.12.5"
   resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.5.tgz#a2c50de5c8b6d708ab95be5e6053936c1884a4de"
   integrity sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A==
@@ -373,7 +373,7 @@
     chalk "^2.0.0"
     js-tokens "^4.0.0"
 
-"@babel/parser@^7.1.0", "@babel/parser@^7.10.4", "@babel/parser@^7.12.3", "@babel/parser@^7.12.5", "@babel/parser@^7.7.7":
+"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.10.4", "@babel/parser@^7.12.3", "@babel/parser@^7.12.5", "@babel/parser@^7.7.7":
   version "7.12.5"
   resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.5.tgz#b4af32ddd473c0bfa643bd7ff0728b8e71b81ea0"
   integrity sha512-FVM6RZQ0mn2KCf1VUED7KepYeUWoVShczewOCfm3nzoBybaih51h+sYVVGthW9M6lPByEPTQf+xm27PBdlpwmQ==
@@ -395,7 +395,7 @@
     "@babel/helper-create-class-features-plugin" "^7.10.4"
     "@babel/helper-plugin-utils" "^7.10.4"
 
-"@babel/plugin-proposal-class-properties@^7.10.4":
+"@babel/plugin-proposal-class-properties@^7.0.0", "@babel/plugin-proposal-class-properties@^7.10.4":
   version "7.12.1"
   resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz#a082ff541f2a29a4821065b8add9346c0c16e5de"
   integrity sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==
@@ -476,7 +476,7 @@
     "@babel/plugin-syntax-object-rest-spread" "^7.8.0"
     "@babel/plugin-transform-parameters" "^7.10.4"
 
-"@babel/plugin-proposal-object-rest-spread@^7.11.0":
+"@babel/plugin-proposal-object-rest-spread@^7.0.0", "@babel/plugin-proposal-object-rest-spread@^7.11.0":
   version "7.12.1"
   resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz#def9bd03cea0f9b72283dac0ec22d289c7691069"
   integrity sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==
@@ -532,7 +532,7 @@
   dependencies:
     "@babel/helper-plugin-utils" "^7.8.0"
 
-"@babel/plugin-syntax-class-properties@^7.10.4", "@babel/plugin-syntax-class-properties@^7.8.3":
+"@babel/plugin-syntax-class-properties@^7.0.0", "@babel/plugin-syntax-class-properties@^7.10.4", "@babel/plugin-syntax-class-properties@^7.8.3":
   version "7.12.1"
   resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz#bcb297c5366e79bebadef509549cd93b04f19978"
   integrity sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA==
@@ -553,6 +553,13 @@
   dependencies:
     "@babel/helper-plugin-utils" "^7.8.3"
 
+"@babel/plugin-syntax-flow@^7.0.0", "@babel/plugin-syntax-flow@^7.12.1":
+  version "7.12.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.12.1.tgz#a77670d9abe6d63e8acadf4c31bb1eb5a506bbdd"
+  integrity sha512-1lBLLmtxrwpm4VKmtVFselI/P3pX+G63fAtUUt6b2Nzgao77KNDwyuRt90Mj2/9pKobtt68FdvjfqohZjg/FCA==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.10.4"
+
 "@babel/plugin-syntax-import-meta@^7.8.3":
   version "7.10.4"
   resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51"
@@ -574,7 +581,7 @@
   dependencies:
     "@babel/helper-plugin-utils" "^7.10.4"
 
-"@babel/plugin-syntax-jsx@^7.12.1":
+"@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.12.1":
   version "7.12.1"
   resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz#9d9d357cc818aa7ae7935917c1257f67677a0926"
   integrity sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==
@@ -602,7 +609,7 @@
   dependencies:
     "@babel/helper-plugin-utils" "^7.10.4"
 
-"@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3":
+"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3":
   version "7.8.3"
   resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871"
   integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==
@@ -637,7 +644,7 @@
   dependencies:
     "@babel/helper-plugin-utils" "^7.10.4"
 
-"@babel/plugin-transform-arrow-functions@^7.10.4":
+"@babel/plugin-transform-arrow-functions@^7.0.0", "@babel/plugin-transform-arrow-functions@^7.10.4":
   version "7.12.1"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz#8083ffc86ac8e777fbe24b5967c4b2521f3cb2b3"
   integrity sha512-5QB50qyN44fzzz4/qxDPQMBCTHgxg3n0xRBLJUmBlLoU/sFvxVWGZF/ZUfMVDQuJUKXaBhbupxIzIfZ6Fwk/0A==
@@ -653,21 +660,21 @@
     "@babel/helper-plugin-utils" "^7.10.4"
     "@babel/helper-remap-async-to-generator" "^7.12.1"
 
-"@babel/plugin-transform-block-scoped-functions@^7.10.4":
+"@babel/plugin-transform-block-scoped-functions@^7.0.0", "@babel/plugin-transform-block-scoped-functions@^7.10.4":
   version "7.12.1"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz#f2a1a365bde2b7112e0a6ded9067fdd7c07905d9"
   integrity sha512-5OpxfuYnSgPalRpo8EWGPzIYf0lHBWORCkj5M0oLBwHdlux9Ri36QqGW3/LR13RSVOAoUUMzoPI/jpE4ABcHoA==
   dependencies:
     "@babel/helper-plugin-utils" "^7.10.4"
 
-"@babel/plugin-transform-block-scoping@^7.10.4":
+"@babel/plugin-transform-block-scoping@^7.0.0", "@babel/plugin-transform-block-scoping@^7.10.4":
   version "7.12.1"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.1.tgz#f0ee727874b42a208a48a586b84c3d222c2bbef1"
   integrity sha512-zJyAC9sZdE60r1nVQHblcfCj29Dh2Y0DOvlMkcqSo0ckqjiCwNiUezUKw+RjOCwGfpLRwnAeQ2XlLpsnGkvv9w==
   dependencies:
     "@babel/helper-plugin-utils" "^7.10.4"
 
-"@babel/plugin-transform-classes@^7.10.4":
+"@babel/plugin-transform-classes@^7.0.0", "@babel/plugin-transform-classes@^7.10.4":
   version "7.12.1"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz#65e650fcaddd3d88ddce67c0f834a3d436a32db6"
   integrity sha512-/74xkA7bVdzQTBeSUhLLJgYIcxw/dpEpCdRDiHgPJ3Mv6uC11UhjpOhl72CgqbBCmt1qtssCyB2xnJm1+PFjog==
@@ -681,14 +688,14 @@
     "@babel/helper-split-export-declaration" "^7.10.4"
     globals "^11.1.0"
 
-"@babel/plugin-transform-computed-properties@^7.10.4":
+"@babel/plugin-transform-computed-properties@^7.0.0", "@babel/plugin-transform-computed-properties@^7.10.4":
   version "7.12.1"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz#d68cf6c9b7f838a8a4144badbe97541ea0904852"
   integrity sha512-vVUOYpPWB7BkgUWPo4C44mUQHpTZXakEqFjbv8rQMg7TC6S6ZhGZ3otQcRH6u7+adSlE5i0sp63eMC/XGffrzg==
   dependencies:
     "@babel/helper-plugin-utils" "^7.10.4"
 
-"@babel/plugin-transform-destructuring@^7.10.4":
+"@babel/plugin-transform-destructuring@^7.0.0", "@babel/plugin-transform-destructuring@^7.10.4":
   version "7.12.1"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz#b9a570fe0d0a8d460116413cb4f97e8e08b2f847"
   integrity sha512-fRMYFKuzi/rSiYb2uRLiUENJOKq4Gnl+6qOv5f8z0TZXg3llUwUhsNNwrwaT/6dUhJTzNpBr+CUvEWBtfNY1cw==
@@ -718,14 +725,22 @@
     "@babel/helper-builder-binary-assignment-operator-visitor" "^7.10.4"
     "@babel/helper-plugin-utils" "^7.10.4"
 
-"@babel/plugin-transform-for-of@^7.10.4":
+"@babel/plugin-transform-flow-strip-types@^7.0.0":
+  version "7.12.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.12.1.tgz#8430decfa7eb2aea5414ed4a3fa6e1652b7d77c4"
+  integrity sha512-8hAtkmsQb36yMmEtk2JZ9JnVyDSnDOdlB+0nEGzIDLuK4yR3JcEjfuFPYkdEPSh8Id+rAMeBEn+X0iVEyho6Hg==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.10.4"
+    "@babel/plugin-syntax-flow" "^7.12.1"
+
+"@babel/plugin-transform-for-of@^7.0.0", "@babel/plugin-transform-for-of@^7.10.4":
   version "7.12.1"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz#07640f28867ed16f9511c99c888291f560921cfa"
   integrity sha512-Zaeq10naAsuHo7heQvyV0ptj4dlZJwZgNAtBYBnu5nNKJoW62m0zKcIEyVECrUKErkUkg6ajMy4ZfnVZciSBhg==
   dependencies:
     "@babel/helper-plugin-utils" "^7.10.4"
 
-"@babel/plugin-transform-function-name@^7.10.4":
+"@babel/plugin-transform-function-name@^7.0.0", "@babel/plugin-transform-function-name@^7.10.4":
   version "7.12.1"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz#2ec76258c70fe08c6d7da154003a480620eba667"
   integrity sha512-JF3UgJUILoFrFMEnOJLJkRHSk6LUSXLmEFsA23aR2O5CSLUxbeUX1IZ1YQ7Sn0aXb601Ncwjx73a+FVqgcljVw==
@@ -733,14 +748,14 @@
     "@babel/helper-function-name" "^7.10.4"
     "@babel/helper-plugin-utils" "^7.10.4"
 
-"@babel/plugin-transform-literals@^7.10.4":
+"@babel/plugin-transform-literals@^7.0.0", "@babel/plugin-transform-literals@^7.10.4":
   version "7.12.1"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz#d73b803a26b37017ddf9d3bb8f4dc58bfb806f57"
   integrity sha512-+PxVGA+2Ag6uGgL0A5f+9rklOnnMccwEBzwYFL3EUaKuiyVnUipyXncFcfjSkbimLrODoqki1U9XxZzTvfN7IQ==
   dependencies:
     "@babel/helper-plugin-utils" "^7.10.4"
 
-"@babel/plugin-transform-member-expression-literals@^7.10.4":
+"@babel/plugin-transform-member-expression-literals@^7.0.0", "@babel/plugin-transform-member-expression-literals@^7.10.4":
   version "7.12.1"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz#496038602daf1514a64d43d8e17cbb2755e0c3ad"
   integrity sha512-1sxePl6z9ad0gFMB9KqmYofk34flq62aqMt9NqliS/7hPEpURUCMbyHXrMPlo282iY7nAvUB1aQd5mg79UD9Jg==
@@ -766,7 +781,7 @@
     "@babel/helper-simple-access" "^7.10.4"
     babel-plugin-dynamic-import-node "^2.3.3"
 
-"@babel/plugin-transform-modules-commonjs@^7.10.4":
+"@babel/plugin-transform-modules-commonjs@^7.0.0", "@babel/plugin-transform-modules-commonjs@^7.10.4":
   version "7.12.1"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz#fa403124542636c786cf9b460a0ffbb48a86e648"
   integrity sha512-dY789wq6l0uLY8py9c1B48V8mVL5gZh/+PQ5ZPrylPYsnAvnEMjqsUXkuoDVPeVK+0VyGar+D08107LzDQ6pag==
@@ -809,7 +824,7 @@
   dependencies:
     "@babel/helper-plugin-utils" "^7.10.4"
 
-"@babel/plugin-transform-object-super@^7.10.4":
+"@babel/plugin-transform-object-super@^7.0.0", "@babel/plugin-transform-object-super@^7.10.4":
   version "7.12.1"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz#4ea08696b8d2e65841d0c7706482b048bed1066e"
   integrity sha512-AvypiGJH9hsquNUn+RXVcBdeE3KHPZexWRdimhuV59cSoOt5kFBmqlByorAeUlGG2CJWd0U+4ZtNKga/TB0cAw==
@@ -817,21 +832,21 @@
     "@babel/helper-plugin-utils" "^7.10.4"
     "@babel/helper-replace-supers" "^7.12.1"
 
-"@babel/plugin-transform-parameters@^7.10.4", "@babel/plugin-transform-parameters@^7.12.1":
+"@babel/plugin-transform-parameters@^7.0.0", "@babel/plugin-transform-parameters@^7.10.4", "@babel/plugin-transform-parameters@^7.12.1":
   version "7.12.1"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz#d2e963b038771650c922eff593799c96d853255d"
   integrity sha512-xq9C5EQhdPK23ZeCdMxl8bbRnAgHFrw5EOC3KJUsSylZqdkCaFEXxGSBuTSObOpiiHHNyb82es8M1QYgfQGfNg==
   dependencies:
     "@babel/helper-plugin-utils" "^7.10.4"
 
-"@babel/plugin-transform-property-literals@^7.10.4":
+"@babel/plugin-transform-property-literals@^7.0.0", "@babel/plugin-transform-property-literals@^7.10.4":
   version "7.12.1"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz#41bc81200d730abb4456ab8b3fbd5537b59adecd"
   integrity sha512-6MTCR/mZ1MQS+AwZLplX4cEySjCpnIF26ToWo942nqn8hXSm7McaHQNeGx/pt7suI1TWOWMfa/NgBhiqSnX0cQ==
   dependencies:
     "@babel/helper-plugin-utils" "^7.10.4"
 
-"@babel/plugin-transform-react-display-name@^7.10.4":
+"@babel/plugin-transform-react-display-name@^7.0.0", "@babel/plugin-transform-react-display-name@^7.10.4":
   version "7.12.1"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.1.tgz#1cbcd0c3b1d6648c55374a22fc9b6b7e5341c00d"
   integrity sha512-cAzB+UzBIrekfYxyLlFqf/OagTvHLcVBb5vpouzkYkBclRPraiygVnafvAoipErZLI8ANv8Ecn6E/m5qPXD26w==
@@ -861,7 +876,7 @@
   dependencies:
     "@babel/helper-plugin-utils" "^7.10.4"
 
-"@babel/plugin-transform-react-jsx@^7.10.4":
+"@babel/plugin-transform-react-jsx@^7.0.0", "@babel/plugin-transform-react-jsx@^7.10.4":
   version "7.12.5"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.12.5.tgz#39ede0e30159770561b6963be143e40af3bde00c"
   integrity sha512-2xkcPqqrYiOQgSlM/iwto1paPijjsDbUynN13tI6bosDz/jOW3CRzYguIE8wKX32h+msbBM22Dv5fwrFkUOZjQ==
@@ -903,14 +918,14 @@
     resolve "^1.8.1"
     semver "^5.5.1"
 
-"@babel/plugin-transform-shorthand-properties@^7.10.4":
+"@babel/plugin-transform-shorthand-properties@^7.0.0", "@babel/plugin-transform-shorthand-properties@^7.10.4":
   version "7.12.1"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.1.tgz#0bf9cac5550fce0cfdf043420f661d645fdc75e3"
   integrity sha512-GFZS3c/MhX1OusqB1MZ1ct2xRzX5ppQh2JU1h2Pnfk88HtFTM+TWQqJNfwkmxtPQtb/s1tk87oENfXJlx7rSDw==
   dependencies:
     "@babel/helper-plugin-utils" "^7.10.4"
 
-"@babel/plugin-transform-spread@^7.11.0":
+"@babel/plugin-transform-spread@^7.0.0", "@babel/plugin-transform-spread@^7.11.0":
   version "7.12.1"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.1.tgz#527f9f311be4ec7fdc2b79bb89f7bf884b3e1e1e"
   integrity sha512-vuLp8CP0BE18zVYjsEBZ5xoCecMK6LBMMxYzJnh01rxQRvhNhH1csMMmBfNo5tGpGO+NhdSNW2mzIvBu3K1fng==
@@ -926,7 +941,7 @@
     "@babel/helper-plugin-utils" "^7.10.4"
     "@babel/helper-regex" "^7.10.4"
 
-"@babel/plugin-transform-template-literals@^7.10.4":
+"@babel/plugin-transform-template-literals@^7.0.0", "@babel/plugin-transform-template-literals@^7.10.4":
   version "7.12.1"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.1.tgz#b43ece6ed9a79c0c71119f576d299ef09d942843"
   integrity sha512-b4Zx3KHi+taXB1dVRBhVJtEPi9h1THCeKmae2qP0YdUHIFhVjtpqqNfxeVAa1xeHVhAy4SbHxEwx5cltAu5apw==
@@ -1085,7 +1100,7 @@
   dependencies:
     regenerator-runtime "^0.13.4"
 
-"@babel/runtime@^7.0.0", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.12.5", "@babel/runtime@^7.3.1", "@babel/runtime@^7.8.4":
+"@babel/runtime@^7.0.0", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.12.5", "@babel/runtime@^7.3.1", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4":
   version "7.12.5"
   resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.5.tgz#410e7e487441e1b360c29be715d870d9b985882e"
   integrity sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==
@@ -1426,6 +1441,14 @@
   dependencies:
     mkdirp "^1.0.4"
 
+"@restart/hooks@^0.3.1":
+  version "0.3.25"
+  resolved "https://registry.yarnpkg.com/@restart/hooks/-/hooks-0.3.25.tgz#11004139ad1c70d2f5965a8939dcb5aeb96aa652"
+  integrity sha512-m2v3N5pxTsIiSH74/sb1yW8D9RxkJidGW+5Mfwn/lHb2QzhZNlaU1su7abSyT9EGf0xS/0waLjrf7/XxQHUk7w==
+  dependencies:
+    lodash "^4.17.15"
+    lodash-es "^4.17.15"
+
 "@sinonjs/commons@^1.7.0":
   version "1.8.1"
   resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.1.tgz#e7df00f98a203324f6dc7cc606cad9d4a8ab2217"
@@ -1672,7 +1695,15 @@
   resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7"
   integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==
 
-"@types/react@^16.9.27":
+"@types/react-relay@^7.0.17":
+  version "7.0.17"
+  resolved "https://registry.yarnpkg.com/@types/react-relay/-/react-relay-7.0.17.tgz#83f6b85c41b5fd3bb27d04d759fa4c0e4dd6a8d4"
+  integrity sha512-cJqOFIbp3M3/QkRpxlL4pwWRWB0lPGHevJFW8unuebkkITre8ptgknkGhAKe5IlA6ENTRJqVQXMuNdyLxl+0cQ==
+  dependencies:
+    "@types/react" "*"
+    "@types/relay-runtime" "*"
+
+"@types/react@*", "@types/react@^16.9.27":
   version "16.9.56"
   resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.56.tgz#ea25847b53c5bec064933095fc366b1462e2adf0"
   integrity sha512-gIkl4J44G/qxbuC6r2Xh+D3CGZpJ+NdWTItAPmZbR5mUS+JQ8Zvzpl0ea5qT/ZT3ZNTUcDKUVqV3xBE8wv/DyQ==
@@ -1680,6 +1711,11 @@
     "@types/prop-types" "*"
     csstype "^3.0.2"
 
+"@types/relay-runtime@*":
+  version "10.0.10"
+  resolved "https://registry.yarnpkg.com/@types/relay-runtime/-/relay-runtime-10.0.10.tgz#b7c2ed282c62d7291cfb662b0e940ca4e193be4b"
+  integrity sha512-mVB6a63uzZ0PRu19A4WiGFUFww8u7cjTE6HHoKy94pUzRfQ/l3qsfjgJlzr7fA/HCM0I4spPpaUunDbp83N9uQ==
+
 "@types/stack-utils@^1.0.1":
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e"
@@ -2272,6 +2308,22 @@ babel-plugin-jest-hoist@^25.5.0:
     "@babel/types" "^7.3.3"
     "@types/babel__traverse" "^7.0.6"
 
+babel-plugin-macros@^2.0.0:
+  version "2.8.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz#0f958a7cc6556b1e65344465d99111a1e5e10138"
+  integrity sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==
+  dependencies:
+    "@babel/runtime" "^7.7.2"
+    cosmiconfig "^6.0.0"
+    resolve "^1.12.0"
+
+babel-plugin-relay@^10.0.1:
+  version "10.0.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-relay/-/babel-plugin-relay-10.0.1.tgz#7e0e12768018ed48f22c623cc1db456989c92647"
+  integrity sha512-0tNZFLVitUbNIHb/PuLYCqW3IvxQK8m5MomrOd5fRy4ljG86fV0KLARjedUQhwRQf32ELU7ODgXFazLza4yZYQ==
+  dependencies:
+    babel-plugin-macros "^2.0.0"
+
 "babel-plugin-styled-components@>= 1", babel-plugin-styled-components@^1.10.0:
   version "1.11.1"
   resolved "https://registry.yarnpkg.com/babel-plugin-styled-components/-/babel-plugin-styled-components-1.11.1.tgz#5296a9e557d736c3186be079fff27c6665d63d76"
@@ -2287,6 +2339,11 @@ babel-plugin-syntax-jsx@6.18.0, babel-plugin-syntax-jsx@^6.18.0:
   resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946"
   integrity sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=
 
+babel-plugin-syntax-trailing-function-commas@^7.0.0-beta.0:
+  version "7.0.0-beta.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz#aa213c1435e2bffeb6fca842287ef534ad05d5cf"
+  integrity sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==
+
 babel-plugin-transform-define@2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/babel-plugin-transform-define/-/babel-plugin-transform-define-2.0.0.tgz#79c3536635f899aabaf830b194b25519465675a4"
@@ -2317,6 +2374,39 @@ babel-preset-current-node-syntax@^0.1.2:
     "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
     "@babel/plugin-syntax-optional-chaining" "^7.8.3"
 
+babel-preset-fbjs@^3.3.0:
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/babel-preset-fbjs/-/babel-preset-fbjs-3.3.0.tgz#a6024764ea86c8e06a22d794ca8b69534d263541"
+  integrity sha512-7QTLTCd2gwB2qGoi5epSULMHugSVgpcVt5YAeiFO9ABLrutDQzKfGwzxgZHLpugq8qMdg/DhRZDZ5CLKxBkEbw==
+  dependencies:
+    "@babel/plugin-proposal-class-properties" "^7.0.0"
+    "@babel/plugin-proposal-object-rest-spread" "^7.0.0"
+    "@babel/plugin-syntax-class-properties" "^7.0.0"
+    "@babel/plugin-syntax-flow" "^7.0.0"
+    "@babel/plugin-syntax-jsx" "^7.0.0"
+    "@babel/plugin-syntax-object-rest-spread" "^7.0.0"
+    "@babel/plugin-transform-arrow-functions" "^7.0.0"
+    "@babel/plugin-transform-block-scoped-functions" "^7.0.0"
+    "@babel/plugin-transform-block-scoping" "^7.0.0"
+    "@babel/plugin-transform-classes" "^7.0.0"
+    "@babel/plugin-transform-computed-properties" "^7.0.0"
+    "@babel/plugin-transform-destructuring" "^7.0.0"
+    "@babel/plugin-transform-flow-strip-types" "^7.0.0"
+    "@babel/plugin-transform-for-of" "^7.0.0"
+    "@babel/plugin-transform-function-name" "^7.0.0"
+    "@babel/plugin-transform-literals" "^7.0.0"
+    "@babel/plugin-transform-member-expression-literals" "^7.0.0"
+    "@babel/plugin-transform-modules-commonjs" "^7.0.0"
+    "@babel/plugin-transform-object-super" "^7.0.0"
+    "@babel/plugin-transform-parameters" "^7.0.0"
+    "@babel/plugin-transform-property-literals" "^7.0.0"
+    "@babel/plugin-transform-react-display-name" "^7.0.0"
+    "@babel/plugin-transform-react-jsx" "^7.0.0"
+    "@babel/plugin-transform-shorthand-properties" "^7.0.0"
+    "@babel/plugin-transform-spread" "^7.0.0"
+    "@babel/plugin-transform-template-literals" "^7.0.0"
+    babel-plugin-syntax-trailing-function-commas "^7.0.0-beta.0"
+
 babel-preset-jest@^25.5.0:
   version "25.5.0"
   resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-25.5.0.tgz#c1d7f191829487a907764c65307faa0e66590b49"
@@ -2870,6 +2960,15 @@ clipboard@^1.5.5:
     select "^1.1.2"
     tiny-emitter "^2.0.0"
 
+cliui@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5"
+  integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==
+  dependencies:
+    string-width "^3.1.0"
+    strip-ansi "^5.2.0"
+    wrap-ansi "^5.1.0"
+
 cliui@^6.0.0:
   version "6.0.0"
   resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1"
@@ -3023,6 +3122,21 @@ concat-stream@^1.5.0:
     readable-stream "^2.2.2"
     typedarray "^0.0.6"
 
+concurrently@^5.3.0:
+  version "5.3.0"
+  resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-5.3.0.tgz#7500de6410d043c912b2da27de3202cb489b1e7b"
+  integrity sha512-8MhqOB6PWlBfA2vJ8a0bSFKATOdWlHiQlk11IfmQBPaHVP8oP2gsh2MObE6UR3hqDHqvaIvLTyceNW6obVuFHQ==
+  dependencies:
+    chalk "^2.4.2"
+    date-fns "^2.0.1"
+    lodash "^4.17.15"
+    read-pkg "^4.0.1"
+    rxjs "^6.5.2"
+    spawn-command "^0.0.2-1"
+    supports-color "^6.1.0"
+    tree-kill "^1.2.2"
+    yargs "^13.3.0"
+
 console-browserify@^1.1.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336"
@@ -3085,6 +3199,11 @@ core-js-pure@^3.0.0:
   resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.7.0.tgz#28a57c861d5698e053f0ff36905f7a3301b4191e"
   integrity sha512-EZD2ckZysv8MMt4J6HSvS9K2GdtlZtdBncKAmF9lr2n0c9dJUaUN88PSTjvgwCgQPWKTkERXITgS6JJRAnljtg==
 
+core-js@3:
+  version "3.7.0"
+  resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.7.0.tgz#b0a761a02488577afbf97179e4681bf49568520f"
+  integrity sha512-NwS7fI5M5B85EwpWuIwJN4i/fbisQUwLwiSNUWeXlkAZ0sbBjLEvLvFLf1uzAUV66PcEPt4xCGCmOZSxVf3xzA==
+
 core-js@^1.0.0:
   version "1.2.7"
   resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636"
@@ -3100,6 +3219,17 @@ core-util-is@1.0.2, core-util-is@~1.0.0:
   resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
   integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
 
+cosmiconfig@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982"
+  integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==
+  dependencies:
+    "@types/parse-json" "^4.0.0"
+    import-fresh "^3.1.0"
+    parse-json "^5.0.0"
+    path-type "^4.0.0"
+    yaml "^1.7.2"
+
 cosmiconfig@^7.0.0:
   version "7.0.0"
   resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.0.tgz#ef9b44d773959cae63ddecd122de23853b60f8d3"
@@ -3359,6 +3489,11 @@ data-urls@^1.1.0:
     whatwg-mimetype "^2.2.0"
     whatwg-url "^7.0.0"
 
+date-fns@^2.0.1:
+  version "2.16.1"
+  resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.16.1.tgz#05775792c3f3331da812af253e1a935851d3834b"
+  integrity sha512-sAJVKx/FqrLYHAQeN7VpJrPhagZc9R4ImZIWYRFZaaohR3KzmuK88touwsSwSVT8Qcbd4zoDsnGfX4GFB4imyQ==
+
 debounce@^1.2.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.0.tgz#44a540abc0ea9943018dc0eaa95cce87f65cd131"
@@ -4109,6 +4244,11 @@ extglob@^2.0.4:
     snapdragon "^0.8.1"
     to-regex "^3.0.1"
 
+extract-files@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/extract-files/-/extract-files-5.0.1.tgz#c9492a8410be643e260a376f0151361993d5f659"
+  integrity sha512-qRW6y9eKF0VbCyOoOEtFhzJ3uykAw8GKwQVXyAIqwocyEWW4m+v+evec34RwtUkkxxHh7NKBLJ6AnXM8W4dH5w==
+
 extsprintf@1.3.0:
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
@@ -4141,6 +4281,11 @@ fb-watchman@^2.0.0:
   dependencies:
     bser "2.1.1"
 
+fbjs-css-vars@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz#216551136ae02fe255932c3ec8775f18e2c078b8"
+  integrity sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==
+
 fbjs@^0.8.0:
   version "0.8.17"
   resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd"
@@ -4154,6 +4299,20 @@ fbjs@^0.8.0:
     setimmediate "^1.0.5"
     ua-parser-js "^0.7.18"
 
+fbjs@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-1.0.0.tgz#52c215e0883a3c86af2a7a776ed51525ae8e0a5a"
+  integrity sha512-MUgcMEJaFhCaF1QtWGnmq9ZDRAzECTCRAF7O6UZIlAlkTs1SasiX9aP0Iw7wfD2mJ7wDTNfg2w7u5fSCwJk1OA==
+  dependencies:
+    core-js "^2.4.1"
+    fbjs-css-vars "^1.0.0"
+    isomorphic-fetch "^2.1.1"
+    loose-envify "^1.0.0"
+    object-assign "^4.1.0"
+    promise "^7.1.1"
+    setimmediate "^1.0.5"
+    ua-parser-js "^0.7.18"
+
 figgy-pudding@^3.5.1:
   version "3.5.2"
   resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e"
@@ -4486,6 +4645,11 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.2.4
   resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb"
   integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==
 
+graphql@^15.4.0:
+  version "15.4.0"
+  resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.4.0.tgz#e459dea1150da5a106486ba7276518b5295a4347"
+  integrity sha512-EB3zgGchcabbsU9cFe1j+yxdzKQKAbGUWRb13DsrsMN1yyfmmIq+2+L5MqVWcDCE4V89R5AyUOi7sMOGxdsYtA==
+
 growly@^1.3.0:
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081"
@@ -4709,7 +4873,12 @@ ignore@^4.0.6:
   resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
   integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
 
-import-fresh@^3.0.0, import-fresh@^3.2.1:
+immutable@~3.7.6:
+  version "3.7.6"
+  resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.7.6.tgz#13b4d3cb12befa15482a26fe1b2ebae640071e4b"
+  integrity sha1-E7TTyxK++hVIKib+Gy665kAHHks=
+
+import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1:
   version "3.2.2"
   resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.2.tgz#fc129c160c5d68235507f4331a6baad186bdbc3e"
   integrity sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw==
@@ -4876,7 +5045,7 @@ is-ci@^2.0.0:
   dependencies:
     ci-info "^2.0.0"
 
-is-core-module@^2.0.0:
+is-core-module@^2.0.0, is-core-module@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.1.0.tgz#a4cc031d9b1aca63eecbd18a650e13cb4eeab946"
   integrity sha512-YcV7BgVMRFRua2FqQzKtTDMz8iCuLEyGKjr70q8Zm1yy2qKcurbFEd79PAdHV77oL3NrAaOVQIbMmiHQCHB7ZA==
@@ -5589,7 +5758,7 @@ jsesc@~0.5.0:
   resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
   integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=
 
-json-parse-better-errors@^1.0.2:
+json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
   integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==
@@ -5800,6 +5969,11 @@ locate-path@^5.0.0:
   dependencies:
     p-locate "^4.1.0"
 
+lodash-es@^4.17.15:
+  version "4.17.15"
+  resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.15.tgz#21bd96839354412f23d7a10340e5eac6ee455d78"
+  integrity sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ==
+
 lodash.debounce@^4.0.8:
   version "4.0.8"
   resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
@@ -6392,7 +6566,7 @@ normalize-html-whitespace@1.0.0:
   resolved "https://registry.yarnpkg.com/normalize-html-whitespace/-/normalize-html-whitespace-1.0.0.tgz#5e3c8e192f1b06c3b9eee4b7e7f28854c7601e34"
   integrity sha512-9ui7CGtOOlehQu0t/OhhlmDyc71mKVlv+4vF+me4iZLPrNtRL2xoquEdfZxasC/bdQi/Hr3iTrpyRKIG+ocabA==
 
-normalize-package-data@^2.5.0:
+normalize-package-data@^2.3.2, normalize-package-data@^2.5.0:
   version "2.5.0"
   resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
   integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==
@@ -6438,6 +6612,11 @@ npmlog@^4.0.1, npmlog@^4.1.2:
     gauge "~2.7.3"
     set-blocking "~2.0.0"
 
+nullthrows@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/nullthrows/-/nullthrows-1.1.1.tgz#7818258843856ae971eae4208ad7d7eb19a431b1"
+  integrity sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==
+
 number-is-nan@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
@@ -6656,6 +6835,14 @@ parse-asn1@^5.0.0, parse-asn1@^5.1.5:
     pbkdf2 "^3.0.3"
     safe-buffer "^5.1.1"
 
+parse-json@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0"
+  integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=
+  dependencies:
+    error-ex "^1.3.1"
+    json-parse-better-errors "^1.0.1"
+
 parse-json@^5.0.0:
   version "5.1.0"
   resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.1.0.tgz#f96088cdf24a8faa9aea9a009f2d9d942c999646"
@@ -6747,6 +6934,11 @@ picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1:
   resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad"
   integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==
 
+pify@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
+  integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=
+
 pify@^4.0.1:
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231"
@@ -7243,6 +7435,29 @@ react-refresh@0.8.3:
   resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.8.3.tgz#721d4657672d400c5e3c75d063c4a85fb2d5d68f"
   integrity sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg==
 
+react-relay-network-modern-ssr@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/react-relay-network-modern-ssr/-/react-relay-network-modern-ssr-1.4.0.tgz#a5e4b60e69e14769c7266a1a0f5002430c815fe1"
+  integrity sha512-sCIiwjzDPV9eBPOb7VcT/dmZkwrqcNpAK5eHkwjvC3Xw+RShtgB/uCSVgCUzMZpOR8iUSkzaceC/HMZdnKxF3w==
+
+react-relay-network-modern@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/react-relay-network-modern/-/react-relay-network-modern-5.0.1.tgz#bf2e900828289ada5c94e83b25a415e40447c1c0"
+  integrity sha512-zo5wePzKIYEZ8uzbO4LAUAOGJuNlvWAxmcpV0TJKa1iimtspSEOA34VnAAdHLpcbBx0Mj7KSa9dV390p411mqg==
+  dependencies:
+    core-js "3"
+    extract-files "^5.0.1"
+
+react-relay@^10.0.1:
+  version "10.0.1"
+  resolved "https://registry.yarnpkg.com/react-relay/-/react-relay-10.0.1.tgz#7b7bf7dd9752165ab99ae0302db4b3e56c143970"
+  integrity sha512-zgafqWphSGFPSJ/h23zPpFGZ4tzKyj8eQPLTeZEwdbtmqAFsAIjPS0zSCo2DcsaeylEgSrQDShttpKYyEUtRAg==
+  dependencies:
+    "@babel/runtime" "^7.0.0"
+    fbjs "^1.0.0"
+    nullthrows "^1.1.1"
+    relay-runtime "10.0.1"
+
 react-remove-scroll-bar@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.1.0.tgz#edafe9b42a42c0dad9bdd10712772a1f9a39d7b9"
@@ -7297,6 +7512,15 @@ read-pkg-up@^7.0.1:
     read-pkg "^5.2.0"
     type-fest "^0.8.1"
 
+read-pkg@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-4.0.1.tgz#963625378f3e1c4d48c85872b5a6ec7d5d093237"
+  integrity sha1-ljYlN48+HE1IyFhytabsfV0JMjc=
+  dependencies:
+    normalize-package-data "^2.3.2"
+    parse-json "^4.0.0"
+    pify "^3.0.0"
+
 read-pkg@^5.2.0:
   version "5.2.0"
   resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc"
@@ -7441,6 +7665,44 @@ regjsparser@^0.6.4:
   dependencies:
     jsesc "~0.5.0"
 
+relay-compiler@^10.0.1:
+  version "10.0.1"
+  resolved "https://registry.yarnpkg.com/relay-compiler/-/relay-compiler-10.0.1.tgz#d3029a5121cad52e1e55073210365b827cee5f3b"
+  integrity sha512-hrTqh81XXxPB4EgvxPmvojICr0wJnRoumxOsMZnS9dmhDHSqcBAT7+C3+rdGm5sSdNH8mbMcZM7YSPDh8ABxQw==
+  dependencies:
+    "@babel/core" "^7.0.0"
+    "@babel/generator" "^7.5.0"
+    "@babel/parser" "^7.0.0"
+    "@babel/runtime" "^7.0.0"
+    "@babel/traverse" "^7.0.0"
+    "@babel/types" "^7.0.0"
+    babel-preset-fbjs "^3.3.0"
+    chalk "^4.0.0"
+    fb-watchman "^2.0.0"
+    fbjs "^1.0.0"
+    glob "^7.1.1"
+    immutable "~3.7.6"
+    nullthrows "^1.1.1"
+    relay-runtime "10.0.1"
+    signedsource "^1.0.0"
+    yargs "^15.3.1"
+
+relay-hooks@^3.7.0:
+  version "3.7.0"
+  resolved "https://registry.yarnpkg.com/relay-hooks/-/relay-hooks-3.7.0.tgz#4ed95494c5bfb82142507d1dc66d856288bc7e2e"
+  integrity sha512-tZnS2rjeOvWpMAKIGS0w09InX//yigtyNg2ic43aAAZaLnjnp6iCJyn7HXwPx3SO/5tCymjgF/hMBicipZJnTw==
+  dependencies:
+    "@restart/hooks" "^0.3.1"
+    fbjs "^1.0.0"
+
+relay-runtime@10.0.1:
+  version "10.0.1"
+  resolved "https://registry.yarnpkg.com/relay-runtime/-/relay-runtime-10.0.1.tgz#c83bd7e6e37234ece2a62a254e37dd199a4f74f9"
+  integrity sha512-sPYiuosq+5gQ7zXs2EKg2O8qRSsF8vmMYo6SIHEi4juBLg1HrdTEvqcaNztc2ZFmUc4vYZpTbbS4j/TZCtHuyA==
+  dependencies:
+    "@babel/runtime" "^7.0.0"
+    fbjs "^1.0.0"
+
 remove-trailing-separator@^1.0.1:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
@@ -7559,6 +7821,14 @@ resolve@^1.10.0, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.3.2, resolve@^1.8.
     is-core-module "^2.0.0"
     path-parse "^1.0.6"
 
+resolve@^1.12.0:
+  version "1.19.0"
+  resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c"
+  integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==
+  dependencies:
+    is-core-module "^2.1.0"
+    path-parse "^1.0.6"
+
 restore-cursor@^3.1.0:
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e"
@@ -7631,7 +7901,7 @@ run-queue@^1.0.0, run-queue@^1.0.3:
   dependencies:
     aproba "^1.1.1"
 
-rxjs@^6.6.0, rxjs@^6.6.3:
+rxjs@^6.5.2, rxjs@^6.6.0, rxjs@^6.6.3:
   version "6.6.3"
   resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.3.tgz#8ca84635c4daa900c0d3967a6ee7ac60271ee552"
   integrity sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==
@@ -7856,6 +8126,11 @@ signal-exit@^3.0.0, signal-exit@^3.0.2:
   resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
   integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==
 
+signedsource@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/signedsource/-/signedsource-1.0.0.tgz#1ddace4981798f93bd833973803d80d52e93ad6a"
+  integrity sha1-HdrOSYF5j5O9gzlzgD2A1S6TrWo=
+
 simple-concat@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f"
@@ -8009,6 +8284,11 @@ sourcemap-codec@^1.4.4:
   resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4"
   integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==
 
+spawn-command@^0.0.2-1:
+  version "0.0.2-1"
+  resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2-1.tgz#62f5e9466981c1b796dc5929937e11c9c6921bd0"
+  integrity sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A=
+
 spdx-correct@^3.0.0:
   version "3.1.1"
   resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9"
@@ -8176,7 +8456,7 @@ string-width@^1.0.1:
     is-fullwidth-code-point "^2.0.0"
     strip-ansi "^4.0.0"
 
-string-width@^3.0.0:
+string-width@^3.0.0, string-width@^3.1.0:
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961"
   integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==
@@ -8266,7 +8546,7 @@ strip-ansi@^4.0.0:
   dependencies:
     ansi-regex "^3.0.0"
 
-strip-ansi@^5.1.0, strip-ansi@^5.2.0:
+strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0:
   version "5.2.0"
   resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae"
   integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==
@@ -8630,6 +8910,11 @@ traverse@0.6.6:
   resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.6.tgz#cbdf560fd7b9af632502fed40f918c157ea97137"
   integrity sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=
 
+tree-kill@^1.2.2:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc"
+  integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==
+
 trunc-html@^1.1.2:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/trunc-html/-/trunc-html-1.1.2.tgz#1e97d51f67d470b67662b1a670e6d0ea7a8edafe"
@@ -8954,6 +9239,11 @@ warning@^4.0.3:
   dependencies:
     loose-envify "^1.0.0"
 
+watchman@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/watchman/-/watchman-1.0.0.tgz#a800f815957952ed9229c54610fb4a26897d2c21"
+  integrity sha512-f7sP6DSVQzNUAXIBctvYyJyq6/j/FtWoEn6yh/Ot/E14a3am7JMH0tygWt6iE+T+DT+BNOUAT3hM/gZ7W9Ycmw==
+
 watchpack-chokidar2@^2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz#38500072ee6ece66f3769936950ea1771be1c957"
@@ -9096,6 +9386,15 @@ worker-farm@^1.7.0:
   dependencies:
     errno "~0.1.7"
 
+wrap-ansi@^5.1.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09"
+  integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==
+  dependencies:
+    ansi-styles "^3.2.0"
+    string-width "^3.0.0"
+    strip-ansi "^5.0.0"
+
 wrap-ansi@^6.2.0:
   version "6.2.0"
   resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53"
@@ -9162,11 +9461,19 @@ yallist@^4.0.0:
   resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
   integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
 
-yaml@^1.10.0:
+yaml@^1.10.0, yaml@^1.7.2:
   version "1.10.0"
   resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e"
   integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==
 
+yargs-parser@^13.1.2:
+  version "13.1.2"
+  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38"
+  integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==
+  dependencies:
+    camelcase "^5.0.0"
+    decamelize "^1.2.0"
+
 yargs-parser@^18.1.2:
   version "18.1.3"
   resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0"
@@ -9175,6 +9482,22 @@ yargs-parser@^18.1.2:
     camelcase "^5.0.0"
     decamelize "^1.2.0"
 
+yargs@^13.3.0:
+  version "13.3.2"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd"
+  integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==
+  dependencies:
+    cliui "^5.0.0"
+    find-up "^3.0.0"
+    get-caller-file "^2.0.1"
+    require-directory "^2.1.1"
+    require-main-filename "^2.0.0"
+    set-blocking "^2.0.0"
+    string-width "^3.0.0"
+    which-module "^2.0.0"
+    y18n "^4.0.0"
+    yargs-parser "^13.1.2"
+
 yargs@^15.3.1:
   version "15.4.1"
   resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8"