/*
 * Copyright 2012 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
//  cldrVersion=21.0
//  number=$Revision: 6546 $
//  date=$Date: 2012-02-07 13:32:35 -0500 (Tue, 07 Feb 2012) $
//  type=root

/**
 * Implementation of DateTimeFormatInfo for the "shi_Tfng" locale.
 */
public class DateTimeFormatInfoImpl_shi_Tfng extends DateTimeFormatInfoImpl_shi {

  @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 6;
  }

  @Override
  public String formatYearQuarterFull() {
    return "ⴰⴽQQQQ y";
  }

  @Override
  public String formatYearQuarterShort() {
    return "ⴰⴽQ y";
  }

  @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[] weekdaysShort() {
    return new String[] {
        "ⴰⵙⴰ",
        "ⴰⵢⵏ",
        "ⴰⵙⵉ",
        "ⴰⴽⵕ",
        "ⴰⴽⵡ",
        "ⴰⵙⵉⵎ",
        "ⴰⵙⵉⴹ"
    };
  }

  @Override
  public int weekendEnd() {
    return 6;
  }

  @Override
  public int weekendStart() {
    return 5;
  }
}
