text:
#include "unicode/utypes.h"

#if !UCONFIG_NO_FORMATTING

#include "unicode/simpletz.h"
#include "unicode/smpdtfmt.h"
#include "unicode/strenum.h"
#include "tzregts.h"
#include "calregts.h"
#include "cmemory.h"

// *****************************************************************************
// class TimeZoneRegressionTest
// *****************************************************************************
/* length of an array */
#define ARRAY_LENGTH(array) (sizeof(array)/sizeof(array[0]))
#define CASE(id,test) case id: name = #test; if (exec) { logln(#test "---"); logln((UnicodeString)""); test(); } break

void
TimeZoneRegressionTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ )
{
    // if (exec) logln((UnicodeString)"TestSuite NumberFormatRegressionTest");
    switch (index) {

        CASE(0, Test4052967);
        CASE(1, Test4073209);
        CASE(2, Test4073215);
        CASE(3, Test4084933);
        CASE(4, Test4096952);
        CASE(5, Test4109314);
        CASE(6, Test4126678);
        CASE(7, Test4151406);
        CASE(8, Test4151429);
        CASE(9, Test4154537);
        CASE(10, Test4154542);
        CASE(11, Test4154650);
        CASE(12, Test4154525);
        CASE(13, Test4162593);
        CASE(14, TestJ186);
        CASE(15, TestJ449);
        CASE(16, TestJDK12API);
        CASE(17, Test4176686);
        CASE(18, Test4184229);
        default: name = ""; break;
    }
}

UBool
TimeZoneRegressionTest::failure(UErrorCode status, const char* msg)
{
    if(U_FAILURE(status)) {
        errln(UnicodeString("FAIL: ") + msg + " failed, error " + u_errorName(status));
        return TRUE;
    }

    return FALSE;
}

/**
 * @bug 4052967
 */
void TimeZoneRegressionTest:: Test4052967() {
    // {sfb} not applicable in C++ ?
    /*logln("*** CHECK TIMEZONE AGAINST HOST OS SETTING ***");
    logln("user.timezone:" + System.getProperty("user.timezone", "<not set>"));
    logln(new Date().toString());
    logln("*** THE RESULTS OF THIS TEST MUST BE VERIFIED MANUALLY ***");*/
}

/**
 * @bug 4073209
 */
void TimeZoneRegressionTest:: Test4073209() {
    TimeZone *z1 = TimeZone::createTimeZone("PST");
    TimeZone *z2 = TimeZone::createTimeZone("PST");
    if (z1 == z2)
        errln("Fail: TimeZone should return clones");
    delete z1;
    delete z2;
}

UDate TimeZoneRegressionTest::findTransitionBinary(const SimpleTimeZone& tz, UDate min, UDate max) {
    UErrorCode status = U_ZERO_ERROR;
    UBool startsInDST = tz.inDaylightTime(min, status);
    if (failure(status, "SimpleTimeZone::inDaylightTime")) return 0;
    if (tz.inDaylightTime(max, status) == startsInDST) {
        logln((UnicodeString)"Error: inDaylightTime() != " + ((!startsInDST)?"TRUE":"FALSE"));
        return 0;
    }
    if (failure(status, "SimpleTimeZone::inDaylightTime")) return 0;
    while ((max - min) > 100) { // Min accuracy in ms
        UDate mid = (min + max) / 2;
        if (tz.inDaylightTime(mid, status) == startsInDST) {
            min = mid;
        } else {
            max = mid;
        }
        if (failure(status, "SimpleTimeZone::inDaylightTime")) return 0;
    }
    return (min + max) / 2;
}

UDate TimeZoneRegressionTest::findTransitionStepwise(const SimpleTimeZone& tz, UDate min, UDate max) {
    UErrorCode status = U_ZERO_ERROR;
    UBool startsInDST = tz.inDaylightTime(min, status);
    if (failure(status, "SimpleTimeZone::inDaylightTime")) return 0;
    while (min < max) {
        if (tz.inDaylightTime(min, status) != startsInDST) {
            return min;
        }
        if (failure(status, "SimpleTimeZone::inDaylightTime")) return 0;
        min += (UDate)24*60*60*1000; // one day
    }
    return 0;
}

/**
 * @bug 4073215
 */
// {sfb} will this work using a Calendar?
void TimeZoneRegressionTest:: Test4073215()
{
    UErrorCode status = U_ZERO_ERROR;
    UnicodeString str, str2;
    SimpleTimeZone *z = new SimpleTimeZone(0, "GMT");
    if (z->useDaylightTime())
        errln("Fail: Fix test to start with non-DST zone");
    z->setStartRule(UCAL_FEBRUARY, 1, UCAL_SUNDAY, 0, status);
    failure(status, "z->setStartRule()");
    z->setEndRule(UCAL_MARCH, -1, UCAL_SUNDAY, 0, status);
    failure(status, "z->setStartRule()");
    if (!z->useDaylightTime())
        errln("Fail: DST not active");

    GregorianCalendar cal(1997, UCAL_JANUARY, 31, status);
    if(U_FAILURE(status)) {
      dataerrln("Error creating calendar %s", u_errorName(status));
      return;
    }
    failure(status, "new GregorianCalendar");
    cal.adoptTimeZone(z);

    SimpleDateFormat sdf((UnicodeString)"E d MMM yyyy G HH:mm", status);
    if(U_FAILURE(status)) {
      errcheckln(status, "Error creating date format %s", u_errorName(status));
      return;
    }
    sdf.setCalendar(cal);
    failure(status, "new SimpleDateFormat");

    UDate jan31, mar1, mar31;

    UBool indt = z->inDaylightTime(jan31=cal.getTime(status), status);
    failure(status, "inDaylightTime or getTime call on Jan 31");
    if (indt) {
        errln("Fail: Jan 31 inDaylightTime=TRUE, exp FALSE");
    }
    cal.set(1997, UCAL_MARCH, 1);
    indt = z->inDaylightTime(mar1=cal.getTime(status), status);
    failure(status, "inDaylightTime or getTime call on Mar 1");
    if (!indt) {
        UnicodeString str;
        sdf.format(cal.getTime(status), str);
        failure(status, "getTime");
        errln((UnicodeString)"Fail: " + str + " inDaylightTime=FALSE, exp TRUE");
    }
    cal.set(1997, UCAL_MARCH, 31);
    indt = z->inDaylightTime(mar31=cal.getTime(status), status);
    failure(status, "inDaylightTime or getTime call on Mar 31");
    if (indt) {
        errln("Fail: Mar 31 inDaylightTime=TRUE, exp FALSE");
    }

    /*
    cal.set(1997, Calendar::DECEMBER, 31);
    UDate dec31 = cal.getTime(status);
    failure(status, "getTime");
    UDate trans = findTransitionStepwise(*z, jan31, dec31);
    logln((UnicodeString)"Stepwise from " +
          sdf.format(jan31, str.remove()) + "; transition at " +
          (trans?sdf.format(trans, str2.remove()):(UnicodeString)"NONE"));
    trans = findTransitionStepwise(*z, mar1, dec31);
    logln((UnicodeString)"Stepwise from " +
          sdf.format(mar1, str.remove()) + "; transition at " +
          (trans?sdf.format(trans, str2.remove()):(UnicodeString)"NONE"));
    trans = findTransitionStepwise(*z, mar31, dec31);
    logln((UnicodeString)"Stepwise from " +
          sdf.format(mar31, str.remove()) + "; transition at " +
          (trans?sdf.format(trans, str2.remove()):(UnicodeString)"NONE"));
    */
}

/**
 * @bug 4084933
 * The expected behavior of TimeZone around the boundaries is:
 * (Assume transition time of 2:00 AM)
 *    day of onset 1:59 AM STD  = display name 1:59 AM ST
 *                 2:00 AM STD  = display name 3:00 AM DT
 *    day of end   0:59 AM STD  = display name 1:59 AM DT
 *                 1:00 AM STD  = display name 1:00 AM ST
 */
void TimeZoneRegressionTest:: Test4084933() {
    UErrorCode status = U_ZERO_ERROR;
    TimeZone *tz = TimeZone::createTimeZone("PST");

    int32_t offset1 = tz->getOffset(1,
        1997, UCAL_OCTOBER, 26, UCAL_SUNDAY, (2*60*60*1000), status);
    int32_t offset2 = tz->getOffset(1,
        1997, UCAL_OCTOBER, 26, UCAL_SUNDAY, (2*60*60*1000)-1, status);

    int32_t offset3 = tz->getOffset(1,
        1997, UCAL_OCTOBER, 26, UCAL_SUNDAY, (1*60*60*1000), status);
    int32_t offset4 = tz->getOffset(1,
        1997, UCAL_OCTOBER, 26, UCAL_SUNDAY, (1*60*60*1000)-1, status);

    /*
     *  The following was added just for consistency.  It shows that going *to* Daylight
     *  Savings Time (PDT) does work at 2am.
     */
    int32_t offset5 = tz->getOffset(1,
        1997, UCAL_APRIL, 6, UCAL_SUNDAY, (2*60*60*1000), status);
    int32_t offset6 = tz->getOffset(1,
        1997, UCAL_APRIL, 6, UCAL_SUNDAY, (2*60*60*1000)-1, status);
    int32_t offset5a = tz->getOffset(1,
        1997, UCAL_APRIL, 6, UCAL_SUNDAY, (3*60*60*1000), status);
    int32_t offset6a = tz->getOffset(1,
        1997, UCAL_APRIL, 6, UCAL_SUNDAY, (3*60*60*1000)-1, status);
    int32_t offset7 = tz->getOffset(1,
        1997, UCAL_APRIL, 6, UCAL_SUNDAY, (1*60*60*1000), status);
    int32_t offset8 = tz->getOffset(1,
        1997, UCAL_APRIL, 6, UCAL_SUNDAY, (1*60*60*1000)-1, status);
    int32_t SToffset = (int32_t)(-8 * 60*60*1000L);
    int32_t DToffset = (int32_t)(-7 * 60*60*1000L);

#define ERR_IF_FAIL(x) if(x) { dataerrln("FAIL: TimeZone misbehaving - %s", #x); }

        ERR_IF_FAIL(U_FAILURE(status))
        ERR_IF_FAIL(offset1 != SToffset)
        ERR_IF_FAIL(offset2 != SToffset)
        ERR_IF_FAIL(offset3 != SToffset)
        ERR_IF_FAIL(offset4 != DToffset)
        ERR_IF_FAIL(offset5 != DToffset)
        ERR_IF_FAIL(offset6 != SToffset)
        ERR_IF_FAIL(offset5a != DToffset)
        ERR_IF_FAIL(offset6a != DToffset)
        ERR_IF_FAIL(offset7 != SToffset)
        ERR_IF_FAIL(offset8 != SToffset)

#undef ERR_IF_FAIL

    delete tz;
}

/**
 * @bug 4096952
 */
void TimeZoneRegressionTest:: Test4096952() {
    // {sfb} serialization not applicable
/*
    UnicodeString ZONES [] = { UnicodeString("GMT"), UnicodeString("MET"), UnicodeString("IST") };
    UBool pass = TRUE;
    //try {
        for (int32_t i=0; i < ZONES.length; ++i) {
            TimeZone *zone = TimeZone::createTimeZone(ZONES[i]);
            UnicodeString id;
            if (zone->getID(id) != ZONES[i])
                errln("Fail: Test broken; zones not instantiating");

            ByteArrayOutputStream baos;
            ObjectOutputStream ostream =
                new ObjectOutputStream(baos = new
                                       ByteArrayOutputStream());
            ostream.writeObject(zone);
            ostream.close();
            baos.close();
            ObjectInputStream istream =
                new ObjectInputStream(new
                                      ByteArrayInputStream(baos.toByteArray()));
            TimeZone frankenZone = (TimeZone) istream.readObject();
            //logln("Zone:        " + zone);
            //logln("FrankenZone: " + frankenZone);
            if (!zone.equals(frankenZone)) {
                logln("TimeZone " + zone.getID() +
                      " not equal to serialized/deserialized one");
                pass = false;
            }
        }
        if (!pass) errln("Fail: TimeZone serialization/equality bug");
    }
    catch (IOException e) {
        errln("Fail: " + e);
        e.print32_tStackTrace();
    }
    catch (ClassNotFoundException e) {
        errln("Fail: " + e);
        e.print32_tStackTrace();
    }
*/
}

/**
 * @bug 4109314
 */
void TimeZoneRegressionTest:: Test4109314() {
    UErrorCode status = U_ZERO_ERROR;
    GregorianCalendar *testCal = (GregorianCalendar*)Calendar::createInstance(status);
    if(U_FAILURE(status)) {
      dataerrln("Error creating calendar %s", u_errorName(status));
      delete testCal;
      return;
    }
    failure(status, "Calendar::createInstance");
    TimeZone *PST = TimeZone::createTimeZone("PST");
    /*Object[] testData = {
        PST, new Date(98,Calendar.APRIL,4,22,0), new Date(98, Calendar.APRIL, 5,6,0),
        PST, new Date(98,Calendar.OCTOBER,24,22,0), new Date(98,Calendar.OCTOBER,25,6,0),
    };*/
    UDate testData [] = {
        CalendarRegressionTest::makeDate(98,UCAL_APRIL,4,22,0),
        CalendarRegressionTest::makeDate(98, UCAL_APRIL,5,6,0),
        CalendarRegressionTest::makeDate(98,UCAL_OCTOBER,24,22,0),
        CalendarRegressionTest::makeDate(98,UCAL_OCTOBER,25,6,0)
    };
    UBool pass = TRUE;
    for (int32_t i = 0; i < 4; i+=2) {
        //testCal->setTimeZone((TimeZone) testData[i]);
        testCal->setTimeZone(*PST);
        UDate t        = testData[i];
        UDate end    = testData[i+1];
        while(testCal->getTime(status) < end) {
            testCal->setTime(t, status);
            if ( ! checkCalendar314(testCal, PST))
                pass = FALSE;
            t += 60*60*1000.0;
        }
    }
    if ( ! pass)
        errln("Fail: TZ API inconsistent");

    delete testCal;
    delete PST;
}

UBool
TimeZoneRegressionTest::checkCalendar314(GregorianCalendar *testCal, TimeZone *testTZ)
{
    UErrorCode status = U_ZERO_ERROR;
    // GregorianCalendar testCal = (GregorianCalendar)aCal.clone();

    int32_t tzOffset, tzRawOffset;
    float tzOffsetFloat,tzRawOffsetFloat;
    // Here is where the user made an error.  They were passing in the value of
    // the MILLSECOND field; you need to pass in the millis in the day in STANDARD
    // time.
    UDate millis = testCal->get(UCAL_MILLISECOND, status) +
        1000.0 * (testCal->get(UCAL_SECOND, status) +
        60.0 * (testCal->get(UCAL_MINUTE, status) +
        60.0 * (testCal->get(UCAL_HOUR_OF_DAY, status)))) -
        testCal->get(UCAL_DST_OFFSET, status);

    /* Fix up millis to be in range.  ASSUME THAT WE ARE NOT AT THE
     * BEGINNING OR END OF A MONTH.  We must add this code because
     * getOffset() has been changed to be more strict about the parameters
     * it receives -- it turns out that this test was passing in illegal
     * values. */
    int32_t date = testCal->get(UCAL_DATE, status);
    int32_t dow  = testCal->get(UCAL_DAY_OF_WEEK, status);
    while(millis < 0) {
        millis += U_MILLIS_PER_DAY;
        --date;
        dow = UCAL_SUNDAY + ((dow - UCAL_SUNDAY + 6) % 7);
    }
    while (millis >= U_MILLIS_PER_DAY) {
        millis -= U_MILLIS_PER_DAY;
        ++date;
        dow = UCAL_SUNDAY + ((dow - UCAL_SUNDAY + 1) % 7);
    }

    tzOffset = testTZ->getOffset((uint8_t)testCal->get(UCAL_ERA, status),
                                testCal->get(UCAL_YEAR, status),
                                testCal->get(UCAL_MONTH, status),
                                date,
                                (uint8_t)dow,
                                (int32_t)millis,
                                status);
    tzRawOffset = testTZ->getRawOffset();
    tzOffsetFloat = (float)tzOffset/(float)3600000;
    tzRawOffsetFloat = (float)tzRawOffset/(float)3600000;

    UDate testDate = testCal->getTime(status);

    UBool inDaylightTime = testTZ->inDaylightTime(testDate, status);
    SimpleDateFormat *sdf = new SimpleDateFormat((UnicodeString)"MM/dd/yyyy HH:mm", status);
    sdf->setCalendar(*testCal);
    UnicodeString inDaylightTimeString;

    UBool passed;

    if(inDaylightTime)
    {
        inDaylightTimeString = " DST ";
        passed = (tzOffset == (tzRawOffset + 3600000));
    }
    else
    {
        inDaylightTimeString = "     ";
        passed = (tzOffset == tzRawOffset);
    }

    UnicodeString output;
    FieldPosition pos(0);
    output = testTZ->getID(output) + " " + sdf->format(testDate, output, pos) +
        " Offset(" + tzOffsetFloat + ")" +
        " RawOffset(" + tzRawOffsetFloat + ")" +
        " " + millis/(float)3600000 + " " +
        inDaylightTimeString;

    if (passed)
        output += "     ";
    else
        output += "ERROR";

    if (passed)
        logln(output);
    else
        errln(output);

    delete sdf;
    return passed;
}

/**
 * @bug 4126678
 * CANNOT REPRODUDE
 *
 * Yet another _alleged_ bug in TimeZone::getOffset(), a method that never
 * should have been made public.  It's simply too hard to use correctly.
 *
 * The original test code failed to do the following:
 * (1) Call Calendar::setTime() before getting the fields!
 * (2) Use the right millis (as usual) for getOffset(); they were passing
 *     in the MILLIS field, instead of the STANDARD MILLIS IN DAY.
 * When you fix these two problems, the test passes, as expected.
 */
void TimeZoneRegressionTest:: Test4126678()
{
    UErrorCode status = U_ZERO_ERROR;
    Calendar *cal = Calendar::createInstance(status);
    if(U_FAILURE(status)) {
      dataerrln("Error creating calendar %s", u_errorName(status));
      delete cal;
      return;
    }
    failure(status, "Calendar::createInstance");
    TimeZone *tz = TimeZone::createTimeZone("PST");
    cal->adoptTimeZone(tz);

    cal->set(1998, UCAL_APRIL, 5, 10, 0);

    if (! tz->useDaylightTime() || U_FAILURE(status))
        dataerrln("We're not in Daylight Savings Time and we should be. - %s", u_errorName(status));

    //cal.setTime(dt);
    int32_t era = cal->get(UCAL_ERA, status);
    int32_t year = cal->get(UCAL_YEAR, status);
    int32_t month = cal->get(UCAL_MONTH, status);
    int32_t day = cal->get(UCAL_DATE, status);
    int32_t dayOfWeek = cal->get(UCAL_DAY_OF_WEEK, status);
    int32_t millis = cal->get(UCAL_MILLISECOND, status) +
        (cal->get(UCAL_SECOND, status) +
         (cal->get(UCAL_MINUTE, status) +
          (cal->get(UCAL_HOUR, status) * 60) * 60) * 1000) -
        cal->get(UCAL_DST_OFFSET, status);

    failure(status, "cal->get");
    int32_t offset = tz->getOffset((uint8_t)era, year, month, day, (uint8_t)dayOfWeek, millis, status);
    int32_t raw_offset = tz->getRawOffset();

    if (offset == raw_offset)
        errln("Offsets should match");

    delete cal;
}

/**
 * @bug 4151406
 * TimeZone::getAvailableIDs(int32_t) throws exception for certain values,
 * due to a faulty constant in TimeZone::java.
 */
void TimeZoneRegressionTest:: Test4151406() {
    int32_t max = 0;
    for (int32_t h=-28; h<=30; ++h) {
        // h is in half-hours from GMT; rawoffset is in millis
        int32_t rawoffset = h * 1800000;
        int32_t hh = (h<0) ? -h : h;
        UnicodeString hname = UnicodeString((h<0) ? "GMT-" : "GMT+") +
            ((hh/2 < 10) ? "0" : "") +
            (hh/2) + ':' +
            ((hh%2==0) ? "00" : "30");
        //try {
            UErrorCode ec = U_ZERO_ERROR;
            int32_t count;
            StringEnumeration* ids = TimeZone::createEnumeration(rawoffset);
            count = ids->count(ec);
            if (count> max)
                max = count;
            if (count > 0) {
                logln(hname + ' ' + (UnicodeString)count + (UnicodeString)" e.g. " + *ids->snext(ec));
            } else {
                logln(hname + ' ' + count);
            }
            // weiv 11/27/2002: why uprv_free? This should be a delete
            delete ids;
            //delete [] ids;
            //uprv_free(ids);
        /*} catch (Exception e) {
            errln(hname + ' ' + "Fail: " + e);
        }*/
    }
    logln("Maximum zones per offset = %d", max);
}

/**
 * @bug 4151429
 */
void TimeZoneRegressionTest:: Test4151429() {
    // {sfb} silly test in C++, since we are using an enum and not an int
    //try {
        /*TimeZone *tz = TimeZone::createTimeZone("GMT");
        UnicodeString name;
        tz->getDisplayName(TRUE, TimeZone::LONG,
                                        Locale.getDefault(), name);
        errln("IllegalArgumentException not thrown by TimeZone::getDisplayName()");*/
    //} catch(IllegalArgumentException e) {}
}

/**
 * @bug 4154537
 * SimpleTimeZone::hasSameRules() doesn't work for zones with no DST
 * and different DST parameters.
 */
void TimeZoneRegressionTest:: Test4154537() {
    UErrorCode status = U_ZERO_ERROR;
    // tz1 and tz2 have no DST and different rule parameters
    SimpleTimeZone *tz1 = new SimpleTimeZone(0, "1", 0, 0, 0, 0, 2, 0, 0, 0, status);
    SimpleTimeZone *tz2 = new SimpleTimeZone(0, "2", 1, 0, 0, 0, 3, 0, 0, 0, status);
    // tza and tzA have the same rule params
    SimpleTimeZone *tza = new SimpleTimeZone(0, "a", 0, 1, 0, 0, 3, 2, 0, 0, status);
    SimpleTimeZone *tzA = new SimpleTimeZone(0, "A", 0, 1, 0, 0, 3, 2, 0, 0, status);
    // tzb differs from tza
    SimpleTimeZone *tzb = new SimpleTimeZone(0, "b", 0, 1, 0, 0, 3, 1, 0, 0, status);

    if(U_FAILURE(status))
        errln("Couldn't create TimeZones");

    if (tz1->useDaylightTime() || tz2->useDaylightTime() ||
        !tza->useDaylightTime() || !tzA->useDaylightTime() ||
        !tzb->useDaylightTime()) {
        errln("Test is broken -- rewrite it");
    }
    if (!tza->hasSameRules(*tzA) || tza->hasSameRules(*tzb)) {
        errln("Fail: hasSameRules() broken for zones with rules");
    }
    if (!tz1->hasSameRules(*tz2)) {
        errln("Fail: hasSameRules() returns false for zones without rules");
        //errln("zone 1 = " + tz1);
        //errln("zone 2 = " + tz2);
    }

    delete tz1;
    delete tz2;
    delete tza;
    delete tzA;
    delete tzb;
}

/**
 * @bug 4154542
 * SimpleTimeZOne constructors, setStartRule(), and setEndRule() don't
 * check for out-of-range arguments.
 */
void TimeZoneRegressionTest:: Test4154542()
{
    const int32_t GOOD = 1;
    const int32_t BAD  = 0;

    const int32_t GOOD_MONTH       = UCAL_JANUARY;
    const int32_t GOOD_DAY         = 1;
    const int32_t GOOD_DAY_OF_WEEK = UCAL_SUNDAY;
    const int32_t GOOD_TIME        = 0;

    int32_t DATA [] = {
        GOOD, INT32_MIN,    0,  INT32_MAX,   INT32_MIN,
        GOOD, UCAL_JANUARY,    -5,  UCAL_SUNDAY,     0,
        GOOD, UCAL_DECEMBER,    5,  UCAL_SATURDAY,   24*60*60*1000,
        BAD,  UCAL_DECEMBER,    5,  UCAL_SATURDAY,   24*60*60*1000+1,
        BAD,  UCAL_DECEMBER,    5,  UCAL_SATURDAY,  -1,
        BAD,  UCAL_JANUARY,    -6,  UCAL_SUNDAY,     0,
        BAD,  UCAL_DECEMBER,    6,  UCAL_SATURDAY,   24*60*60*1000,
        GOOD, UCAL_DECEMBER,    1,  0,                   0,
        GOOD, UCAL_DECEMBER,   31,  0,                   0,
        BAD,  UCAL_APRIL,      31,  0,                   0,
        BAD,  UCAL_DECEMBER,   32,  0,                   0,
        BAD,  UCAL_JANUARY-1,   1,  UCAL_SUNDAY,     0,
        BAD,  UCAL_DECEMBER+1,  1,  UCAL_SUNDAY,     0,
        GOOD, UCAL_DECEMBER,   31, -UCAL_SUNDAY,     0,
        GOOD, UCAL_DECEMBER,   31, -UCAL_SATURDAY,   0,
        BAD,  UCAL_DECEMBER,   32, -UCAL_SATURDAY,   0,
        BAD,  UCAL_DECEMBER,  -32, -UCAL_SATURDAY,   0,
        BAD,  UCAL_DECEMBER,   31, -UCAL_SATURDAY-1, 0,
    };
    SimpleTimeZone *zone = new SimpleTimeZone(0, "Z");
    for (int32_t i=0; i < 18*5; i+=5) {
        UBool shouldBeGood = (DATA[i] == GOOD);
        int32_t month     = DATA[i+1];
        int32_t day       = DATA[i+2];
        int32_t dayOfWeek = DATA[i+3];
        int32_t time      = DATA[i+4];

        UErrorCode status = U_ZERO_ERROR;

        //Exception ex = null;
        //try {
            zone->setStartRule(month, day, dayOfWeek, time, status);
        //} catch (IllegalArgumentException e) {
        //    ex = e;
        //}
        if (U_SUCCESS(status) != shouldBeGood) {
            errln(UnicodeString("setStartRule(month=") + month + ", day=" + day +
                  ", dayOfWeek=" + dayOfWeek + ", time=" + time +
                  (shouldBeGood ? (") should work")
                   : ") should fail but doesn't"));
        }

        //ex = null;
        //try {
        status = U_ZERO_ERROR;
            zone->setEndRule(month, day, dayOfWeek, time, status);
        //} catch (IllegalArgumentException e) {
        //   ex = e;
        //}
        if (U_SUCCESS(status) != shouldBeGood) {
            errln(UnicodeString("setEndRule(month=") + month + ", day=" + day +
                  ", dayOfWeek=" + dayOfWeek + ", time=" + time +
                  (shouldBeGood ? (") should work")
                   : ") should fail but doesn't"));
        }

        //ex = null;
        //try {
        // {sfb} need to look into ctor problems! (UErrorCode vs. dst signature confusion)
        status = U_ZERO_ERROR;
            SimpleTimeZone *temp = new SimpleTimeZone(0, "Z",
                    (int8_t)month, (int8_t)day, (int8_t)dayOfWeek, time,
                    (int8_t)GOOD_MONTH, (int8_t)GOOD_DAY, (int8_t)GOOD_DAY_OF_WEEK,
                    GOOD_TIME,status);
        //} catch (IllegalArgumentException e) {
        //    ex = e;
        //}
        if (U_SUCCESS(status) != shouldBeGood) {
            errln(UnicodeString("SimpleTimeZone(month=") + month + ", day=" + day +
                  ", dayOfWeek=" + dayOfWeek + ", time=" + time +
                  (shouldBeGood ? (", <end>) should work")// + ex)
                   : ", <end>) should fail but doesn't"));
        }

        delete temp;
        //ex = null;
        //try {
        status = U_ZERO_ERROR;
            temp = new SimpleTimeZone(0, "Z",
                    (int8_t)GOOD_MONTH, (int8_t)GOOD_DAY, (int8_t)GOOD_DAY_OF_WEEK,
                    GOOD_TIME,
                    (int8_t)month, (int8_t)day, (int8_t)dayOfWeek, time,status);
        //} catch (IllegalArgumentException e) {
        //    ex = e;
        //}
        if (U_SUCCESS(status) != shouldBeGood) {
            errln(UnicodeString("SimpleTimeZone(<start>, month=") + month + ", day=" + day +
                  ", dayOfWeek=" + dayOfWeek + ", time=" + time +
                  (shouldBeGood ? (") should work")// + ex)
                   : ") should fail but doesn't"));
        }
        delete temp;
    }
    delete zone;
}

/**
 * @bug 4154525
 * SimpleTimeZone accepts illegal DST savings values.  These values
 * must be non-zero.  There is no upper limit at this time.
 */
void
TimeZoneRegressionTest::Test4154525()
{
    const int32_t GOOD = 1, BAD = 0;

    int32_t DATA [] = {
        1, GOOD,
        0, BAD,
        -1, BAD,
        60*60*1000, GOOD,
        INT32_MIN, BAD,
        // Integer.MAX_VALUE, ?, // no upper limit on DST savings at this time
    };

    UErrorCode status = U_ZERO_ERROR;
    for(int32_t i = 0; i < 10; i+=2) {
        int32_t savings = DATA[i];
        UBool valid = DATA[i+1] == GOOD;
        UnicodeString method;
        for(int32_t j=0; j < 2; ++j) {
            SimpleTimeZone *z=NULL;
            switch (j) {
                case 0:
                    method = "constructor";
                    z = new SimpleTimeZone(0, "id",
                        UCAL_JANUARY, 1, 0, 0,
                        UCAL_MARCH, 1, 0, 0,
                        savings, status); // <- what we're interested in
                    break;
                case 1:
                    method = "setDSTSavings()";
                    z = new SimpleTimeZone(0, "GMT");
                    z->setDSTSavings(savings, status);
                    break;
            }

            if(U_FAILURE(status)) {
                if(valid) {
                    errln(UnicodeString("Fail: DST savings of ") + savings + " to " + method + " gave " + u_errorName(status));
                }
                else {
                    logln(UnicodeString("Pass: DST savings of ") + savings + " to " + method + " gave " + u_errorName(status));
                }
            }
            else {
                if(valid) {
                    logln(UnicodeString("Pass: DST savings of ") + savings + " accepted by " + method);
                }
                else {
                    errln(UnicodeString("Fail: DST savings of ") + savings + " accepted by " + method);
                }
            }
            status = U_ZERO_ERROR;
            delete z;
        }
    }
}

/**
 * @bug 4154650
 * SimpleTimeZone.getOffset accepts illegal arguments.
 */
void
TimeZoneRegressionTest::Test4154650()
{
    const int32_t GOOD = 1, BAD = 0;
    const int32_t GOOD_ERA = GregorianCalendar::AD, GOOD_YEAR = 1998, GOOD_MONTH = UCAL_AUGUST;
    const int32_t GOOD_DAY = 2, GOOD_DOW = UCAL_SUNDAY, GOOD_TIME = 16*3600000;

    int32_t DATA []= {
        GOOD, GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, GOOD_TIME,

        GOOD, GregorianCalendar::BC, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, GOOD_TIME,
        GOOD, GregorianCalendar::AD, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, GOOD_TIME,
        BAD,  GregorianCalendar::BC-1, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, GOOD_TIME,
        BAD,  GregorianCalendar::AD+1, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, GOOD_TIME,

        GOOD, GOOD_ERA, GOOD_YEAR, UCAL_JANUARY, GOOD_DAY, GOOD_DOW, GOOD_TIME,
        GOOD, GOOD_ERA, GOOD_YEAR, UCAL_DECEMBER, GOOD_DAY, GOOD_DOW, GOOD_TIME,
        BAD,  GOOD_ERA, GOOD_YEAR, UCAL_JANUARY-1, GOOD_DAY, GOOD_DOW, GOOD_TIME,
        BAD,  GOOD_ERA, GOOD_YEAR, UCAL_DECEMBER+1, GOOD_DAY, GOOD_DOW, GOOD_TIME,

        GOOD, GOOD_ERA, GOOD_YEAR, UCAL_JANUARY, 1, GOOD_DOW, GOOD_TIME,
        GOOD, GOOD_ERA, GOOD_YEAR, UCAL_JANUARY, 31, GOOD_DOW, GOOD_TIME,
        BAD,  GOOD_ERA, GOOD_YEAR, UCAL_JANUARY, 0, GOOD_DOW, GOOD_TIME,
        BAD,  GOOD_ERA, GOOD_YEAR, UCAL_JANUARY, 32, GOOD_DOW, GOOD_TIME,

        GOOD, GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, UCAL_SUNDAY, GOOD_TIME,
        GOOD, GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, UCAL_SATURDAY, GOOD_TIME,
        BAD,  GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, UCAL_SUNDAY-1, GOOD_TIME,
        BAD,  GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, UCAL_SATURDAY+1, GOOD_TIME,

        GOOD, GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, 0,
        GOOD, GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, 24*3600000-1,
        BAD,  GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, -1,
        BAD,  GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, 24*3600000,
    };

    int32_t dataLen = (int32_t)(sizeof(DATA) / sizeof(DATA[0]));

    UErrorCode status = U_ZERO_ERROR;
    TimeZone *tz = TimeZone::createDefault();
    for(int32_t i = 0; i < dataLen; i += 7) {
        UBool good = DATA[i] == GOOD;
        //IllegalArgumentException e = null;
        //try {
            /*int32_t offset = */
        tz->getOffset((uint8_t)DATA[i+1], DATA[i+2], DATA[i+3],
                      DATA[i+4], (uint8_t)DATA[i+5], DATA[i+6], status);
        //} catch (IllegalArgumentException ex) {
        //   e = ex;
        //}
        if(good != U_SUCCESS(status)) {
            UnicodeString errMsg;
            if (good) {
                errMsg = (UnicodeString(") threw ") + u_errorName(status));
            }
            else {
                errMsg = UnicodeString(") accepts invalid args", "");
            }
            errln(UnicodeString("Fail: getOffset(") +
                  DATA[i+1] + ", " + DATA[i+2] + ", " + DATA[i+3] + ", " +
                  DATA[i+4] + ", " + DATA[i+5] + ", " + DATA[i+6] +
                  errMsg);
        }
        status = U_ZERO_ERROR; // reset
    }
    delete tz;
}

/**
 * @bug 4162593
 * TimeZone broken at midnight.  The TimeZone code fails to handle
 * transitions at midnight correctly.
 */
void
TimeZoneRegressionTest::Test4162593()
{
    UErrorCode status = U_ZERO_ERROR;
    SimpleDateFormat *fmt = new SimpleDateFormat("z", Locale::getUS(), status);
    if(U_FAILURE(status)) {
      dataerrln("Error creating calendar %s", u_errorName(status));
      delete fmt;
      return;
    }
    const int32_t ONE_HOUR = 60*60*1000;

    SimpleTimeZone *asuncion = new SimpleTimeZone(-4*ONE_HOUR, "America/Asuncion" /*PY%sT*/,
        UCAL_OCTOBER, 1, 0 /*DOM*/, 0*ONE_HOUR,
        UCAL_MARCH, 1, 0 /*DOM*/, 0*ONE_HOUR, 1*ONE_HOUR, status);

    /* Zone
     * Starting time
     * Transition expected between start+1H and start+2H
     */
    TimeZone *DATA_TZ [] = {
      0, 0, 0 };

    int32_t DATA_INT [] [5] = {
        // These years must be AFTER the Gregorian cutover
        {1998, UCAL_SEPTEMBER, 30, 22, 0},
        {2000, UCAL_FEBRUARY, 28, 22, 0},
        {2000, UCAL_FEBRUARY, 29, 22, 0},
     };

    UBool DATA_BOOL [] = {
        TRUE,
        FALSE,
        TRUE,
    };

    UnicodeString zone [4];// = new String[4];
    DATA_TZ[0] =
        new SimpleTimeZone(2*ONE_HOUR, "Asia/Damascus" /*EE%sT*/,
            UCAL_APRIL, 1, 0 /*DOM*/, 0*ONE_HOUR,
            UCAL_OCTOBER, 1, 0 /*DOM*/, 0*ONE_HOUR, 1*ONE_HOUR, status);
    DATA_TZ[1] = asuncion;  DATA_TZ[2] = asuncion;

    for(int32_t j = 0; j < 3; j++) {
        TimeZone *tz = (TimeZone*)DATA_TZ[j];
        TimeZone::setDefault(*tz);
        fmt->setTimeZone(*tz);

        // Must construct the Date object AFTER setting the default zone
        int32_t *p = (int32_t*)DATA_INT[j];
        UDate d = CalendarRegressionTest::makeDate(p[0], p[1], p[2], p[3], p[4]);
       UBool transitionExpected = DATA_BOOL[j];

        UnicodeString temp;
        logln(tz->getID(temp) + ":");
        for (int32_t i = 0; i < 4; ++i) {
            FieldPosition pos(0);
            zone[i].remove();
            zone[i] = fmt->format(d+ i*ONE_HOUR, zone[i], pos);
            logln(UnicodeString("") + i + ": " + d + " / " + zone[i]);
            //d += (double) ONE_HOUR;
        }
        if(zone[0] == zone[1] &&
            (zone[1] == zone[2]) != transitionExpected &&
            zone[2] == zone[3]) {
            logln(UnicodeString("Ok: transition ") + transitionExpected);
        }
        else {
            errln("Fail: boundary transition incorrect");
        }
    }
    delete fmt;
    delete asuncion;
    delete DATA_TZ[0];
}

  /**
    * getDisplayName doesn't work with unusual savings/offsets.
    */
void TimeZoneRegressionTest::Test4176686() {
    // Construct a zone that does not observe DST but
    // that does have a DST savings (which should be ignored).
    UErrorCode status = U_ZERO_ERROR;
    int32_t offset = 90 * 60000; // 1:30
    SimpleTimeZone* z1 = new SimpleTimeZone(offset, "_std_zone_");
    z1->setDSTSavings(45 * 60000, status); // 0:45

    // Construct a zone that observes DST for the first 6 months.
    SimpleTimeZone* z2 = new SimpleTimeZone(offset, "_dst_zone_");
    z2->setDSTSavings(45 * 60000, status); // 0:45
    z2->setStartRule(UCAL_JANUARY, 1, 0, status);
    z2->setEndRule(UCAL_JULY, 1, 0, status);

    // Also check DateFormat
    DateFormat* fmt1 = new SimpleDateFormat(UnicodeString("z"), status);
    if (U_FAILURE(status)) {
        dataerrln("Failure trying to construct: %s", u_errorName(status));
        return;
    }
    fmt1->setTimeZone(*z1); // Format uses standard zone
    DateFormat* fmt2 = new SimpleDateFormat(UnicodeString("z"), status);
    if(!assertSuccess("trying to construct", status))return;
    fmt2->setTimeZone(*z2); // Format uses DST zone
    Calendar* tempcal = Calendar::createInstance(status);
    tempcal->clear();
    tempcal->set(1970, UCAL_FEBRUARY, 1);
    UDate dst = tempcal->getTime(status); // Time in DST
    tempcal->set(1970, UCAL_AUGUST, 1);
    UDate std = tempcal->getTime(status); // Time in standard

    // Description, Result, Expected Result
    UnicodeString a,b,c,d,e,f,g,h,i,j,k,l;
    UnicodeString DATA[] = {
        "z1->getDisplayName(false, SHORT)/std zone",
        z1->getDisplayName(FALSE, TimeZone::SHORT, a), "GMT+01:30",
        "z1->getDisplayName(false, LONG)/std zone",
        z1->getDisplayName(FALSE, TimeZone::LONG, b), "GMT+01:30",
        "z1->getDisplayName(true, SHORT)/std zone",
        z1->getDisplayName(TRUE, TimeZone::SHORT, c), "GMT+01:30",
        "z1->getDisplayName(true, LONG)/std zone",
        z1->getDisplayName(TRUE, TimeZone::LONG, d ), "GMT+01:30",
        "z2->getDisplayName(false, SHORT)/dst zone",
        z2->getDisplayName(FALSE, TimeZone::SHORT, e), "GMT+01:30",
        "z2->getDisplayName(false, LONG)/dst zone",
        z2->getDisplayName(FALSE, TimeZone::LONG, f ), "GMT+01:30",
        "z2->getDisplayName(true, SHORT)/dst zone",
        z2->getDisplayName(TRUE, TimeZone::SHORT, g), "GMT+02:15",
        "z2->getDisplayName(true, LONG)/dst zone",
        z2->getDisplayName(TRUE, TimeZone::LONG, h ), "GMT+02:15",
        "DateFormat.format(std)/std zone", fmt1->format(std, i), "GMT+01:30",
        "DateFormat.format(dst)/std zone", fmt1->format(dst, j), "GMT+01:30",
        "DateFormat.format(std)/dst zone", fmt2->format(std, k), "GMT+01:30",
        "DateFormat.format(dst)/dst zone", fmt2->format(dst, l), "GMT+02:15",
    };

    for (int32_t idx=0; idx<(int32_t)ARRAY_LENGTH(DATA); idx+=3) {
        if (DATA[idx+1]!=(DATA[idx+2])) {
            errln("FAIL: " + DATA[idx] + " -> " + DATA[idx+1] + ", exp " + DATA[idx+2]);
        }
    }
    delete z1;
    delete z2;
    delete fmt1;
    delete fmt2;
    delete tempcal;
}

/**
 * Make sure setStartRule and setEndRule set the DST savings to nonzero
 * if it was zero.
 */
void TimeZoneRegressionTest::TestJ186() {
    UErrorCode status = U_ZERO_ERROR;
    // NOTE: Setting the DST savings to zero is illegal, so we
    // are limited in the testing we can do here.  This is why
    // lines marked //~ are commented out.
    SimpleTimeZone z(0, "ID");
    //~z.setDSTSavings(0, status); // Must do this!
    z.setStartRule(UCAL_FEBRUARY, 1, UCAL_SUNDAY, 0, status);
    failure(status, "setStartRule()");
    if (z.useDaylightTime()) {
        errln("Fail: useDaylightTime true with start rule only");
    }
    //~if (z.getDSTSavings() != 0) {
    //~    errln("Fail: dst savings != 0 with start rule only");
    //~}
    z.setEndRule(UCAL_MARCH, -1, UCAL_SUNDAY, 0, status);
    failure(status, "setStartRule()");
    if (!z.useDaylightTime()) {
        errln("Fail: useDaylightTime false with rules set");
    }
    if (z.getDSTSavings() == 0) {
        errln("Fail: dst savings == 0 with rules set");
    }
}

/**
 * Test to see if DateFormat understands zone equivalency groups.  It
 * might seem that this should be a DateFormat test, but it's really a
 * TimeZone test -- the changes to DateFormat are minor.
 *
 * We use two known, stable zones that shouldn't change much over time
 * -- America/Vancouver and America/Los_Angeles.  However, they MAY
 * change at some point -- if that happens, replace them with any two
 * zones in an equivalency group where one zone has localized name
 * data, and the other doesn't, in some locale.
 */
void TimeZoneRegressionTest::TestJ449() {
    UErrorCode status = U_ZERO_ERROR;
    UnicodeString str;

    // Modify the following three as necessary.  The two IDs must
    // specify two zones in the same equivalency group.  One must have
    // locale data in 'loc'; the other must not.
    const char* idWithLocaleData = "America/Los_Angeles";
    const char* idWithoutLocaleData = "US/Pacific";
    const Locale loc("en", "", "");

    TimeZone *zoneWith = TimeZone::createTimeZone(idWithLocaleData);
    TimeZone *zoneWithout = TimeZone::createTimeZone(idWithoutLocaleData);
    // Make sure we got valid zones
    if (zoneWith->getID(str) != UnicodeString(idWithLocaleData) ||
        zoneWithout->getID(str) != UnicodeString(idWithoutLocaleData)) {
      dataerrln(UnicodeString("Fail: Unable to create zones - wanted ") + idWithLocaleData + ", got " + zoneWith->getID(str) + ", and wanted " + idWithoutLocaleData + " but got " + zoneWithout->getID(str));
    } else {
        GregorianCalendar calWith(*zoneWith, status);
        GregorianCalendar calWithout(*zoneWithout, status);
        SimpleDateFormat fmt("MMM d yyyy hh:mm a zzz", loc, status);
        if (U_FAILURE(status)) {
            errln("Fail: Unable to create GregorianCalendar/SimpleDateFormat");
        } else {
            UDate date = 0;
            UnicodeString strWith, strWithout;
            fmt.setCalendar(calWith);
            fmt.format(date, strWith);
            fmt.setCalendar(calWithout);
            fmt.format(date, strWithout);
            if (strWith == strWithout) {
                logln((UnicodeString)"Ok: " + idWithLocaleData + " -> " +
                      strWith + "; " + idWithoutLocaleData + " -> " +
                      strWithout);
            } else {
                errln((UnicodeString)"FAIL: " + idWithLocaleData + " -> " +
                      strWith + "; " + idWithoutLocaleData + " -> " +
                      strWithout);
            }
        }
    }

    delete zoneWith;
    delete zoneWithout;
}

// test new API for JDK 1.2 8/31 putback
void
TimeZoneRegressionTest::TestJDK12API()
{
    // TimeZone *pst = TimeZone::createTimeZone("PST");
    // TimeZone *cst1 = TimeZone::createTimeZone("CST");
    UErrorCode ec = U_ZERO_ERROR;
    //d,-28800,3,1,-1,120,w,9,-1,1,120,w,60
    TimeZone *pst = new SimpleTimeZone(-28800*U_MILLIS_PER_SECOND,
                                       "PST",
                                       3,1,-1,120*U_MILLIS_PER_MINUTE,
                                       SimpleTimeZone::WALL_TIME,
                                       9,-1,1,120*U_MILLIS_PER_MINUTE,
                                       SimpleTimeZone::WALL_TIME,
                                       60*U_MILLIS_PER_MINUTE,ec);
    //d,-21600,3,1,-1,120,w,9,-1,1,120,w,60
    TimeZone *cst1 = new SimpleTimeZone(-21600*U_MILLIS_PER_SECOND,
                                       "CST",
                                       3,1,-1,120*U_MILLIS_PER_MINUTE,
                                       SimpleTimeZone::WALL_TIME,
                                       9,-1,1,120*U_MILLIS_PER_MINUTE,
                                       SimpleTimeZone::WALL_TIME,
                                       60*U_MILLIS_PER_MINUTE,ec);
    if (U_FAILURE(ec)) {
        errln("FAIL: SimpleTimeZone constructor");
        return;
    }

    SimpleTimeZone *cst = 0;

    if(cst1->getDynamicClassID() == SimpleTimeZone::getStaticClassID())
        cst = (SimpleTimeZone*) cst1;

    if(pst->hasSameRules(*cst)) {
        errln("FAILURE: PST and CST have same rules");
    }

    UErrorCode status = U_ZERO_ERROR;
    int32_t offset1 = pst->getOffset(1,
        1997, UCAL_OCTOBER, 26, UCAL_SUNDAY, (2*60*60*1000), status);
    failure(status, "getOffset() failed");

    int32_t offset2 = cst->getOffset(1,
        1997, UCAL_OCTOBER, 26, UCAL_SUNDAY, (2*60*60*1000), 31, status);
    failure(status, "getOffset() failed");

    if(offset1 == offset2)
        errln("FAILURE: Sunday Oct. 26 1997 2:00 has same offset for PST and CST");

    // verify error checking
    pst->getOffset(1,
        1997, UCAL_FIELD_COUNT+1, 26, UCAL_SUNDAY, (2*60*60*1000), status);
    if(U_SUCCESS(status))
        errln("FAILURE: getOffset() succeeded with -1 for month");

    status = U_ZERO_ERROR;
    cst->setDSTSavings(60*60*1000, status);
    failure(status, "setDSTSavings() failed");

    int32_t savings = cst->getDSTSavings();
    if(savings != 60*60*1000) {
        errln("setDSTSavings() failed");
    }

    delete pst;
    delete cst;
}
/**
 * SimpleTimeZone allows invalid DOM values.
 */
void TimeZoneRegressionTest::Test4184229() {
    SimpleTimeZone* zone = NULL;
    UErrorCode status = U_ZERO_ERROR;
    zone = new SimpleTimeZone(0, "A", 0, -1, 0, 0, 0, 0, 0, 0, status);
    if(U_SUCCESS(status)){
        errln("Failed. No exception has been thrown for DOM -1 startDay");
    }else{
       logln("(a) " + UnicodeString( u_errorName(status)));
    }
    status = U_ZERO_ERROR;
    delete zone;

    zone = new SimpleTimeZone(0, "A", 0, 0, 0, 0, 0, -1, 0, 0, status);
    if(U_SUCCESS(status)){
        errln("Failed. No exception has been thrown for DOM -1 endDay");
    }else{
       logln("(b) " + UnicodeString(u_errorName(status)));
    }
    status = U_ZERO_ERROR;
    delete zone;

    zone = new SimpleTimeZone(0, "A", 0, -1, 0, 0, 0, 0, 0, 1000, status);
    if(U_SUCCESS(status)){
        errln("Failed. No exception has been thrown for DOM -1 startDay+savings");
    }else{
       logln("(c) " + UnicodeString(u_errorName(status)));
    }
    status = U_ZERO_ERROR;
    delete zone;
    zone = new SimpleTimeZone(0, "A", 0, 0, 0, 0, 0, -1, 0, 0, 1000, status);
    if(U_SUCCESS(status)){
        errln("Failed. No exception has been thrown for DOM -1 endDay+ savings");
    }else{
       logln("(d) " + UnicodeString(u_errorName(status)));
    }
    status = U_ZERO_ERROR;
    delete zone;
    // Make a valid constructor call for subsequent tests.
    zone = new SimpleTimeZone(0, "A", 0, 1, 0, 0, 0, 1, 0, 0, status);

    zone->setStartRule(0, -1, 0, 0, status);
    if(U_SUCCESS(status)){
        errln("Failed. No exception has been thrown for DOM -1 setStartRule +savings");
    } else{
        logln("(e) " + UnicodeString(u_errorName(status)));
    }
    zone->setStartRule(0, -1, 0, status);
    if(U_SUCCESS(status)){
        errln("Failed. No exception has been thrown for DOM -1 setStartRule");
    } else{
        logln("(f) " + UnicodeString(u_errorName(status)));
    }

    zone->setEndRule(0, -1, 0, 0, status);
    if(U_SUCCESS(status)){
        errln("Failed. No exception has been thrown for DOM -1 setEndRule+savings");
    } else{
        logln("(g) " + UnicodeString(u_errorName(status)));
    }

    zone->setEndRule(0, -1, 0, status);
    if(U_SUCCESS(status)){
        errln("Failed. No exception has been thrown for DOM -1 setEndRule");
    } else{
        logln("(h) " + UnicodeString(u_errorName(status)));
    }
    delete zone;
}

#endif /* #if !UCONFIG_NO_FORMATTING */

redpajama_set_name: RedPajamaGithub


text:
DICE TRAVELS
Rolling the dice, letting it ride...
Day 75: So that's a Myanmar ginger plant
A woman and her sun walk through the fields between Inle Lake and Kalaw, Myanmar. Photo: Isaac Stone Simonelli
Daily Updates are not edited and function more as daily journal entries – so if the plot seems to be all over the place or missing entirely and the tenses changes faster than a kaleidoscope, well, that's just the way it is.
IT TURNS out that we, under my guidance, have booked a three-day, two-night trek, instead of a two-day, one-night trek. None of us have the extra day. The new plan is to hike for most of today, then catch a tuk-tuk to Kalaw, where we can get a southbound sleeper bus.
There was a momentary scramble last night when the girls broke the news to me, after having already booked their bus tickets by phone via Kam's friend. I went downstairs to confirm that a similar solution was possible for me – we have different final destinations – then managed booked the same bus, though I would be getting off before Yangon.
The next morning, down in the sala I find David and the girls, drinking cheap coffee and taking in the neighborhood; not that there is much of a neighborhood to take in. The entire village, bigger than most we've seen is still just a collection of a couple dozen homes – a few of them two-stories tall – small garden plots, a monastery and a school – all connected by muddy paths torn up by wooden carts and cattle.
I want to ask David if he's thought any more about whether or not he'll incorporate dice into his decision making process – nothing big, just what bagel to order with which kind of cream cheese spread. However, it feels too soon to raise the topic. I've got a niggling feeling that he'll probably be thinking about the dice process more during the morning section of his hike.
Instead, we all watch the mother of a little boy, perhaps four years old, help him pull on his galoshes. Left on on his own in the scrubs along a patch of staked green beans, the little man with his baseball cap askew picks up a nearby hoe and gets to work, scratching the heavy tool across the dirt, doing his best to mimic what he's seen thousands of times already in his short life.
The little man gets to work. Photo: Isaac Stone Simonelli
"Do you think you could live out here?" Mariacamielle asks the group.
There is a moment of silence as we ponder the possiblity. She then directs the question straight at me, its seems that she and Melissa have already been talking about it this morning.
"Of course, I mean people live out here, so I could live out here," I say, not exactly answer the question. "We're such adaptive animals. People can get use to anything."
The real question is whether or not I'd be able to happily live out here. If I was raised out here, I'm sure I would be happy – it appears to be a permanent disposition. However, being transplanted into these fields at this point in my life, completely disconnecting me from my family, friends and the more international lifestyle that I'm accustomed to, that would probably scrub away my smile.
Mariacamielle says she couldn't. She's too restless; there is still too much to see.
It's one of those hypotheticals that you can't really know the answer to until you're living it.
As we head out of the village, the trail quickly becomes a thick dark-brown mud path pocketed with deep trenches from bovine hoofs digging deep. We prance around the edges, occasionally sucking it up and tentatively walking through the muddy bits trying our best to avoid getting stuck and losing a shoe. Marciacamielle, in her hiking boots, gives up immediately and tromps through the puddles and mud, streaking the inside of her legs brown with dirt. Melissa, in her hiking sandals and socks, does her best to stay out of the mud, but it doesn't seem to make much of a difference.
The dirt roads and paths seem to have a regular flow of traffic. Photos: Isaac Stone Simonelli
The path narrows as we clamber over a couple rocks and begin to descend down the steep mountainside into vegetable filled valley.
We are forced to pause and step aside as a dark faced man with well-weathered skin urges his Water Buffalo along. The enormous beast with wide flat horns holds its head low as it begrudgingly allows itself to be led by a rope strung through its nostrils. Mau and Kam are cautious, keeping us at a safe distance from the animal. They seem to see a real threat, where we only see an unusual and powerful domesticated animal.
Further up, we catch the beast bathing shoulder deep in a pond. His owner crouches down nearby, still holding onto Water Buffalo's lead, passively watching it bathe. A pair of white ox pulling a cart with large wooden wheels is driven into the same pond. Though the sun has yet to reach full intensity for the day, it's already time to let the animals cool off after their morning labor.
Cows and water buffalo are led to a watering hole. Photos: Isaac Stone Simonelli
The girls begin to fall behind, their mouths happily moving faster than their feet, Now that we are meeting a tuk-tuk somewhere in the afternoon to hitch a ride to the bus station, cutting the hike short, we have time.
In the distance, between their bouts of laughter, it's possible to hear them composing a Dice Travels theme song to Estelle's "American Boy".
"Taking pictures no decisions all the time / Rolling the dice to his own paradise / He really wants to share it with you / A random trip around the world / American Boy /American Boy"
Insert real music video via YOUTUBE>
Kam breaks off the stem of a short ginger plant, one of the thousands poking out of the fertile red field next to us. Its leaves are sharp blades, its stalk like a bamboo shoot. The distinct, healing smell of ginger fills my nostrils as he passes it to me. I know the smell, but looking at the plant, with its iconic root buried beneath the soil, I would have had no idea that it was ginger if I wasn't told, or sniffing every plant we pass.
When I was growing up we had gardens in our countryside neighborhood on the outskirts of Bloomington, Indiana. We actually lived in a town that was no longer a town: Sanders. Sanders was once a stop for a local train service. It had a post office and a single store. Then the roads were built and the limestone quarries, which supported those living in the neighborhood began to shut down. So the town became a collection of two neighborhoods. We lost our post office. This was all before I was born. But we still had gardens, at least at my house.
There several raised beds with lettuce, tomatoes, zucchini, pumpkins corn, radishes, cucumbers and so on. There were also a handful of fruit trees that were never very productive, as well as Golden Fall Raspberries and a strawberry patch. Despite this contact with homegrown food sources, I have no idea what most of the cultivated plants we are walking by produce.
It's startling how disconnected we, the majority, have become from our food sources. How is it possible to know only the fruit of a plant? I guess that's a fairly easy question to answer, though the answer itself is problematic.
A giant pile of picked ginger dries in the sun beneath a crab apple tree like a pile of leaves in autumn. I've never seen so much ginger in my life.
And all the ginger. Photos: Isaac Stone Simonelli
We pause in a wide open field, sitting in the grass, laying against our packs. David and his guide arrive and sit with us.
With a great amount of laughing the girls put on their Dice Travels production, then go into a second song they've developed called "Caca shoes" – basically "Shit Shoes", which they do to a little jig to, showing off their muddy footwear.
Their smiles and laughs are contagious.
Mau pulls of the head of a plant to use as a microphone and interviews us, establishing an order of respect based on our ages.
Once things settle down a bit, I ask David if he'll start rolling dice to make decisions. He's momentarily pensive, carefully finding his words, rolling a familiar thought around in his head one last time before giving it form.
"Yes. Yes, I will," he says. Thinking our paths will cross again before the day is out, I fail to get his email so I can follow up on how his rolling goes. However, I have faith that the dice will chose well, and that random selection of a cranberry bagel with plain cream cheese or a plain bagel with cranberry spread will not upset his universe, but in fact somehow make it slightly more delicious.
Back on the trail, we pass across rolling hills before coming to a stop at a giant perfectly circular hole in the earth. There are three of them actually, though one has caved in. At the bottom of two of them, which run along a deep trench, is a smaller perfectly circular hole.
Mau says something as we all peek into the depths.
"Elephant BBQ," Mau says again, though I barely catch it.
"Joking. For making Lime," he says.
David's guide, who is with us at this time as well, speaks better English and explains.
Huge chunks of limestone are somehow dragged way out here to the middle of nowhere, where they are thrown into the holes and then super heated from fires being stoked below them.
After being super heated the stone can easily be grounded up and used, among other things, for the Bettle Nut chew that is so popular in Myanmar. (The chew is the reason so many Burmese smiles are missing teeth are stained a gritty blood red.)
"They are too dangerous to light during the rainy season though," the guide explains. A little rain can cause super hot rocks to explode like bombs.
Mau was hiking on the other side of the valley with the other guides brother when one blew up recently. He points at the giant collapsed kiln next to us.
"Boom!" he says with a laugh. "People say we cannot come down because it's too dangerous."
Mau doesn't mention if anyone died in the explosion. Though, apparently, these kiln blasts do kill and maim people from time to time.
Further on, Mau and I are ahead of the group. A smattering of large, thick leaved military cacti press in against the path like pikes on an anti-cavalry line. Mau bends and twists the black little spiked tip of one of the leg-length leaves off the plant, eventually pulling the needle free.
"Put your name," he says, handing the spike to me.
Though my name isn't carved into a single smooth skinned Birch or Ironwood or any other tree after several decades of tromping through the deciduous forests of Indiana, I take the needle and do a little advertising – though I'm sure it's for a limited audience.
The black spike digs deep into the wet flesh of the leaf, which will scar a light brown within days.
I carve "Dice Travels" into the the thick leaf, among a handful of other names on the leaves.
Mau takes the needle and writes "with" below Dice Travels. Below that, he adds his name. For him, a man with no email with no Facebook algorithm dredging up Memories, the scared leaves from these crude lines will be enough to help him recall these couple of days together.
Mau marks our trip in a Mission Cactus plant. Photo: Isaac Stone Simonelli
"When we were living together people thought we were lesbians," Melissa tells me out of the blue. Given that I had a similar line of questioning about here and Mariacamielle, I'm not surprised. The two girls have a beautiful, affection friendship, something that is without a doubt love though at moments its hard to know the nature of the love.
Announcements like the one Melissa made earlier, which was that Mariacamielle had the best boobs, blur the lines further.
They are the perfect size, perfect shape, perfect boobs, she said. I was told if I could fix Melissa's phone, which stopped working after being caught in a rain storm in Bagan, I could have pictures they'd taken of them. However, the phone remained dead, and I thought it best to not weigh in with my own early morning observation. Not that it would matter either way, Melissa has made up her mind about Mariacamielle's boobs and their seems to be a general understanding between them about this.
Despite Melissa's post-pubescent boyish fascination with Mariacamielle's boobs, she in fact is teetering on the edge of landing herself a new boyfriend back home, which heavily discounts any theories about their relationship being more romantic.
"Do you hate Muslims?" Kam asks me as we walk beneath a Banyan Tree. He's wearing an uncomfortable smile, unsure of what my response will be.
"No, I don't hate anyone," I say with a smile.
"That is good. I hate Muslims," he says, with the same smile.
"I think all people are different, so even if there are probably some Muslims I don't like, I am sure there are some people of all religions that I don't like, but more that I do."
"Yes, I think that is good," he says.
There was something in the way he asked the question that made it seem like it had been kicking around his head all day. Though I prefer the company of Mau, I find the question, despite being bigoted, endearing, because of the honesty of it. Earlier Kam had asked me to read an email he'd received from the United States with regard to his application into the "lottery", which would give him the opportunity to move to the US to work. It was a standard email saying that if selected they would not notify him; he needed to enter his number into such-and-such website.
Past fields of eggplants, heavy with their purple phallic fruit, we reach a main road. Or should I simply say, a road, a real road.
Our tuk-tuk is waiting. We pile in and do our best to enjoy a bumpy ride to Kalaw, sucking on chocolate lollipops that Mau procured from somewhere.
An angry woman starts yelling at Kam as we disembark at the bus pickup point. She's not pleased in the slightest with having us there. Probably because we didn't buy the tickets from here. Even after Kam's walked off to talk to someone else, she carries on yelling from behind her booth making a scene. Eventually, Kam moves us to another pickup point a hundred meters down the road, where a man examines our tickets and allows us to drop our bags at his shop.
Mau and I have had to track down someone to exchange some dollars for Kyat in a nearby market for me so I can pay for the bus ticket.
It's hard to say goodbye to Mau. Mariacamielle threatens, as she has many times today, to fold him and his family up in her pocket and take them all home with her. Not only was he part of the cooking team at dinner last night, but he single-handedly made lunch today, which was equally delicious. The man is gem in the kitchen, as well as just splendid company.
Mau gives us a each a package of preserved, sweetened fruit to snack on the long bus ride south.
Caught off guard in receiving a gift, when I feel like I should be giving one. At least tipping him, I fail.
Our guide Mau. Photos: Isaac Stone Simonelli
After he and Kam pile onto a motorbike with a third man, the man who brought our luggage down from Inle Lake today, I instantly regret not giving him money.
I felt the need to tip him more than Kam, there was a subtle inequality between the two that made me want to support Mau. Unfortunately, I failed to do so.
Thankfully, Mariacamielle had given him an extra headlamp, so at least he had that. Without a headlamp, he explained in broken English and gestures that he often ended up driving a motorbike at night holding a flashlight in his mouth.
I should have rolled: pulled out a 20 sided die and given him the dollar value of the roll. For the next several hours the disappointment in failing to tip Mau echoes in the back of my head. I'll just have to track him down and shower him with a few gifts when I return to Myanmar on the motorcycle, as there is nothing else that can be done.
Mariacamielle and I flirt a bit over noodles, tea and soft, warm Burmese teacake. There is something in her character that is contagiously attractive.
The sky darkens over the four lane split highway cutting through Kalaw. The shops on either side glow, the artificial light illuminating restaurant tables and the interiors of souvenirs shops.
I've wandered across the street to replace my longi after Melissa, like a blood hound, sniffed about our little group, her noise quivering in search of a foul smell, which turned out to be a mildewy pair of pants that I'd changed into as my "clean pants" for the bus ride. The sour vinegar smell was bad enough that I complied with the suggestion that I wearing something else.
The die chose a red longi, which I wrap around my waist and quickly twist into a knot.
Back at work on my laptop, I watch Mariacamielle dancing on the sidewalk, Melissa is out of sight. Mariacamielle is overdoing it, clearly trying to shake her dear friend out of a funk. I suspect Melissa's pouting a bit due to the mild flirting between Mariacamielle and myself – they're already a wonderful pair, no need for a dice kid to come along and shake things up.
"She's grumpy," Mariacamielle mouths at me from the sidewalk.
It doesn't take long for Mariacamielle's showering of attention on Melissa to pull her out of it. Pretty soon the two are back in their groove: crazy, funny and entirely wrapped up in their own wonderful world.
"Is this the bus?" Melissa, with her heavy French accent, asks the man in charge.
It's not.
About a dozen inquires in, the man finally realizes that the young French girl is having a laugh.
"Here is your bus," he says playing along, as a pickup truck with high bars welded onto the side for cattle comes to a stop in front of us.
The bus is an hour late. Then it's an hour and half late. Then it's here and we're piling in.
I'm not sitting next to the girls, but I tell Mariacamielle she can hold on to my beloved North Face hoodie, at least until it's time for me to get off.
They'll be riding the bus all the way to Yangon. I'll be switching buses, before then headed for Thailand and my motorcycle.
We say goodbye to the fields of Myanmar. Photo: Isaac Stone Simonelli
#Myanmar #DailyUpdate #Featured #featured
Day 365: Dice Man Quakes at Entering 'Real World'
364: Devastating Realization: Did I Fail The Dice?
363: Goodbye Rafiki, You Troublesome Friend
THE premise is simple: Allow die roles to determine the majority of decisions faced while motorbiking throughout the world with a limited budget for an entire year. It's 365 days of tempting fate, enticing serendipity and letting go of free will – if such things exist at all.
Follow the journey
Dice Are in Charge for...
Like what you read? Donate now and keep the dice in charge
© 2023 by "Dice Travels". Proudly created with Wix.com

redpajama_set_name: RedPajamaCommonCrawl


text:
LET'S HAVE AN HONEST DEBATE ABOUT LGBT FUNDING
An opinion piece by Stuart Duffy, Founder of Pink Saltire
We need to have an honest conversation about funding for LGBT+ work in Scotland.
Over recent years one thing has become clear to many of us – Scotland has ambitions to be a world-leading country for LGBT+ rights. The Scottish Parliament have passed equal marriage, adoption rights, gender recognition reforms, agreed to introduce inclusive education in all schools and the First Minister has publicly apologised for past discrimination against gay/bi men – all extremely important and very welcome moves.
Pioneering work over many decades has led us to where we are now – work by groups like Equality Network, Stonewall Scotland, LGBT Youth Scotland, LGBT Health & Wellbeing and many many others – these victories have been hard fought.
In 2019 we can see that most of our politicians and policy makers have a better understanding about LGBT issues, with a huge shift in awareness amongst the general public too, who are now more likely than ever to accept someone in a same-sex relationship in their family.
A positive consequence of these fundamental changes in societal attitudes are that LGBT people feel more confident than ever to be open about their identity and rightfully expect services to meet their specific needs, whether in the NHS, schools, the workplace or in the community. But have services such as local authorities or the NHS really done enough to meet the needs of their LGBT customers and service users and how are we funding those services?
In 2019 the fight for equality continues at significant pace – a fight against discrimination (2018 figures show LGBT+ hate crimes at their highest ever level); a fight against bullying and abuse in our schools (TIE research identified 90% of LGBT pupils had faced homo/bi/transphobia at school); a fight to stem the poor mental health of LGBT people (LGBT Youth figures in 2018 show 84% of LGBT young people had experienced mental health problems, 50% had suicidal thoughts); and a fight for representation in every corner of Scotland (Equality Network figures from 2015 show 47% of LGBT people felt isolated in rural communities).
In our experience, there are large gaps in provision across the country. Representation of LGBT+ people is patchy at best, with inconsistent delivery of services to meet the needs of rural and urban populations.
Work is funded through 2 core routes – public funds from central or local government and grants/donations from trusts or corporate funders. In 2018 we outlined how National Lottery funding was a critical component to the funding of smaller groups around the country, who receive no core funding and rely on project-by-project year-by-year funding applications. The Lottery are just one of hundreds of individual funders of course, but from experience, this can be a lengthy and energy-sapping process with some funders, taking significant time and resources to continually seek out the right funder and submit a successful bid. Ofcourse funds don't exist to employ professional fundraisers or bid writers for LGBT groups, it's all done by volunteers.
Very few local authorities fund any LGBT work, with the exception of LGBT youth work services which are mainly provided by LGBT Youth Scotland in a number of Council areas around the country. Government funding comes mainly from the Scottish Government's Equalities portfolio – the national and intermediary bodies fund and the promoting equalities and cohesion fund.
The Scottish Government receive a block grant from Westminster and so offering groups any certainty around multi-year funding had been impossible since the block grant value can never be guaranteed. However, in 2017, the government took the bold step and moved to a new 3-year funding deal for equalities funding in Scotland, creating some certainty for those organisations who were successful in their bid, but also closing the door on any new funding until 2020 for other groups.
In the year to March 2019, The Scottish Government provided almost £1million in funding through its Equalities unit to these LGBT organisations:
Equality Network – £230,000
Equality Network Intersex project – £45,000
Stonewall Scotland – £100,000
Scottish Trans Alliance – £200,000
LGBT Youth Scotland – £260,000
LGBT Youth Scotland Women & Girls project – £40,000
LGBT Health & Wellbeing Age project – £60,000
LGBT Health & Wellbeing LGBT Helpline – £20,000
LEAP Sports – £38,800
Additional funding from other departments also flowed to LGBT organisations. Ofcourse this money isn't just handed on a plate to these groups – they work hard to win the support of Government ministers and officials to bring their plans to fruition. Most have an established track record and have delivered successful project or policy work in the past. All of the groups listed could do even more if funds were available too.
Meanwhile, with an increasing confidence in communities caused partly by the introduction of new legislation and the positive change in society's views (that the Government has championed for so long), the LGBT sector has continued to evolve and expand to meet the needs of our community right across the country.
LGBT people are calling out for more specific services in their local community which are closer to them, rather than predominantly in Glasgow or Edinburgh. Just look at the growth in community Pride events over the past few years – from just 3 events in 2016 to 13 in 2018. No Pride events receive Government funding yet they have become the main vehicle for embedding social change in communities around the country.
New organisations have been launched to help meet the demand too, but continually face the challenge of appropriate funding sources to deliver the services needed.
Community-led, hard-working and passionate LGBT groups like Four Pillars in Aberdeen, like Scottish Borders LGBT, like Ayrshire LGBT or the Highland LGBT Forum – groups who are keen to deliver services which meet the needs of their local community but face funding barriers to make it a reality. Groups like these, like Pride organisers, like sports groups and professional networks all play a vital part in making our communities more inclusive, representative and safer for LGBT people.
Even those groups with a higher public profile, such as the TIE Campaign and yes, Pink Saltire too, face significant funding challenges in order to deliver the services we know are urgently needed if we are to achieve our shared ambitions of making Scotland a fantastic place to be LGBT. The dire honest truth is our charities will cease to exist without core funding to employ the staff to deliver the services people say they need.
TIE statement released 2nd April 2019
By comparison, earlier in the year, the Conservative UK Government committed an extra £1million of funding for LGBT services in England as part of their LGBT Action Plan. Scotland has no similar plan for the delivery of services here or commitments of extra funding to meet the needs of our community.
The LGBT movement in Scotland needs an open and honest discussion about the challenges the community face and how these will be met by the skilled organisations we are lucky to have in our small country. This isn't a discussion about moving pennies around from one group to another, but about strategic and structural change which delivers real benefits for ALL of our communities right around the country.
We cannot let the momentum of our movement, built up over many years and on the backs of passionate and dedicated LGBT activists, somehow fade away now. If we are to tackle rising hate crime, social isolation, bullying, worse health outcomes, LGBT discrimination and a lack of inclusion in community life, we need to invest in action sooner rather than later.
We encourage The Scottish Government, local authorities, LGBT organisations and the community to get involved in the discussion and lets make change happen together.
2 thoughts on "LET'S HAVE AN HONEST DEBATE ABOUT LGBT FUNDING"
Angela Anderson says:
Not sure I entered my previous comment entered successfully so apologies if im repeating myself. I agree funding is needed to employ experienced staff to deliver services. Charitable status has its own particular disadvantages. The right people do not always end up on Volunteer Boards. Smaller local support groups need more support. Bi+ specific projects are still too little and there is a lack of awareness of the issues experienced and being discriminated against in the LGBT Community. So its more than just funding. Other intersectional areas such as disability and mental illhealth need more contnued funding. Although there are many issues we have in common the LGBT Community is not the big happy family we would like it to be and therefore intersectional issues need to be a priority for funding.LGBT organisations have a huge job to meet intersectional needs and funding needs to reflect this
Pingback: NEW LGBT HUB LAUNCHES IN ABERDEEN – PINK SALTIRE
Previous Previous post: COUNCIL PULLS THE PLUG ON RIVERSIDE PRIDE PLANS FOR GLASGOW
Next Next post: LGBT HISTORY MONTH 2019: HOW DID YOUR COUNCIL DO?


6. Check out your competition. Visit your competitors' websites. Do searches for keywords related to your business. Find out what others in your vertical are doing and saying. This is a great way to get ideas and take stock of your own company's online marketing efforts.
Facebook is the largest social media platform, and the size of its user base alone makes it a good choice for every business. You can post updates and interact with followers, and also use the platform's built-in advertising options to reach an extremely targeted audience.
Percussion – This streamlined CMS offers editable templates, shared assets, versioning, automatic link management, drag and drop editing, and more. Enables content producers to simplify their content editing and publishing process.
Highlights for this Banner Elk Photographer include: Studio Sessions, Event Photography, Engagement Shoots, Headshots, Bridal Photos, Children's Photography, Portraits, Wedding Photography, Business & Corporate Headshots, Destination Weddings, Family Photography (Portraits, Lifestyle, Vacation), Modeling Portfolio & Headshots, Outdoor, and On-Location.
Master strategic marketing concepts and tools to address brand communication in a digital world. This Specialization explores aspects of the new digital marketing environment, including topics such as digital marketing analytics, search engine optimization, social media marketing, and 3D Printing. When you complete the Digital Marketing Specialization you will have a richer understanding of the foundations of the new digital marketing landscape and acquire a new set of stories, concepts, and tools to help you digitally create, distribute, promote and price products and services. In 2016, this was one of the top 10 specializations in terms of enrollments. INC Magazine rated the first course, Marketing in a Digital World, as one of The 10 Hottest Online Classes for Professionals in 2015. In addition, this course was also ranked in the top five courses across multiple MOOC providers. Finally, the Digital Marketing Certificate was the top coveted certificate on Coursera in 2015. Get more updates on the specialization at http://digitalmarketingprofs.com/ This Specialization is part of the University of Illinois Masters of Business Administration degree program, the iMBA. Learn more about the admission into the program here.


For the start, you should start with the structure of one's home. The layout is important to make sure that your location will fit all the points that you need inside such as the bath, the shower, the toilet, and the table if you ever need one. When you have completed with the layout, then your next thing that you need to accomplish is to use the tiles in the place. For this unique step, you need to ensure that you have imagined the continuing future of your bright spot style ideas. That means, you should have the picture what your area can look like when you mount the tile. Therefore, you might want to mount the tiles with some nice looking combinations. For example, the wall area is utilising the milky white color and the floor is utilizing the creamy white color. Which will make your place looks better.
If you want to use in your region, you've to make sure first that you've the appropriate design that can help your spot in making the best comfortable one. For this type of tiles, you should use it for the modern or even contemporary design. They will combination perfectly and build the right try looking in your place. But, when you yourself have applied the rustic design in your region, you are able to however have chance to make use of this sort of porcelain tiles, but you ought to select them in the rustic way also. Ergo, you have to ensure that you select the pottery with the rustic style one.
In selecting the very best hardwood design can be the complicate things for you yourself to discover the most effective one for you. Every individual has their very own taste in selecting the hardwood for flooring or walling their place, as well as you. If you're the one who generally like the newest new design, you should use among the that could make your area look more contemporary and elegant like that which you want. You only have to choose one to get you to have the best spot tile ever.
There are numerous types of tiles designs as possible select on your own place centered on your own taste of tiles design. You have to make sure that you want your own picked newest spot tiles'style when you are likely to use it in floor your place. If you prefer the water colors, you can use the water color hardwood in your place that may produce your area search friendlier and as if you are in the middle of ocean. You can select the tiles in aqua, turquoise, orange natural or sea-foam predicated on everything you like. The turquoise tile color could make you have the perfect search that will make you want to get move every time you see your place.
You have to realize that even although you have chosen and applied the very best issues that you place them in your region, you still have to check on them regularly whether they're broken or not, particularly for the hardwood that you utilize every day. You shouldn't check your location tile each day, you have to check it annually to ensure that the hardwood can be used for still another year or not. If the tile has damaged, you just have to exchanging place hardwood with the brand new one that has the same design with your past tiles.
Many people enjoy to truly have the subway area style. Actually, some of them are trying to have the attractive area utilizing the . Sure, this sort of design can be considered as anything nice to apply in your area. However, when you wish to utilize this kind of region design, there are a few points that you need to highlight before you start the process. That's since to think about these exact things will provide you with the great result for your .
In choosing the , you've to ensure that you select the most effective one. This sort of tiles has many colors and habits that you can use for the space. You only have to choose them centered on which your area wants and also that which you like. Thus, you only have to make sure that you've selected the best colors and styles that you need to use in your place and ensure that you plumped for tile along with your spot design will match very well and develop the fantastic look.
The final issue may be the furniture in the home. Even if you are looking for the , you'll need to ensure that you still get all of the points that you need within the place. But, you should just pick the very best issues that will have a way to aid your primary idea of utilizing the tiles to produce the . Thus, the will appear good after you have finished it.


text:
Belayab Pharmaceuticals partners with Ghana's mPharma
Business News Tech News
Ethiopian pharmaceutical conglomerate Belayab Pharmaceuticals has partnered with Ghana's mPharma for its expansion project into the Ethiopian market. The Ghana-based company is a healthtech startup that develops software for the management of prescription drug inventories for pharmacies and suppliers.
mPharma is already present in markets in Ghana, its home base, Kenya, Nigeria, Rwanda, and Zambia. Its expansion into the Ethiopian market is expected to contribute to the country's efforts to address the affordability of healthcare services.
Part of mPharama's mission is not only to provide efficient services to pharmacies and other suppliers of prescription medication, but to also move towards making these medications affordable and more accessible.
According to its own reports, mPharma serves more than 100,000 patients monthly and has distributed more than a million drugs across the continent of African from 300 pharmacies and suppliers.
With the new partnership, the two companies expect to open at least two pharmacies in Addis Ababa by the end of this year. The pharmacies will offer customers a loyalty program called Mutti that will give members access to discounts and other financing options for medication. The plan is to provide access to a "pharmacy-in-a-box" solution where mPharma handles every infrastructure involved, and the pharmacy is just concerned about the consumer.
Tags: Belayab Pharmaceuticals, Ethiopian Healthcare, Ethiopian Pharmaceuticals, mPharma
African Development Bank seeks to finance Ethiopia's Digital Modernisation
Concerns raised over Ethiopian United States investigators intentions to release separate reports on Boeing 737 MAX crash


A veto of Iloilo City's P2.318-billion budget for 2019 by mayor Jose Espinosa III appears to have done little to ease the political tension between the mayor and the city council.
While the Sangguniang Panlungsod failed to override Espinosa's veto, its majority bloc at the council became creative by striking out the mayor's line vetos.
The majority bloc also passed a resolution directing the local finance committee to implement the city council's pre-veto version of the budget.
Backing him in scrapping the veto were councilors Jay Treñas, Lady Julie Grace Baronda, Armand Parcon, Ely Estante, Marie Irene Ong, Leila Luntao, and Joshua Alim.
Only six councilors identified with Espinosa objected. They were Eduardo Peñaredondo, R Leoni Gerochi, Lyndon Acap, Candice Tupas, Mandrie Malabor, and Liezl Joy Zulueta-Salazar.
However, City Administrator Hernando Galvez said the city council's resolution merely expresses the sentiments of the council and has no obligatory or legal effect.


Save time and physical work: feedstar provides the feed as often as necessary – fully automatically – and at any time you choose.
Allow yourself room for other duties.
Save the time-consuming task of feeding the cows with feed mixer or silage feeders.
You no longer have to shovel in the feed or clear away the uneaten feed.
Use the time you save for other tasks, such as feeding calves.
Feedstar reduces your workload. No need to shovel the feed around.
With feedstar the rations always remain on the belt.
No need to sweep the feed table clean yourself.
A scraper cleans the band of feed residues. The feed table remains clean and hygienic. The leftover feed collects in a return area.
Easy to operate with the automatic controller or by remote control.


text:
Q: Argument type 'FluentNHibernate.Mapping.IProperty' is not CLS-compliant Name is not compliant? Layout? What?
Do you have ideas what exactly could generate this message? Any ideas are welcome. I have bunch of such warning.
Actually, I am open to remove CLSCompliant(true), but I want to know root cause.

A: Is it not just as simple as the Fluent.NHibernate assembly not being CLSCompliant? The  IProperty type isn't compliant, therefore a method taking it as a parameter isn't compliant.

A: You might have a member that uses the same name with different casing - e.g. iProperty. Or perhaps you have two arguments that differ only in casing.

redpajama_set_name: RedPajamaStackExchange


Slipstream Media pioneered live sports streaming globally back in 2002 with our flagship content, international tennis. It was undoubtedly the initial content driver of Slipstream Media.
Technically ahead of our time and using our own compression technology (this is pre-Flash Media and Youtube), we successfully broadcast the two Auckland ATP and WTA events in the first ever online broadcast of any major tennis event and one of the first major sports events in the world. Contracted to ATP and WTA we then streamed live out of far-flung venues such as Cincinnati, Dubai, Bangkok and Sydney.
No other form of entertainment can be transposed beyond the actual venue and retain the drama and feeling of being live. In other words no other content suits live streaming more than sport.
The internet provides a cost-effective production and broadcast medium for second tier sports. With surprisingly good production standards, and global delivery, we get that content beyond the venue to niche and mainstream fans everywhere.
Slipstream Media grew out of this phenomenon and has been the primary online sports broadcaster in the country.
Extensive experience in live streaming from international venues including from Asia, the US, the Middle East, Africa, and Australia.
The ability to send multi format, multiple bitrate streams, using state of the art codecs and media players.
The countries pre-eminent ad-server and online tracking technology for opening up revenue streams.
Subscription engine for pay-per-view events.
Live video streaming has in the past garnered considerable traction for creating and developing online communities within sports fans.
We deliver content to local and global audiences from international and New Zealand venues.
We provide interactive communication between fans in real time through live chat and social media.
We have a re-selling relationship with two significant online pan-European sports betting companies.
Depending on the type of content, these companies purchase and broadcast content as provided exclusively through Slipstream, providing another revenue stream around live sports content.


text:
Dom Frei Paulo de São Tomás de Aquino O.P. (1773 - 20 de dezembro de 1823) foi um prelado português, arcebispo de Cranganore entre 1821 e 1823, pelo que após, a arquidiocese seria suprimida e incorporada pelo vicariato apostólico de Verapoly. Participou da Junta Provisional de Governo da Índia, entre 1821 e 1823.

Ligação externa

Bispos de Portugal
Governadores da Índia Portuguesa
Religiosos da Ordem dos Dominicanos de Portugal

redpajama_set_name: RedPajamaWikipedia


text:
How to make money from slot machine games? Describe briefly.
Camp Kedrick 1 year ago
Slot machine game is India's most famous game. The gaming industry developed slot machine game is the only video game that attracts its player through its graphics. There is a lot of interest in playing slot games and the graphics are very real. Most experienced players play it and earn money from it. If you also want to earn money by playing a slot machine, then you first need to know about it and its rules because if you started playing it without knowing, you lost and lost your lost money. To earn money from a slot machine, you have to follow some steps which are as follows –
If you have got all the information about the slot game then you should start playing the slot machine game first. After starting, look carefully at various screens to find your victory. The next step is to casinos Mexico set the wagers by pressing the button at the bottom of your screen. With the slot machine left and reel, you can set your budget, keep in mind that set the budget so that you can win twice as much. But one thing you have to keep in mind is not to put science in your right side reels because it is just a feature that makes you feel like playing a real slot machine.
Cash data
Making money from a slot machine is not very easy as it has 3 reels and 3 pay to make money. In such a way there are very limited ways for you to win. If you want to win then you have to keep in mind the symbol of your reels features. If you think you are winning then you have to look at many multiple pay lines. If you want to play slot machine games, then you can use 0.10 to 2.00 spins.
Special mark or symbol
So here are some small amounts of symbol feature on your reels: making money logo, vault full of notes, Golden 7s, silver 7s, triple bars, double bars, and single bars.
There are no wilds, no scatters, no multipliers and no bonuses to make money featured within the slot game.
Use this Guide for your Journey to Becoming a Sports Broadcaster
Sports broadcasters offer coverage of sporting events using different media outlets like television, radio, and the internet. While some of them specialize in a certain area such as doing commentary, others specialize in research, production, and presentation of sporting events and competitions. Becoming a sports broadcaster can be challenging as […]
Which is the best online site to win progressive jackpots in online game?
Four Helpful Tips to Get Started with Esports Sponsorships
Esports Betting Is Growing Rapidly In Philippines
How Sports Contributes To The Development Of A Child?
Is The Autographed Sports Memorabilia Authentic


text:
Seniors and Falls – A Critical Combination
A recent New York Times article illustrates the point that falls, once seen as an inevitable sign of aging, are now considered complex events. Falls have multiple causes and consequences, and require a wide range of interventions that many patients never receive.
Dr. R. Sean Morrison, a professor of geriatrics and adult development at Mount Sinai School of Medicine in New York, says that even falls that cause only minor injury "need to be taken as seriously as diabetes" because "they can be a real warning sign that something serious is wrong. Dr. Mary E. Tinetti, a falls expert at Yale University Medical School, says that falls can be as harmful as stokes, and that may people do not report them or ask for help for fear that their families may try to move them out of their homes to assisted living facilities or nursing homes. Some people feel that admitting that they fall is the same as admitting that they can no longer take care of themselves.
The Centers for Disease Control and Prevention (CDC) reports that each year, over 1.8 million Americans over age 65 are injured in falls. Some people recover and rebound as if the injury never happened. For many people, however, the fall starts a downward spiral that their bodies can no longer withstand. Depression, pneumonia, social isolation, infection and muscle loss are some of the potential consequences of falls. In 2005 (the last year for which statistics are available), 433,000 people over age 65 were admitted to hospitals after falling, whereas 15,800 died as a direct result of the fall. Many others survive falls, but have indirect consequences. According to the CDC, one in five hip-fracture patients over age 65 dies within a year after surgery, while one in four spends a year or more in a nursing home. Older persons with slower reactions and less upper-body strength are unable to break falls with their wrists, and their weight can fall on their hips or heads. Existing respiratory or heart problems can increase the possibility of a downward spiral.
Dr. Deanna Gray-Miceli, adjunct professor of nursing at the University of Pennsylvania, is an expert in geriatric falls. Her research indicates that the period of immobility after a fall is particularly dangerous. "Being immobile, you're not taking deep breaths, you're more prone to orthostatic pneumonia, or older people can develop urinary incontinence. And that can have a whole cascade of emotional consequences as well as the physical consequences, such as skin breakdown, pressure sores, bladder infection, and lung infection." Infection can also cause confusion.
Dr. Gray-Miceli says that after a fall, it is important for medical staff to keep the patient focused on signs of progress so the patient can say, "Today I got up by the side of the chair and took five steps. Yesterday I only took four steps." These signs of progress are important so the patient can gain a sense of optimism and control and help prevent depression from setting in.
Dr. Gray-Miceli has identified treatable causes of falls, such as low blood pressure, declining vision, changes in gait and heart arrhythmias, as well as conditions in the home. The CDC also offers tips to reduce falls at home, such as removing loose rugs, and ensuring that stairway handrails are installed. The CDC website atwww.cdc.gov/ncipc/duip/preventadultfalls.htm includes many other tips. Physical therapy and changes in medication reduced falls by 11%, according to a study by Dr. Tinetti. Families and doctors should be alert for circumstances and conditions that can cause falls and do their best to prevent them.
The attorneys at Oast & Hook can assist clients with their long-term care, financial, insurance, investment, estate, veterans' benefits and special needs planning issues.
O&H: Allie, we've heard that there is new study that animals can actually feel the beat of music that they hear. Please tell us about it.
Allie: Sure! The Neurosciences Institute in San Diego recently released results of a study that was published online last week by the journal Current Biology. Aniruddh Patel of the Institute conducted the study that showed that some parrots and an occasional elephant actually felt the beat of the music they heard. Unfortunately dogs, cats and chimps did not demonstrate that same ability. The research initially included studying YouTube videos of Snowball, a medium sulfur-crested Eleonora cockatoo, dancing to the beat of his favorite Backstrert Boys song, among other songs. (My favorite video of Snowball has him dancing to "Another One Bites the Dust" by Queen; that one gets Oast & Hook's staff dancing along with him!) Mr. Patel then collaborated with Snowball's owner for more extensive research. Other scientists studied Snowball, an African gray parrot named Alex, and other animals on YouTube. The research shows that some animals share with people some ability to mimic sounds that they hear, and that same brain circuitry also lets people learn to talk, and sometimes also dance or tap their toes to music. The scientists say that the research has given them some insight into why humans became able to dance.
Please feel free to e-mail your pet- and animal-related questions to Allie at:allie@oasthook.com .


MINT holder VILDT UDSALG på FILM! Hundredevis af DVD' er er blevet sat ned til HALV PRIS! Borderlands 2 axton save file xbox 360.
A glitch- filled opening night could spell trouble for Blizzard' s $ 15 All- Access Pass. Fight alongside Handsome Jack as four new vault hunters contributing to the rise of the corrupt Hyperion Corporation, each with unique skill trees, action skills, and play styles. The Ascended Glitch trope as used in popular culture.
If a Good Bad Bug is particularly liked by fans of a game, it might be upgraded to the status of a. Udsalg på film af Michelle 29.


text:
Centrul de Investigare a Crimelor Comunismului (CICC) este un institut de cercetare aflat sub egida Asociației pentru Memoria Victimelor Comunismului, înființat în aprilie 2010 și condus de istoricul Marius Oprea.

Vezi și
 Institutul Național pentru Studiul Totalitarismului (INST)
 Institutul de Investigare a Crimelor Comunismului și Memoria Exilului Românesc (IICMER)
 Institutul Român de Istorie Recentă (IRIR)

Note

Legături externe
www.condamnareacomunismului.ro - Site web oficial

Organizații neguvernamentale din România
Cercetarea istoriei comunismului din România


text:
<!DOCTYPE=html>

      <link type="text.css" rel="stylesheet" href="pure-min.css"/>
   <title>ckmarc</title>

      go cluelesskit


text:
Videos and Media
Conspiracy Fact and Theory
The Daily Sheeple
Back to the Basics: Water for Survival
By Ed ThomasApril 10, 2012
Water – The Most Important Survival Basic Clean water is something that we all take for...
The Henry U.S. Survival AR-7 Portable Rifle
By The Daily SheepleApril 3, 2012
Since 1959, the venerable AR-7 has been the choice of U.S. Air Force pilots who need...
Doom: Massive Wealth Destruction Through High Inflation, Social Unrest, War, or Credit Market Collapse
I think there is a massive wealth destruction coming down the line. I'm not saying it's...
The Colony – The Ultimate Doomsday Survival Experiment
By Ed ThomasApril 2, 2012
What would you do in the wake of a global catastrophe? Even if you survived it,...
Testing Precious Metals for Long-Term Preparations
By The Daily SheepleMarch 26, 2012
Mints and exchanges offer a sure thing. These businesses are built on trust and integrity. However...
New Executive Order: We Can Take Anything from Anyone at Any Time
By Ed ThomasMarch 19, 2012
This Executive Order was quietly signed on Friday afternoon. It is the death warrant of private...
Gardening – The Ultimate Food Storage Backup
By Ed ThomasMarch 6, 2012
Got food with dirt on it for backup?
The Nation's Supply and Delivery of Fresh Drinking Water is in Peril: Water Bills to Triple Across USA
Is this information new? Why, all of a sudden, is water infrastructure such a big concern?...
The Other Things [You'll Need In A Survival Situation]
By The Daily SheepleFebruary 23, 2012
Guns (and ammo) are obviously good things to have. And every person who wants to be...
Going Off Grid – Montana Style!
The concept of off-grid living is often encumbered by numerous false assumptions and associations. Many think...
Why Be Subjected to Ridicule by Appearing on "Doomsday Preppers" ?
When "Doomsday Preppers" contacted me and asked if I would be willing to put my family...
The Greater Depression: Worst is yet to Come
By Ed ThomasFebruary 10, 2012
Very few people who are alive today were around in 1929, so, understandably, the very concept...
Why We Are Truly In Trouble
By The Daily SheepleFebruary 8, 2012
I am building a SHTF plan that I fully intend on having to use. A large...
Mainstream Report: Subculture of Americans Prepares for Civilization's Collapse
By The Daily SheepleJanuary 22, 2012
They are following in the footsteps of hippies in the 1960s who set up communes to...
Some Suggestions for Helping to Keep People Away After a Cataclysm
For those that have prepared and sacrificed to be ready, "just in case", their main problem...
How To Prepare For The Difficult Years Ahead
By Ed ThomasJanuary 17, 2012
Eventually, this thing is coming all the way down. Someday America will be such a horror...
Todays Air Rifiles: No Longer Just Toys
By Ed ThomasJanuary 8, 2012
An often, overlooked survival item, is the air rifle, as it is looked upon by many...
Survive Economic Fluctuations and Full-Blown Collapse
With commodities like food and oil still trading in weakening dollars, it puts further pressure on...
Confirmed: Fukushima Disaster Contaminated Ocean With 50 Million Times Normal Radiation, Leaks Still Ongoing
By Ed ThomasDecember 13, 2011
TEPCO has finally admitted that alarming quantities of radioactive strontium (which has roughly a 30-year half...
10 Survival Tips That Will Get You Killed
By The Daily SheepleNovember 25, 2011
The Modern Survivalist Fernando "FerFAL" Aguirre explains why some of the survival tips you may have...
Page 66 of 66« First‹ Previous6263646566
Our staff has spent the better part of the last decade helping to inform the public about breaking news, global developments, and trend forecasts. We believe strongly in the First Amendment as a tool for open ... Read More
COPYRIGHT © 2019 THEDAILYSHEEPLE.COM