{-# OPTIONS --without-K --rewriting #-}

open import lib.Basics
open import lib.types.LoopSpace
open import 2Grp
open import Codes
open import Decode12

module Decode13 where

module _ {i} {G : Type i} {{η : CohGrp G}} where

  open import Delooping G

  module _ (z : G) (p₁ p₂ p₃ : base == base) where

    long-aux3 : {e₁ e₂ : G == G} 
      (α₁ : ap fst (ap codes p₁) == e₁) (α₂ : ap fst (ap codes p₂) == e₂)
      (q₂ : loop (coe e₁ z)  p₂ == loop (coe e₂ (coe e₁ z)))
      (q₃ : p₃  p₁ == loop (coe e₁ z))
      
      ! (ap loop (transp-∙ p₁ p₂ z)) 
      (ap loop (transp-coe (p₁  p₂) z) 
      ap loop (ap  q  coe q z) (ap-∘ fst codes (p₁  p₂)))) 
      ap loop (ap  q  coe q z)
        (! ((∙-ap fst (ap codes p₁) (ap codes p₂) 
        ap (ap fst) (∙-ap codes p₁ p₂))  idp))) 
      ap loop (ap  q  coe q z) (ap2 _∙_ α₁ α₂)) 
      ap loop (coe-∙ e₁ e₂ z) 
      ! q₂ 
      ! (ap  p  p  p₂) q₃) 
      ∙-assoc p₃ p₁ p₂ 
      ! (transp-cst=idf (p₁  p₂) p₃)
        ==
      transport  v  loop (transport codes-fst p₂ v) == loop v  p₂)
        (! (transp-coe p₁ z  ap  q  coe q z) (ap-∘ fst codes p₁) 
          ap  q  coe q z) α₁  idp))
        (ap loop (transp-coe p₂ (coe e₁ z) 
        ap  q  coe q (coe e₁ z)) (ap-∘ fst codes p₂) 
        ap  q  coe q (coe e₁ z)) α₂  idp)  ! q₂) 
      ! (transp-cst=idf p₂ (loop (transport codes-fst p₁ z))) 
      ap (transport (_==_ base) p₂)
        (ap loop
          (transp-coe p₁ z 
          ap  q  coe q z) (ap-∘ fst codes p₁) 
          ap  q  coe q z) α₁  idp)) 
      ap (transport (_==_ base) p₂) (! q₃) 
      ap (transport (_==_ base) p₂) (! (transp-cst=idf p₁ p₃)) 
      ! (transp-∙ p₁ p₂ p₃)  idp
    long-aux3 idp idp q₂ q₃ = =ₛ-out (long-aux4 z p₁ p₂ p₃ q₂ q₃)

    long-aux2 : (e₁ e₂ : G  G)
      (α₁ : ap fst (ap codes p₁) == ua e₁) (α₂ : ap fst (ap codes p₂) == ua e₂)
      {g : G} (β₁ : coe (ua e₁) z == g)
      (q₂ : loop g  p₂ == loop (coe (ua e₂) g))
      (q₃ : p₃  p₁ == loop g)
       
      ! (ap loop (transp-∙ p₁ p₂ z)) 
      (ap loop (transp-coe (p₁  p₂) z) 
      ap loop (ap  q  coe q z) (ap-∘ fst codes (p₁  p₂)))) 
      ap loop (ap  q  coe q z)
        (! ((∙-ap fst (ap codes p₁) (ap codes p₂) 
        ap (ap fst) (∙-ap codes p₁ p₂))  idp))) 
      ap loop (ap  q  coe q z) (ap2 _∙_ α₁ α₂)) 
      ap loop (coe-∙ (ua e₁) (ua e₂) z) 
      ap loop (ap (coe (ua e₂)) β₁) 
      ! q₂ 
      ! (ap  p  p  p₂) q₃) 
      ∙-assoc p₃ p₁ p₂ 
      ! (transp-cst=idf (p₁  p₂) p₃)
        ==
      transport  v  loop (transport codes-fst p₂ v) == loop v  p₂)
        (! (transp-coe p₁ z  ap  q  coe q z) (ap-∘ fst codes p₁) 
          ap  q  coe q z) α₁  β₁))
        (ap loop (transp-coe p₂ g 
        ap  q  coe q g) (ap-∘ fst codes p₂) 
        ap  q  coe q g) α₂  idp)  ! q₂) 
      ! (transp-cst=idf p₂ (loop (transport codes-fst p₁ z))) 
      ap (transport (_==_ base) p₂)
        (ap loop
          (transp-coe p₁ z 
          ap  q  coe q z) (ap-∘ fst codes p₁) 
          ap  q  coe q z) α₁  β₁)) 
      ap (transport (_==_ base) p₂) (! q₃) 
      ap (transport (_==_ base) p₂) (! (transp-cst=idf p₁ p₃)) 
      ! (transp-∙ p₁ p₂ p₃)  idp
    long-aux2 e₁ e₂ α₁ α₂ idp q₂ q₃ = long-aux3 α₁ α₂ q₂ q₃

    long-aux : (e₁ e₂ : G  G)
      (α₁ : ap fst (ap codes p₁) == ua e₁) (α₂ : ap fst (ap codes p₂) == ua e₂)
      (β₁ : coe (ua e₁) z == fst e₁ z) {g : G} (β₂ : coe (ua e₂) (fst e₁ z) == g)
      {t : base == base} (q₁ : p₁  p₂ == t)
      (q₂ : loop (fst e₁ z)  p₂ == loop g) (q₃ : p₃  p₁ == loop (fst e₁ z))
       
      ! (ap loop (transp-∙ p₁ p₂ z)) ◃∙
      ap loop (ap  p  transport codes-fst p z) q₁) ◃∙
      transport  v  loop (transport codes-fst v z) == loop (coe (ap fst (ap codes v)) z)) q₁
        (ap loop (transp-coe (p₁  p₂) z) 
        ap loop (ap  q  coe q z) (ap-∘ fst codes (p₁  p₂)))) ◃∙
      ap loop (ap  q  coe q z)
        (! ((∙-ap fst (ap codes p₁) (ap codes p₂) 
          ap (ap fst) (∙-Ω-fmap (codes , idp) p₁ p₂)) 
          ap (ap fst  ap codes) q₁))) ◃∙
      ap loop (ap  q  coe q z) (ap2 _∙_ α₁ α₂)) ◃∙
      ap loop (coe-∙ (ua e₁) (ua e₂) z) ◃∙
      ap loop (ap (coe (ua e₂)) β₁) ◃∙
      ap loop β₂ ◃∙
      ! q₂ ◃∙
      ! (ap  p  p  p₂) q₃) ◃∙
      ∙-assoc p₃ p₁ p₂ ◃∙
      ap  p  p₃  p) q₁ ◃∙
      ! (transport
           v  transport (_==_ base) v p₃ == p₃  v)
          q₁
          (transp-cst=idf (p₁  p₂) p₃)) ◃∎
        =ₛ
      transport
          v  loop (transport codes-fst p₂ v) == loop v  p₂)
         (! (
           transp-coe {B = codes-fst} p₁ z 
           ap  q  coe q z) (ap-∘ fst codes p₁) 
           ap  q  coe q z) α₁ 
           β₁))
         (ap loop
           (
             transp-coe {B = codes-fst} p₂ (fst e₁ z) 
             ap  q  coe q (fst e₁ z)) (ap-∘ fst codes p₂) 
             ap  q  coe q (fst e₁ z)) α₂ 
             β₂) 
           ! q₂) ◃∙
       ! (transp-cst=idf p₂ (loop (transport codes-fst p₁ z))) ◃∙
       ap (transport  b  base == b) p₂)
         (ap loop (
           transp-coe {B = codes-fst} p₁ z 
           ap  q  coe q z) (ap-∘ fst codes p₁) 
           ap  q  coe q z) α₁ 
           β₁)) ◃∙
       ap (transport  b  base == b) p₂) (! q₃) ◃∙
       ap (transport  b  base == b) p₂) (! (transp-cst=idf p₁ p₃)) ◃∙
       ! (transp-∙ p₁ p₂ p₃) ◃∙
       ap  p  transport  b  base == b) p p₃) q₁ ◃∎
    long-aux e₁ e₂ α₁ α₂ β₁ idp idp q₂ q₃ = =ₛ-in (long-aux2 e₁ e₂ α₁ α₂ β₁ q₂ q₃)