extend _components/base.pug

block pagetitle
    | Downloads  

block css 
    link(rel="stylesheet", href="../css/native-persistence.css?ver=" + config.version)
    link(rel="stylesheet", href="../css/download.css?ver=" + config.version)
    link(rel="stylesheet", href="../js/vendor/highlight/default.min.css?ver=" + config.version)
    link(rel="stylesheet", href="../js/vendor/highlight/night-owl.css?ver=" + config.version)
    script(src="../js/vendor/highlight/highlight.min.js")
    script(src="../js/vendor/highlight/xml.min.js")
    //- script(src="../js/vendor/highlight/bash.min.js")

block main
    - global.pageHref = "download"
    - config.hdrClassName = "hdr__blue"
    include ./_components/header.pug

    mixin downloadRow(params)
        tr 
            td !{params.ver}
            td
                if(params.guide)
                    a(href=params.guide, target="_blank") guide
                if(params.javadoc)
                    a(href=params.javadoc, target="_blank") javadoc
                if(params.scaladoc)
                    a(href=params.scaladoc, target="_blank") scaladoc
            td
                if(params.notes)
                    a(href=params.notes, target="_blank") release notes
            td !{params.date}
            td.jsLinksInside
                
                if(params.sourcelink)
                    - let fileNameArr = params.sourcelink.split("/");
                    - let fileName = fileNameArr[fileNameArr.length - 1];
                    a.sourcelink(href=params.sourcelink, target="_blank") !{fileName}
                    |  (
                    a(href=params.sourcelink + ".asc", target="_blank") pgp
                    a(href=params.sourcelink + ".sha512", target="_blank") sha512
                    | )

    mixin downloadDockerRow(params)
        tr 
            td !{params.name}
            td
                if(params.guide)
                    a(href=params.guide, target="_blank") guide
            td !{params.date}
            td
                
                if(params.links)
                    each link in params.links
                        a.sourcelink(href=link, target="_blank") !{link}<br>





    section.innerhero.innerhero--download
        .container.innerhero__cont
            .innerhero__main
                .innerhero__pre.pb-3 Apache Ignite
                h1.h1.innerhero__h1.innerhero__mega Downloads
            img.innerhero__pic.innerhero__pic--download(src="/public/img/downloads/hero.svg", alt="Downloads")
    // /.innerhero



    section.downloadtitle.container.pb-5
        h2 Download Apache Ignite® and install in your environment. <br>Select from one of the available options.

    section.cmtynavblock.jsNavBlock.cmtynavblock--downwrap
        .container
            ul.cmtynavblock__list.flexi.cmtynavblock--down
                li
                    a.cmtynavblock__active(href="#source") Source Releases
                li
                    a(href="#binary") Binary Releases
                li
                    a(href="#docker") Docker and <br>Cloud Images
                li
                    a(href="#git") Git Repository
                li
                    a(href="#extensions") Extensions
                li
                    a(href="#party3rd") 3rd Party Binaries 
    // /.cmtynavblock

    section.download-src#source.container
        .capstext.pb-5 SOURCE RELEASES

        include ./_components/download-source.pug
        .download-src__bottom.flexi.pt-5
            .download-src__left
                p.
                    If you are looking for an earlier version of Apache Ignite, please find it in the archive. If you encounter a problem with the selected mirror, please choose another one. If primary mirrors are not reachable, switch to backup servers added to the end of the list.
            .download-src__right 
                .download-choser.flexi 
                    .download-choser__label Selected mirror:
                    .download-choser__select.flexi
                        select(name="download_domain").jsDownloadDomenSelect
                            option(value="dlcdn.apache.org") dlcdn.apache.org
                            option(value="downloads.apache.org") downloads.apache.org
                        a.download-choser__button.download-choser__button--blue(href="#").jsChangeLink Change
    // /.download-src





    section.download-bin.container#binary
        .capstext BINARY RELEASES

        .download-bin__header.pt-4.pb-5
            p.
                Binary release packages are provided for your convenience and not considered as primary release artifacts of the ASF. It's recommended to verify a release downloadable, following <a href="#verification">this guidelines.</a> For more information about Apache release policy see <a href="http://www.apache.org/dev/release.html#what" target="_blank">What is a Release?</a>

        include ./_components/download-binary.pug
        // /.downtable__wrap
        p.pt-5 f you are looking for previous release versions of Apache Ignite, please have a look in the <a href="https://archive.apache.org/dist/ignite" target="_blank">archive</a>.
    // /.download-bin





    


    section.downloadslim.container 
        h3.h5.pb-2 Slim binary releases
        include ./_components/download-slim.pug
    // /.downloadslim



    section.download-docker.container#docker
        h3.capstext.pb-5 DOCKER AND CLOUD IMAGES
        include ./_components/download-docker.pug
    // /.download-docker




    section.downverify.container#verify.pt-5
        h3.h5 How to verify
        .downverify__wrap.flexi.pt-4
            .downverify__left
                p The PGP signatures can be verified using PGP or GPG. First download the <a href="https://downloads.apache.org/ignite/KEYS" target="_blank">Apache Ignite KEYS</a> file as well as the .asc signature files for the desired release version. Make sure you get these files from the main distribution directory, rather than from a mirror. Then verify the signatures.
            aside.downverify__right 
                p Please check <a href="https://www.apache.org/info/verification.html" target="_blank">How to Verify Downloaded Files</a> for more information on how and why you should verify Apache Ignite releases.
                downverify.downverify__code
                    p.pb-1 % gpg --import KEYS
                    p % gpg --verify apache-ignite-2.9.1-src.zip.asc apache-ignite-2.9.1-src.zip
    // /.downverify



    section.downfooter.container#git
        p.capstext.pb-3 GIT REPOSITORY
        pre.nativecode__codebox.nomargin
            code.bash.
                $ git clone https://gitbox.apache.org/repos/asf/ignite
        
        .downfooter__spacer.pt-5.pb-5
        p.capstext.pb-3#extensions EXTENSIONS

        -
            var xmlCode = `<dependency>
                <groupId>org.apache.ignite</groupId>
                <artifactId>ignite-spring-boot-autoconfigure-ext</artifactId>
                <version>1.0.0</version>
            </dependency>
            <dependency>
                <groupId>org.apache.ignite</groupId>
                <artifactId>ignite-spring-boot-thin-client-autoconfigure-ext</artifactId>
                <version>1.0.0</version>
            </dependency>`;

        pre.nativecode__codebox.nomargin
            code.xml #{xmlCode}



    section.party3rd#party3rd.container
        p.capstext 3RD PARTY BINARIES
        .party3rd__wrap.pt-5.flexi
            .party3rd__left
                p.pb-2 This is a list of 3rd party binary packages based on Apache Ignite. The Apache Ignite project does not endorse or maintain any 3rd party binary packages.
                p <a href="https://www.gridgain.com/resources/download#communityEdition" target="_blank">GridGain Community Edition</a> is a binary build of Apache Ignite created by GridGain, which includes optional LGPL dependencies, such as Hibernate L2 cache integration and Geospatial Indexing, as well as bug fixes and features which may be included into the future official Apache Ignite releases.
            .party3rd__right
                p GridGain also provides his own <a href="http://www.gridgainsystems.com/nexus/content/repositories/external" target="_blank">GridGain Maven Repository</a> containing Apache Ignite LGPL artifacts such as ignite-hibernate.
                p Please note that artifacts located at GridGain Maven Repository provided for convenience and are NOT official Apache Ignite artifacts.
                p If you would like to provide your own edition of Apache Ignite here, please send email to <a href="mailto:dev@ignite.apache.org">Ignite dev list.</a>






