/*
 * Copyright 2010 Google Inc.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package com.google.gwt.i18n.client.impl.cldr;

// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA

/**
 * Implementation of DateTimeFormatInfo for the "en_Dsrt" locale.
 */
public class DateTimeFormatInfoImpl_en_Dsrt extends DateTimeFormatInfoImpl_en {

  @Override
  public String[] ampms() {
    return new String[] {
        "𐐈𐐣",
        "𐐑𐐣"
    };
  }

  @Override
  public String[] erasFull() {
    return new String[] {
        "𐐒𐐲𐑁𐐬𐑉 𐐗𐑉𐐴𐑅𐐻",
        "𐐈𐑌𐐬 𐐔𐐱𐑋𐐮𐑌𐐨"
    };
  }

  @Override
  public String[] erasShort() {
    return new String[] {
        "𐐒𐐗",
        "𐐈𐐔"
    };
  }

  @Override
  public int firstDayOfTheWeek() {
    return 1;
  }

  @Override
  public String[] monthsFull() {
    return new String[] {
        "𐐖𐐰𐑌𐐷𐐭𐐯𐑉𐐨",
        "𐐙𐐯𐐺𐑉𐐭𐐯𐑉𐐨",
        "𐐣𐐪𐑉𐐽",
        "𐐁𐐹𐑉𐐮𐑊",
        "𐐣𐐩",
        "𐐖𐐭𐑌",
        "𐐖𐐭𐑊𐐴",
        "𐐂𐑀𐐲𐑅𐐻",
        "𐐝𐐯𐐹𐐻𐐯𐑋𐐺𐐲𐑉",
        "𐐉𐐿𐐻𐐬𐐺𐐲𐑉",
        "𐐤𐐬𐑂𐐯𐑋𐐺𐐲𐑉",
        "𐐔𐐨𐑅𐐯𐑋𐐺𐐲𐑉"
    };
  }

  @Override
  public String[] monthsNarrow() {
    return new String[] {
        "𐐖",
        "𐐙",
        "𐐣",
        "𐐁",
        "𐐣",
        "𐐖",
        "𐐖",
        "𐐂",
        "𐐝",
        "𐐉",
        "𐐤",
        "𐐔"
    };
  }

  @Override
  public String[] monthsShort() {
    return new String[] {
        "𐐖𐐰𐑌",
        "𐐙𐐯𐐺",
        "𐐣𐐪𐑉",
        "𐐁𐐹𐑉",
        "𐐣𐐩",
        "𐐖𐐭𐑌",
        "𐐖𐐭𐑊",
        "𐐂𐑀",
        "𐐝𐐯𐐹",
        "𐐉𐐿𐐻",
        "𐐤𐐬𐑂",
        "𐐔𐐨𐑅"
    };
  }

  @Override
  public String[] quartersFull() {
    return new String[] {
        "1𐑅𐐻 𐐿𐐶𐐪𐑉𐐻𐐲𐑉",
        "2𐑌𐐼 𐐿𐐶𐐪𐑉𐐻𐐲𐑉",
        "3𐑉𐐼 𐐿𐐶𐐪𐑉𐐻𐐲𐑉",
        "4𐑉𐑃 𐐿𐐶𐐪𐑉𐐻𐐲𐑉"
    };
  }

  @Override
  public String[] quartersShort() {
    return new String[] {
        "𐐗1",
        "𐐗2",
        "𐐗3",
        "𐐗4"
    };
  }

  @Override
  public String[] weekdaysFull() {
    return new String[] {
        "𐐝𐐲𐑌𐐼𐐩",
        "𐐣𐐲𐑌𐐼𐐩",
        "𐐓𐐭𐑆𐐼𐐩",
        "𐐎𐐯𐑌𐑆𐐼𐐩",
        "𐐛𐐲𐑉𐑆𐐼𐐩",
        "𐐙𐑉𐐴𐐼𐐩",
        "𐐝𐐰𐐻𐐲𐑉𐐼𐐩"
    };
  }

  @Override
  public String[] weekdaysNarrow() {
    return new String[] {
        "𐐝",
        "𐐣",
        "𐐓",
        "𐐎",
        "𐐛",
        "𐐙",
        "𐐝"
    };
  }

  @Override
  public String[] weekdaysShort() {
    return new String[] {
        "𐐝𐐲𐑌",
        "𐐣𐐲𐑌",
        "𐐓𐐭𐑆",
        "𐐎𐐯𐑌",
        "𐐛𐐲𐑉",
        "𐐙𐑉𐐴",
        "𐐝𐐰𐐻"
    };
  }
}
