All our tangible history can be attributed to our records-making going back to when the records were literally set in stone, so to say, archived using human digits (digital heritage!). Oral traditions such as songs, stories and recitals, performative traditions, arts and other cultural expressions that reaffirm of our collective experiences remain intangible. Stories create Legends, Rituals physically embody the legends through performances, Records attempt to freeze time at a moment. Thereby characterizing culture and memories of a community. Our effort here is to visit and discuss who creates the records, discuss the affordance of lists as an information artefact for exchange, facilitating dialogue and collective meaning-making. We peek at the traditional community of Helavaru as map and genealogy tellers, their legends, rituals / performances and the cultural economy involved in making and circulating the archives of cultural memories in contrast with the technology driven formulation of lists that are founding the Internet culture. Allegorically, if the memory of stone as a medium of a message is still alive in us, how are people included and who all are excluded from our "memories".
Our session would be a performative through experimental list artefacts that intend to make visible the interplay between the form of the information artefact and the content. How do we perceive information when the form of the list changes. The implicit structure of lists is suggestive of a certain order, priority and disconnected connections. We intend to play with those structures, breaking them and making new ones in the process. What do we call a list? and what does it do?
Priyanka and Aditya will bring "poetic" list artefacts that juxtapose traditional aspects of list making and lists as a dynamic phenomenon on the internet (ex. #Metoo).
Bhanu will introduce the traditional storytelling community of Helavaru as list performers.
Aishwarya will bring in the current context of social auditing and the stories from the ground today, from a rural context.
Dinesh will illustrate 3 ways list are formulated today mathematically, socially and technologically.
Priyanka is a new media artist-researcher, currently engaged with Microsoft as an interaction designer. While at Microsoft she solves design problems for the browser, her personal inquiries run deep into understanding people's lives on the internet, nature of the digital-materiality and its affordances for expression and exchange in networked societies.
Aditya is a designer and an entrepreneur always thinking of ways to display information beautifully. Lately he has been working on interfaces for lists to provide a clear stream of reason to anyone through simple model(s) of visualisation of information and, therefore attempt to make knowledge more accessible.
Priyanka and Aditya intends to play with the form of lists to investigate its effect on narrative construction. They will bring in "poetic-lists" - experimental list artefacts that probe into the implicit order and biases that lists bring to the act of meaning making, especially in the context of a collective audience.
Bhanu Prakash GS - As Web application developer at Servelots(.com), he contributes to the open and free software, and has been working on developing tools for delivering visual stories from archives. He has worked with the [email protected] project titled "13 Ways" where stories from the history of National Centre for Biological Sciences, Democracy Archives for University of Gottingen, and also on methods to render the folk stories of Vijayadashami rituals into visual stories on the Web.
Bhanu introduces the ways the Helavaru community, in the pre-internet era, created, "circulated" and mutated Lists of names, facts and events forming the information networks of communities, castes, jaatis, clans, tribes. The Helavas are a nomadic community visible around Karnataka and Andhra who deck up their bullocks and carts, set out to the villages of their patrons to sing praises of great deeds of their forefathers and the genealogy of the families with great detail, and end their performance with a ritual Harike - a wish for the well being of their patrons. In return they are paid for their services with grains, clothes, goat, sheep, cow, bullocks and money as much as one can afford.
Their story is an indicator of the cultural economy, of interweaving a web of communities, their systems of socio-political-cultural organisation by developing competence in data indexing, backups and restores, dealing with identity and authentication, conflicts and negotiations and more from generation to generation. The Helavaru claim that each family recorded genealogy of at least 3 lakh families, and passing it on, and also losing in some cases is fascinating.
Aishwarya is a Communication Strategist at the Society for Social Audit, Accountability and Transparency (SSAAT) - Andhra Pradesh, Department of Rural Development, Government of Telangana. SSAAT has been set-up with a vision to uphold the concept of eternal vigilance by the people, facilitated by social activists and Government acting in conjunction.
A social audit is a standardised way of facilitating people to critique the implementation of a welfare scheme, and demand accountability from the government. It is a powerful tool which enables people to come forward, demand information, question officials, and fight for their rightful deliverables of a government scheme. This mechanism ensures transparency in the way a government functions, and has helped recover a lot of money lost to corruption.
In India, a Supreme Court mandate made the social audits of MGNREGS compulsory in all states. However, Social Audit units have been successful in empowering the people only in a few states. While the SAU facilitates an audit, it is conducted by people from the families of the beneficiaries. One social audit is a 15-day process of record verifications, door-to-door verifications, awareness rallies, a Gram Sabha and a Public Hearing. While a social audit ensures accountability, it lacks the guarantee of enforcement. The different layers of bureaucracy often swallows the essence of public participation and grievance redressal does not have follow-ups.
All grievances are recorded in the form of paras in the social audit database. While our on-ground social auditors may be socially and politically aware enough to observe and call out patterns in caste and gender discrimination, the results remain, but in a list on the MIS.
Dinesh is part of Janastu team - a non-profit group. The team is eager to help address Web content accessibility for the low-literate using social semantic web concepts and are also looking at 3D methods for spatial navigation, location interpretation and storytelling. Janastu engages with software commons by developing and supporting open source social platforms.
Dinesh, with a Computer Science background, will bring list comprehension to this platform using map/reduce, monads, and blockchain as the technical formalisms that make the Internet work and how people are made to toe these invisible lines. Then initiate discussions on Machine Learning within the history of page ranking and how the who, where, what of lists manifest. This will be contextualized with the traditional, the social and the new media social networks and processes that nurture community memory by tuning the semantic distance needed for privacy and by making room for forgetting in ways that communities heal from trauma.


text:
Thomas Neuburger
Our Next 9/11: The Reaction to the Reaction
By Thomas Neuburger
"If you're looking for a president with a track record of boosting foreign intervention, expanding the surveillance state, and steadfastly backing Israel despite its war crimes, Joe Biden is your guy." —Branko Marcetic, Jacobin
An angry mob of Proud Boy types, off-duty cops and ride-along Trump supporters broke into the Capitol, an angry reaction to a propagandized, misplaced fear that "democracy" was being shattered by election theft, and the reaction to the reaction was swift.
Condemnation — appropriate in my view — was heaped on the perpetrators, complicit and enabling Republicans (that's you, Josh Hawley), and on Donald Trump himself. I've written elsewhere ("About Last Night") that he should be impeached once again for inciting this mob, despite the shortness of his remaining term, just to draw a line no president will dare cross again.
But the reaction to this reaction has been much more than swift; it looks like it's also going to be excessive. The Establishment State and its semi-corporate allies are setting the stage for another round of surveillance and lock-down measures, aimed to be sure at preventing another assault on anywhere elites gather to rule, but also aimed at making sure any threat to Establishment power anywhere can't begin to form.
And never forget, crushing dissent in America has always meant crushing the left.
Another 9/11?
This may be this generation's 9/11 (yes, the original was 20 years ago, a generation away from the present date). That 9/11 brought the Patriot Act, still with us, and universal ("collect it all") Pentagon surveillance of, well, all of us:
"Rather than look for a single needle in the haystack, [NSA chief Gen. Keith Alexander's] approach was, 'Let's collect the whole haystack,' " said one former senior U.S. intelligence official who tracked the plan's implementation. "Collect it all, tag it, store it. . . . And whatever it is you want, you go searching for it."
That plan, ironically named the Patriot Act, and all that followed from it, lives today, long after the terrorists struck New York, long after we entered, destroyed, and left Iraq, and 20 years after we started a war of choice to destroy Afghanistan, a war the Establishment refuses ever to end. Guantanamo too is with us; its prisoners will die before it's closed, like broken medieval men chained to walls, waiting to starve to death.
Joe Biden, both personally and professionally, is a warrior. Personally, he wears his hackles on his sleeve.
He's also a warrior professionally. He was one of the strongest supporters of the Iraq War in the Senate, then lied for decades about why he supported it (he claimed to have been fooled by Bush's fake intelligence) rather than admit fault.
As Branko Marcetic writes at Jacobin, "If you're looking for a president with a track record of boosting foreign intervention, expanding the surveillance state, and steadfastly backing Israel despite its war crimes, Joe Biden is your guy."
The Reaction to the Reaction, H.R. 4192
Now comes the muscular reaction to the mob's reaction, Biden's promise to reinvigorate the war on "domestic terrorism":
Democrats have a "domestic terrorism" law ready to go, H.R. 4192, "Confronting the Threat of Domestic Terrorism Act," introduced by Adam Schiff in the last Congress. Many think it will form the basis for Biden's new assault on speech and political action.
Here's how the ACLU characterizes Schiff's proposed law: "By reifying and broadening domestic terrorism authorities, H.R. 4192 would unnecessarily expand law enforcement authorities to target and discriminate against the very communities Congress is seeking to protect."
In a letter to Congress written in opposition to the bill, the ACLU wrote:
The American Civil Liberties Union (ACLU) strongly urges you to oppose H.R. 4192, which is unnecessary because the offenses it creates largely duplicate existing crimes, and harmful because it expands authorities that law enforcement has abused to target marginalized communities. In light of recent mass shootings and the surge in white supremacist violence, lawmakers are understandably seeking to take action. But proposals like H.R. 4192 are the wrong approach. This bill is yet another iteration in a series of problematic proposals that would further entrench domestic terrorism frameworks, and cause more harm to the communities that Congress is seeking to protect.
The full text is here. The letter also cites abuse of the Patriot Act and notes, "Law enforcement agencies' use of these authorities undermines and has violated equal protection, due process, and First Amendment rights. Law enforcement agencies already have all the authorities they need to address white supremacist violence effectively."
Will the Capitol Assault be this generation's 9/11, at least in its lasting aftermath? Stay tuned.
But don't take any bets it won't. The power-hungry (and increasingly insecure) bipartisan state would love nothing better than to expand its control over any effective dissent.
Including the dissent of all those hated socialists.
And including yours.
(I've launched a Substack site to greet the post-Trump era. You can get more information here and here. If you decide to sign up — it's free — my thanks to you!)
Gaius Publius
national security state
war on progressives

redpajama_set_name: RedPajamaCommonCrawl


text:
Wandering Through Ancient Lakes
Ancient Lakes is a cluster of three small lakes nestled at the head of Potholes Coulee; a flat bottomed, cliff ringed valley.
Central Washington, geology
Recently I was watching a gear review video on YouTube. I don't remember what they were reviewing but I remember where they were doing their review; Ancient Lakes. I had never seen or even heard about this area of Washington, and did some quick calling to my buddies. They weren't familiar with the area either. That's all it took for me to pull maps and start making plans to visit the area.
Having hiked up to the saddle between coulees we were able to look down at Dusty Lakes.
Ancient Lakes is a cluster of three small lakes nestled at the head of a flat bottomed, cliff ringed valley called a coulee in these parts of Washington. The Ancient Lakes coulee is carved into the orchard-covered Quincy plateau and faces west, toward the Columbia River. This area is a great example of a recessional-cataract canyon. Potholes Coulee caught the attention of J Harlen Bretz in the early 20th century, which led to his "outrageous hypothesis" of Ice Age flooding; a very controversial theory during his time, but one that proved to be correct!
This year it's hard to get short notice camping reservations as I'm sure everyone has noticed, but we did luck out and found a spot over at Potholes State Park which is only about a 45-minute drive from Ancient Lakes. We camped here once before when the temperatures had been a blistering 105 in the shade. Can't say we enjoyed it much that time, but this time of year we had cold nights, and pleasant day temps this go-around and did enjoy the campsite.
We left early in the morning for Ancient Lakes and as we pulled in the parking lot it looked like we were going to have the place much to ourselves. However, before we could even gear up the parking lot started filling up with arrivals. There are so many trails that spider web off the parking area that we rarely saw but a handful of fellow hikers once on the trail.
article gallery
Theresa taking a moment to enjoy some of the deserts nature art in the area.
Big sagebrush (Artemisia tridentata) was found every where but made a nice change from the foliage we're normally accustom too.
Making our way across the rim towards the saddle that will give us a view of Dustly Lakes.
A mating pair of Canadian Geese (Branta canadensis) along with their hatchlings enjoying Ancient Lakes.
We timed our visit to coincide with the blooming of many of the desert flowers. Here's the flowers of Thymeleaf buckwheat (Eriogonum thymoides) which covered the floor of the coulee.
We took our lunch on the southern rim of the coulee. Look closely and you can see Theresa's pink top.
Looking down on the 2 lakes that make up Ancient Lakes from atop the south rim of the coulee.
Big sagebrush (Artemisia tridentata) was found everywhere but made a nice change from the foliage we're normally accustomed to.
The only exception to this was the waterfall at the head of Ancient Lakes. This seemed to be the main attraction and it looked like a tour bus had ejected its payload at its base. As such we contented ourselves with the view from across the lake.
The real treat and view were when we decided to hike up to the south rim of the coulee. The topo map should have a saddle that would give us a view of the neighboring Dusty Lake. Not only did that prove to be the case but the views from the rim top back over Ancient Lake were spectacular.
We did get lucky with our timing. The desert flowers were in bloom, and there was an incredible number of birds in the area. And I'm happy to say that the one animal that I kept seeing a warning about — rattlesnakes, didn't make an appearance at all. We're already making plans for a return visit in the fall.
Taking a POS Boat To Chisik Island
Here's the irony, right before the drama started I had just stated, "Every time I come to Alaska I get pushed out of my comfort
Costa Rica: Surviving a Cattle Stampede in La Fortuna
As Costa Rica become a top eco-tourism country, one family decided to preserve the 600 acres of land given to them near La Fortuna to maintain the rich biodiversity living within.
A White Christmas In Lighthouse Park
In 1888, George Grant Mackay, a Scottish civil engineer, and land developer, arrived in the young city of Vancouver in Canada. Mackay purchased 6,000 acres of dense forest on either side of Capilano River and built a cabin on the very edge of the canyon wall.
In Search of "Ground Photo Timothy"
In the early 1950s, the U.S. government became increasingly concerned about a Soviet military threat. This new age of nuclear fear was the beginning of a "Cold War" era t. As a result, many facilities were built on the west coast to search for any threats coming in over the Pacific.


text:
package org.batfish.representation.juniper;

import static org.batfish.common.Warnings.TAG_PEDANTIC;
import static org.batfish.common.matchers.WarningMatchers.hasText;
import static org.batfish.common.matchers.WarningsMatchers.hasUnimplementedWarning;
import static org.batfish.datamodel.Names.zoneToZoneFilter;
import static org.batfish.datamodel.acl.AclLineMatchExprs.matchSrcInterface;
import static org.batfish.datamodel.matchers.AclLineMatchers.hasTraceElement;
import static org.batfish.representation.juniper.JuniperConfiguration.DEFAULT_DEAD_INTERVAL;
import static org.batfish.representation.juniper.JuniperConfiguration.DEFAULT_HELLO_INTERVAL;
import static org.batfish.representation.juniper.JuniperConfiguration.DEFAULT_ISIS_COST;
import static org.batfish.representation.juniper.JuniperConfiguration.DEFAULT_NBMA_DEAD_INTERVAL;
import static org.batfish.representation.juniper.JuniperConfiguration.DEFAULT_NBMA_HELLO_INTERVAL;
import static org.batfish.representation.juniper.JuniperConfiguration.MAX_ISIS_COST_WITHOUT_WIDE_METRICS;
import static org.batfish.representation.juniper.JuniperConfiguration.OSPF_DEAD_INTERVAL_HELLO_MULTIPLIER;
import static org.batfish.representation.juniper.JuniperConfiguration.buildScreen;
import static org.batfish.representation.juniper.JuniperConfiguration.getDefaultSourceAddress;
import static org.batfish.representation.juniper.JuniperConfiguration.getPrimaryInterface;
import static org.batfish.representation.juniper.JuniperConfiguration.getRouterId;
import static org.batfish.representation.juniper.JuniperConfiguration.matchingFirewallFilter;
import static org.batfish.representation.juniper.JuniperConfiguration.mergeIpAccessListLines;
import static org.batfish.representation.juniper.JuniperConfiguration.toOspfDeadInterval;
import static org.batfish.representation.juniper.JuniperConfiguration.toOspfHelloInterval;
import static org.batfish.representation.juniper.JuniperConfiguration.toRibId;
import static org.batfish.representation.juniper.JuniperConfiguration.toRouteFilterList;
import static org.batfish.representation.juniper.JuniperConfiguration.toTraceableStatement;
import static org.batfish.representation.juniper.JuniperStructureType.FIREWALL_FILTER;
import static org.batfish.representation.juniper.JuniperStructureType.FIREWALL_FILTER_TERM;
import static org.batfish.representation.juniper.JuniperStructureType.SECURITY_POLICY;
import static org.batfish.representation.juniper.JuniperStructureType.SECURITY_POLICY_TERM;
import static org.batfish.representation.juniper.NatPacketLocation.interfaceLocation;
import static org.batfish.representation.juniper.NatPacketLocation.routingInstanceLocation;
import static org.batfish.representation.juniper.NatPacketLocation.zoneLocation;
import static org.hamcrest.Matchers.contains;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.hasSize;
import static org.hamcrest.Matchers.instanceOf;
import static org.hamcrest.Matchers.iterableWithSize;
import static org.hamcrest.Matchers.notNullValue;
import static org.hamcrest.Matchers.nullValue;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertThat;

import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterables;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import org.batfish.common.Warning;
import org.batfish.common.Warnings;
import org.batfish.datamodel.AclLine;
import org.batfish.datamodel.ConcreteInterfaceAddress;
import org.batfish.datamodel.Configuration;
import org.batfish.datamodel.ConfigurationFormat;
import org.batfish.datamodel.ExprAclLine;
import org.batfish.datamodel.HeaderSpace;
import org.batfish.datamodel.InterfaceType;
import org.batfish.datamodel.Ip;
import org.batfish.datamodel.IpAccessList;
import org.batfish.datamodel.IpWildcard;
import org.batfish.datamodel.LineAction;
import org.batfish.datamodel.Prefix;
import org.batfish.datamodel.RouteFilterList;
import org.batfish.datamodel.TraceElement;
import org.batfish.datamodel.Vrf;
import org.batfish.datamodel.acl.AclLineMatchExpr;
import org.batfish.datamodel.acl.AndMatchExpr;
import org.batfish.datamodel.acl.MatchHeaderSpace;
import org.batfish.datamodel.acl.MatchSrcInterface;
import org.batfish.datamodel.acl.OrMatchExpr;
import org.batfish.datamodel.acl.PermittedByAcl;
import org.batfish.datamodel.dataplane.rib.RibId;
import org.batfish.datamodel.isis.IsisLevel;
import org.batfish.datamodel.routing_policy.statement.If;
import org.batfish.datamodel.routing_policy.statement.SetTag;
import org.batfish.datamodel.routing_policy.statement.Statement;
import org.batfish.datamodel.routing_policy.statement.TraceableStatement;
import org.batfish.representation.juniper.OspfInterfaceSettings.OspfInterfaceType;
import org.batfish.vendor.VendorStructureId;
import org.junit.Test;

/** Test for {@link JuniperConfiguration} */
public class JuniperConfigurationTest {

  private static JuniperConfiguration createConfig() {
    JuniperConfiguration config = new JuniperConfiguration();
    config.setFilename("file");
    config._c = new Configuration("host", ConfigurationFormat.JUNIPER);
    return config;
  }

  @Test
  public void testFilterToIpAccessList_noTerm() {
    JuniperConfiguration config = createConfig();
    ConcreteFirewallFilter filter = new ConcreteFirewallFilter("filter", Family.INET);
    IpAccessList emptyAcl = config.filterToIpAccessList(filter);

    // ACL from empty filter should have no lines
    assertThat(emptyAcl.getLines(), iterableWithSize(0));
  }

  @Test
  public void testFilterToIpAccessList_hasTerm() {
    JuniperConfiguration config = createConfig();
    ConcreteFirewallFilter filter = new ConcreteFirewallFilter("filter", Family.INET);
    FwTerm term = new FwTerm("term");
    String ipAddrPrefix = "1.2.3.0/24";
    term.getFroms().add(new FwFromSourceAddress(IpWildcard.parse(ipAddrPrefix), ipAddrPrefix));
    term.getThens().add(FwThenAccept.INSTANCE);
    filter.getTerms().put("term", term);
    IpAccessList headerSpaceAcl = config.filterToIpAccessList(filter);

    // ACL from headerSpace filter should have one line
    AclLine headerSpaceAclLine = Iterables.getOnlyElement(headerSpaceAcl.getLines());
    // It should have a MatchHeaderSpace match condition, matching the ipAddrPrefix from above
    VendorStructureId vsId =
        new VendorStructureId("file", FIREWALL_FILTER_TERM.getDescription(), "filter term");
    assertThat(
        headerSpaceAclLine,
        equalTo(
            ExprAclLine.builder()
                .setName("term")
                .setAction(LineAction.PERMIT)
                .setTraceElement(TraceElement.builder().add("Matched ").add("term", vsId).build())
                .setVendorStructureId(vsId)
                .setMatchCondition(
                    new AndMatchExpr(
                        ImmutableList.of(
                            new MatchHeaderSpace(
                                HeaderSpace.builder()
                                    .setSrcIps(IpWildcard.parse(ipAddrPrefix).toIpSpace())
                                    .build(),
                                TraceElement.of("Matched source-address 1.2.3.0/24")))))
                .build()));
  }

  @Test
  public void testSecurityPolicyToIpAccessList() {
    JuniperConfiguration config = createConfig();
    ConcreteFirewallFilter filter = new ConcreteFirewallFilter("filter", Family.INET);

    FwTerm term = new FwTerm("term");
    String ipAddrPrefix = "1.2.3.0/24";
    term.getFroms().add(new FwFromSourceAddress(IpWildcard.parse(ipAddrPrefix), ipAddrPrefix));
    term.getThens().add(FwThenAccept.INSTANCE);
    filter.getTerms().put("term", term);

    Zone zone = new Zone("zone", new AddressBook("global", null));
    String interface1Name = "interface1";
    zone.getInterfaces().add(interface1Name);
    String interface2Name = "interface2";
    zone.getInterfaces().add(interface2Name);
    config.getMasterLogicalSystem().getZones().put("zone", zone);
    filter.setFromZone("zone");
    IpAccessList headerSpaceAndSrcInterfaceAcl = config.securityPolicyToIpAccessList(filter);

    // ACL from headerSpace and zone filter should have one line
    AclLine comboAclLine = Iterables.getOnlyElement(headerSpaceAndSrcInterfaceAcl.getLines());
    // It should have an AndMatchExpr match condition, containing both a MatchSrcInterface
    // condition and a MatchHeaderSpace condition
    VendorStructureId vsId =
        new VendorStructureId("file", SECURITY_POLICY_TERM.getDescription(), "filter term");
    assertThat(
        comboAclLine,
        equalTo(
            ExprAclLine.builder()
                .setName("term")
                .setAction(LineAction.PERMIT)
                .setTraceElement(TraceElement.builder().add("Matched ").add("term", vsId).build())
                .setVendorStructureId(vsId)
                .setMatchCondition(
                    new AndMatchExpr(
                        ImmutableList.of(
                            new AndMatchExpr(
                                ImmutableList.of(
                                    new MatchHeaderSpace(
                                        HeaderSpace.builder()
                                            .setSrcIps(IpWildcard.parse(ipAddrPrefix).toIpSpace())
                                            .build(),
                                        TraceElement.of("Matched source-address 1.2.3.0/24")))),
                            new MatchSrcInterface(zone.getInterfaces()))))
                .build()));
  }

  @Test
  public void testCompositeFirewallFilter() {
    JuniperConfiguration config = createConfig();

    ConcreteFirewallFilter concrete = new ConcreteFirewallFilter("F", Family.INET);
    CompositeFirewallFilter composite =
        new CompositeFirewallFilter("composite", ImmutableList.of(concrete));
    IpAccessList compositeAcl = config.filterToIpAccessList(composite);

    assertThat(
        compositeAcl.getLines(),
        contains(hasTraceElement(matchingFirewallFilter(config.getFilename(), "F"))));
  }

  /**
   * Sets up the given configuration with one VRF called vrf containing one interface called iface.
   *
   * @return the created interface
   */
  private static org.batfish.datamodel.Interface createInterface(Configuration c) {
    Vrf vrf = new Vrf("vrf");
    c.setVrfs(ImmutableMap.of("vrf", vrf));
    org.batfish.datamodel.Interface iface =
        org.batfish.datamodel.Interface.builder().setName("iface").setOwner(c).setVrf(vrf).build();
    return iface;
  }

  /**
   * Creates a {@link RoutingInstance} configured with one VRF called vrf containing one enabled
   * Juniper {@link Interface} called iface with the given {@code ifaceBandwidth}. If {@code
   * configuredIfaceIsisMetric} is not null, interface's level 1 IS-IS settings will use it. If
   * {@code referenceBandwidth} is not null, routing instance's IS-IS settings will use it.
   *
   * @param ifaceBandwidth Bandwidth of interface
   * @param configuredIfaceIsisMetric IS-IS metric for the interface's level 1 IS-IS settings
   * @param referenceBandwidth Reference bandwidth for the routing instance's {@link IsisSettings}
   */
  private static RoutingInstance createRoutingInstance(
      @Nonnull Double ifaceBandwidth,
      @Nullable Long configuredIfaceIsisMetric,
      @Nullable Double referenceBandwidth) {
    Interface iface = new Interface("iface");
    iface.setBandwidth(ifaceBandwidth);
    iface.getOrInitIsisSettings();
    if (configuredIfaceIsisMetric != null) {
      iface.getIsisSettings().getLevel1Settings().setMetric(configuredIfaceIsisMetric);
    }

    RoutingInstance routingInstance = new RoutingInstance("vrf");
    routingInstance.getInterfaces().put("iface", iface);
    if (referenceBandwidth != null) {
      routingInstance.getIsisSettings().setReferenceBandwidth(referenceBandwidth);
    }

    return routingInstance;
  }

  @Test
  public void testProcessIsisInterfaceSettings() {
    // Config with loopback and two other interfaces
    JuniperConfiguration config = createConfig();
    String loopbackName = "lo0.0";
    String iface1Name = "iface1";
    String iface2Name = "iface2";
    Vrf vrf = new Vrf("vrf");
    org.batfish.datamodel.Interface.builder()
        .setOwner(config._c)
        .setName(loopbackName)
        .setVrf(vrf)
        .setType(InterfaceType.LOOPBACK)
        .build();
    org.batfish.datamodel.Interface.builder()
        .setName(iface1Name)
        .setOwner(config._c)
        .setVrf(vrf)
        .build();
    org.batfish.datamodel.Interface.builder()
        .setName(iface2Name)
        .setOwner(config._c)
        .setVrf(vrf)
        .build();
    config._c.setVrfs(ImmutableMap.of("vrf", vrf));

    // Loopback has IS-IS enabled at both levels; other interfaces' IS-IS settings vary by test
    RoutingInstance routingInstance = new RoutingInstance("vrf");
    Interface vsLoopback = new Interface(loopbackName);
    vsLoopback.getOrInitIsisSettings();
    routingInstance.getInterfaces().put(loopbackName, vsLoopback);

    {
      // LEVEL_1_2 if both enabled in process and each enabled on at least one interface
      Interface vsIface1 = new Interface(iface1Name);
      Interface vsIface2 = new Interface(iface2Name);
      vsIface1.getOrInitIsisSettings().getLevel1Settings().setEnabled(false);
      vsIface2.getOrInitIsisSettings().getLevel2Settings().setEnabled(false);
      routingInstance.getInterfaces().put(iface1Name, vsIface1);
      routingInstance.getInterfaces().put(iface2Name, vsIface2);
      assertThat(
          config.processIsisInterfaceSettings(routingInstance, true, true),
          equalTo(IsisLevel.LEVEL_1_2));

      // LEVEL_1 if process doesn't have L2 enabled; LEVEL_2 if process doesn't have L1 enabled
      assertThat(
          config.processIsisInterfaceSettings(routingInstance, true, false),
          equalTo(IsisLevel.LEVEL_1));
      assertThat(
          config.processIsisInterfaceSettings(routingInstance, false, true),
          equalTo(IsisLevel.LEVEL_2));
    }

    {
      // LEVEL_1 if both enabled in process but only L1 enabled on non-loopback interfaces
      Interface vsIface1 = new Interface(iface1Name);
      Interface vsIface2 = new Interface(iface2Name);
      vsIface1.getOrInitIsisSettings().getLevel2Settings().setEnabled(false);
      routingInstance.getInterfaces().put(iface1Name, vsIface1);
      routingInstance.getInterfaces().put(iface2Name, vsIface2);
      assertThat(
          config.processIsisInterfaceSettings(routingInstance, true, true),
          equalTo(IsisLevel.LEVEL_1));
    }

    {
      // LEVEL_2 if both enabled in process but only L2 enabled on non-loopback interfaces
      Interface vsIface1 = new Interface(iface1Name);
      Interface vsIface2 = new Interface(iface2Name);
      vsIface1.getOrInitIsisSettings().getLevel1Settings().setEnabled(false);
      routingInstance.getInterfaces().put(iface1Name, vsIface1);
      routingInstance.getInterfaces().put(iface2Name, vsIface2);
      assertThat(
          config.processIsisInterfaceSettings(routingInstance, true, true),
          equalTo(IsisLevel.LEVEL_2));
    }
  }

  @Test
  public void testIsisCostFromInterfaceSettings() {
    // Reference bandwidth and interface IS-IS cost are both set. Test that interface IS-IS cost
    // takes precedence.
    JuniperConfiguration config = createConfig();
    org.batfish.datamodel.Interface viIface = createInterface(config._c);
    RoutingInstance routingInstance = createRoutingInstance(100D, 5L, 10000D);

    config.processIsisInterfaceSettings(routingInstance, true, false);
    assertThat(viIface.getIsis().getLevel1().getCost(), equalTo(5L));
  }

  @Test
  public void testIsisCostFromReferenceBandwidth() {
    // Reference bandwidth is set and interface IS-IS cost is not. Test that reference bandwidth is
    // used to produce IS-IS cost.
    JuniperConfiguration config = createConfig();
    org.batfish.datamodel.Interface viIface = createInterface(config._c);
    RoutingInstance routingInstance = createRoutingInstance(500D, null, 10000D);

    config.processIsisInterfaceSettings(routingInstance, true, false);
    assertThat(viIface.getIsis().getLevel1().getCost(), equalTo(20L));
  }

  @Test
  public void testIsisCostFromSmallReferenceBandwidth() {
    // Interface IS-IS cost is not set. Reference bandwidth is set smaller than interface bandwidth.
    // IS-IS cost should be 1.
    JuniperConfiguration config = createConfig();
    org.batfish.datamodel.Interface viIface = createInterface(config._c);
    RoutingInstance routingInstance = createRoutingInstance(100D, null, 10D);

    config.processIsisInterfaceSettings(routingInstance, true, false);
    assertThat(viIface.getIsis().getLevel1().getCost(), equalTo(1L));
  }

  @Test
  public void testDefaultIsisCost() {
    // Neither reference bandwidth nor interface IS-IS cost is set. Test that IS-IS cost is default.
    JuniperConfiguration config = createConfig();
    org.batfish.datamodel.Interface viIface = createInterface(config._c);
    RoutingInstance routingInstance = createRoutingInstance(100D, null, null);

    config.processIsisInterfaceSettings(routingInstance, true, false);
    assertThat(viIface.getIsis().getLevel1().getCost(), equalTo((long) DEFAULT_ISIS_COST));
  }

  @Test
  public void testIsisCostInterfaceBandwidth0() {
    // Reference bandwidth is set, but IS-IS cost can't be calculated because interface bandwidth is
    // 0. IS-IS cost should be default value; conversion warning should be generated.
    JuniperConfiguration config = createConfig();
    org.batfish.datamodel.Interface viIface = createInterface(config._c);
    RoutingInstance routingInstance = createRoutingInstance(0D, null, 10000D);
    config.setWarnings(new Warnings(true, false, false));

    config.processIsisInterfaceSettings(routingInstance, true, false);
    assertThat(viIface.getIsis().getLevel1().getCost(), equalTo((long) DEFAULT_ISIS_COST));
    assertThat(
        config.getWarnings().getPedanticWarnings(),
        contains(
            new Warning(
                "Cannot use IS-IS reference bandwidth for interface 'iface' because interface"
                    + " bandwidth is 0.",
                TAG_PEDANTIC)));
  }

  @Test
  public void testRefBandwidthBasedIsisCostClipped() {
    // Reference bandwidth = 10000, bandwidth = 10. IS-IS cost would be 1000 if wide-metrics-only
    // were set, but since it is not, cost should be clipped to 63.
    JuniperConfiguration config = createConfig();
    org.batfish.datamodel.Interface viIface = createInterface(config._c);
    RoutingInstance routingInstance = createRoutingInstance(10D, null, 10000D);

    config.processIsisInterfaceSettings(routingInstance, true, false);
    assertThat(
        viIface.getIsis().getLevel1().getCost(),
        equalTo((long) MAX_ISIS_COST_WITHOUT_WIDE_METRICS));

    // Now ensure that when wide-metrics-only is set, IS-IS cost doesn't get clipped.
    routingInstance.getIsisSettings().getLevel1Settings().setWideMetricsOnly(true);
    config.processIsisInterfaceSettings(routingInstance, true, false);
    assertThat(viIface.getIsis().getLevel1().getCost(), equalTo(1000L));
  }

  @Test
  public void testInterfaceSettingsBasedIsisCostClipped() {
    // Interface IS-IS metric = 100, but wide-metrics-only is not set. Cost should be clipped to 63.
    JuniperConfiguration config = createConfig();
    org.batfish.datamodel.Interface viIface = createInterface(config._c);
    RoutingInstance routingInstance = createRoutingInstance(10D, 100L, null);

    config.processIsisInterfaceSettings(routingInstance, true, false);
    assertThat(
        viIface.getIsis().getLevel1().getCost(),
        equalTo((long) MAX_ISIS_COST_WITHOUT_WIDE_METRICS));

    // Now ensure that when wide-metrics-only is set, IS-IS cost doesn't get clipped.
    routingInstance.getIsisSettings().getLevel1Settings().setWideMetricsOnly(true);
    config.processIsisInterfaceSettings(routingInstance, true, false);
    assertThat(viIface.getIsis().getLevel1().getCost(), equalTo(100L));
  }

  @Test
  public void testFromNatPacketLocationMatchExprs() {
    JuniperConfiguration config = createConfig();

    Interface parent = new Interface("parent");

    String interface1Name = "interface1";
    parent.getUnits().put(interface1Name, new Interface(interface1Name));
    config.getMasterLogicalSystem().getInterfaces().put(parent.getName(), parent);

    Zone zone = new Zone("zone", new AddressBook("global", null));
    String zoneInterface1Name = "zoneInterface1";
    zone.getInterfaces().add(zoneInterface1Name);
    String zoneInterface2Name = "zoneInterface2";
    zone.getInterfaces().add(zoneInterface2Name);
    config.getMasterLogicalSystem().getZones().put(zone.getName(), zone);

    RoutingInstance routingInstance = config.getMasterLogicalSystem().getDefaultRoutingInstance();
    String routingInstanceInterface1Name = "routingInstanceInterface1";
    routingInstance
        .getInterfaces()
        .put(routingInstanceInterface1Name, new Interface(routingInstanceInterface1Name));
    String routingInstanceInterface2Name = "routingInstanceInterface2";
    routingInstance
        .getInterfaces()
        .put(routingInstanceInterface2Name, new Interface(routingInstanceInterface2Name));

    Map<NatPacketLocation, AclLineMatchExpr> matchExprs = config.fromNatPacketLocationMatchExprs();
    assertThat(
        matchExprs,
        equalTo(
            ImmutableMap.of(
                interfaceLocation(interface1Name), matchSrcInterface(interface1Name),
                zoneLocation(zone.getName()),
                    matchSrcInterface(zoneInterface1Name, zoneInterface2Name),
                routingInstanceLocation(routingInstance.getName()),
                    matchSrcInterface(
                        routingInstanceInterface1Name, routingInstanceInterface2Name))));
  }

  @Test
  public void testBuildScreen() {
    List<ScreenOption> screenOptionList =
        ImmutableList.of(
            IcmpLarge.INSTANCE,
            IpUnknownProtocol.INSTANCE,
            TcpFinNoAck.INSTANCE,
            TcpSynFin.INSTANCE,
            TcpNoFlag.INSTANCE);

    Screen screen = new Screen("screen");
    for (ScreenOption option : screenOptionList) {
      screen.getScreenOptions().add(option);
    }

    IpAccessList screenAcl = buildScreen(screen, "~SCREEN~screen");

    assertThat(
        screenAcl,
        equalTo(
            IpAccessList.builder()
                .setName("~SCREEN~screen")
                .setLines(
                    ImmutableList.of(
                        ExprAclLine.rejecting(
                            new OrMatchExpr(
                                screenOptionList.stream()
                                    .map(ScreenOption::getAclLineMatchExpr)
                                    .collect(Collectors.toList()))),
                        ExprAclLine.ACCEPT_ALL))
                .build()));

    Screen screen2 = new Screen("screen2");
    IpAccessList screenAcl2 = buildScreen(screen2, "~SCREEN~screen2");
    assertThat(screenAcl2, nullValue());
  }

  @Test
  public void testBuildScreensPerZone() {
    JuniperConfiguration config = createConfig();

    List<ScreenOption> screenOptionList1 =
        ImmutableList.of(IcmpLarge.INSTANCE, IpUnknownProtocol.INSTANCE, TcpFinNoAck.INSTANCE);

    List<ScreenOption> screenOptionList2 = ImmutableList.of(TcpSynFin.INSTANCE, TcpNoFlag.INSTANCE);

    Screen screen1 = new Screen("screen1");
    for (ScreenOption option : screenOptionList1) {
      screen1.getScreenOptions().add(option);
    }

    Screen screen2 = new Screen("screen2");
    for (ScreenOption option : screenOptionList2) {
      screen2.getScreenOptions().add(option);
    }
    screen2.setAction(ScreenAction.ALARM_WITHOUT_DROP);

    Screen screen3 = new Screen("screen3");

    config.getMasterLogicalSystem().getScreens().put("screen1", screen1);
    config.getMasterLogicalSystem().getScreens().put("screen2", screen2);
    config.getMasterLogicalSystem().getScreens().put("screen3", screen3);

    Zone zone = new Zone("zone", null);
    zone.getScreens().add("screen1");
    zone.getScreens().add("screen2");
    zone.getScreens().add("screen3");

    IpAccessList screenAcl = config.buildScreensPerZone(zone, "~SCREEN_ZONE~zone");

    // screenAcl should only have screen1, because screen2 has an alarm action and screen3 has not
    // options.
    assertThat(
        screenAcl,
        equalTo(
            IpAccessList.builder()
                .setName("~SCREEN_ZONE~zone")
                .setLines(
                    ImmutableList.of(
                        ExprAclLine.accepting(
                            new AndMatchExpr(
                                ImmutableList.of(new PermittedByAcl("~SCREEN~screen1"))))))
                .build()));
    assertThat(config._c.getIpAccessLists().get("~SCREEN~screen1"), notNullValue());
    assertThat(config._c.getIpAccessLists().get("~SCREEN~screen2"), nullValue());
    assertThat(config._c.getIpAccessLists().get("~SCREEN~screen3"), nullValue());
    assertThat(
        config._c.getIpAccessLists().get("~SCREEN~screen1"),
        equalTo(
            IpAccessList.builder()
                .setName("~SCREEN~screen1")
                .setLines(
                    ImmutableList.of(
                        ExprAclLine.rejecting(
                            new OrMatchExpr(
                                screenOptionList1.stream()
                                    .map(ScreenOption::getAclLineMatchExpr)
                                    .collect(Collectors.toList()))),
                        ExprAclLine.ACCEPT_ALL))
                .build()));
  }

  @Test
  public void testBuildScreensPerInterface() {
    JuniperConfiguration config = createConfig();
    Interface iface = new Interface("iface");

    List<ScreenOption> screenOptionList =
        ImmutableList.of(IcmpLarge.INSTANCE, IpUnknownProtocol.INSTANCE, TcpFinNoAck.INSTANCE);

    Screen screen = new Screen("screen");
    for (ScreenOption option : screenOptionList) {
      screen.getScreenOptions().add(option);
    }

    config.getMasterLogicalSystem().getScreens().put("screen", screen);

    Zone zone = new Zone("zone", null);
    zone.getScreens().add("screen");

    config.getMasterLogicalSystem().getInterfaceZones().put(iface.getName(), zone);

    IpAccessList screenAcl = config.buildScreensPerInterface(iface);

    // screenAcl should only have screen, because screen2 has an alarm action and screen3 has not
    // options.
    assertThat(
        screenAcl,
        equalTo(
            IpAccessList.builder()
                .setName("~SCREEN_INTERFACE~iface")
                .setLines(
                    ImmutableList.of(
                        ExprAclLine.accepting(new PermittedByAcl("~SCREEN_ZONE~zone"))))
                .build()));
    assertThat(config._c.getIpAccessLists().get("~SCREEN_ZONE~zone"), notNullValue());
  }

  @Test
  public void testToRibId() {
    String hostname = "host";
    assertThat(
        toRibId(hostname, "inet.0", null),
        equalTo(new RibId(hostname, Configuration.DEFAULT_VRF_NAME, RibId.DEFAULT_RIB_NAME)));
    assertThat(
        toRibId(hostname, "inet.1", null),
        equalTo(new RibId(hostname, Configuration.DEFAULT_VRF_NAME, "inet.1")));
    assertThat(
        toRibId(hostname, "VRF1.inet.0", null),
        equalTo(new RibId(hostname, "VRF1", RibId.DEFAULT_RIB_NAME)));
    assertThat(
        toRibId(hostname, "VRF1.inet.1", null), equalTo(new RibId(hostname, "VRF1", "inet.1")));

    Warnings w = new Warnings(true, true, true);
    assertThat(toRibId(hostname, "inet6.0", w), nullValue());
    assertThat(
        w,
        hasUnimplementedWarning(
            hasText("Rib name conversion: inet6 address family is not supported")));
  }

  @Test
  public void testToOspfDeadIntervalExplicit() {
    OspfInterfaceSettings ospfInterfaceSettings = new OspfInterfaceSettings(Ip.ZERO);
    ospfInterfaceSettings.setOspfDeadInterval(7);
    // Explicitly set dead interval should be preferred over inference
    assertThat(toOspfDeadInterval(ospfInterfaceSettings), equalTo(7));
  }

  @Test
  public void testToOspfDeadIntervalFromHello() {
    int helloInterval = 1;
    OspfInterfaceSettings ospfInterfaceSettings = new OspfInterfaceSettings(Ip.ZERO);
    ospfInterfaceSettings.setOspfHelloInterval(1);
    // Since the dead interval is not set, it should be inferred as four times the hello interval
    assertThat(
        toOspfDeadInterval(ospfInterfaceSettings),
        equalTo(OSPF_DEAD_INTERVAL_HELLO_MULTIPLIER * helloInterval));
  }

  @Test
  public void testToOspfDeadIntervalFromType() {
    OspfInterfaceSettings ospfInterfaceSettings = new OspfInterfaceSettings(Ip.ZERO);
    // Since the dead interval and hello interval are not set, it should be inferred from the
    // network type
    ospfInterfaceSettings.setOspfInterfaceType(OspfInterfaceType.P2P);
    assertThat(toOspfDeadInterval(ospfInterfaceSettings), equalTo(DEFAULT_DEAD_INTERVAL));
    ospfInterfaceSettings.setOspfInterfaceType(OspfInterfaceType.NBMA);
    assertThat(toOspfDeadInterval(ospfInterfaceSettings), equalTo(DEFAULT_NBMA_DEAD_INTERVAL));
  }

  @Test
  public void testToOspfHelloIntervalExplicit() {
    OspfInterfaceSettings ospfInterfaceSettings = new OspfInterfaceSettings(Ip.ZERO);
    ospfInterfaceSettings.setOspfHelloInterval(7);
    // Explicitly set hello interval should be preferred over inference
    assertThat(toOspfHelloInterval(ospfInterfaceSettings), equalTo(7));
  }

  @Test
  public void testToOspfHelloIntervalFromType() {
    OspfInterfaceSettings ospfInterfaceSettings = new OspfInterfaceSettings(Ip.ZERO);
    // Since the hello interval is not set, it should be inferred from the network type
    ospfInterfaceSettings.setOspfInterfaceType(OspfInterfaceType.P2P);
    assertThat(toOspfHelloInterval(ospfInterfaceSettings), equalTo(DEFAULT_HELLO_INTERVAL));
    ospfInterfaceSettings.setOspfInterfaceType(OspfInterfaceType.NBMA);
    assertThat(toOspfHelloInterval(ospfInterfaceSettings), equalTo(DEFAULT_NBMA_HELLO_INTERVAL));
  }

  @Test
  public void testBuildSecurityPolicyAcl_traceElement_fromHost() {
    JuniperConfiguration config = createConfig();
    Zone zone = new Zone("toZone", null);

    ConcreteFirewallFilter crossZoneFilter =
        new ConcreteFirewallFilter("crossZonePolicy", Family.INET);

    zone.getFromZonePolicies().put("crossZonePolicy", crossZoneFilter);

    config.buildSecurityPolicyAcl("acl", zone);
    IpAccessList acl = config._c.getIpAccessLists().get("acl");
    assertNotNull(acl);
    assertThat(acl.getLines(), hasSize(3));

    assertThat(
        acl.getLines().get(0).getTraceElement(),
        equalTo(TraceElement.of("Matched Juniper semantics on traffic originated from device")));

    assertThat(
        acl.getLines().get(1).getTraceElement(),
        equalTo(
            TraceElement.builder()
                .add("Matched ")
                .add(
                    "security policy from junos-host to zone toZone",
                    new VendorStructureId(
                        config.getFilename(),
                        SECURITY_POLICY.getDescription(),
                        zoneToZoneFilter("junos-host", "toZone")))
                .build()));

    assertThat(
        acl.getLines().get(2).getTraceElement(),
        equalTo(TraceElement.of("Matched default policy")));
  }

  @Test
  public void testBuildSecurityPolicyAcl_traceElement_fromZone() {
    JuniperConfiguration config = createConfig();
    Zone zone = new Zone("toZone", null);

    ConcreteFirewallFilter crossZoneFilter =
        new ConcreteFirewallFilter("crossZonePolicy", Family.INET);

    crossZoneFilter.setFromZone("fromZone");

    zone.getFromZonePolicies().put("crossZonePolicy", crossZoneFilter);

    config.buildSecurityPolicyAcl("acl", zone);
    IpAccessList acl = config._c.getIpAccessLists().get("acl");
    assertNotNull(acl);
    assertThat(acl.getLines(), hasSize(3));

    assertThat(
        acl.getLines().get(0).getTraceElement(),
        equalTo(TraceElement.of("Matched Juniper semantics on traffic originated from device")));

    assertThat(
        acl.getLines().get(1).getTraceElement(),
        equalTo(
            TraceElement.builder()
                .add("Matched ")
                .add(
                    "security policy from zone fromZone to zone toZone",
                    new VendorStructureId(
                        config.getFilename(),
                        SECURITY_POLICY.getDescription(),
                        zoneToZoneFilter("fromZone", "toZone")))
                .build()));

    assertThat(
        acl.getLines().get(2).getTraceElement(),
        equalTo(TraceElement.of("Matched default policy")));
  }

  @Test
  public void testFwTermToIpAccessList_traceElement() {
    JuniperConfiguration config = createConfig();
    FwTerm term = new FwTerm("term");
    term.getThens().add(FwThenAccept.INSTANCE);
    ConcreteFirewallFilter filter = new ConcreteFirewallFilter("acl", Family.INET);
    filter.getTerms().put(term.getName(), term);
    IpAccessList acl = config.fwTermsToIpAccessList("acl", filter, null, FIREWALL_FILTER);

    assertThat(acl.getLines(), hasSize(1));

    TraceElement expected =
        TraceElement.builder()
            .add("Matched ")
            .add(
                "term",
                new VendorStructureId("file", FIREWALL_FILTER_TERM.getDescription(), "acl term"))
            .build();
    TraceElement actual = acl.getLines().get(0).getTraceElement();
    assertThat(actual, equalTo(expected));
    assertThat(actual.getText(), equalTo("Matched term"));
  }

  @Test
  public void testMergeIpAccessListLines() {
    List<ExprAclLine> lines =
        ImmutableList.of(
            new ExprAclLine(
                LineAction.PERMIT,
                new MatchHeaderSpace(
                    HeaderSpace.builder().setSrcIps(Ip.parse("1.1.1.1").toIpSpace()).build()),
                "match1",
                TraceElement.of("trace of match1"),
                null));

    MatchHeaderSpace conj =
        new MatchHeaderSpace(
            HeaderSpace.builder().setDstIps(Ip.parse("2.2.2.2").toIpSpace()).build());

    List<AclLine> aclLines = mergeIpAccessListLines(lines, conj);

    assertThat(aclLines, hasSize(1));
    assertThat(aclLines.get(0).getTraceElement(), equalTo(TraceElement.of("trace of match1")));
  }

  @Test
  public void testRouterIdInference() {
    RoutingInstance ri = new RoutingInstance("RI");
    Ip routerId = Ip.parse("9.9.9.9");
    Ip loopBackIp1 = Ip.parse("1.1.1.2");
    Ip loopBackIp2 = Ip.parse("1.1.1.3");
    Ip ifaceIp1 = Ip.parse("1.1.1.4");
    Ip ifaceIp2 = Ip.parse("1.1.1.5");

    ri.setRouterId(routerId);
    Interface lo0 = new Interface("lo0.0");
    lo0.setPrimaryAddress(ConcreteInterfaceAddress.create(loopBackIp1, Prefix.MAX_PREFIX_LENGTH));
    Interface lo1 = new Interface("lo0.1");
    lo1.setPrimaryAddress(ConcreteInterfaceAddress.create(loopBackIp2, Prefix.MAX_PREFIX_LENGTH));
    Interface i1 = new Interface("ge-0/0/0.0");
    i1.setPrimaryAddress(ConcreteInterfaceAddress.create(ifaceIp1, Prefix.MAX_PREFIX_LENGTH - 1));
    Interface i2 = new Interface("ge-0/0/0.1");
    i2.setPrimaryAddress(ConcreteInterfaceAddress.create(ifaceIp2, Prefix.MAX_PREFIX_LENGTH - 1));
    ri.getInterfaces().put(lo0.getName(), lo0);
    ri.getInterfaces().put(lo1.getName(), lo1);
    ri.getInterfaces().put(i1.getName(), i1);
    ri.getInterfaces().put(i2.getName(), i2);
    // Return configured router id
    assertThat(getRouterId(ri), equalTo(routerId));
    ri.setRouterId(null); // clear router id
    // Lowest loopback address is returned
    assertThat(getRouterId(ri), equalTo(loopBackIp1));
    // Remove loopbacks
    ri.getInterfaces().remove(lo0.getName());
    ri.getInterfaces().remove(lo1.getName());
    // Lowest IP is returned
    assertThat(getRouterId(ri), equalTo(ifaceIp1));
    // Remove interfaces
    ri.getInterfaces().clear();
    // Zero is returned
    assertThat(getRouterId(ri), equalTo(Ip.ZERO));
  }

  /** Check that vendor structure id is set when prefix list is converted to route filter list */
  @Test
  public void testToRouterFilterList_prefixList_vendorStructureId() {
    PrefixList plist = new PrefixList("name");
    RouteFilterList rfl = toRouteFilterList(plist, "file");
    assertThat(
        rfl.getVendorStructureId(),
        equalTo(
            new VendorStructureId(
                "file", JuniperStructureType.PREFIX_LIST.getDescription(), "name")));
  }

  /** Check that tracing is properly added during routing policy conversion */
  @Test
  public void toRoutingPolicy_trace() {
    JuniperConfiguration vsC = new JuniperConfiguration();
    vsC.setFilename("file");

    PolicyStatement ps = new PolicyStatement("ps");
    PsTerm term = new PsTerm("psterm");
    term.getThens().add(new PsThenTag(234L));
    ps.getTerms().put(term.getName(), term);

    // no Froms case: expect a traceable (for the then we added) and end of policy
    List<Statement> statements = vsC.toRoutingPolicy(ps).getStatements();
    assertThat(statements, contains(instanceOf(TraceableStatement.class), instanceOf(If.class)));
    TraceableStatement traceableStatement = (TraceableStatement) statements.get(0);
    assertThat(traceableStatement.getInnerStatements(), contains(instanceOf(SetTag.class)));
    assertThat(
        traceableStatement.getTraceElement(),
        equalTo(
            toTraceableStatement(ImmutableList.of(), "psterm", "ps", "file").getTraceElement()));

    // Froms case: expect an If with traceable then, and another If that is end-of-policy
    term.getFroms().addFromTag(new PsFromTag(23L));
    List<Statement> statementsWithFroms = vsC.toRoutingPolicy(ps).getStatements();
    assertThat(statementsWithFroms, contains(instanceOf(If.class), instanceOf(If.class)));
    If ifStatement = (If) statementsWithFroms.get(0);
    assertThat(ifStatement.getTrueStatements(), contains(instanceOf(TraceableStatement.class)));
    assertThat(
        traceableStatement.getTraceElement(),
        equalTo(
            toTraceableStatement(ImmutableList.of(), "psterm", "ps", "file").getTraceElement()));
  }

  private Configuration createViConfig(List<String> ifaceNames) {
    Configuration c =
        Configuration.builder()
            .setHostname("c")
            .setConfigurationFormat(ConfigurationFormat.JUNIPER)
            .build();
    ifaceNames.forEach(
        ifaceName ->
            org.batfish.datamodel.Interface.builder().setName(ifaceName).setOwner(c).build());
    return c;
  }

  @Test
  public void testGetDefaultSourceAddress() {
    {
      // neither lo0 nor primary exists
      assertThat(
          getDefaultSourceAddress(new RoutingInstance("ri"), createViConfig(ImmutableList.of())),
          equalTo(Optional.empty()));
    }

    {
      // when both lo0 and primary are present in the routing instance
      Interface lo0 = new Interface("lo0.0");
      Interface em0 = new Interface("em0.0");
      em0.setPrimary(true);
      em0.setPrimaryAddress(ConcreteInterfaceAddress.parse("10.10.10.1/31"));

      RoutingInstance ri = new RoutingInstance("ri");
      ri.getInterfaces().put(lo0.getName(), lo0);
      ri.getInterfaces().put(em0.getName(), em0);

      Configuration c = createViConfig(ImmutableList.of(lo0.getName(), em0.getName()));

      // l0 has no address
      assertThat(getDefaultSourceAddress(ri, c), equalTo(Optional.of(Ip.parse("10.10.10.1"))));

      // l0 has legal (not 127.0.0.1) address
      lo0.setPrimaryAddress(ConcreteInterfaceAddress.parse("192.168.1.1/32"));
      assertThat(getDefaultSourceAddress(ri, c), equalTo(Optional.of(Ip.parse("192.168.1.1"))));

      // l0 is not active
      c.getAllInterfaces().get(lo0.getName()).adminDown();
      assertThat(getDefaultSourceAddress(ri, c), equalTo(Optional.of(Ip.parse("10.10.10.1"))));
    }

    {
      // only primary interface is present in the routing instance
      Interface em0 = new Interface("em0.0");
      em0.setPrimary(true);

      RoutingInstance ri = new RoutingInstance("ri");
      ri.getInterfaces().put(em0.getName(), em0);

      Configuration c = createViConfig(ImmutableList.of(em0.getName()));

      // primary interface has no address
      assertThat(getDefaultSourceAddress(ri, c), equalTo(Optional.empty()));

      // primary interface has address
      em0.getAllAddresses().add(ConcreteInterfaceAddress.parse("10.10.10.1/31"));
      assertThat(getDefaultSourceAddress(ri, c), equalTo(Optional.of(Ip.parse("10.10.10.1"))));

      // primary interface is inactive
      c.getAllInterfaces().get(em0.getName()).adminDown();
      assertThat(getDefaultSourceAddress(ri, c), equalTo(Optional.empty()));
    }
  }

  @Test
  public void testGetPrimaryInterface() {
    {
      // prefer explicit primary
      Interface explicitPrimary = new Interface("xe-0/0/0.0");
      explicitPrimary.setPrimary(true);

      Interface implicitPrimary = new Interface("em0.0");
      implicitPrimary.getAllAddresses().add(ConcreteInterfaceAddress.parse("10.10.10.1/31"));

      Configuration c =
          createViConfig(ImmutableList.of(explicitPrimary.getName(), implicitPrimary.getName()));

      RoutingInstance ri = new RoutingInstance("ri");
      ri.getInterfaces().put(explicitPrimary.getName(), explicitPrimary);
      ri.getInterfaces().put(implicitPrimary.getName(), implicitPrimary);

      assertThat(getPrimaryInterface(ri, c), equalTo(Optional.of(explicitPrimary)));

      // inactive explicit primary
      c.getAllInterfaces().get(explicitPrimary.getName()).adminDown();
      assertThat(getPrimaryInterface(ri, c), equalTo(Optional.of(implicitPrimary)));
    }
    {
      // prefer management if it has an address
      Interface mgmtInterface = new Interface("em0.0");

      Interface otherInterface = new Interface("xe-0/0/0.0");
      otherInterface.getAllAddresses().add(ConcreteInterfaceAddress.parse("10.10.10.1/31"));

      RoutingInstance ri = new RoutingInstance("ri");
      ri.getInterfaces().put(mgmtInterface.getName(), mgmtInterface);
      ri.getInterfaces().put(otherInterface.getName(), otherInterface);

      Configuration c =
          createViConfig(ImmutableList.of(mgmtInterface.getName(), otherInterface.getName()));

      // mgmt interface without address
      assertThat(getPrimaryInterface(ri, c), equalTo(Optional.of(otherInterface)));

      // mgmt interface with address
      mgmtInterface.getAllAddresses().add(ConcreteInterfaceAddress.parse("10.10.10.1/31"));
      assertThat(getPrimaryInterface(ri, c), equalTo(Optional.of(mgmtInterface)));

      // inactive mgmt interface
      c.getAllInterfaces().get(mgmtInterface.getName()).adminDown();
      assertThat(getPrimaryInterface(ri, c), equalTo(Optional.of(otherInterface)));
    }
    {
      // return other interfaces with address
      Interface noAddressInterface = new Interface("xe-0/0/0.0");

      Interface addressedInterface = new Interface("xe-1/0/0.0");
      addressedInterface.getAllAddresses().add(ConcreteInterfaceAddress.parse("10.10.10.1/31"));

      Configuration c =
          createViConfig(
              ImmutableList.of(noAddressInterface.getName(), addressedInterface.getName()));

      RoutingInstance ri = new RoutingInstance("ri");
      ri.getInterfaces().put(addressedInterface.getName(), addressedInterface);
      ri.getInterfaces().put(noAddressInterface.getName(), noAddressInterface);

      assertThat(getPrimaryInterface(ri, c), equalTo(Optional.of(addressedInterface)));

      // inactive addressed interface
      // inactive mgmt interface
      c.getAllInterfaces().get(addressedInterface.getName()).adminDown();
      assertThat(getPrimaryInterface(ri, c), equalTo(Optional.empty()));
    }
  }

  @Test
  public void testDefaultSourceAddress() {
    ConcreteInterfaceAddress ignoredAddress = ConcreteInterfaceAddress.parse("127.0.0.1/32");
    ConcreteInterfaceAddress addr1 = ConcreteInterfaceAddress.parse("1.1.1.1/32");
    ConcreteInterfaceAddress addr2 = ConcreteInterfaceAddress.parse("2.2.2.2/32");
    {
      // ignored IP is always ignored
      Interface iface = new Interface("em0.0");
      iface.setPrimaryAddress(ignoredAddress);
      iface.setPreferredAddress(ignoredAddress);
      iface.getAllAddresses().add(ignoredAddress);
      assertThat(getDefaultSourceAddress(iface), equalTo(Optional.empty()));
    }
    {
      // first pref: explicit primary
      Interface iface = new Interface("em0.0");
      iface.setPrimaryAddress(addr2);
      iface.setPreferredAddress(addr1);
      iface.getAllAddresses().add(addr1);
      assertThat(getDefaultSourceAddress(iface), equalTo(Optional.of(addr2.getIp())));
    }
    {
      // second pref: preferred address
      Interface iface = new Interface("em0.0");
      iface.setPreferredAddress(addr2);
      iface.getAllAddresses().add(addr1);
      assertThat(getDefaultSourceAddress(iface), equalTo(Optional.of(addr2.getIp())));
    }
    {
      // last pref: lowest address
      Interface iface = new Interface("em0.0");
      iface.getAllAddresses().add(addr1);
      iface.getAllAddresses().add(addr2);
      assertThat(getDefaultSourceAddress(iface), equalTo(Optional.of(addr1.getIp())));
    }
  }
}

redpajama_set_name: RedPajamaGithub


Pride Mountain Vineyards is located high on the spine of the Mayacamas mountains, the geographical boundary between Napa and Sonoma Counties. The winery is about half way between eastern Santa Rosa (the largest city in Sonoma County) and the town of St. Helena in the Napa Valley. In fact half of their winery is in Sonoma County including their tasting room, and the other half is in Napa County; their vineyards grow in both counties with approximately 60% of their land in Sonoma County and 40% in Napa County. A row of bricks in the concrete between the tasting room and the winery visually identifies the county line. Wines that contain grapes from both Sonoma and Napa County are labeled with the percentages of each; as they say at Pride, "one ranch, two counties".
Pride Mountain owns 235 acres with approximately 90 acres planted to vine. As a result, there is a good balance between the native hillside vegetation and the vineyard blocks. The winery is one of the more recognizable wineries in the Spring Mountain District. Regardless of the direction you come from, you will be driving on narrow windy roads to reach the property.
Pride Mountain was founded by Jim (died in 2004) and Carolyn Pride; today the winery is still very much family run – Carolyn's two children Suzanne and Steve are the co-owners.
The earliest vineyard plantings on site were from 1869 – the property was originally called the Summit Ranch by locals and was deeded to its original owners in 1872 from the US Government. Over the years we have seen several photographs of wooden wagons making the trip up from St. Helena to the top of Spring Mountain (one such photo shows a wagon in between two redwood trees on the lower part of Spring Mountain before the road becomes much steeper (these redwoods are still there). Electricity did not arrive to the top of Spring Mountain until the 1940's and Spring Mountain Road was not paved until the 1950's.
Prior to the Pride's purchase of the property in 1989, grapes from the vineyards were being sold to Robert Mondavi Winery (grapes have been growing continuously on site since the 1950s). However when the Pride's purchased the property, much of the existing vineyards needed to be revitalized or replanted – initially overseen by noted Napa viticulturist, "Laurie" Wood. The original winery on the property, Summit Winery was founded in 1890 – today only parts of the old stone walls are standing as the winery burned down sometime during Prohibition.
The first Pride wines were made at Rombauer Winery from 1991 through 1996; the current winery was built in 1997 and later 23,000 square feet of caves were drilled into the hillside.
Jim was the founder of the well-known Pride Institute. Ask most dentists about this institute and they will have heard of it. They introduced many now common practices in the dental industry and currently provide management and consulting services for dental offices. After Jim's death, Pride Institute was sold to its employees.
This winery has been the reason a lot of folks make the short trip up to Spring Mountain from the town of St Helena – both for the quality of wines and their exceptional hospitality. Due to their popularity, an auxiliary benefit has been additional recognition for the Spring Mountain District. There are 20+ other small premium producers on 'the mountain' – all appointment only. Many of these wineries are only within a 10 minute or less drive of each other.
Due to its fantastic location at about 2,000 feet in elevation there are excellent views and on a clear day you can see into parts of several counties including all the way to Snow Mountain (often covered in snow in the winter) – about 80 miles airline to the north.
We highly recommend their Estate Tasting – allow about 60 minutes for this educational experience including the tasting and tour through part of the cave. Alternatively, the Summit Tasting is a private seated tasting within the cave and lasts about 90 minutes. Both tastings include an overview of the Pride Mountain history and information about their vineyards and wine making.
In the past Pride used Belgian draft horses to help with vineyard work among their steeper vineyard blocks as well as pull visitors through the vineyards while seated on a wooden wagon. These original horses have since died but smaller Belgian Draft horses are still kept on site although they aren't setup to haul visitors anymore (due to their size). An employee has even taught one of the horses how to dance, Mexican style!
Pride's philosophy is that the majority of wine making occurs in the vineyards and that blending grapes from multiple vineyard blocks add complexity to wine. Individual blocks are harvested only as they ripen. Fruit from these blocks are then fermented and aged separate from each other until the final blends are put together. Unlike many area vintners, they believe in using all neutral oak during the initial stages of aging the red wines – then based on each barrel and flavor profile they will add in individual new oak barrels as necessary. The wine making team wants to highlight the true expressions of the vintage and varietals rather than have the new oak take over in the early stages of aging.
A variety of soil types are on site including noticeably red rocky soils. In addition, afternoon breezes help keep delay the onset of mildew and keep other diseases at bay.
Because of the elevation of the property, the vineyards are often above the fog line – with a long moderate growing season, plenty of sunshine with harvest often occurring in late October.
Their wines have performed well at a variety of wine competitions over the years and have also been a favorite in the White House; a wall next to the tasting room is decorated with Presidential certificates for when their wine was served at White House functions.
The tasting room is elegantly furnished with a hand painted mural above the mirror behind the tasting counter. Tastings usually include at least one white wine among all the red wines.
All wines produced are from their estate vineyards – their focus is on Bordeaux style reds but they also make several enticing white wines. The 2017 Viognier (from the Sonoma County side of their property) was entirely aged in barrel (neutral oak) with battonage lasting for about 6 weeks. This stirring of the lees is done to "build up the stuffing of the mid palate," accordingly to winemaker Sally Johnson. One soon notices the roundness and weight on the palate that she is referring to. Also immediately noticeable is the extremely aromatic bouquet with its sweet tropical and floral aromas. Summertime stone fruit – with ripe aromas of nectarine and peach. These aromas continue as flavors – rich on the palate there is a perception this wine might be sweet due to the intensity of the fruit but in reality there is no residual sugar.
Pride Mountain used to produce a Mistelle de Viognier (may still be able to find this online), this was a very unique wine. It was created with juice from Viognier grapes and fortified with white brandy.
Some wines are produced in such limited quantities that they are typically only available to mailing list members on a first come first serve basis. One is their estate Vintner's select Chardonnay – we tried the 2006 vintage. This wine is golden color with honeysuckle and lime aromas along with notes of caramel on the palate with nuances of toasted nuts and assorted spices on the finish. Often a vertical of two vintages of Chardonnay will be tasted side by side.
Pride's red wines age very well and it is interesting to note the differences both in aroma and flavor even with just a year extra of bottle aging. The 2015 Merlot (12% Cabernet Sauvignon and a dollop of Petit Verdot) shows an elegant bouquet with a hint of smokiness showing through the bright red fruit aromatics (strawberry and plum). Their Merlot vines tend to produce clusters with very small berries (a high skin to juice ratio) – and as a result their Merlots tend to retain excellent structure. This vintage is no different in that regard, showing ripe and robust tannins on the finish – lingering also with a darker spice nuance. This wine has very good acidity.
The 2015 Reserve Claret is a Merlot dominated wine (60% Merlot) with 39% Cabernet Sauvignon and 1% Petit Verdot. Fruit for this wine comes from their best block of Merlot plus fruit from the oldest Cabernet Sauvignon block on site (planted in 1982 – the only original block that the Pride's did not replant). This old vine Cab block is named the Rock Arch Block after a rock arch that used to be located on this part of the property but was destroyed in the 1906 earthquake. The 2015 shows aromas of dark cherry and blueberry with nuances of dust and cedar box. As the wine opens reveals hints of mocha on the bouquet. A good mix of both darker and red fruits show on the palate including red cherry and black currant. Very approachable in its youth but has plenty of 'oomph' and character to last quite some time if aged properly.
Note that their tours are especially popular around and during harvest time, so be sure to reserve well in advance if you are planning a visit to the valley during this time of year. Several nice spots on the property are available for picnics including up the hill beyond the winery and what is our favorite spot, the tables next to stone walls of the old Summit Winery (for tour guests usually following a tour, let the tasting room staff know before you setup your picinic).
Based on their location straddling the county line – Pride Mountain often participates in tasting events in both Sonoma and Napa County – including the Napa Wine Auction, Premiere Napa Valley and the Sonoma County Barrel Auction.
My wife and I will be coming to Napa on Thursday & Friday August 3 & 4, 2017 and would like to book a tasting on Friday morning around 11 am. Can you book this for us?


Just going through my first and hopefully only tornado in my lifetime (West Springfield, MA), I would say ground floor, center of the building.
Just wanted to get some opinions - would you say that it's better to house active records centers in basements of buildings (water does roll downhill unfortunately), or on a ground level or higher floor?  Keep in mind we're in tornado country here (Oklahoma), which is why I'm torn.


text:
Q: Sticky footer container that doesn't overlap other content I have a sidenav which has a container with social media context that is meant to stick to the bottom of the sidenav which spans the entire view-port height like so:
sidenav {
  height: 100%;
  background: #007979;
  left: 0;
  position: fixed;
  text-align:
  width: 25rem;
}

The sidenav immediate child is a container which has it's position property set to relative to I can then assign a position property and value to the social media container to stick to the bottom, like so:
sidenav-inner {
  position: relative;
  height: 100%;
}

My issue is that if I set the social media containers position property to either absolute or relative, if the view-port height is adjusted slightly, the social media container overlaps the navigation list that is at the top, as it is positioned in correspondence to the sidenav-inner container.
Question
How do I position the social media container at the bottom of the sidenav, without using the position proeprty? Or how do I use the position property without it overlapping other content in the sidenav?

Item

Item

Item

                //social media content

            //more social media content

A: You can easily solve this by defining .sidenav-inner as a flexbox and then having the header and footer not grow, but the ul grow to take up all the space. It will thus push the social media to the bottom of the box.
.sidenav {
  height: 100%;
  background: #007979;
  left: 0;
  position: fixed;
  text-align:
  width: 25rem;
}

.sidenav-inner {
  position: relative;
  height: 100%;
  display: flex;
  flex-direction: column;
}

.sidenav-header {
  flex: 0 1 auto;
}

.sidenav-inner ul {
    flex: 1 0 auto;
}

.side-nav-social {
  flex: 0 1 auto;
}

https://jsfiddle.net/d2u85u4q/

A: You can do it like this:(be aware of margins)
html

                header

Item

Item

Item

Item

Item

Item

Item

Item

Item

                //social media content

            //more social media content

css:
    .sidenav {
  height: 250px;
  background: #007979;
  left: 0;
  position: fixed;
  width: 200px;
}

.sidenav-inner {
  position: relative;
  height: 90%;
}
.sidenav-header{
  height:10%;
}
.sidenav-body{
  overflow:auto;
  height:70%;
}
.side-nav-social{
  position:absolute;
  bottom:0;
  height:10%;
}

plnker code

redpajama_set_name: RedPajamaStackExchange


text:
What's on at Rockpool restaurants in April
Posted byPublisher March 30, 2021 March 30, 2021 Posted inNews, What's On
Check out what's on at Rockpool venues for the month of April.
The Bavarian fires up menu with Jack Daniel's-inspired dishes
The Bavarian has added a Jack Daniel's kick to its autumn menu, with the refined, mellow, maple syrup notes of this Tennessee whiskey underscoring a range of dishes, platters and drinks.
Available throughout April and until the end of May, a new range of burgers, schnitzels, wings and shared platters are doused in sensationally sticky Jack Daniel's sauces. The new menu additions include the Jack Daniel's Chookhaus burger, the Jack Daniel's Southern Fried Schnitzel, and Jack Wings, which are doused in a combination of Jack Daniel's BBQ and hot sauces. A Jack Daniel's Platter (pictured above) includes 12 Jack wings, crackling pork belly, southern fried chicken schnitzel, potato gems and coleslaw, served with lashings of Jack Daniel's sauce on the side. Meanwhile, fans of sticky ribs can launch themselves into slow-cooked, coffee and spice-rubbed Jack ribs, by the full or half-rack, which are basted in Jack Daniel's BBQ or hot sauce and served with fries.
A hat-trick of drinks includes jugs or steins of Jack Daniel's and Coke or Dry, 30ml shot of Jack Daniel's Fire cinnamon whiskey, and a Jack Daniel's Death Charge cocktail, which combines Jack Fire with alcoholic ginger beer or cider. Customers who purchase any Jack Daniel's menu item via the self-serve me&u until the end of May will enter the draw to win a Weber BBQ, or a Jack Daniel's bar fridge. Locations and bookings HERE.
Bottomless tacos and Margarita towers at El Camino Cantina
Tex-Mex and Margarita fans can get their fill of their favourite food and drink thrills at El Camino Cantina, with a value-packed, bottomless Tacos & Towers deal available for $50 per person. Indulge in an endless supply of tacos, and a bottomless Margarita tower over the course of one hour. Tacos & Towers are available at all locations daily from 12pm to 4pm. Locations and bookings HERE.
Fratelli Fresh Easter Sunday Roast
Fratelli Fresh is warming the ovens ready for its slow-roasted Easter spectacular: 12-hour slow-cooked lamb shoulder. Available at all Fratelli Fresh locations in Sydney (Darling Harbour, Entertainment Quarter, Manly, Miranda and Westfield Sydney) on Easter Sunday for lunch and dinner, it is served with rosemary roast potatoes, honey roast vegetables with brown butter and toasted almonds, mint salsa verde and gravy. There is house-made hazelnut tiramisu for dessert, too.
This tremendous Easter feast costs $39 per person (minimum 2 people, pre-bookings only). It is also available to pre-order for pick-up or takeaway at $79.
The cut-off date to order the roast for pre-order in-venue dining or take-away/pick-up is Thursday, 1st April 10am. Pick-up is available all day on Friday, 2nd and Saturday, 3rd April, and between 11am and 12pm on Easter Sunday. In-venue bookings and orders can be made through RESERVATIONS. For takeaway/pick-up orders please call: (02) 9259 5600.
Nerd Alert: Trivia at The Argyle
Unleash your inner nerd every Thursday from 7pm, with The Argyle's interactive and OTT trivia experience. Entry is free and there are prizes for the nerdiest participants. Plus happy hour from 4pm–7pm, with $5 beer, wine, spirits and cocktails: Aperol spritz, lychee margarita, strawberry frozé and pink G&T; $7.50 espresso martinis; and $10 Long Island ice teas. Happy hour coincides with pizza hour (4pm–7pm) when wood-fired pizzas are $10.
Fratelli Fresh Seafood Series
Everyone's favourite Fratelli Fresh is launching a Seafood Series in April across its Sydney fleet of restaurants: Darling Harbour, Entertainment Quarter, Manly, Miranda and Westfield Sydney.
The following revolving specials will feature throughout the month:
• Lobster spaghetti with cherry tomato, chilli, garlic and basil ($33)
• Blue swimmer crab risotto with crab bisque, ginger and shallot ($32)
• Strozzapreti with Kinkawooka mussels, fennel, chilli and tarragon oil ($28)
Merivale acquires The Quarterdeck at Narooma
A Taste of the Autumn Races at Sokyo


text:
package org.yafra.rcp.admin;

import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.graphics.Image;

// String[] titles = { "Name", "Description", "Rights" }; - see YafrTechRoleView

/**
 * @author mwn
 *
 */
public class YafraTechRoleLabelProvider extends LabelProvider implements ITableLabelProvider
{
	/*
	 * (non-Javadoc)
	 *
	 * @see
	 * org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.
	 * Object, int)
	 */
	@Override
	public String getColumnText(Object element, int columnIndex)
		{
		MGYafraTechRole user = (MGYafraTechRole) element;
		switch (columnIndex)
			{
			case 0:
				return user.getName();
			case 1:
				return user.getDescription();
			case 2:
				return user.getRights();
			default:
				throw new RuntimeException(" - ERROR out of range on table label provider");
			}

		}

	@Override
	public Image getColumnImage(Object element, int columnIndex)
		{
		// TODO Auto-generated method stub
		return null;
		}

}


text:
Home Arts & Culture College of Visual and Performing Arts Laura Bell Bundy to Host Annual 'Christmas at Belmont' Holiday Concert on...
Laura Bell Bundy to Host Annual 'Christmas at Belmont' Holiday Concert on NPT, PBS
Schermerhorn performance to be nationally broadcast starting Dec. 22
Laura Bell Bundy will host the 2011 "Christmas at Belmont" concert.
Hosted by country artist and Tony-nominated Broadway star Laura Bell Bundy, and taped at the Schermerhorn Symphony Center in Nashville, Tennessee, nearly 700 Belmont University student musicians will join the Belmont School of Music faculty and the Nashville Children¹s Choir for "Christmas at Belmont." The annual production of traditional carols, classical masterworks, world music and light-hearted seasonal favorites will air on PBS stations nationwide beginning Thursday, December 22. Please check local listings to confirm air dates and times. Nashville Public Television [NPT-Channel 8] will air "Christmas at Belmont" on Thursday, December 22 at 8 p.m. (CST) and re-broadcast the concert on Christmas Day at 7 p.m. (CST).
This year's edition of "Christmas at Belmont" features the University Symphony Orchestra, Belmont Chorale, Percussion Ensemble, Musical Theatre, Jazz Ensemble and Bluegrass Ensemble, as well as a mass choir of 600 voices. The performance includes both classic sacred holiday music such as "The First Noel" and "God Rest Ye, Merry Gentlemen" as well as festive seasonal songs such as "Carol of the Bells" and "We Need a Little Christmas," to name a few.
"'Christmas at Belmont' is an amazing opportunity to showcase Belmont University's world-class School of Music in front of a national audience," said Belmont University President Bob Fisher. "We're incredibly grateful that this partnership with NPT puts our talented students and faculty in living rooms across the country. It's also an honor to welcome Laura Bell Bundy as host of 'Christmas at Belmont.' Her diverse vocal skills as both a Broadway performer and country singer will offer a perfect complement to the variety of our student ensemble performances."
The native Kentucky performer has done it all, from performing on the nationally televised Academy of Country Music Awards and hosting the Country Music Association's "45th Annual CMA Awards" pre-telecast to the lights of Broadway – where she received a Tony nomination for her role as Elle Woods in Legally Blonde – and acting in various film and TV roles including a lead role in Country Music Television's "To the Mat" and a recurring role on CBS' "How I Met Your Mother," to writing and recording music. Bundy released her debut country music album, Achin' and Shakin', in 2010 under the Mercury Records label, which featured the hit single "Giddy On Up." She has just finished writing and recording her sophomore album produced by Nathan Chapman which is now scheduled for an early 2012 release.
Dr. Cynthia Curtis, dean of Belmont's College of Visual and Performing Arts, noted, "We are delighted that through the efforts of NPT and our generous sponsors, we can share the talents of Belmont students and faculty with a national audience. Having Laura Bell Bundy as host of 'Christmas at Belmont' is a tremendous coup for the event! She brings not only her varied talents as a performer both on Broadway and in country music, but also serves as an outstanding musical role model for our students."
The performance and taping of "Christmas at Belmont" returns for the third time to the Schermerhorn Symphony Center, fully restored after the historic Nashville floods of May 2010 threatened its very survival. The Schermerhorn, which opened in 2006, is one of the few venues in the world featuring natural lighting and state-of-the-art acoustics, including motorized acoustic drapes and an acoustical isolation joint that encircles the entire concert hall and prevents sound waves traveling into or out of the hall.
"To be back at the Schermerhorn, when only a year ago we worried about it vitality after the floods, will truly be joyous," said Beth Curley, president and CEO of NPT, which has won 33 Midsouth Emmy® awards since 2001. "Belmont's talented students and faculty always make for a magnificent broadcast and a highlight of PBS' holiday programming. It's an honor to bring Belmont, the Schermerhorn, and ultimately Nashville, to public television viewers throughout the nation."
The Alvin and Sally Beaman Foundation and the Jack C. Massey Foundation serve as underwriters for "Christmas at Belmont."
**There are no seats available for the live television taping of this event on Mon., Dec. 5. Media interested in covering the event should contact Greg Pillon, Belmont's director of communications, at 615-460-6645 for information on filming at the dress rehearsal that afternoon.**
About Nashville Public Television
Nashville Public Television is available free and over the air to nearly 2.2 million people throughout the Middle Tennessee and southern Kentucky viewing area, and is watched by more than 600,000 households every week. The mission of NPT is to provide, through the power of traditional television and interactive telecommunications, high quality educational, cultural and civic experiences that address issues and concerns of the people of the Nashville region, and which thereby help improve the lives of those we serve.
Must Read - Arts & Culture
Treybig Invited to Present at Mid-Atlantic Flute Society Convention
Hope Buckner - February 13, 2019
School of Music Lecturer Dr. Carolyn Treybig presented, by invitation, her clinic session entitled Telemann Fantasies - Period v.s. Modern Flute Interpretation at the 2019 Mid-Atlantic...
Related Articles - Arts & Culture
Shirer to Play Series of Carillon Concerts
Ames Conducts Coro Novo Spiritu in Italy
Alumna Rynn Shines on "Songland"
Burns Participates in NAICU Presentation to Sen. Lamar Alexander
Bullington Receives Grant from National Endowment of the Humanities
August Commencement Ceremony Set to Graduate 259 Students Friday
Commencement Week Honors 955 Graduates


We know not only how to execute the tools and tasks to derive a credible plan, but we have experience of how to bring these together in a way that the wider organisation then buys into the outcome.
We have the confidence in our approach but are willing to listen and adapt where necessary to meet your specific needs.
For change to 'stick', any new ways of working must have people at it's heart. Training alone will rarely be enough. Education, coaching and mentoring must be part of the cultural default.
We have the confidence in our approach but are willing to listen and adapt where necessary to meet you specific needs.
Fast, agile, flexible and responsive with minimal bureaucracy.
We make extensive use of our pre-existing IP including standards, methods, frameworks and approaches, to expedite delivery and provide best practice.
Whilst we have skills across all major integration platforms we do not act as a reseller for any integration platform or service vendors. Consequently we are able to provide independent advice on technology selection and acquisition.
We act in the best interests of our clients and pride ourselves on our ability to work with clients, taking them with us and often providing a transfer of knowledge and capability allowing our clients to become self-sufficient.
Our consultants will help define the agenda and roadmap and advise on best practice.
We pride ourselves on the calibre of our consultants and many have received plaudits from our customers.
We bring all of these elements, and more, to every engagement.
Our style is to work in collaboration with you and build trust through credibility. And our engaging, practical approach means we transfer new skills to develop and embed your internal capability fast.


I'm really looking forward to this concert, and I'm glad that the Baltimore Symphony has decided to perform this music. I've been a serious gamer for years, and in my experience, a soundtrack can make the difference between a good video game and a great one.
Video game music, like everything else about video games, has evolved greatly since Tetris, Galaga, and Super Mario Bros. Crude synthesizers have given way to more advanced ones and in many cases to full orchestras.
Nobuo Uematsu, who composed the music for the Final Fantasy series through Final Fantasy X, has witnessed this evolution as well as anyone. His music has helped make this fantasy/science-fiction series one of the most popular video game series in history, and I am happy to see the Baltimore Symphony recognize his achievements.
I will also be glad to see some people my age at the symphony. The concert is this Saturday, June 27 at the Joseph Meyerhoff Symphony Hall in Baltimore.
The main season is almost over. We are playing this weekend to full houses, with a concert of Rachmaninoff's Third Piano Concerto, performed beautifully by Yefim Bronfman, and excerpts from Wagner's great Ring Cycle of operas. It will be nice to have a little break next week!
We have had a great season that included some unusual repertoire this past year. Bernstein's Mass, which we performed in Baltimore, New York, and Washington last October, was a once-a-career opportunity for us. Though we all admire Leonard Bernstein, I think that it was still a pleasant surprise to experience the eclectic chaos of the work. Marin put together a great cast, and it was truly thrilling to perform the work with children's choirs from here and from New York. Click here to watch Marin discuss the project.
Mahler's Ninth Symphony, which we performed this spring, was another highlight. This is a difficult piece, even by Mahler's standards, but we were all very pleased with the results. There were a lot of other great performances, too, but the Bernstein and the Mahler stand out to me.
So in couple of weeks we will have our first summer season concert, "Distant Worlds: The Music of Final Fantasy." To be honest, I don't know exactly what to expect from this show, but I will ask my 23 year old and 21 year old sons about Final Fantasy. I know that Eric, my older son, enjoyed "Play, a Video Game Symphony," last summer, in which we performed music from various video games while scenes from the games appeared on a screen over the orchestra. I'm sure that Distant Worlds will be a big hit with the gaming crowd, too.
Hi, I'm Greg Mulligan. I play in the First Violin section of the BSO. I have been here in Baltimore since 1980, except between 1989-1994, when I left to become the concertmaster of the San Antonio Symphony. Now I'm glad to be living and performing in Baltimore again. Click here to read more about me.
It's funny to me that I am writing a blog for the BSO, because, while I am a good typist and I love to communicate, I am technologically challenged. Whenever something goes wrong when I am on the computer, I hope that my wife Jeanne, or one of my sons, Eric or Stephen, is around the house because there is little chance that I can find the problem! But with their help, and with the help of Jamie Jean Schneider, E-Commerce Coordinator of the BSO, I think I can do this.
Last weekend we performed a Pops show featuring music from the 1970s, "Disco Days and Boogie Nights," with our great Pops conductor, Jack Everly, and nine excellent singing and dancing solo performers. While the disco craze has the reputation of having produced some very silly music, I have to say that I really enjoyed the show. I was a teenager in the 1970s, and I remember very fondly going out with friends to dance to all that music. It all has a great beat and it inspires moving your body. And there is a lot of variety. This show wasn't only disco; it also featured many other types of popular music from that era.
It was fun to wear 70s clothes. I used to have an old disco (loud pattern!) shirt, but I'm sure it got donated to Goodwill at some point. So I went into Hampden and found a copper-silver polyester shirt. There were some great costumes in the orchestra, including the French horn section dressed as the rock group Kiss. Join the BSO facebook fan page to view pictures of us dressed to the max for the evening.
I'm looking forward to this week. Hilary Hahn is a local girl who has amazed the classical music world with her incredible, beautiful violin playing. She is playing the Higdon Violin Concerto, which I don't know, but I am looking forward to learning it. Also, it will be nice to have Marin back again. Besides Higdon we are playing pieces by Beethoven and Dvorák, two of my favorite composers. If you want to see just how classically cool Hilary Hahn really is, visit her YouTube Channel.


text:
using System;
using System.Net;
using System.Text;
using Titanium.Web.Proxy.Extensions;
using Titanium.Web.Proxy.Http;

namespace Titanium.Web.Proxy.Models
{
    /// <summary>
    ///     Http Header object used by proxy
    /// </summary>
    public class HttpHeader
    {
        /// <summary>
        /// HPACK: Header Compression for HTTP/2
        /// Section 4.1. Calculating Table Size
        /// The additional 32 octets account for an estimated overhead associated with an entry.
        /// </summary>
        public const int HttpHeaderOverhead = 32;

#if NETSTANDARD2_1
        internal static Version VersionUnknown => HttpVersion.Unknown;
#else
        internal static Version VersionUnknown { get; } = new Version(0, 0);
#endif

        internal static Version Version10 => HttpVersion.Version10;

        internal static Version Version11 => HttpVersion.Version11;

#if NETSTANDARD2_1
        internal static Version Version20 => HttpVersion.Version20;
#else
        internal static Version Version20 { get; } = new Version(2, 0);
#endif

        internal static readonly Encoding DefaultEncoding = Encoding.GetEncoding("ISO-8859-1");

        public static Encoding Encoding => DefaultEncoding;

        internal static readonly HttpHeader ProxyConnectionKeepAlive = new HttpHeader("Proxy-Connection", "keep-alive");

        private string? nameString;

        private string? valueString;

        /// <summary>
        ///     Initialize a new instance.
        /// </summary>
        /// <param name="name">Header name.</param>
        /// <param name="value">Header value.</param>
        public HttpHeader(string name, string value)
        {
            if (string.IsNullOrEmpty(name))
            {
                throw new Exception("Name cannot be null or empty");
            }

            nameString = name.Trim();
            NameData = nameString.GetByteString();

            valueString = value.Trim();
            ValueData = valueString.GetByteString();
        }

        internal HttpHeader(KnownHeader name, string value)
        {
            nameString = name.String;
            NameData = name.String8;

            valueString = value.Trim();
            ValueData = valueString.GetByteString();
        }

        internal HttpHeader(KnownHeader name, KnownHeader value)
        {
            nameString = name.String;
            NameData = name.String8;

            valueString = value.String;
            ValueData = value.String8;
        }

        internal HttpHeader(ByteString name, ByteString value)
        {
            if (name.Length == 0)
            {
                throw new Exception("Name cannot be empty");
            }

            NameData = name;
            ValueData = value;
        }

        private protected HttpHeader(ByteString name, ByteString value, bool headerEntry)
        {
            // special header entry created in inherited class with empty name
            NameData = name;
            ValueData = value;
        }

        /// <summary>
        ///     Header Name.
        /// </summary>
        public string Name => nameString ??= NameData.GetString();

        internal ByteString NameData { get; }

        /// <summary>
        ///     Header Value.
        /// </summary>
        public string Value => valueString ??= ValueData.GetString();

        internal ByteString ValueData { get; private set; }

        public int Size => Name.Length + Value.Length + HttpHeaderOverhead;

        internal static int SizeOf(ByteString name, ByteString value)
        {
            return name.Length + value.Length + HttpHeaderOverhead;
        }

        internal void SetValue(string value)
        {
            valueString = value;
            ValueData = value.GetByteString();
        }

        internal void SetValue(KnownHeader value)
        {
            valueString = value.String;
            ValueData = value.String8;
        }

        /// <summary>
        ///     Returns header as a valid header string.
        /// </summary>
        /// <returns></returns>
        public override string ToString()
        {
            return $"{Name}: {Value}";
        }

        internal static HttpHeader GetProxyAuthorizationHeader(string? userName, string? password)
        {
            var result = new HttpHeader(KnownHeaders.ProxyAuthorization,
                "Basic " + Convert.ToBase64String(Encoding.UTF8.GetBytes($"{userName}:{password}")));
            return result;
        }
    }
}


text:
San Jerónimo el Real
Founded in 1464 and rebuilt for Queen Isabella in 1503, this church near the Retiro was particularly favoured by the Spanish monarchs, and used for state ceremonies, including the religious ceremony for the crowning of King Juan Carlos. Most of the original building was destroyed during the Napoleonic Wars, and the present church is largely a reconstruction that was undertaken between 1848 and 1883. The cloister was incorporated into the nearby Prado Museum as part of its expansion project.
Moreto 4
www.sanjeronimoelreal.es
Banco de España (M: L2)
Sep-Jun: Mon-Sat 10am-1pm, 5pm-8.30pm; Sun 9.30am-2.30pm, 5pm-8.30pm. Jul-Aug Mon-Sat 10am-1pm, 6pm-8.30pm; Sun 9.30am-1.30pm, 6pm-8.30pm
facebookinstagramspotify
Time Out Barcelona