extend _components/base.pug

block pagetitle
    | Events 

block css 
    link(rel="stylesheet", href="../css/events.css?ver=" + config.version)

block main
    - global.pageHref = "events.html"
    include ./_components/header.pug



    section.eventhero
        .container
            .eventhero__main
                h2.h2.
                    Join The Apache Ignite <br>
                    Community At&nbsp;Conferences, <br>
                    Summits And Other Events
                .h5.pt-3.
                    The community meets online and offline regularly. <br>
                    Join our meetup groups and events to learn from <br>Ignite experts or to share your Ignite experience.
            img.eventhero__img(src="/img/events/b1-mainpic.svg", alt="Join the Apache Ignite Community at Conferences, Summits and Other Events")
    // /.eventhero


    section.cmtynavblock 
        .container
            ul.cmtynavblock__list.flexi 
                li
                    a.cmtynavblock__active(href="#summit")  Ignite Summit
                li
                    a(href="#meetups") Meetups Worldwide
                li
                    a(href="#upcoming") Upcoming Events
                li
                    a(href="#past") Past Events
    // /.cmtynavblock



    section.event-featured.container 
        p.capstext Featured Event
        a(href="https://ignite-summit.org/schedule/", target="_blank").event-featured__banner.pt-5
            picture
                source(srcset="/img/events/event-banner-vert.jpg" media="(max-width: 767px)")
                img(src="/img/events/event-banner.jpg", alt="")
            //- .event-featured__placeholder(style="background:#E8F2FA; height:340px;")
    // /.event-featured



    section.evsummit.container#summit
        .evsummit__date.flexi 
            .evsummit__day 16
            .evsummit__month.h5 NOVEMBER <br>2021
        .evsummit__info.flexi.pt-5
            .evsummit__logo 
                img(src="/img/events/b2-summit.svg", alt="")
            .evsummit__descr
                h3.h3 Apache Ignite Summit
                p.h5.pt-2.
                    This virtual conference will feature speakers from industry-leading companies <br>
                    and hundreds of participants from all over the world. 
        .evsummit__blocks.pt-5.flexi 
            a(href="https://hopin.com/events/ignite-summit-cloud-edition", target="_blank").evsummblock.evsummblock--speaker
                p.h4.evsummblock__title Become a speaker
                p.fz20.pt-1x.evsummblock__descr Submit a talk by October 15
                p.evsummblock__listtitle.pt-4
                    strong We are looking for:
                ul.evsummblock__list.dashlist.pt-1
                    li Ignite cloud-related deployment stories
                    li technical deep dives
                    li integration experiences
            .evsummblock.evsummblock--join
                p.h4.evsummblock__title Join Summit online
                p.fz20.pt-1x.evsummblock__descr.
                    Become a&nbsp;part of&nbsp;a&nbsp;true community event 
                    and learn more about up-to-date<br>
                    in-memory computing solutions.
    // /.evsummit
        

    section.event-planet#meetups
        .container
            .event-planet__wrap.flexi 
                .event-planet__main 
                    h3.h3.pb-1 Apache Ignite Meetups Worldwide
                    p.h5.pt-5 Meet the community&nbsp;&mdash; developers, experts, and practitioners&nbsp;&mdash; face-to-face, virtually, or&nbsp;onsite in&nbsp;your city.
                .event-planet__pic 
                    img(src="/img/events/b4-world.svg", alt="")
    // /.event-planet
        


    section.event-virtual.container#virtual
        .eventvirt.flexi 
            .eventvirt__left 
                h3.h4 Virtual Apache Ignite Meetup
                p.pt-2 Join Ignite users, developers, committers, contributors, and architects from all over the world and&nbsp;get access to&nbsp;the online-talks and presentations by&nbsp;Apache Ignite experts and practitioners.
            .eventvirt__right 
                a.button(href="https://www.meetup.com/ru-RU/Apache-Ignite-Virtual-Meetup/", target="_blank") Join Virtual Meetup

        .event-virtbot
            .event-virtbot__col
                h4.h4 Recordings Of Past Meetups
                p.pt-2 Find a collection of past Virtual Apache Ignite Meetup <br>presentations, talks, and webinars.
            .event-virtbot__col
                h4.h4 Upcoming Virtual Meetup
                p.pt-2.event-virtbot__gray November 16, 2021
            .event-virtbot__col
                .event-recording.pb-2
                    a(href="https://www.youtube.com/watch?v=f2ArcJPH4iU&list=PLMc7NR20hA-LQ0GR1QW5SDQflMOuPUqDQ&index=1", target="_blank").event-recorditem.videoscr.glightbox
                        img.event-recpic(src="https://img.youtube.com/vi/f2ArcJPH4iU/maxresdefault.jpg", alt="")
                    a(href="https://www.youtube.com/watch?v=lCiZ3x8IRvI&list=PLMc7NR20hA-LQ0GR1QW5SDQflMOuPUqDQ&index=2" target="_blank").event-recorditem.videoscr.glightbox
                        img.event-recpic(src="https://img.youtube.com/vi/lCiZ3x8IRvI/maxresdefault.jpg", alt="")
                    a(href="https://www.youtube.com/watch?v=7UjENQBFvIQ&list=PLMc7NR20hA-LQ0GR1QW5SDQflMOuPUqDQ&index=3" target="_blank").event-recorditem.videoscr.glightbox
                        img.event-recpic(src="https://img.youtube.com/vi/7UjENQBFvIQ/maxresdefault.jpg", alt="")
                a.event-recbutton.button.button--shadow(href="https://www.youtube.com/playlist?list=PLMc7NR20hA-LQ0GR1QW5SDQflMOuPUqDQ", target="_blank")
                    <i><svg width="9" height="10" viewBox="0 0 9 10" fill="none" xmlns="http://www.w3.org/2000/svg">
                        <path d="M8.71423 4.99993L0.142805 9.94865L0.142805 0.0512134L8.71423 4.99993Z"/>
                    </svg></i>
                    span Watch Virtual Meetup videos 
            .event-dynamicsect
                h3.h5.pb-1x Ignite Summit: Cloud Edition
                p Ignite Summit: Cloud Edition is the premier event for developers who use Apache Ignite® and in-memory computing to tackle speed and scale challenges in cloud environments.
                a.button.button--shadow.event-recmorebutton(href="https://www.meetup.com/ru-RU/Apache-Ignite-Virtual-Meetup/events/280383112/", target="_blank") Learn more
    // /.event-virtual



    section.eventyoucity.container 
        h2.h4 Apache Ignite Meetups In Your City
        .eventyoucity__wrap.pt-5
            article.eventyoucity__item
                .eventyoucity__icon 
                    img(src="/img/events/flag-uk.svg", alt="")
                .eventyoucity__town.h5
                    strong London
                    span Apache Ignite Meetup
                .eventyoucity__action 
                    a.button.button--shadow(href="https://www.meetup.com/ru-RU/Apache-Ignite-London/" target="_blank")
                        img(src="/img/events/icon-plus.svg", alt="")
                        span Join 
            article.eventyoucity__item
                .eventyoucity__icon 
                    img(src="/img/events/flag-ru.svg", alt="")
                .eventyoucity__town.h5
                    strong St.Petersburg
                    span Apache Ignite Meetup
                .eventyoucity__action 
                    a.button.button--shadow(href="https://www.meetup.com/ru-RU/St-Petersburg-Apache-Ignite-Meetup/" target="_blank")
                        img(src="/img/events/icon-plus.svg", alt="")
                        span Join 
            article.eventyoucity__item
                .eventyoucity__icon 
                    img(src="/img/events/flag-ru.svg", alt="")
                .eventyoucity__town.h5
                    strong Moscow
                    span Apache Ignite Meetup
                .eventyoucity__action 
                    a.button.button--shadow(href="https://www.meetup.com/ru-RU/Moscow-Apache-Ignite-Meetup/" target="_blank")
                        img(src="/img/events/icon-plus.svg", alt="")
                        span Join
            article.eventyoucity__last
                p.fz20.pb-3 Start an onsite Apache Ignite Meetup in your city.
                small Take the first step.
                small Send us a note to <br><a href="mailto:dev@ignite.apache.org">dev@ignite.apache.org</a> <br>and we'll see what can be done.
    // /.eventyoucity



    section.eventupcoming.container#upcoming 
        .capstext.pb-1 Upcoming Events Schedule
        .eventupcoming__wrap.pt-4
            h2.h4.eventupcoming__head.pb-5 Online events (2)
            article.eventcomingitem.flexi 
                .eventcomingitem__left
                    p.eventcomingitem__num 9
                    p.eventcomingitem__month November 
                    p.eventcomingitem__year.pt-3 2021
                .eventcomingitem__main
                    p.eventcomingitem__title.h5 Apache Ignite 2.11: Improvements and .NET Upgrades, Apache Ignite 3 Alpha 3: The Journey Continues
                    p.eventcomingitem__descr.pt-1 A quick overview of Apache Ignite 2.11. This release resolved a number of issues, problems with the internal architecture and technical bugs. Plus we will discuss Apache Ignite 2.11 updates related to .NET. Just now, the Apache Ignite community released the latest version of Ignite 3—Alpha 3! Val Kulichenko, the Ignite 3.0 Release manager, will demonstrate the updates and the latest API changes.
                    a.eventcomingitem__more(href="https://www.meetup.com/Apache-Ignite-Virtual-Meetup/events/281596817", target="_blank") Learn more details
                .eventcomingitem__right
                    .eventcomingitem__mic
                        .eventcomingitem__speaker.
                            Maxim Muzafarov<br>
                            Pavel Tupitsyn<br>
                            Val Kulichenko
                    .eventcomingitem__loc
                        .eventcomingitem__locblock
                            img(src="/img/events/content/meetup.svg", alt="")
                        .eventcomingitem__camera Online event
            // /.eventcomingitem

            article.eventcomingitem.flexi 
                .eventcomingitem__left
                    p.eventcomingitem__num 15-16
                    p.eventcomingitem__month November
                    p.eventcomingitem__year.pt-3 2021
                .eventcomingitem__main
                    p.eventcomingitem__title.h5 Ignite Summit: Cloud Edition
                    p.eventcomingitem__descr.pt-1 On November 15 and 16, 2021a free virtual event—Ignite Summit: Cloud Edition will be held. The conference is for architects and developers who use or are interested in using Apache Ignite in the cloud. On November 15, 2021, free training sessions for EMEA and the Americas will be offered. On November 16, 2021, Ignite experts will share architectural insights and practical tips for solving challenges in cloud environments.
                    a.eventcomingitem__more(href="https://ignite-summit.org/", target="_blank") Learn more details
                .eventcomingitem__right
                    .eventcomingitem__mic
                        .eventcomingitem__speaker Cloud Edition
                    .eventcomingitem__loc
                        .eventcomingitem__locblock
                            img(src="/img/events/content/summit.svg", alt="")
                        .eventcomingitem__camera Online event
            // /.eventcomingitem

        .eventupcoming__wrap.pt-4
            h2.h4.py-4 Offline events (2)
            article.eventcomingitem.flexi 
                .eventcomingitem__left
                    p.eventcomingitem__num 13
                    p.eventcomingitem__month November
                    p.eventcomingitem__year.pt-3 2021
                .eventcomingitem__main
                    p.eventcomingitem__title.h5 Backward compatibility on the example of Apache Ignite. Why does it hurt so much?
                    p.eventcomingitem__descr.pt-1 I am developing an Apache Ignite distributed database. Our product provides backward compatibility between versions. What do you need to think about for backward compatibility? What is Backward Compatibility for Developers? How do I test it? Why does it hurt so much? How to relieve pain? I will tell you about all this with the code examples.
                    a.eventcomingitem__more(href="https://mergeconf.ru/development/opensource/izhikov", target="_blank") Learn more details
                .eventcomingitem__right
                    .eventcomingitem__mic
                        .eventcomingitem__speaker  Nikolay Izhikov
                    .eventcomingitem__loc
                        .eventcomingitem__locblock
                            img(src="/img/events/content/merge.svg", alt="")
                        .eventcomingitem__address Innopolis, Russia
            // /.eventcomingitem

            article.eventcomingitem.flexi 
                .eventcomingitem__left
                    p.eventcomingitem__num 18
                    p.eventcomingitem__month November
                    p.eventcomingitem__year.pt-3 2021
                .eventcomingitem__main
                    p.eventcomingitem__title.h5 Ignite Summit: Cloud Edition
                    p.eventcomingitem__descr.pt-1 The report will present the concept of historical rebalancing, implemented in the Apache Ignite distributed database.
                    a.eventcomingitem__more(href="https://www.highload.ru/moscow/2021/abstracts/7989", target="_blank") Learn more details
                .eventcomingitem__right
                    .eventcomingitem__mic
                        .eventcomingitem__speaker Vlad Pyatkov
                    .eventcomingitem__loc
                        .eventcomingitem__locblock
                            img(src="/img/events/content/hl++.svg", alt="")
                        .eventcomingitem__address Moscow, Russia
            // /.eventcomingitem
    // /.eventupcoming




    section.eventspast#past.container.jsTabWrap
        h3.capstext.pb-5 Past Events
        .eventspast__tablinks.flexi 
            button.eventpast__link(data-tablink="e2021").active 2021
            button.eventpast__link(data-tablink="e2020") 2020
            button.eventpast__link(data-tablink="e2019") 2019
            button.eventpast__link(data-tablink="e2018") 2018
            button.eventpast__link(data-tablink="e2017") 2017
            button.eventpast__link(data-tablink="e2016") 2016
            button.eventpast__link(data-tablink="e2015") 2015
            button.eventpast__link(data-tablink="e2014") 2014
        .eventspast__tabs
            .eventspast__tabwrap(data-tab="e2021").active
                include ./_components/events/2021.pug
            // /.eventspast__tabwrap 2021
            
            .eventspast__tabwrap(data-tab="e2020")
                include ./_components/events/2020.pug
            // /.eventspast__tabwrap 2020

            .eventspast__tabwrap(data-tab="e2019")
                include ./_components/events/2019.pug
            // /.eventspast__tabwrap 2019

            .eventspast__tabwrap(data-tab="e2018")
                include ./_components/events/2018.pug
            // /.eventspast__tabwrap 2018

            .eventspast__tabwrap(data-tab="e2017")
                include ./_components/events/2017.pug
            // /.eventspast__tabwrap 2017

            .eventspast__tabwrap(data-tab="e2016")
                include ./_components/events/2016.pug
            // /.eventspast__tabwrap 2016

            .eventspast__tabwrap(data-tab="e2015")
                include ./_components/events/2015.pug
            // /.eventspast__tabwrap 2015

            .eventspast__tabwrap(data-tab="e2014")
                include ./_components/events/2014.pug
            // /.eventspast__tabwrap 2014
    // /.eventspast
        



    