text:
@protocol ComGoogleCommonHashHasher;

@interface ComGoogleCommonHashCrc32cHashFunction : ComGoogleCommonHashAbstractStreamingHashFunction

#pragma mark Public

- (jint)bits;

- (id<ComGoogleCommonHashHasher>)newHasher OBJC_METHOD_FAMILY_NONE;

- (NSString *)description;

#pragma mark Package-Private

- (instancetype)init;

@end

J2OBJC_EMPTY_STATIC_INIT(ComGoogleCommonHashCrc32cHashFunction)

FOUNDATION_EXPORT void ComGoogleCommonHashCrc32cHashFunction_init(ComGoogleCommonHashCrc32cHashFunction *self);

FOUNDATION_EXPORT ComGoogleCommonHashCrc32cHashFunction *new_ComGoogleCommonHashCrc32cHashFunction_init() NS_RETURNS_RETAINED;

J2OBJC_TYPE_LITERAL_HEADER(ComGoogleCommonHashCrc32cHashFunction)

#endif

#if !defined (_ComGoogleCommonHashCrc32cHashFunction_Crc32cHasher_) && (ComGoogleCommonHashCrc32cHashFunction_INCLUDE_ALL || ComGoogleCommonHashCrc32cHashFunction_Crc32cHasher_INCLUDE)
#define _ComGoogleCommonHashCrc32cHashFunction_Crc32cHasher_

#define ComGoogleCommonHashAbstractByteHasher_RESTRICT 1
#define ComGoogleCommonHashAbstractByteHasher_INCLUDE 1
#include "com/google/common/hash/AbstractByteHasher.h"

@class ComGoogleCommonHashHashCode;
@class IOSIntArray;

@interface ComGoogleCommonHashCrc32cHashFunction_Crc32cHasher : ComGoogleCommonHashAbstractByteHasher

#pragma mark Public

- (ComGoogleCommonHashHashCode *)hash__;

- (void)updateWithByte:(jbyte)b;

#pragma mark Package-Private

- (instancetype)init;

@end

J2OBJC_STATIC_INIT(ComGoogleCommonHashCrc32cHashFunction_Crc32cHasher)

FOUNDATION_EXPORT IOSIntArray *ComGoogleCommonHashCrc32cHashFunction_Crc32cHasher_CRC_TABLE_;
J2OBJC_STATIC_FIELD_GETTER(ComGoogleCommonHashCrc32cHashFunction_Crc32cHasher, CRC_TABLE_, IOSIntArray *)

FOUNDATION_EXPORT void ComGoogleCommonHashCrc32cHashFunction_Crc32cHasher_init(ComGoogleCommonHashCrc32cHashFunction_Crc32cHasher *self);

FOUNDATION_EXPORT ComGoogleCommonHashCrc32cHashFunction_Crc32cHasher *new_ComGoogleCommonHashCrc32cHashFunction_Crc32cHasher_init() NS_RETURNS_RETAINED;

J2OBJC_TYPE_LITERAL_HEADER(ComGoogleCommonHashCrc32cHashFunction_Crc32cHasher)

#endif

#pragma pop_macro("ComGoogleCommonHashCrc32cHashFunction_INCLUDE_ALL")


TakkTile sensors were implemented into the i-HY hand. The hand which was a collaborative development effort between Harvard, iRobot, and Yale.
There are 22 sensors in each finger and 48 sensors in the palm.


Jamal Cornelious serves as a Community Development Representative for Delta Community Credit Union. Delta Community is the largest credit union in the state of Georgia, serving more than 360,000 individuals. In this role, Jamal helps to lead and execute the community and philanthropic investment strategy on behalf of Delta Community. Jamal specializes in providing financial education to residents across the Greater Atlanta Metropolitan Area. Jamal has held numerous leadership positions in the nonprofit sector, focusing on developing impactful public-private partnerships. Jamal holds a Bachelor of Science in Business along with a Master of Public Service Management from DePaul University. Jamal lives in Atlanta, GA with his wife and daughter.


text:
About, Speaking & Contact
Dan Raven-Ellison
Guerrilla Geographer & Creative Explorer
National Geographic: London becomes world's first 'National Park City.' What does that mean?
21 July, 2019 27 November, 2019 By @DanRavenEllison
"The National Park City idea is all about making cities greener, healthier, and wilder, says Daniel Raven-Ellison, a geographer and National Geographic explorer who originated the concept six years ago.
"What an amazing moment for London. Celebrating, honouring and recognising the biodiversity and greenness of this great city," said Jayne Miller, Chair of World Urban Parks. It's a challenge to cities around the world to venerate, protect, and increase the green spaces, Miller said in a statement."
Read the full article on National Geographic.
Positive News: London, the world's first national park city
9 July, 2019 27 November, 2019 By @DanRavenEllison
"As part of our United Kingdom of Solutions focus, we meet Daniel Raven-Ellison. The former geography teacher has spearheaded the movement for London to become the world's first national park city – and it's happening later this month.
"I feel proud, excited and most of all, really hopeful." After six years of campaigning, Daniel Raven-Ellison has his sights firmly fixed on 22 July: the day when London will officially become the world's first national park city. This former geography teacher – the driving force behind the movement to make the capital greener, healthier and wilder – has proved a natural at enthusing people to join his imaginative leap about how and what cities can be."
Read the full article on Positive News.
BBC Two: Cities, Nature's New Wild
17 January, 2019 By @DanRavenEllison
Cities: Nature's New Wild is a brilliant new wildlife series from the BBC. Looking at the relationship between wildlife, people and cities around the world, the final episode finishes with Beth Collier and Wild in the City, Friend's of the Earth's 10xGreener project and the London National Park City.
Watch the whole episode on iPlayer here and skip to 52 minutes for "Tales from the Wild Side" that focuses on London.
CNN Going Green: How London will become the world's first National Park City
23 December, 2018 By @DanRavenEllison	No Comments
"London is not just a city, it's a landscape," he said. "It's a landscape that's home not just to nearly nine million people, but there are as many trees. We share this city with 15,000 other species of life and I don't think that urban life is worth any less than that life that we see in maybe those more distant places from cities."
CNN's Going Green covers the London National Park City. Read the full article here.
The #UKin100Seconds
25 September, 2018 25 September, 2018 By @DanRavenEllison	No Comments
Made in collaboration with Friends of the Earth, Jack Smith and Benjamin Zephaniah, here's my new film – The UK in 100 Seconds.
Facebook Live: Empty Classroom Day for Nat Geo Kids & Dirt is Good
17 May, 2018 By @DanRavenEllison	No Comments
Outdoor Classroom Day is an international effort to get more children playing and learning outdoors at school. Nearly 2 million children and 19,000 schools have got involved during 2018 so far.
I was delighted when Nat Geo Kids & Dirt is Good asked me to host this Facebook Live to help promote the day.
Canal & River Trust video: How the canal can be your co-navigator.
7 April, 2018 7 April, 2018 By @DanRavenEllison	No Comments
The Canal & River Trust asked me to collaborate on a short video about my relationship with canals. I used the opportunity to describe why I take so much pleasure in walking along them.
Walk Magazine: Walk & Talk… Dan Raven-Ellison
26 February, 2018 By @DanRavenEllison	No Comments
"The urban explorer and 'guerilla geographer' is leading the campaign to make London a national park city.
What is the London National Park City campaign?
The concept is my own 'invention', although it's not a new idea. We have enclosed and protected green spaces for centuries. Urban nature conservation is in the DNA of town and city dwellers, from private gardens to sprawling nature reserves. Britain has already exported the idea of urban nature conservation around the world, so the only contribution I am making is stressing that the whole of London's urban landscape should be part of the National Park City. That means all the parks, gardens, rivers, industrial sites – a recognition of the collective value of the whole urban landscape."
Read the whole interview on the Ramblers website.
Lonely Planet: The world's first 'National Park City' is set to be in the UK
"London is preparing to become the world's first 'National Park City', with thanks to the backing of the Mayor of London, members of the London Assembly and many of the city's councillors.
"London becoming a National Park City is the perfect way to celebrate everything that has been done to make the capital so green and diverse. It's also an exciting challenge to make the city even more green, wild and enjoyable," Dan Raven-Ellison, founder of the London National Park City campaign, told Lonely Planet."
Read the full article on Lonely Planet.
Going Underground Interview: Air pollution, the London National Park City and geography
27 October, 2017 By @DanRavenEllison
Earlier this week I was interviewed on RT's Going Underground about air pollution, making London greener, and the "renaissance of geography". This is a shortened version of that interview.
View DanRavenEllison's profile on Twitter
View DanRavenEllison's profile on Instagram
View danielravenellison's profile on LinkedIn

redpajama_set_name: RedPajamaCommonCrawl


text:
Board index World of Blue Twin Peaks Movie, TV, Books Season 2 (1990-1991)
Location: The Great Northern
Re: Episode 12
Postby Audrey Horne » Mon Oct 19, 2015 11:10 pm
I'm sorry but I don't think there is a more exciting moment than Cooper rescuing Audrey. That's my Twin Peaks oayoff. The killer reveal is episode 2.14 and this one are the two most satisfying moments for me... One devastating and one so stand up and cheering.
God, I love this music. Isn't it too dreamy?
TwinPeaksFanatic
Location: Central. NJ
Contact TwinPeaksFanatic
Postby TwinPeaksFanatic » Fri Jun 17, 2016 5:22 am
I always enjoyed episode 12 a lot, particularly for the Donna/Harold Smith scenes. I think it's some of LFB's best work.
I wrote a recap for the episode, which can be viewed here - http://twinpeaksfanatic.blogspot.com/20 ... de-12.html
Postby Gabriel » Fri Mar 24, 2017 8:16 am
What I have found interesting as the characters walk through the curtained corridors is the similarity between Jack's and the Waiting Room/Black Lodge. The Waiting Room/Black Lodge are to One Eyed Jack's what the bed chamber at the end of 2001 is to a regular hotel room.
Mr. Reindeer
Postby Mr. Reindeer » Sun Apr 02, 2017 7:39 pm
There's an odd amount of violence against women in this episode: Coop hitting Nancy (somewhat mitigated/justified by his anger regarding Audrey, but still arguably unbefitting of an agent of his standing and prowess), Jean stabbing Blackie (and in a beautifully creepy unscripted moment seemingly savoring her blood as she bleeds from her mouth!), and perhaps most troublesome, Pinkle's casual wife-beating joke, which is even more cringe-worthy in Shelly's presence. Of course, it's certainly the sort of joke plenty of people might have made in that era, and (slightly less so) even might make openly today, so it's realistic in that sense. But the episode seems to want us to find Pinkle endearing, or at the very least, harmless. I'm not really inclined to laugh at his slapstick to begin with (I like Lander generally, and really enjoy him on On the Air, a show I don't particularly like but he's one of the best strengths) -- but after that crack, I'm really not in the mood to giggle at his capering. I really wish Shelly had at least gotten more of a reaction shot registering her disgust. She just placidly smokes her cigarette. Btw, the line isn't in the script, so it's possible that Lander improvised it.
OTOH, I have never found LFB as powerful, in control, or sexy as I do in this episode. It's almost like Clifford made it his personal mission to make Donna pop: the performance she gives in this episode, consistently in every scene, is head and shoulders above anything else she did on the show. Personally, I don't generally find her physically attractive, but the way she's photographed in this one and the energy she gives off is the definition of steamy. She owns it.
And, after this slightly troubling episode from a feminist standpoint (which ends with two females in peril), Lesli Linka Glatter returns in full force next episode, opening with a series of Georgia O'Keefe-esque vaginal orchid shots.
My Twin Peaks timeline.
Postby Jonah » Sat Jul 22, 2017 5:31 am
I like the opening here with Cooper in Room 315, speaking into his recorder to Diane, then doing a handstand and - finally -seeing Audrey's envelope. (For some reason I had always assumed the Giant was referring to Audrey's letter when he said "you forgot something", but of course he was probably referring to what Laura whispered in Coop's ear in his dream.)
The trial sequences here in the roadhouse always struck me as a bit ridiculous, but this is Twin Peaks. So it sort of works.
I do like the scene with the Judge, Harry, and Cooper at the bar.
Donna's speech to Harold is very effective and well played by Lara Flynn Boyle.
I like the scene with Maddy and James at the diner.
I love Maddy hiding in the bushes with her coffee! And then we see Cooper crouching in some bushes a little later too. There's a lot of crouching and sneaking around in this episode.
The stuff at One Eyed Jack's was never one of my favourite subplots. All the red drapes remind me of the red room of course - and doubly so when we see the statues now too. Very on the nose - but somehow it works.
Harry peering through the glass and seeing Blackie killed is very eerie. Renault licking the blood is .... I'm not sure if it's OTT or creepy, but it's definitely memorable.
The final scene might have been very powerful only for the fact that the rake is already dripping with fake blood before Harold rubs it on his face. This goof always really took me out of the moment, but I like this storyline overall.
Actually, now that some time has passed, I like "The full blossom of the evening".
Poiuyt
Postby Poiuyt » Tue Aug 21, 2018 4:07 pm
File under Never Noticed Credits: Van Dyke Parks, the legendary writer of the Beach Boys' lost Smile album--lost at least until 2011--appears in this episode.
Not knowing what he looks like, I had to look up who he played. None other than Leo Johnson's attorney. Strange casting choice. I wonder if he asked to be in the show.
Postby Mr. Strawberry » Wed Aug 22, 2018 12:11 pm
Poiuyt wrote: File under Never Noticed Credits: Van Dyke Parks, the legendary writer of the Beach Boys' lost Smile album--lost at least until 2011--appears in this episode.
Finally listening to Smile thanks to this post. So far, I dig it.
And you're right, that is a pretty odd casting decision.
Postby Mr. Reindeer » Wed Aug 22, 2018 1:26 pm
He gave an interview to the TP Archive. He said he had never seen the show or any of DKL's work, but the episode director Graham Clifford was a former neighbor of his. He had also acted previously with Royal Dano.
Return to "Season 2 (1990-1991)"


text:
#include <jni.h>
#include <stdio.h>
#include <string.h>
#include <sass.h>
#include <sass2scss.h>
#include <stdlib.h>
#include "jni_helper.c"
#include "io_bit3_jsass_adapter_NativeAdapter.h"

/**
 * Convert a sass value into a java value.
 *
 * @param sass_value The sass value.
 *
 * @return The java value.
 */
jobject convert_sass_value_to_java(JNIEnv *env, const union Sass_Value *sass_value) {
    jobject j_value = 0;

    if (sass_value_is_number(sass_value)) {
        double c_value = sass_number_get_value(sass_value);
        const char *c_unit = sass_number_get_unit(sass_value);

        jstring j_unit = (*env)->NewStringUTF(env, c_unit);

        jclass j_class = (*env)->FindClass(env, "io/bit3/jsass/type/SassNumber");
        jmethodID j_constructor = (*env)->GetMethodID(env, j_class, "<init>", "(DLjava/lang/String;)V");
        j_value = (*env)->NewObject(env, j_class, j_constructor, c_value, j_unit);

        (*env)->DeleteLocalRef(env, j_unit);
        (*env)->DeleteLocalRef(env, j_class);
    }

    else if (sass_value_is_string(sass_value)) {
        const char *c_value = sass_string_get_value(sass_value);
        bool c_quoted = sass_string_is_quoted(sass_value);

        jstring j_string;

        if (c_quoted) {
            char *c_string = sass_string_unquote(c_value);
            j_string = (*env)->NewStringUTF(env, c_string);
            free(c_string);
        } else {
            j_string = (*env)->NewStringUTF(env, c_value);
        }

        jclass j_class = (*env)->FindClass(env, "io/bit3/jsass/type/SassString");
        jmethodID j_constructor = (*env)->GetMethodID(env, j_class, "<init>", "(Ljava/lang/String;Z)V");
        j_value = (*env)->NewObject(env, j_class, j_constructor, j_string, c_quoted);

        (*env)->DeleteLocalRef(env, j_string);
        (*env)->DeleteLocalRef(env, j_class);
    }

    else if (sass_value_is_boolean(sass_value)) {
        bool c_value = sass_boolean_get_value(sass_value);

        jclass j_class = (*env)->FindClass(env, "io/bit3/jsass/type/SassBoolean");
        jmethodID j_constructor = (*env)->GetMethodID(env, j_class, "<init>", "(Z)V");
        j_value = (*env)->NewObject(env, j_class, j_constructor, c_value);

        (*env)->DeleteLocalRef(env, j_class);
    }

    else if (sass_value_is_color(sass_value)) {
        double red = sass_color_get_r(sass_value);
        double green = sass_color_get_g(sass_value);
        double blue = sass_color_get_b(sass_value);
        double alpha = sass_color_get_a(sass_value);

        jclass j_class = (*env)->FindClass(env, "io/bit3/jsass/type/SassColor");
        jmethodID j_constructor = (*env)->GetMethodID(env, j_class, "<init>", "(DDDD)V");
        j_value = (*env)->NewObject(env, j_class, j_constructor, red, green, blue, alpha);

        (*env)->DeleteLocalRef(env, j_class);
    }

    else if (sass_value_is_list(sass_value)) {
        size_t c_length = sass_list_get_length(sass_value);
        enum Sass_Separator c_separator = sass_list_get_separator(sass_value);

        jclass j_separator_class = (*env)->FindClass(env, "io/bit3/jsass/Separator");
        jobject j_separator;

        if (SASS_SPACE == c_separator) {
            jfieldID j_field = (*env)->GetStaticFieldID(env, j_separator_class, "SPACE", "Lio/bit3/jsass/Separator;");
            j_separator = (*env)->GetStaticObjectField(env, j_separator_class, j_field);
        } else {
            jfieldID j_field = (*env)->GetStaticFieldID(env, j_separator_class, "COMMA", "Lio/bit3/jsass/Separator;");
            j_separator = (*env)->GetStaticObjectField(env, j_separator_class, j_field);
        }

        jclass j_class = (*env)->FindClass(env, "io/bit3/jsass/type/SassList");
        jmethodID j_constructor = (*env)->GetMethodID(env, j_class, "<init>", "(ILio/bit3/jsass/Separator;)V");
        j_value = (*env)->NewObject(env, j_class, j_constructor, (jint) c_length, j_separator);

        jmethodID j_add_method = (*env)->GetMethodID(env, j_class, "add", "(Ljava/lang/Object;)Z");

        for (size_t i = 0; i < c_length; i++) {
            union Sass_Value *c_item = sass_list_get_value(sass_value, i);
            jobject j_item = convert_sass_value_to_java(env, c_item);
            (*env)->CallBooleanMethod(env, j_value, j_add_method, j_item);
            (*env)->DeleteLocalRef(env, j_item);
        }

        (*env)->DeleteLocalRef(env, j_separator);
        (*env)->DeleteLocalRef(env, j_separator_class);
        (*env)->DeleteLocalRef(env, j_class);
    }

    else if (sass_value_is_map(sass_value)) {
        size_t c_length = sass_map_get_length(sass_value);

        jclass j_class = (*env)->FindClass(env, "io/bit3/jsass/type/SassMap");
        jmethodID j_constructor = (*env)->GetMethodID(env, j_class, "<init>", "(I)V");
        j_value = (*env)->NewObject(env, j_class, j_constructor, (jint) c_length);

        jmethodID j_put_method = (*env)->GetMethodID(
                env, j_class, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"
        );

        for (size_t i = 0; i < c_length; i++) {
            union Sass_Value *c_key = sass_map_get_key(sass_value, i);
            union Sass_Value *c_item = sass_map_get_value(sass_value, i);
            jobject j_key = convert_sass_value_to_java(env, c_key);
            jobject j_item = convert_sass_value_to_java(env, c_item);
            (*env)->CallObjectMethod(env, j_value, j_put_method, j_key, j_item);
            (*env)->DeleteLocalRef(env, j_key);
            (*env)->DeleteLocalRef(env, j_item);
        }

        (*env)->DeleteLocalRef(env, j_class);
    }

    else if (sass_value_is_error(sass_value)) {
        const char *c_message = sass_error_get_message(sass_value);
        jstring j_message = (*env)->NewStringUTF(env, c_message);

        jclass j_class = (*env)->FindClass(env, "io/bit3/jsass/type/SassError");
        jmethodID j_constructor = (*env)->GetMethodID(env, j_class, "<init>", "(Ljava/lang/String;)V");
        j_value = (*env)->NewObject(env, j_class, j_constructor, j_message);

        (*env)->DeleteLocalRef(env, j_class);
        (*env)->DeleteLocalRef(env, j_message);
    }

    else if (sass_value_is_warning(sass_value)) {
        const char *c_message = sass_error_get_message(sass_value);
        jstring j_message = (*env)->NewStringUTF(env, c_message);

        jclass j_class = (*env)->FindClass(env, "io/bit3/jsass/type/SassWarning");
        jmethodID j_constructor = (*env)->GetMethodID(env, j_class, "<init>", "(Ljava/lang/String;)V");
        j_value = (*env)->NewObject(env, j_class, j_constructor, j_message);

        (*env)->DeleteLocalRef(env, j_class);
        (*env)->DeleteLocalRef(env, j_message);
    }

    if (!j_value) {
        jclass j_class = (*env)->FindClass(env, "io/bit3/jsass/type/SassNull");
        jmethodID j_constructor = (*env)->GetMethodID(env, j_class, "<init>", "()V");
        j_value = (*env)->NewObject(env, j_class, j_constructor);

        (*env)->DeleteLocalRef(env, j_class);
    }

    // (*env)->DeleteLocalRef(env, j_value);

    return j_value;
}

/**
 * Convert a java value into a sass value.
 *
 * @param j_value The java value.
 *
 * @return The sass value.
 */
union Sass_Value *convert_java_value_to_sass(JNIEnv *env, jobject j_value) {
    if (!j_value) {
        return sass_make_null();
    }

    jclass j_type_class = (*env)->GetObjectClass(env, j_value);
    jfieldID j_type_field = (*env)->GetStaticFieldID(env, j_type_class, "TYPE", "I");

    if (!j_type_field) {
        char message[128];
        sprintf(message, "Java value %p does not have any type", j_value);

        (*env)->DeleteLocalRef(env, j_type_class);

        return sass_make_error(message);
    }

    jint type = (*env)->GetStaticIntField(env, j_type_class, j_type_field);
    union Sass_Value *sass_result = 0;

    if (1 == type) {
        sass_result = sass_make_null();
    } else if (2 == type) {
        double c_value = call_class_double_method(env, j_value, j_type_class, "doubleValue");
        char *c_unit = call_class_string_method(env, j_value, j_type_class, "getUnit");

        sass_result = sass_make_number(c_value, c_unit);
    } else if (3 == type) {
        char *c_string = call_class_string_method(env, j_value, j_type_class, "getValue");
        bool c_quoted = call_class_boolean_method(env, j_value, j_type_class, "isQuoted");

        if (c_quoted) {
            char c_quote = call_class_char_method(env, j_value, j_type_class, "getQuote");
            c_string = sass_string_quote(c_string, c_quote);
        }

        union Sass_Value *sass_string = sass_make_string(c_string);
        sass_string_set_quoted(sass_string, c_quoted);

        sass_result = sass_string;
    } else if (4 == type) {
        bool c_value = call_class_boolean_method(env, j_value, j_type_class, "getValue");

        sass_result = sass_make_boolean(c_value);
    } else if (5 == type) {
        double c_red = call_class_double_method(env, j_value, j_type_class, "getRed");
        double c_green = call_class_double_method(env, j_value, j_type_class, "getGreen");
        double c_blue = call_class_double_method(env, j_value, j_type_class, "getBlue");
        double c_alpha = call_class_double_method(env, j_value, j_type_class, "getAlpha");

        sass_result = sass_make_color(c_red, c_green, c_blue, c_alpha);
    } else if (6 == type) {
        int c_size = call_class_int_method(env, j_value, j_type_class, "size");

        jobject j_separator = call_class_object_method(
                env, j_value, j_type_class, "getSeparator", "()Lio/bit3/jsass/Separator;"
        );
        jclass j_separator_class = (*env)->GetObjectClass(env, j_separator);
        jfieldID j_separator_field = (*env)->GetFieldID(env, j_separator_class, "character", "C");
        jchar c_separator_char = (*env)->GetCharField(env, j_separator, j_separator_field);

        enum Sass_Separator c_separator = SASS_COMMA;
        if (' ' == c_separator_char) {
            c_separator = SASS_SPACE;
        }

        union Sass_Value *sass_list = sass_make_list((size_t) c_size, c_separator);

        jmethodID j_get_method = (*env)->GetMethodID(env, j_type_class, "get", "(I)Ljava/lang/Object;");

        for (int i = 0; i < c_size; i++) {
            jobject j_item = (*env)->CallObjectMethod(env, j_value, j_get_method, i);
            union Sass_Value *c_item = convert_java_value_to_sass(env, j_item);
            sass_list_set_value(sass_list, (size_t) i, c_item);
            (*env)->DeleteLocalRef(env, j_item);
        }

        (*env)->DeleteLocalRef(env, j_separator_class);
        (*env)->DeleteLocalRef(env, j_separator);

        sass_result = sass_list;
    } else if (7 == type) {
        int c_size = call_class_int_method(env, j_value, j_type_class, "size");

        union Sass_Value *sass_map = sass_make_map((size_t) c_size);

        jobject j_entry_set = call_class_object_method(env, j_value, j_type_class, "entrySet", "(I)Ljava/util/Set;");
        jobject j_iterator = call_object_method(env, j_value, "iterator", "()Ljava/util/Iterator;");
        jclass j_iterator_class = (*env)->GetObjectClass(env, j_iterator);
        jmethodID j_iterator_hasNext_method = (*env)->GetMethodID(env, j_iterator_class, "hasNext", "()Z");
        jmethodID j_iterator_next_method = (*env)->GetMethodID(env, j_iterator_class, "next", "()Ljava/lang/Object;");

        jclass j_entry_class = (*env)->FindClass(env, "java/util/Map$Entry");
        jmethodID j_entry_getKey_method = (*env)->GetMethodID(env, j_entry_class, "getKey", "()Ljava/lang/Object;");
        jmethodID j_entry_getValue_method = (*env)->GetMethodID(env, j_entry_class, "getValue", "()Ljava/lang/Object;");

        size_t i = 0;
        while ((*env)->CallBooleanMethod(env, j_iterator, j_iterator_hasNext_method)) {
            jobject j_entry = (*env)->CallObjectMethod(env, j_iterator, j_iterator_next_method);
            jobject j_key = (*env)->CallObjectMethod(env, j_entry, j_entry_getKey_method);
            jobject j_item = (*env)->CallObjectMethod(env, j_entry, j_entry_getValue_method);

            union Sass_Value *c_key = convert_java_value_to_sass(env, j_key);
            union Sass_Value *c_item = convert_java_value_to_sass(env, j_item);

            sass_map_set_key(sass_map, i, c_key);
            sass_map_set_value(sass_map, i, c_item);

            i++;
            (*env)->DeleteLocalRef(env, j_item);
            (*env)->DeleteLocalRef(env, j_key);
            (*env)->DeleteLocalRef(env, j_entry);
        }

        (*env)->DeleteLocalRef(env, j_iterator_class);
        (*env)->DeleteLocalRef(env, j_iterator);
        (*env)->DeleteLocalRef(env, j_entry_class);
        (*env)->DeleteLocalRef(env, j_entry_set);

        sass_result = sass_map;
    } else if (8 == type) {
        const char *message = call_class_string_method(env, j_value, j_type_class, "getMessage");
        sass_result = sass_make_error(message);
    } else if (9 == type) {
        const char *message = call_class_string_method(env, j_value, j_type_class, "getMessage");
        sass_result = sass_make_warning(message);
    }

    (*env)->DeleteLocalRef(env, j_type_class);

    if (sass_result) {
        return sass_result;
    }

    char message[128];
    sprintf(message, "Java type %d cannot be converted into sass", type);
    return sass_make_error(message);
}

/**
 * Structure that store all relevant informations for a callback.
 */
struct function_cookie {
    JNIEnv *env;
    jmethodID j_method;
    jobject j_object;
};

/**
 * Function callback that bypass the call into the java world.
 *
 * @param sass_arguments      The function arguments list.
 * @param sass_function_entry The sass function entry.
 * @param sass_compiler       The sass compiler.
 *
 * @return The return value of the function.
 */
union Sass_Value *function_callback(
        const union Sass_Value *sass_arguments,
        Sass_Function_Entry sass_function_entry,
        struct Sass_Compiler *sass_compiler
) {
    void *cookie = sass_function_get_cookie(sass_function_entry);
    struct function_cookie *c_function_cookie = (struct function_cookie *) cookie;

    JNIEnv *env = c_function_cookie->env;

    jobject j_arguments = convert_sass_value_to_java(env, sass_arguments);

    jobject j_result = (*env)->CallObjectMethod(
            env,
            c_function_cookie->j_object,
            c_function_cookie->j_method,
            j_arguments
    );

    union Sass_Value *sass_result = convert_java_value_to_sass(env, j_result);

    (*env)->DeleteLocalRef(env, j_result);
    (*env)->DeleteLocalRef(env, j_arguments);

    return sass_result;
}

/**
 * Structure that store all relevant informations for a callback.
 */
struct importer_cookie {
    JNIEnv *env;
    jobject j_object;
};

/**
 * Importer callback that bypass the call into the java world.
 *
 * @param sass_arguments      The function arguments list.
 * @param sass_function_entry The sass function entry.
 * @param sass_compiler       The sass compiler.
 *
 * @return The return value of the function.
 */
Sass_Import_List importer_callback(
        const char *c_url,
        Sass_Importer_Entry sass_importer_entry,
        struct Sass_Compiler *sass_compiler
) {
    void *cookie = sass_importer_get_cookie(sass_importer_entry);
    Sass_Import_Entry sass_last_import_entry = sass_compiler_get_last_import(sass_compiler);
    const char *c_last_import_imp_path = sass_import_get_imp_path(sass_last_import_entry);
    const char *c_last_import_abs_path = sass_import_get_abs_path(sass_last_import_entry);
    const char *c_last_import_source = sass_import_get_source(sass_last_import_entry);
    const char *c_last_import_srcmap = sass_import_get_srcmap(sass_last_import_entry);

    struct importer_cookie *c_importer_cookie = (struct importer_cookie *) cookie;

    JNIEnv *env = c_importer_cookie->env;

    jstring j_url = (*env)->NewStringUTF(env, c_url);

    // recreate a java import object
    jstring j_last_import_imp_path = c_last_import_imp_path ? (*env)->NewStringUTF(env, c_last_import_imp_path) : 0;
    jstring j_last_import_abs_path = c_last_import_abs_path ? (*env)->NewStringUTF(env, c_last_import_abs_path) : 0;
    jstring j_last_import_source = c_last_import_source ? (*env)->NewStringUTF(env, c_last_import_source) : 0;
    jstring j_last_import_srcmap = c_last_import_srcmap ? (*env)->NewStringUTF(env, c_last_import_srcmap) : 0;
    jclass j_import_class = (*env)->FindClass(env, "io/bit3/jsass/adapter/NativeImport");
    jmethodID j_import_constructor = (*env)->GetMethodID(
            env, j_import_class, "<init>", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"
    );
    jobject j_last_import = (*env)->NewObject(
            env, j_import_class, j_import_constructor,
            j_last_import_imp_path, j_last_import_abs_path, j_last_import_source, j_last_import_srcmap
    );

    // call the java importer
    jclass j_importer_class = (*env)->FindClass(env, "io/bit3/jsass/adapter/NativeImporterWrapper");
    jmethodID j_importer_method = (*env)->GetMethodID(
            env, j_importer_class, "apply",
            "(Ljava/lang/String;Lio/bit3/jsass/adapter/NativeImport;)Ljava/util/Collection;"
    );
    jobject j_imports = (*env)->CallObjectMethod(
            env, c_importer_cookie->j_object, j_importer_method, j_url, j_last_import
    );

    Sass_Import_List sass_import_list = 0;

    if (j_imports) {
        jclass j_imports_class = (*env)->FindClass(env, "java/util/Collection");
        jsize j_imports_length = call_class_int_method(env, j_imports, j_imports_class, "size");

        // convert into sass_import_list
        sass_import_list = sass_make_import_list((size_t) j_imports_length);

        jobject j_iterator = call_object_method(env, j_imports, "iterator", "()Ljava/util/Iterator;");
        jclass j_iterator_class = (*env)->GetObjectClass(env, j_iterator);
        jmethodID j_iterator_hasNext_method = (*env)->GetMethodID(env, j_iterator_class, "hasNext", "()Z");
        jmethodID j_iterator_next_method = (*env)->GetMethodID(env, j_iterator_class, "next", "()Ljava/lang/Object;");

        jfieldID j_import_path_property = (*env)->GetFieldID(
                env, j_import_class, "importPath", "Ljava/lang/String;"
        );
        jfieldID j_import_absolute_path_property = (*env)->GetFieldID(
                env, j_import_class, "absolutePath", "Ljava/lang/String;"
        );
        jfieldID j_import_contents_property = (*env)->GetFieldID(
                env, j_import_class, "contents", "Ljava/lang/String;"
        );
        jfieldID j_import_sourceMap_property = (*env)->GetFieldID(
                env, j_import_class, "sourceMap", "Ljava/lang/String;"
        );
        jfieldID j_import_errorMessage_property = (*env)->GetFieldID(
                env, j_import_class, "errorMessage", "Ljava/lang/String;"
        );

        size_t i = 0;
        while ((*env)->CallBooleanMethod(env, j_iterator, j_iterator_hasNext_method)) {
            jobject j_import = (*env)->CallObjectMethod(env, j_iterator, j_iterator_next_method);

            char *c_import_path = get_field_string(env, j_import, j_import_path_property);
            char *c_import_absolute_path= get_field_string(env, j_import, j_import_absolute_path_property);
            char *c_import_contents = get_field_string(env, j_import, j_import_contents_property);
            char *c_import_sourceMap = get_field_string(env, j_import, j_import_sourceMap_property);
            char *c_error_message = get_field_string(env, j_import, j_import_errorMessage_property);

            Sass_Import_Entry sass_import_entry = sass_make_import(
                    c_import_path, c_import_absolute_path, c_import_contents, c_import_sourceMap
            );
            if (strlen(c_error_message)) {
                sass_import_set_error(sass_import_entry, c_error_message, 0, 0);
            }
            sass_import_set_list_entry(sass_import_list, i, sass_import_entry);

            (*env)->DeleteLocalRef(env, j_import);
            i++;
        }

        (*env)->DeleteLocalRef(env, j_imports_class);
        (*env)->DeleteLocalRef(env, j_iterator_class);
        (*env)->DeleteLocalRef(env, j_iterator);
    }

    // cleanup
    (*env)->DeleteLocalRef(env, j_imports);
    (*env)->DeleteLocalRef(env, j_last_import);
    (*env)->DeleteLocalRef(env, j_last_import_srcmap);
    (*env)->DeleteLocalRef(env, j_last_import_source);
    (*env)->DeleteLocalRef(env, j_last_import_abs_path);
    (*env)->DeleteLocalRef(env, j_last_import_imp_path);
    (*env)->DeleteLocalRef(env, j_url);
    (*env)->DeleteLocalRef(env, j_importer_class);
    (*env)->DeleteLocalRef(env, j_import_class);

    return sass_import_list;
}

/**
 * Walk over function and release the jni references.
 */
void release_function_cookie_references(JNIEnv *env, Sass_Function_List c_functions) {
    for(size_t i = 0; true; i++) {
        Sass_Function_Entry c_function = sass_function_get_list_entry(c_functions, i);

        if (!c_function) {
            break;
        }

        void *cookie = sass_function_get_cookie(c_function);
        struct function_cookie *c_function_cookie = (struct function_cookie *) cookie;

        (*env)->DeleteLocalRef(env, c_function_cookie->j_object);
    }
}

/**
 * Walk over function and release the jni references.
 */
void release_importers_cookie_references(JNIEnv *env, Sass_Importer_List c_importers) {
    for(size_t i = 0; true; i++) {
        Sass_Importer_Entry c_importer = sass_importer_get_list_entry(c_importers, i);

        if (!c_importer) {
            break;
        }

        void *cookie = sass_importer_get_cookie(c_importer);
        struct importer_cookie *c_importer_cookie = (struct importer_cookie *) cookie;

        (*env)->DeleteLocalRef(env, c_importer_cookie->j_object);
    }
}

/**
 * Walk over function and importer cookies and release the jni references.
 */
void release_all_cookie_references(JNIEnv *env, struct Sass_Context *sass_context) {
    struct Sass_Options *sass_options = sass_context_get_options(sass_context);

    Sass_Function_List c_functions = sass_option_get_c_functions(sass_options);
    release_function_cookie_references(env, c_functions);

    Sass_Importer_List c_headers = sass_option_get_c_headers(sass_options);
    release_importers_cookie_references(env, c_headers);

    Sass_Importer_List c_importers = sass_option_get_c_importers(sass_options);
    release_importers_cookie_references(env, c_importers);
}

/**
 * Parse and execute the compilation and create the output object.
 *
 * @param env           The JNI environment.
 * @param sass_compiler The sass compiler.
 * @param sass_context  The sass context.
 *
 * @return The output object.
 */
jobject parse_and_execute(JNIEnv *env, struct Sass_Compiler *sass_compiler, struct Sass_Context *sass_context) {
    sass_compiler_parse(sass_compiler);
    sass_compiler_execute(sass_compiler);

    const char *c_css = sass_context_get_output_string(sass_context);
    const char *c_source_map = sass_context_get_source_map_string(sass_context);
    int error_status = sass_context_get_error_status(sass_context);
    const char *c_error_json = sass_context_get_error_json(sass_context);
    const char *c_error_text = sass_context_get_error_text(sass_context);
    const char *c_error_message = sass_context_get_error_message(sass_context);
    const char *c_error_file = sass_context_get_error_file(sass_context);
    const char *c_error_src = sass_context_get_error_src(sass_context);

    jstring j_css = (*env)->NewStringUTF(env, c_css);
    jstring j_source_map = (*env)->NewStringUTF(env, c_source_map);
    jstring j_error_json = (*env)->NewStringUTF(env, c_error_json);
    jstring j_error_text = (*env)->NewStringUTF(env, c_error_text);
    jstring j_error_message = (*env)->NewStringUTF(env, c_error_message);
    jstring j_error_file = (*env)->NewStringUTF(env, c_error_file);
    jstring j_error_src = (*env)->NewStringUTF(env, c_error_src);

    jclass j_class;
    jmethodID j_method;
    jobject j_output = 0;

    if (0 != error_status) {
        j_class = (*env)->FindClass(env, "io/bit3/jsass/CompilationException");
        j_method = (*env)->GetMethodID(
                env, j_class, "<init>",
                "(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"
        );
        jthrowable j_exception = (*env)->NewObject(
                env, j_class, j_method,
                error_status, j_error_json, j_error_text, j_error_message, j_error_file, j_error_src
        );
        (*env)->Throw(env, j_exception);
    } else {
        j_class = (*env)->FindClass(env, "io/bit3/jsass/Output");
        j_method = (*env)->GetMethodID(
                env, j_class, "<init>",
                "(Ljava/lang/String;Ljava/lang/String;)V"
        );
        j_output = (*env)->NewObject(
                env, j_class, j_method, j_css, j_source_map
        );
    }

    (*env)->DeleteLocalRef(env, j_class);
    (*env)->DeleteLocalRef(env, j_css);
    (*env)->DeleteLocalRef(env, j_source_map);
    (*env)->DeleteLocalRef(env, j_error_json);
    (*env)->DeleteLocalRef(env, j_error_text);
    (*env)->DeleteLocalRef(env, j_error_message);
    (*env)->DeleteLocalRef(env, j_error_file);
    (*env)->DeleteLocalRef(env, j_error_src);
    release_all_cookie_references(env, sass_context);

    sass_delete_compiler(sass_compiler);

    return j_output;
}

/**
 * Set custom functions in the sass options.
 *
 * @param env             The JNI environment.
 * @param sass_options    The sass options.
 * @param j_options       The java options.
 * @param j_options_class The java options class.
 */
void configure_functions(
        JNIEnv *env,
        struct Sass_Options *sass_options,
        jobject j_options,
        jobject j_options_class
) {
    jarray j_functions = get_class_object_property(
            env, j_options, j_options_class, "functions", "[Lio/bit3/jsass/function/FunctionWrapper;"
    );
    jsize j_functions_length = (*env)->GetArrayLength(env, j_functions);
    jclass j_function_wrapper_class = (*env)->FindClass(env, "io/bit3/jsass/function/FunctionWrapper");
    jmethodID j_function_wrapper_apply_method = (*env)->GetMethodID(
            env, j_function_wrapper_class, "apply", "(Lio/bit3/jsass/type/SassValue;)Lio/bit3/jsass/type/SassValue;"
    );
    Sass_Function_List sass_function_list = sass_make_function_list((size_t) j_functions_length);

    for (size_t i = 0; i < j_functions_length; i++) {
        jobject j_function = (*env)->GetObjectArrayElement(env, j_functions, (jsize) i);

        struct function_cookie *cookie = malloc(sizeof(struct function_cookie));
        cookie->env = env;
        cookie->j_method = j_function_wrapper_apply_method;
        cookie->j_object = j_function;

        jobject j_function_declaration = call_object_method(
                env, j_function, "getDeclaration", "()Lio/bit3/jsass/function/FunctionDeclaration;"
        );
        const char *c_signature = call_string_method(
                env, j_function_declaration, "getSignature"
        );
        (*env)->DeleteLocalRef(env, j_function_declaration);

        Sass_Function_Entry sass_function_entry = sass_make_function(
                c_signature, (Sass_Function_Fn) function_callback, cookie
        );
        sass_function_set_list_entry(sass_function_list, i, sass_function_entry);
    }

    sass_option_set_c_functions(sass_options, sass_function_list);

    (*env)->DeleteLocalRef(env, j_function_wrapper_class);
    (*env)->DeleteLocalRef(env, j_functions);
}

/**
 * Set header importers in the sass options.
 *
 * @param env             The JNI environment.
 * @param sass_options    The sass options.
 * @param j_options       The java options.
 * @param j_options_class The java options class.
 */
void configure_header_importers(JNIEnv *env, struct Sass_Options *sass_options, jobject j_options,
                                jobject j_options_class) {
    jarray j_header_importers = get_class_object_property(
            env, j_options, j_options_class, "headerImporters", "[Lio/bit3/jsass/adapter/NativeImporterWrapper;"
    );
    jsize j_header_importers_length = (*env)->GetArrayLength(env, j_header_importers);
    Sass_Importer_List sass_header_importer_list = sass_make_importer_list((size_t) j_header_importers_length);

    for (size_t i = 0; i < j_header_importers_length; i++) {
        jobject j_importer = (*env)->GetObjectArrayElement(env, j_header_importers, (jsize) i);

        struct importer_cookie *cookie = malloc(sizeof(struct importer_cookie));
        cookie->env = env;
        cookie->j_object = j_importer;

        Sass_Importer_Entry sass_importer_entry = sass_make_importer(
                (Sass_Importer_Fn) importer_callback, (size_t) i, cookie
        );
        sass_importer_set_list_entry(sass_header_importer_list, i, sass_importer_entry);
    }

    sass_option_set_c_headers(sass_options, sass_header_importer_list);

    (*env)->DeleteLocalRef(env, j_header_importers);
}

/**
 * Set importers in the sass options.
 *
 * @param env             The JNI environment.
 * @param sass_options    The sass options.
 * @param j_options       The java options.
 * @param j_options_class The java options class.
 */
void configure_importers(JNIEnv *env, struct Sass_Options *sass_options, jobject j_options, jobject j_options_class) {
    jarray j_importers = get_class_object_property(
            env, j_options, j_options_class, "importers", "[Lio/bit3/jsass/adapter/NativeImporterWrapper;"
    );
    jsize j_importers_length = (*env)->GetArrayLength(env, j_importers);
    Sass_Importer_List sass_importer_list = sass_make_importer_list((size_t) j_importers_length);

    for (size_t i = 0; i < j_importers_length; i++) {
        jobject j_importer = (*env)->GetObjectArrayElement(env, j_importers, (jsize) i);

        struct importer_cookie *cookie = malloc(sizeof(struct importer_cookie));
        cookie->env = env;
        cookie->j_object = j_importer;

        Sass_Importer_Entry sass_importer_entry = sass_make_importer(
                (Sass_Importer_Fn) importer_callback, (size_t) i, cookie
        );
        sass_importer_set_list_entry(sass_importer_list, i, sass_importer_entry);
    }

    sass_option_set_c_importers(sass_options, sass_importer_list);

    (*env)->DeleteLocalRef(env, j_importers);
}

/**
 * Configure the sass options corresponding to the java context options.
 *
 * @param env           The JNI environment.
 * @param j_context     The java context.
 * @param sass_options  The sass options.
 */
void configure_options(JNIEnv *env, jobject j_context, struct Sass_Options *sass_options) {
    jobject j_options = get_object_property(env, j_context, "options", "Lio/bit3/jsass/adapter/NativeOptions;");

    jclass j_options_class = (*env)->FindClass(env, "io/bit3/jsass/adapter/NativeOptions");

    // NativeContext.inputPath
    const char *c_input_path = get_string_property(env, j_context, "inputPath");
    sass_option_set_input_path(sass_options, c_input_path);

    // NativeContext.outputPath
    const char *c_output_path = get_string_property(env, j_context, "outputPath");
    sass_option_set_output_path(sass_options, c_output_path);

    // NativeOptions.functions
    configure_functions(env, sass_options, j_options, j_options_class);

    // NativeOptions.headerImporters
    configure_header_importers(env, sass_options, j_options, j_options_class);

    // NativeOptions.importers
    configure_importers(env, sass_options, j_options, j_options_class);

    // NativeOptions.includePath
    const char *c_include_path = get_class_string_property(env, j_options, j_options_class, "includePath");
    sass_option_set_include_path(sass_options, c_include_path);

    // NativeOptions.indent
    const char *c_indent = get_class_string_property(env, j_options, j_options_class, "indent");
    sass_option_set_indent(sass_options, c_indent);

    // NativeOptions.indentedSyntaxSrc
    bool c_is_indented_syntax = get_class_bool_property(env, j_options, j_options_class, "isIndentedSyntaxSrc");
    sass_option_set_is_indented_syntax_src(sass_options, c_is_indented_syntax);

    // NativeOptions.linefeed
    const char *c_linefeed = get_class_string_property(env, j_options, j_options_class, "linefeed");
    sass_option_set_linefeed(sass_options, c_linefeed);

    // NativeOptions.omitSourceMapUrl
    bool c_is_omit_source_map_url = get_class_bool_property(env, j_options, j_options_class, "omitSourceMapUrl");
    sass_option_set_omit_source_map_url(sass_options, c_is_omit_source_map_url);

    // NativeOptions.outputStyle
    jint j_output_style_numeric = get_class_int_property(env, j_options, j_options_class, "outputStyle");
    switch ((int) j_output_style_numeric) {
        case 2:
            sass_option_set_output_style(sass_options, SASS_STYLE_EXPANDED);
            break;

        case 3:
            sass_option_set_output_style(sass_options, SASS_STYLE_COMPACT);
            break;

        case 4:
            sass_option_set_output_style(sass_options, SASS_STYLE_COMPRESSED);
            break;

        default:
            sass_option_set_output_style(sass_options, SASS_STYLE_NESTED);
    }

    // NativeOptions.pluginPath
    const char *c_plugin_path = get_class_string_property(env, j_options, j_options_class, "pluginPath");
    sass_option_set_plugin_path(sass_options, c_plugin_path);

    // NativeOptions.precision
    int c_precision = get_class_int_property(env, j_options, j_options_class, "precision");
    sass_option_set_precision(sass_options, c_precision);

    // NativeOptions.sourceComments
    bool c_is_source_comments = get_class_bool_property(env, j_options, j_options_class, "sourceComments");
    sass_option_set_source_comments(sass_options, c_is_source_comments);

    // NativeOptions.sourceMapContents
    bool c_is_source_map_contents = get_class_bool_property(env, j_options, j_options_class, "sourceMapContents");
    sass_option_set_source_map_contents(sass_options, c_is_source_map_contents);

    // NativeOptions.sourceMapEmbed
    bool c_is_source_map_embed = get_class_bool_property(env, j_options, j_options_class, "sourceMapEmbed");
    sass_option_set_source_map_embed(sass_options, c_is_source_map_embed);

    // NativeOptions.sourceMapFile
    const char *c_source_map_file = get_class_string_property(env, j_options, j_options_class, "sourceMapFile");
    sass_option_set_source_map_file(sass_options, c_source_map_file);

    // NativeOptions.sourceMapRoot
    const char *c_source_map_root = get_class_string_property(env, j_options, j_options_class, "sourceMapRoot");
    sass_option_set_source_map_root(sass_options, c_source_map_root);

    (*env)->DeleteLocalRef(env, j_options_class);
}

/**
 * The java-native functions.
 */

JNIEXPORT jobjectArray JNICALL Java_io_bit3_jsass_adapter_NativeAdapter_compileFile
        (JNIEnv *env, jclass j_adapter, jobject j_context) {
    const char *c_input_path = get_string_property(env, j_context, "inputPath");

    struct Sass_File_Context *sass_context = sass_make_file_context(c_input_path);
    struct Sass_Options *sass_options = sass_file_context_get_options(sass_context);
    configure_options(env, j_context, sass_options);
    sass_file_context_set_options(sass_context, sass_options);
    struct Sass_Compiler *sass_compiler = sass_make_file_compiler(sass_context);

    (*env)->DeleteLocalRef(env, j_adapter);
    (*env)->DeleteLocalRef(env, j_context);

    jobject output = parse_and_execute(env, sass_compiler, (struct Sass_Context *) sass_context);

    sass_delete_file_context(sass_context);

    return output;
}

JNIEXPORT jobjectArray JNICALL Java_io_bit3_jsass_adapter_NativeAdapter_compileString
        (JNIEnv *env, jclass j_adapter, jobject j_context) {
    char *c_source_string = get_string_property(env, j_context, "source");

    struct Sass_Data_Context *sass_context = sass_make_data_context(c_source_string);
    struct Sass_Options *sass_options = sass_data_context_get_options(sass_context);
    configure_options(env, j_context, sass_options);
    sass_data_context_set_options(sass_context, sass_options);
    struct Sass_Compiler *sass_compiler = sass_make_data_compiler(sass_context);

    (*env)->DeleteLocalRef(env, j_adapter);
    (*env)->DeleteLocalRef(env, j_context);

    jobject output = parse_and_execute(env, sass_compiler, (struct Sass_Context *) sass_context);

    sass_delete_data_context(sass_context);

    return output;
}

redpajama_set_name: RedPajamaGithub


text:
Features / FullWidth
The Gospel According to Cinema, Part 1: The Rise of Christian Film
by Corey Atad
Last weekend, the Pure Flix-produced, inspirational drama Do You Believe? opened in theaters, and if you're a regular moviegoer, chances are you didn't see it. You might not have even heard of it. As its title suggests, Do You Believe? is about religion. More specifically, it's a religious film, spreading messages preached by Evangelical Christians across America to appeal to those very same Christians. It's part of a growing genre of faith-based films made to target this largely conservative religious community, and while that's a pretty specific niche, the business model has proved surprisingly profitable of late.
In 2014—a watershed year for the Christian film industry—nineteen Christian films received theatrical releases, almost double the previous record in 2006. Of those, eleven films made over $1 million, and four made over $30 million. While earlier Christian films like Fireproof, Facing the Giants, and Courageous had seen this kind of success, to have so many become successful all in one year was unprecedented. Beginning with Son of God, a recut version of History's The Bible miniseries, and throughout the year to Kirk Cameron's Saving Christmas, audiences consistently came out in droves to see films made by Christians, for Christians.
Evangelical Christian films date back to the silent era, when Protestants saw cinema's potential as a sermonizing tool for their congregations. In the 1940s, Youth for Christ magazine editor Ken Anderson built a studio for the production of Christian films. In the 1950s, Reverend Billy Graham founded World Wide Pictures. This subsidiary of the Billy Graham Evangelistic Association produced and distributed hundreds of films over more than half a century. With the advent of home video in the 1980s, the theatrical market for Christian films largely dried up and the focus shifted to the video and made-for-TV formats. That is until the early 2000s when one film changed everything.
In the weeks leading up to Easter in February 2004, the hottest topic of discussion across America was a mid-budget independent film shot in two dead languages about the final days of Jesus of Nazareth. Mel Gibson's The Passion of the Christ arrived in a storm of controversy, criticism, and an $84-million opening weekend. The film went on to gross over $370 million at the domestic box office, an unsurpassed record for an R-rated picture. Its commercial success served as a loud wake-up call. In every corner of America lay a vast, untapped market of eager, movie-going Christians.
Stories of Evangelical congregations in the Bible Belt being bused en masse to screenings of The Passion of the Christ caused quite a stir in the movie industry. Several studios stood up and took notice. They saw the potential for a niche genre: films made by Christians, featuring overt religious content and messages, and marketed directly to conservative Evangelical Christians. 20th Century Fox created its own faith-based label, Fox Faith, with the intent to make and distribute several Christian films theatrically each year. They saw mild success, but the experiment had died out by 2008. Walt Disney and Walden Media had great success mobilizing Evangelical Christians to go see The Chronicles of Narnia: The Lion, the Witch and the Wardrobe in 2005, but were unable to maintain that audience for the film's two sequels. Hollywood had gone too big too soon.
Already a successful producer of Christian television programming, Michael Scott and his business partners David A.R. White and Russell Wolfe saw a different, more independent path. "We saw the broader market, we saw that they were hungry for it, and quite frankly they weren't being served very well," says Scott. In 2005, the trio founded Pure Flix, a Christian film production and distribution company not unlike its forerunners in the 1940s and 1950s. They've since made a magnitude of inspirational dramas, comedies and parables with religious messages, and even some Book of Revelation-inspired apocalyptic action films. In only a few years, Pure Flix became the largest distributor of evangelical Christian films in the world, according to Scott.
For almost a decade, Pure Flix has specialized in releasing films through direct-to-video, television, and other home-media channels. In 2010, after steady growth year over year, the company dipped its toe in the theatrical market with a film called What If…, an inspirational drama starring Kevin Sorbo about a godless, greedy businessman who wakes up in an alternate reality in which he's the pastor of his hometown church, and married to his old college sweetheart. What If… played in about 80 theaters and pulled in over $800 thousand in box-office receipts. Building on that film's success, Pure Flix released God's Not Dead in 2014 in over 1,800 theatres. Produced on a budget of $2 million, the film grossed over $60 million.
"A lot of God's Not Dead's success was no doubt an explosion," Scott explains. There has to be more to the story, though. Resonating with the audience is key for any film, but it's absolutely crucial to the niche Evangelical Christian market, for which the values and messages of a film are easily as important as its story. Scott says Pure Flix has honed in on exactly what gets its key demographic of church-going Evangelical Christians fired up, learning from the successes and failures of over 80 film releases. That learning process no doubt continues right through their release of Do You Believe?, which opened in more theaters than God's Not Dead the year before, but to less than half that film's opening weekend gross.
That kind of unpredictability is itself unsurprising, and playing to such a specific audience is hardly easy. Look no further than the domestic box-office failures of Noah and Exodus: Gods and Kings, two films made by non-Christians, released by major Hollywood studios last year, and marketed to mass audiences. Both films also attempted to galvanize an Evangelical audience starved for big-budget Biblical epics, but conservative Evangelical Christians can be notoriously picky when it comes to assessing accurate representations of their beliefs on screen. Jordan Diepersloot, the pastor at Via Church in Fresno, avoided both films due to their bold deviations from the Biblical text. "That Biblical story had a point to it and I think [the films] miss that," Diepersloot says. The worry is that Christians and non-Christians alike will watch these films and get the wrong impression of what's actually in the Bible, creating confusion, and potentially distancing audiences from Christianity.
Diepersloot tries to see what he deems as more "authentic" Christian films when he can make time. "If I have a congregation of people who are most likely going to see a movie because it has the label 'Christian' behind it, I like to be aware of what it is," he says. The inspirational Christian messages behind the films are something he can often get behind. An example is the Sony-financed Heaven is for Real, based on the best-selling book by Todd Burpo, about his four-year-old son's visits to heaven during a near-death experience. The film was a huge success and an example of Hollywood getting it right when producing films for Christians. "That's a movie that makes people feel some sense of hope for those who've lost loved ones," says Diepersloot.
For Alyse Pugh, a student at Biola University, an Evangelical Christian, liberal-arts college in California, films like Heaven is for Real also serve as a kind of political act. "In culture, [Christians are] viewed as judgmental bigots who don't listen to anyone and just want to push our own agenda. Them bringing up heaven as a reality, and that everyone is going to have face that some day, that was really bold of them and I respect that," she says.
The common feeling of marginalization in Evangelical Christian communities is heavily present in many of these films, whether they're dramas, comedies or even action films. In fact, sometimes it's their overriding theme. In last year's blatantly absurd and literally paranoid thriller Persecuted, a megachurch pastor is framed for murder by a cabal of powerful government officials hell-bent on destroying Christianity in the United States. Other films like God's Not Dead present an only slightly more realistic vision of American culture, in which religion and Christianity are flatly demonized in the face of growing secularity. Even Do You Believe? features a plot in which self-professed humanists take an EMT to court after he gives last rites to a dying man.
"One of the threads that runs through a lot these films—particularly the ones that are not the studio hybrids or bought out by the studios and fit toward a more general audience—is some sort of persecution theme or complex," says Kenneth Morefield, an Associate Professor of English at Campbell University and film critic for Christianity Today. "It reinforces the perceptions of a subset of Evangelicalism at the moment that we're persecuted, marginalized, silenced, [and] caricaturized in mainstream entertainment."
While notions that Christians in the United States are a marginalized group may seem fanciful when over 70% of Americans identify as Christian and over 50% claim to regularly attend church services, many still feel it's true. Diepersloot, for example, identified strongly with the protagonist in God's Not Dead, a young Christian student who bravely stands up to a tyrannical philosophy professor threatening him with a failing grade should he not admit that God is, in fact, dead. "You know it happens pretty often," says Diepersloot, who personally experienced his philosophy professor belittling his students' intelligence for believing in religion. "He would even tell stories about how his sister was a Christian, and how she was the least smart of the children in their family."
Whether or not it's an accurate representation, the persecution complex so prevalent in Christian cinema resonates with a subset of Christians in America. "It's definitely clear that there is an audience, and it's not an insignificant one that feels it's true, that feels disaffected, and feels as though they don't see themselves on the screen," says Morefield. That moviegoers, eager to see themselves represented as heroically overcoming nasty secular-humanist villains on screen, have flocked to Christian films that validate their world view.
For many Christian moviegoers, Christian films provide a great contrast to the secular liberalism of mainstream Hollywood. "50 Shades of Grey is skyrocketing with viewers, and I think Christian films bring wholesome, edifying, family and biblical values to lighten things," says Pugh. In the eyes of this niche-but-growing audience, Christian films stand as a virtuous alternative to the debauched values of Hollywood and the secular society at large.
Not everyone sees it that way, though. Morefield finds the lack of diversity and even reality in many Christian films troubling. "It's mostly a white, conservative, upper-middle class mirror—perhaps slightly idealized mirror—to the Christian audience of how they want to perceive themselves, or how they want to be perceived." He believes contemporary Christian films are comparatively more socially conservative (rather than theologically conservative), playing to a relatively insular community. Even more troubling for Morefield is that these films aren't truly evangelical. "They're not at all directed toward those outside the Church," he explains.
Scott disagrees with this assertion. "God's Not Dead has been seen by about twenty million people," says Scott. (The estimate is that only half that number saw the film at a theater.) "I get testimonies everyday: 'We showed God's Not Dead and we doubled our church congregation.'" Though hampered by smaller marketing budgets than the big studios, these films are, in Scott's words, "incredible evangelistic and outreach tools." Members of church congregations are regularly encouraged to take a neighbor or a coworker to such films.
Whether Scott is correct or not, the real trouble with using the recent string of Christian films as tools for evangelism is that, on the whole, they're not very good. The films are regularly dismissed or attacked by critics, and mainstream audiences seem averse to the obviously low budgets, lousy acting, made-for-TV aesthetics and blatant preaching in most Christian films. Making a Christian film isn't very hard, but making a good Christian film is a much tougher nut to crack.
Continue to Part 2, in which Corey Atad explores in greater detail the aesthetic considerations of Christian films, and looks ahead to the future of religious cinema.
MovieMezzanine
Top 5 Movies Based on True Stories
AmirGanjavie
László Nemes and Géza Röhrig
on "Son of Saul"
MarshallShaffer
Adam McKay: From "The Other Guys" To "The Big Short"
Pingback: Everybody's Talkin' 3 – 27 (Chatter from Other Bloggers) | The Matinee | Cinematic Passion & Perspective()
Pingback: A Deep Dive Into Christian Movies, Part 2()


text:
RAMOS Surname Meaning and Origin
One of the possible meanings of the Ramos surname is olive branch. Pepe Nilsson / Getty Images
Vital Records Around the World
Kimberly Powell
Genealogy Expert
Certificate in Genealogical Research, Boston University
B.A., Carnegie Mellon University
Kimberly Powell is a professional genealogist and the author of The Everything Guide to Online Genealogy. She teaches at the Genealogical Institute of Pittsburgh and the Salt Lake Institute of Genealogy.
The exact derivation of the Ramos surname is in dispute, depending upon the family's origin (Portuguese, Cuban, Mexican, Brazilian, etc.) The most commonly accepted meanings are:
Branches or offshoots, or an olive branch, from the plural of ramo, Latin ramus, meaning "branch." It often referred to someone who lived in a thickly wooded area.
Palms or palm branches, from "Domingo dos Ramos," a Catholic feast day known as Sunday of the Palms or Palm Sunday.
A habitational name for someone from one of many towns called Ramos, in Spain and Portugal.
Ramos is the 20th most common Hispanic surname.
Surname Origin: Spanish, Portuguese
Alternate Surname Spellings: RAMOSE, RAMOSE, RAMIS, RAMO, RAMON
Where Do People With the Ramos Surname Live?
WorldNames PublicProfile places the majority of individuals with the Ramos surname in Spain, especially in the region of Islas Canarias, followed by Extremadura, Castilla Y Leon, and Andalucia. This data does not include all of the Spanish-speaking countries, however. Forebears, which does include additional data from other countries, has it ranked 14th in Peru, 23rd in Cuba, 25th in Spain, 30th in Mexico and 35th in Brazil.
Famous People With the Surname RAMOS
Rodolfo Ramos: Professional skateboarder & X-games competitor
Fidel Ramos: 12th President of the Philippines
Sarah Ramos: American actress
Genealogy Resources for the Surname RAMOS
Ramos RootsPath - RAMOS Surname DNA Project: Join other Ramos males in sorting out the various Ramos ancestral lines through Y Chromosome DNA testing.
Ramos Family Genealogy Forum: Search this popular genealogy forum for the Ramos surname to find others who might be researching your ancestors, or post your own Ramos query.
FamilySearch - RAMOS Genealogy: Access over 3.3 million free historical records and lineage-linked family trees posted for the Ramos surname and its variations on this free genealogy website hosted by the Church of Jesus Christ of Latter-day Saints.
Resources and Further Reading
Cottle, Basil. "Penguin Dictionary of Surnames." Baltimore: Penguin Books, 1967.
Menk, Lars. "A Dictionary of German Jewish Surnames." Bergenfield, NJ: Avotaynu, 2005.
Beider, Alexander. "A Dictionary of Jewish Surnames from Galicia." Bergenfield, NJ: Avotaynu, 2004.
Hanks, Patrick and Flavia Hodges. "A Dictionary of Surnames." New York: Oxford University Press, 1989.
Hanks, Patrick. "Dictionary of American Family Names." New York: Oxford University Press, 2003.
Hoffman, William F. "Polish Surnames: Origins and Meanings." Chicago: Polish Genealogical Society, 1993.
Rymut, Kazimierz. "Nazwiska Polakow." Wroclaw: Zaklad Narodowy im. Ossolinskich - Wydawnictwo, 1991.
Smith, Elsdon C. "American Surnames." Baltimore: Genealogical Publishing Company, 1997.
Powell, Kimberly. "RAMOS Surname Meaning and Origin." ThoughtCo, Aug. 27, 2020, thoughtco.com/ramos-last-name-meaning-and-origin-1422595. Powell, Kimberly. (2020, August 27). RAMOS Surname Meaning and Origin. Retrieved from https://www.thoughtco.com/ramos-last-name-meaning-and-origin-1422595 Powell, Kimberly. "RAMOS Surname Meaning and Origin." ThoughtCo. https://www.thoughtco.com/ramos-last-name-meaning-and-origin-1422595 (accessed January 31, 2023).
Surname Meaning and Origin of Guzman
The Surname Rodriguez: Its Meaning and Origin
Meaning and Origin of the Surname Duda
KOZLOWSKI Surname Meaning and Origin
Kaminski: Last Name Meaning and Origin
Wisniewski Surname Meaning and Origin
DuBois Surname Meaning and Origin
OBAMA - Last Name Meaning and Origin
NOWAK - Surname Meaning and Origin
Watt Surname Meaning and Origin
Meaning and Origin for the Surname "Cook"
Watson Surname Meaning and Origin
Collins Surname Meaning and Origin
The Surname Bennett, Its Meaning and Family History
The Surname Baker: Its Meaning and Origin
Aguilar Last Name Meaning & Origin


Reasons why HTML5 is the future has become quite clear that more people are now accessing the internet via mobile devices than those using desktop computers. For this simple yet important reason, it is important that all businesses ensure that their websites are responsive to these widely used devices. There are many types of mobile devices and different operating systems which increase the challenges for the support of mobile devices.
Are you in search for a solution that will work perfectly? Well, HTML5 might be the solution you need. To start with, its capability to run anywhere is the main reason it manages to stay influential in the mobility world.
Essentially, this means that there is a new set of tags that will enhance your HTML code and this will make it increasingly meaningful. Conventional developers use a lot of tag div. Now they can easily develop with the new tags which include nav, header and footer and this makes HTML more productive. When it comes to classification of different web page parts, HTML5 will provide all the necessary semantic elements.
If you are worried about the storage of user's data for fast upload to servers, you shouldn't. HTML5 will give you a bank you can use to store the data and synchronize it to the server when you need to. This feature will ensure that your application is working even when the user is to online and will greatly enhance performance.
It is not a good thing to have an application that will still function well without internet connection? It is and HTML5 can help you achieve this. HTML5 can create an experience that can be reached by users with or without the internet. In addition to this amazing feature, you will also be able to save important data to databases locally.
HTML5 has the capability of speeding up and boosting real time chats, and games. It also works in the delivery of improved communication. The connection and the video conferencing control is done in the browser directly and this does not require external applications or plug-ins.
HTML5 has the ability to integrate video and audio smoothly into browsers. This will not require any Silverlight or Flash. Initially, there was no solid way videos could be incorporated into website pages. This resulted in a need for video player development. These players were functioning well but the need for external plug-ins meant that you had to go through the annoying process of downloading them. Today, HTML5 does the work for you. Videos will run smoothly and users get a good browsing experience without any delays.
Without a doubt, mobile devices have won the computer vs. mobile devices war. They have taken over the world and more people are starting to use them in internet based activities. HTML5 is one of the most ready tools for a future full of mobile devices. It has the capability of developing modern applications and mobile sites. Adobe is already indicating the death of flash and developers will have to depend on HTML5 to handle web app development in the near future.
Mobile browsers have already embraced the use of HTML5 in the creation of mobile ready project. This is based on its uncomplicatedness in designing and building projects for smaller screen displays operated through touch. It will improve the markup tags including audio and video, animation canvas aspect, and modern semantic elements such as header, article and aside. This will give a different appearance and meaning to web page elements.
So, why Is HTML5 The Future?
According to statistics, about 60% of developers have already transformed to development through HTML5 for major projects. 19% native mobile developers are now using less of the traditional technology. For this reason, it is quite clear that HTML5 is becoming the new platform of choice. The technology in web development is maturing and improving every day. It is a matter of a short period before development through HTML5 surpasses any other native development methods.
There will always be people who believe they need native mobile application for more important platforms. Most of the developers are opting to go with the working smart and not hard bandwagon. In the near future a web application will be required to work for most of the mobile platforms if not all. For this and many other reasons, HTML5 is believed to be an important tool in future web development.


Like many other things in life, choosing how we pay off our debts is a highly personal choice. Getting into debt is easy, but getting out requires clever strategies that can help you conquer debt. There is no one strategy that will work for everyone, because debt is a very personal thing. Finding a rewarding way that works for you is the most important thing in paying off debt.
There are many strategies, some more effective than others. You need to be aware of how you spend money, save money, and where your weaknesses are in order to choose the most effective of the clever strategies that can help you conquer debt. Two. Finding the best match can be a process of trial and error.
These are all clever strategies that can help you conquer debt, but it is a personal choice in which one you're going to use. Only you can choose the strategy that will fit best with your budget- you may not have to keep this as a choice, once some of the debts are paid off.
Choosing to pay off the highest interest rate debt may be good for you. All not only will this prevents interest charges, but if it's one of your smaller debts, it may actually pay off in a completely first. This will free up more money for other debts, and help make the debt shrink. One reason you may not wish to use this is if this is an account that has a large effect on your credit, like a home or car loan: doing the math is the only way to insure that you don't hurt yourself in the long run.
Paying off the smallest debts will make give you a sense of victory, and eliminate some of the worries that you may have about having so many debts. This one of the clever strategies that can help you conquer debt may give you the incentive to keep paying off the debt you have, and help you stay out of it.
And paying off the loans with the will that annoy you first may make more sense. Sometimes, these loans effect not our financial, but our personal strategy. Many times, having loans to family or friends feels worse than owing a more impersonal institution. Paying off these quickly may become one of your favorite of the clever strategies that can help you conquer debt.
Find ways to incorporate your chosen of the clever strategies that can help you conquer debt. Shifting a credit card balance to a new card, with an low interest introductory period may be just enough to let you pay off this debt. Read the fine print, of course. And don't use the new card for any other purchases. Make sure you can pay off the debts all at the lowest possible rate, and don't add more debt to what you need to pay.
Looking at your budget may allow you to find it a small expense, that you can use as a reward. Regardless of how clever strategies that can help you conquer debt, they are useless if you feel like you're not getting anything back, so incentives may be needed. The thrill of paying of a debt can be its own reward- some people may need the extra incentive when it comes close to a special occasion to keep paying down their debts.
Something that is not mentioned often is to make sure that the debt you pay off stays personal. Paying off the bill just because it's there doesn't give me much of a sense of accomplishment, but knowing that I have paid off a couch, a video console, or a computer feels much better. Another section of this type of clever strategies that can help you conquer debt lets me think of additional interest as actual things lost: "If I don't pay this off, the interest will be as much as going out to a movie." This keeps me motivated to keep the payments up, and to avoid going back into debt.
As long as you are paying on your debts will, any of these clever strategies that can help you conquer debt will work. If you find yourself not able to make progress using one strategy, you need to take a look and see if a different strategy would work better for you. Keep looking, and trying different combinations. Once you have gotten yourself out of debt, you will have built good habits to avoid getting back into debt again.


Freehold Gilstead Court in the Novena-Newton enclave has been relaunched for sale by tender, marketing agent JLL said on Tuesday.
"Following the announcement of the July 2018 market cooling measures, and the Urban Redevelopment Authority's revised maximum allowable dwelling units in non-landed residential developments which affects Gilstead Court, the Collective Sale Committee (CSC) proposed to lower the reserve price from S$168 million to S$153 million," JLL said.
The almost nine per cent price cut was approved by those present at an extraordinary general meeting convened by the CSC, and owners supportive of lowering the reserve price have begun signing a supplemental agreement.
Nonetheless, for the change to take effect, the legal process requires approval from owners representing at least 80 per cent by total share value and by total floor area. As at Jan 29, owners representing more than 60 per cent have approved the lower reserve price, JLL said.
The original reserve price of S$168 million translates to a land rate of about S$1,590 per sq ft per plot ratio (psf ppr), or about S$1,486 psf ppr after factoring in the 7 per cent bonus balcony plot ratio.
Should more than 80 per cent of the owners agree to the lower proposed reserve price of S$153 million, the unit land rate will be reduced to S$1,448 psf ppr, or S$1,353 psf ppr with the 7 per cent bonus balcony plot ratio.
As there is a high development baseline for the site, development charge is not payable for the proposed redevelopment with the bonus gross floor area, JLL said.
Built around 1978, Gilstead Court comprises 24 apartments of 129 sq m each, and 24 apartments of 136 sq m each, totalling 48 units in three four-storey apartment blocks.
The 75,479 sq ft site is zoned 'Residential' with a gross plot ratio of 1.4. Located in District 11, the development is also near Novena MRT station, with schools such as St Joseph's Primary Institution (Junior) and Anglo-Chinese School (Junior) in the vicinity.


Hundreds of beautiful plaster moulding designs available.
Over 40 years experience, trusted and well known throughout the building industry as a leading plaster moulding supplier.
All our products can be ordered online through our website.
All online orders are processed quickly and a dedicated sales representative will contact you to arrange delivery.
Expert product advice available just call 01903 753743.
After sales support and advice also available.
Halford Jarvis is a specialist plaster moulding retailer established over 40 years ago. We have become well known throughout the building industry and housing market as the leading retailer of architectural and decorative plaster mouldings.
Our plaster mouldings feature designs that have been used in many of the UK's most prestigious museums and public buildings. We stock hundreds of beautiful styles each with its own characteristics capable of transforming any home. All our products have been skilfully designed and crafted to the highest quality.
All of our plaster mouldings can be ordered through our online store.
We have a number of highly skilled technical operatives that enables us to offer a supply and fix service.
We offer a service that restores textured ceilings and walls back to a smooth finish using British Gypsum Multi Finish.