diff --git a/_data/config.yml b/_data/config.yml index 95783fd1..cc6a7623 100644 --- a/_data/config.yml +++ b/_data/config.yml @@ -1,9 +1,9 @@ banner: show: false - content: "DevConf 2024 is entirely sold out! We can't wait to see you all soon!" + content: "DevConf 2025 is entirely sold out! We can't wait to see you all soon!" sponsors: - show: false - proposal: /public/docs/DevConf 2024 Sponsorship Proposal.pdf + show: true + proposal: /public/docs/DevConf 2025 Sponsorship Proposal.pdf banner: false callForSpeakers: show: true @@ -37,12 +37,12 @@ general: events: - virtual: false show: true - showAgenda: true + showAgenda: false location: "Johannesburg" menuTitle: "Joburg" date: "27 May 2025" info: "/joburg" - infoOn: false + infoOn: true sessionizeId: "b0tah92u" logo: devconfjhb.png minattendees: 700 @@ -54,20 +54,20 @@ events: sponsorOpen: true colour: pink tickets: - totally_sold_out: true - onsale: false + totally_sold_out: false + onsale: true has_shuttle: false has_waiting_list: false waiting_list: - purchaseSite: "https://www.quicket.co.za/events/237752-devconf-2024-johannesburg" + purchaseSite: "https://www.quicket.co.za/events/286990-devconf-2025-johannesburg/#/" merch_link: "" fullprice: - price: 3623 - bulkPrice: 3293.64 - sold_out: true + price: 3985.29 + bulkPrice: 3622.99 + sold_out: false earlybird: - price: 3150.43 - sold_out: true + price: 3465.47 + sold_out: false rooms: room_1: "Centre Court" room_2: "NCC" @@ -160,12 +160,12 @@ events: # room: Julia - virtual: false show: true - showAgenda: true + showAgenda: false location: "Cape Town" menuTitle: "Cape Town" date: "29 May 2025" info: "/capetown" - infoOn: false + infoOn: true sessionizeId: "b0tah92u" logo: devconfcpt.png minattendees: 700 @@ -177,20 +177,20 @@ events: sponsorOpen: true colour: blue tickets: - onsale: false + onsale: true totally_sold_out: false has_shuttle: false has_waiting_list: false waiting_list: "" - purchaseSite: "https://www.quicket.co.za/events/239304-devconf-2024-cape-town" + purchaseSite: "https://www.quicket.co.za/events/285080-devconf-2025-cape-town/#/" merch_link: fullprice: - price: 3623 + price: 3985.29 + bulkPrice: 3622.99 sold_out: false - bulkPrice: 3293.64 earlybird: - price: 3150.43 - sold_out: true + price: 3465.47 + sold_out: false rooms: room_1: "Hall A" room_2: "Hall B" diff --git a/_includes/event.html b/_includes/event.html index 0e8646c4..dc512e56 100644 --- a/_includes/event.html +++ b/_includes/event.html @@ -101,7 +101,7 @@ target="_blank">Buy a ticket now! {% endif %} -
+
{% endif %} {% if event.tickets.totally_sold_out %} {% else %} -
We use Quicket for ticket purchases, and payment can be made by Instant EFT, Credit Card, SnapScan, or Zapper. 🟣 - If you need an PO, or "normal" EFT, please email us so we can help you directly with a manual purchase! 🔵 - You can login to Quicket to manage or transfer your tickets. Quicket support can help with any questions on how to use their platform. 🟢 +
We use Quicket for ticket purchases, and payment can be made by Instant EFT, Credit Card, SnapScan, Zapper or EFT. 🟣 + If you need an PO, you can do that on Quicket too and have 15 days to pay! Need more time? Quicket Support can assist! 🔵 + You can login to Quicket to manage or transfer your tickets. Quicket Support can help with any questions on how to use their platform. 🟢 Ticket Purchase Terms & Conditions
 
{% endif %} diff --git a/capetown.html b/capetown.html index 3b5be24b..94de8287 100644 --- a/capetown.html +++ b/capetown.html @@ -1,4 +1,4 @@ --- layout: default --- -{% include event.html offset=1 baseStyle="sponsor-title-blue" sponsors=site.data.2024.cptsponsors sessions=site.data.2024.cptsessions %} +{% include event.html offset=1 baseStyle="sponsor-title-blue" sponsors=site.data.2025.cptsponsors sessions=site.data.2025.cptsessions %} diff --git a/faq.html b/faq.html index b10e0b7a..5b4205ad 100644 --- a/faq.html +++ b/faq.html @@ -7,91 +7,117 @@

FAQ

  1. Who runs DevConf?

    -

    DevConf is owned by the non-profit organisation The Developer User Group. - DevConf is run by two of the DevUG directors in their free time, Candice Mesk and Robert MacLean. +

    + DevConf is owned by the non-profit organisation + The Developer User Group. DevConf is run by two of the DevUG directors in their free + time, Candice Mesk and Robert MacLean.

  2. What is the goal of DevConf?

    -

    DevConf has a simple goal: give professional software developers an opportunity to network and learn from their peers in a safe environment.

    +

    + DevConf has a simple goal: give professional software developers + an opportunity to network and learn from their peers in a safe + environment. +

  3. Where can I find information about your COVID policy?

    - All details on our COVID policy, and our approach if there are government restrictions can be found on our COVID Info Page. + All details on our COVID policy, and our approach if there are + government restrictions can be found on our + COVID Info Page.

  4. -

    Can I buy tickets without a credit card? Is it possible to generate an invoice for comapnies?

    +

    + Can I buy tickets without a credit card? Is it possible to + generate an invoice for comapnies? +

    Totally! There are two options available to you:

    Buy online

    -

    Our online ticketing solution supports Instant EFT, Credit Card, SnapScan, or Zapper payments. - - +

    + Our online ticketing solution supports Instant EFT, Credit Card, + SnapScan, or Zapper payments and EFT options. If purchasing by + EFT online, the ticketing platform reserves your tickets for 15 + days to allow time for the EFT to reflect. Once the purchase is + confirmed, you can log in to the ticketing website to generate + an invoice for your company.

    -

    EFT and Manual purchase

    +
  5. Can I have a free ticket?

    -

    Unfortunately not. DevConf is designed to be cash neutral so we do not have any excess funds to sponsor - free - tickets. Only speakers and organisers receive complementary access to the event. We do work with - sponsors on - processes for them to donate tickets, so follow us on social media to hear about those opportunities - when they - come up.

    +

    + Unfortunately not. DevConf is designed to be cash neutral so we + do not have any excess funds to sponsor free tickets. Only + speakers and organisers receive complementary access to the + event. We do work with sponsors on processes for them to donate + tickets, so follow us on social media to hear about those + opportunities when they come up. +

  6. I would like to speak at the event!

    -

    That is awesome! We have a call for speakers each year and you can get the details of this when the call - for speakers goes out by - signing up to our mailing list.

    +

    + That is awesome! We have a call for speakers each year and you + can get the details of this when the call for speakers goes out + by signing up to our mailing list. +

  7. Who is Fizz Marketing?

    -

    Fizz is the planning and logistics partner for DevConf that handles the administrative duties for - DevConf.

    +

    + Fizz is the planning and logistics partner for DevConf that + handles the administrative duties for DevConf. +

  8. How did this start?

    -

    The idea of DevConf originated with Robert MacLean in late 2013; the idea was to run an event for - developers who - could not attend the Developer User Group which happened outside of normal working hours. The first - DevConf - took place in 2016. DevConf is proudly run by Candice Mesk and Robert MacLean.

    +

    + The idea of DevConf originated with Robert MacLean in late 2013; + the idea was to run an event for developers who could not attend + the Developer User Group which happened outside of normal + working hours. The first DevConf took place in 2016. DevConf is + proudly run by Candice Mesk and Robert MacLean. +

  9. How much money do you make?

    -

    Nothing. DevConf is designed to be cash neutral so there is no profit nor loss, however, DevConf has made - a small - surplus each year (which is better than a loss) and that surplus has been used to fund the following - year as - well as cover some of the community initiatives run by the Developer User Group. Where possible (budget- - and space-permitting), those DevUG committee members who are not involved with DevConf planning are - allocated one non-transferrable ticket each to attend DevConf.

    -

    In 2016, some of this surplus funded trips for two organisers to attend other conferences with the - intention of - learning from those events, and a UHK keyboard was bought for each of the organisers (3 that year) as a - gift at - a cost of less than R10 000. In 2021, the organisers bought two laptops to replace aging equipment used - to run - the event. The organisers have not recieved any other financial benefits.

    +

    + Nothing. DevConf is designed to be cash neutral so there is no + profit nor loss, however, DevConf has made a small surplus each + year (which is better than a loss) and that surplus has been + used to fund the following year as well as cover some of the + community initiatives run by the Developer User Group. Where + possible (budget- and space-permitting), those DevUG committee + members who are not involved with DevConf planning are allocated + one non-transferrable ticket each to attend DevConf. +

    +

    + In 2016, some of this surplus funded trips for two organisers to + attend other conferences with the intention of learning from + those events, and a UHK keyboard was bought for each of the + organisers (3 that year) as a gift at a cost of less than R10 + 000. In 2021, the organisers bought two laptops to replace aging + equipment used to run the event. The organisers have not + recieved any other financial benefits. +

  10. Is the event auditted?

    -

    Yes, DevConf is audited each year after the events. The Developer User Group is also audited annually and - is - fully compliant with SARS and CIPC.

    +

    + Yes, DevConf is audited each year after the events. The + Developer User Group is also audited annually and is fully + compliant with SARS and CIPC. +

-
\ No newline at end of file + diff --git a/joburg.html b/joburg.html index 83e48a03..50e0736e 100644 --- a/joburg.html +++ b/joburg.html @@ -1,4 +1,4 @@ --- layout: default --- -{% include event.html offset=0 baseStyle="sponsor-title" sponsors=site.data.2024.jhbsponsors sessions=site.data.2024.jhbsessions %} +{% include event.html offset=0 baseStyle="sponsor-title" sponsors=site.data.2025.jhbsponsors sessions=site.data.2025.jhbsessions %} diff --git a/package.json b/package.json index 215e49fd..5ebe6e78 100644 --- a/package.json +++ b/package.json @@ -28,20 +28,20 @@ ], "devDependencies": { "@types/grecaptcha": "^3.0.9", - "@types/node": "^22.7.4", - "@typescript-eslint/eslint-plugin": "^8.8.0", - "@typescript-eslint/parser": "^8.8.0", + "@types/node": "^22.8.5", + "@typescript-eslint/eslint-plugin": "^8.12.2", + "@typescript-eslint/parser": "^8.12.2", "concurrently": "^9.0.1", - "eslint": "^9.12.0", + "eslint": "^9.13.0", "eslint-config-airbnb": "^19.0.4", "eslint-plugin-import": "^2.31.0", "nodemon": "^3.1.7", - "sass": "^1.79.4", + "sass": "^1.80.5", "ts-loader": "^9.5.1", - "typescript": "^5.6.2", + "typescript": "^5.6.3", "webpack": "^5.95.0", "webpack-cli": "^5.1.4", - "uuid": "^10.0.0" + "uuid": "^11.0.2" }, "scripts": { "watch-css": "yarn sass --update --no-source-map -w --style compressed -I scss scss/main.scss public/css/main.css", diff --git a/public/css/main.css b/public/css/main.css index 305e3bfe..f555ed12 100644 --- a/public/css/main.css +++ b/public/css/main.css @@ -1 +1 @@ -.sponsor{overflow-x:clip;display:grid;grid-template-columns:1fr;grid-template-rows:250px repeat(5, auto);margin-bottom:40px}.sponsor a{text-decoration:none;text-align:center}@media(max-width: 850px){.sponsor{margin-bottom:30px}}.sponsor-home{grid-template-rows:auto repeat(5, auto)}.sponsor hr{width:90%;border-style:none;height:2px;background-color:#f4f4f4}.sponsor-fake-button{font-family:"Armata",Helvetica,"Segoe UI",Verdana,sans-serif;background-image:linear-gradient(to right, #001e5b, #000d28);text-decoration:none;min-width:200px;display:grid;align-items:center;justify-content:center;border:none;text-align:center;font-size:.9rem;font-weight:800;border-radius:20px;padding:10px 20px;text-transform:uppercase;color:#fff;line-height:1rem;cursor:pointer}.sponsor-fake-button:hover{background-image:linear-gradient(to left, #001e5b, #000d28) !important}.sponsor-button{margin-top:10px;margin-bottom:10px;font-family:"Armata",Helvetica,"Segoe UI",Verdana,sans-serif;background-image:linear-gradient(to right, #001e5b, #000d28);text-decoration:none;min-width:200px;display:grid;align-items:center;justify-content:center;border:none;text-align:center;font-size:.9rem;font-weight:800;border-radius:20px;padding:10px 20px;text-transform:uppercase;color:#fff;line-height:1rem;cursor:pointer;cursor:pointer}.sponsor-button:hover{background-image:linear-gradient(to left, #001e5b, #000d28) !important}.sponsor-title{width:100%;background-color:#ff3263;overflow:hidden;display:grid;grid-template-columns:1fr;grid-template-rows:1fr;padding-top:10px;color:#fff}.sponsor-title-ellipse{width:100vw;height:100vw;border-radius:50%;background-color:#000;opacity:.08;margin-top:20px;grid-row:1/1;grid-column:1/1;z-index:10}.sponsor-title-button{margin-top:30px}.sponsor-title-content{grid-row:1/1;grid-column:1/1;z-index:100;justify-self:center;font-size:3rem;text-align:center;margin-top:40px;justify-items:center;display:grid;grid-template-rows:repeat(4, minmax(0, min-content));grid-row-gap:10px;text-transform:uppercase;padding-left:10px;padding-right:10px}@media(max-width: 850px){.sponsor-title-content{font-size:2.1rem;margin-top:0}}.sponsor-title-content-sponsor{display:grid;justify-items:center}.sponsor-title-content-packages-intro{font-size:1rem;width:350px}.sponsor-title-content-package{margin-top:0}.sponsor-title-content-package-image{display:grid;justify-items:center;align-items:start;margin-top:-130px;z-index:150;margin-bottom:-40px}@media(max-width: 850px){.sponsor-title-content-package-image{display:none}}.sponsor-title-content-package-image>img{height:300px;margin-top:50px}.sponsor-title-content-second{width:100%;font-size:1.5rem;display:grid;grid-auto-flow:column;grid-template-columns:repeat(5, auto);align-items:center;justify-items:stretch;text-align:center}@media(max-width: 600px){.sponsor-title-content-second{grid-auto-flow:row;grid-template-columns:unset;font-size:1.3rem}}.sponsor-title-content-third{font-size:1rem}.sponsor-title-blue{width:100%;background-color:#19c3fc;overflow:hidden;display:grid;grid-template-columns:1fr;grid-template-rows:1fr;padding-top:10px;color:#fff}.sponsor-title-blue-ellipse{width:100vw;height:100vw;border-radius:50%;background-color:#000;opacity:.08;margin-top:20px;grid-row:1/1;grid-column:1/1;z-index:10}.sponsor-title-blue-button{margin-top:30px}.sponsor-title-blue-content{grid-row:1/1;grid-column:1/1;z-index:100;justify-self:center;font-size:3rem;text-align:center;margin-top:40px;justify-items:center;display:grid;grid-template-rows:repeat(4, minmax(0, min-content));grid-row-gap:10px;text-transform:uppercase;padding-left:10px;padding-right:10px}@media(max-width: 850px){.sponsor-title-blue-content{font-size:2.1rem;margin-top:0}}.sponsor-title-blue-content-sponsor{display:grid;justify-items:center}.sponsor-title-blue-content-packages-intro{font-size:1rem;width:350px}.sponsor-title-blue-content-package{margin-top:0}.sponsor-title-blue-content-package-image{display:grid;justify-items:center;align-items:start;margin-top:-130px;z-index:150;margin-bottom:-40px}@media(max-width: 850px){.sponsor-title-blue-content-package-image{display:none}}.sponsor-title-blue-content-package-image>img{height:300px;margin-top:50px}.sponsor-title-blue-content-second{width:100%;font-size:1.5rem;display:grid;grid-auto-flow:column;grid-template-columns:repeat(5, auto);align-items:center;justify-items:stretch;text-align:center}@media(max-width: 600px){.sponsor-title-blue-content-second{grid-auto-flow:row;grid-template-columns:unset;font-size:1.3rem}}.sponsor-title-blue-content-third{font-size:1rem}.sponsor-title-third{width:100%;background-color:#9a76cf;overflow:hidden;display:grid;grid-template-columns:1fr;grid-template-rows:1fr;padding-top:10px;color:#fff}.sponsor-title-third-ellipse{width:100vw;height:100vw;border-radius:50%;background-color:#000;opacity:.08;margin-top:20px;grid-row:1/1;grid-column:1/1;z-index:10}.sponsor-title-third-button{margin-top:30px}.sponsor-title-third-content{grid-row:1/1;grid-column:1/1;z-index:100;justify-self:center;font-size:3rem;text-align:center;margin-top:40px;justify-items:center;display:grid;grid-template-rows:repeat(4, minmax(0, min-content));grid-row-gap:10px;text-transform:uppercase;padding-left:10px;padding-right:10px}@media(max-width: 850px){.sponsor-title-third-content{font-size:2.1rem;margin-top:0}}.sponsor-title-third-content-sponsor{display:grid;justify-items:center}.sponsor-title-third-content-packages-intro{font-size:1rem;width:350px}.sponsor-title-third-content-package{margin-top:0}.sponsor-title-third-content-package-image{display:grid;justify-items:center;align-items:start;margin-top:-130px;z-index:150;margin-bottom:-40px}@media(max-width: 850px){.sponsor-title-third-content-package-image{display:none}}.sponsor-title-third-content-package-image>img{height:300px;margin-top:50px}.sponsor-title-third-content-second{width:100%;font-size:1.5rem;display:grid;grid-auto-flow:column;grid-template-columns:repeat(5, auto);align-items:center;justify-items:stretch;text-align:center}@media(max-width: 600px){.sponsor-title-third-content-second{grid-auto-flow:row;grid-template-columns:unset;font-size:1.3rem}}.sponsor-title-third-content-third{font-size:1rem}.sponsor-content-detail,.sponsor-content-detail-packages{display:grid;justify-items:center;padding-bottom:20px;padding-top:20px;padding-left:20px;padding-right:20px;grid-row-gap:20px;max-width:100vw}.sponsor-content-detail-wide-body{overflow-x:hidden;overflow-y:hidden;display:flex;grid-column-gap:20px;width:100%}.sponsor-content-detail-wide-body img{border-style:solid;border-width:1px;border-color:#fc003d;padding:5px;background-color:#fff;height:150px}.sponsor-content-detail-tickets{display:grid;justify-items:center;text-align:center;padding-left:15px;padding-right:15px}.sponsor-content-detail-tickets-cards{width:100%;display:grid;text-align:center;padding:25px 10px;background-color:#fff;grid-row-gap:5px;text-align:center;line-height:1.5rem;grid-template-columns:1fr 1fr 1fr 1fr;grid-template-rows:1fr;column-gap:30px;align-content:center}@media(max-width: 1280px){.sponsor-content-detail-tickets-cards{grid-template-columns:1fr 1fr;grid-template-rows:1fr 1fr}}@media(max-width: 850px){.sponsor-content-detail-tickets-cards{grid-template-columns:1fr;grid-template-rows:min-content min-content min-content min-content}}.sponsor-content-detail-tickets-cards-price{color:#ff3263;font-size:1rem !important;font-weight:800 !important}@media(max-width: 850px){.sponsor-content-detail-tickets-cards{grid-template-columns:auto}}.sponsor-content-detail-tickets-cards>div{display:grid;align-items:center;row-gap:5px;justify-items:center;background-color:#f4f4f4;padding:10px;border-radius:5px;grid-template-rows:min-content 1fr min-content min-content}.sponsor-content-detail-tickets-cards>div>div:nth-child(1){color:#ff3263;font-weight:800}.sponsor-content-detail-tickets-cards>div>div:nth-child(2){font-size:.8rem}.sponsor-content-detail-tickets-cards>div>div:nth-child(3){font-size:.8rem;font-weight:800}.sponsor-content-detail-tickets-cards>div>a{width:max-content}.sponsor-content-detail-location{display:grid;justify-items:center;text-align:center;grid-row-gap:20px}.sponsor-content-detail-packages{grid-column-gap:20px;grid-template-columns:1fr 1fr 1fr;grid-template-rows:auto;justify-items:stretch;padding-left:15%;padding-right:15%}.sponsor-content-detail-packages>div{padding-left:0;padding-right:0}@media(max-width: 850px){.sponsor-content-detail-packages{grid-template-columns:auto;grid-template-rows:auto auto}}.sponsor-content-detail-package-cards{display:grid;grid-column-gap:20px;grid-row-gap:20px;grid-template-columns:100%;grid-template-columns:repeat(auto-fill, minmax(250px, 1fr));justify-items:center;align-items:baseline}@media(min-width: 2350px){.sponsor-content-detail-package-cards{grid-template-columns:1fr 1fr 1fr}}.sponsor-content-detail-package-card{padding:25px 10px;background-color:#f4f4f4;border-radius:5px;color:#ff3263;display:grid;justify-items:center;grid-row-gap:5px;width:200px;text-align:center;line-height:1.5rem}.sponsor-content-detail-package-card>img{width:150px}@media(max-width: 850px){.sponsor-content-detail-package-card>img{display:none}}.sponsor-content-detail-package-card>div>div.sponsor-content-detail-package-card-remaining{font-weight:800;color:#cb0031}.sponsor-content-detail-package-card>div:nth-child(1),.sponsor-content-detail-package-card>div:nth-child(5),.sponsor-content-detail-package-card>div:nth-child(7){font-weight:800}.sponsor-content-detail-package-card-blue{padding:25px 10px;background-color:#f4f4f4;border-radius:5px;color:#19c3fc;display:grid;justify-items:center;grid-row-gap:5px;width:200px;text-align:center;line-height:1.5rem}.sponsor-content-detail-package-card-blue>img{width:150px}@media(max-width: 850px){.sponsor-content-detail-package-card-blue>img{display:none}}.sponsor-content-detail-package-card-blue>div>div.sponsor-content-detail-package-card-remaining{font-weight:800;color:#0282ad}.sponsor-content-detail-package-card-blue>div:nth-child(1),.sponsor-content-detail-package-card-blue>div:nth-child(5),.sponsor-content-detail-package-card-blue>div:nth-child(7){font-weight:800}.sponsor-content-detail-sponsors{display:grid;grid-template-columns:repeat(3, minmax(0, max-content));justify-items:center;grid-row-gap:10px}@media(max-width: 850px){.sponsor-content-detail-sponsors{grid-template-columns:auto}}.sponsor-content-detail-content-sponsor{display:grid;justify-items:center}.sponsor-content-detail-sponsor{border-color:#ff3263;border-width:1px;border-style:solid}.sponsor-content-detail-sponsor-level{display:grid;justify-items:center;margin-bottom:15px}.sponsor-content-detail-sponsor-level img{border-style:solid;border-width:1px;border-color:rgba(240,99,133,.2784313725);padding:5px}.sponsor-content-detail-sponsor-level a{color:rgba(0,0,0,0) !important}.sponsor-content-detail-sponsor-level a:hover{color:rgba(0,0,0,0) !important}.sponsor-content-detail-heading,.sponsor-content-detail-heading-pink,.sponsor-content-detail-heading-third{color:#19c3fc;text-transform:uppercase;padding-top:10px;font-weight:800;font-size:2rem;margin-bottom:15px;text-align:center}.sponsor-content-detail-heading-smaller{font-size:1.6rem}.sponsor-content-detail-heading-third{color:#9a76cf}.sponsor-content-detail-heading-pink{color:#ff3263}@media(min-width: 850px){.sponsor-content-detail-heading-attendees{text-align:left}}.sponsor-content-detail-termsAndConditions{font-size:.6rem}.sponsor-content-detail-mission{display:grid;grid-template-columns:repeat(4, 1fr);grid-template-rows:1fr;grid-column-gap:50px;line-height:1.5rem}.sponsor-content-detail-mission>div{text-align:center;display:grid;justify-items:center;grid-row-gap:20px;grid-template-rows:auto auto 1fr;grid-template-columns:auto}@media(max-width: 850px){.sponsor-content-detail-mission>div>img{display:none;grid-template-rows:0 auto}}@media(max-width: 850px){.sponsor-content-detail-mission{grid-template-rows:repeat(4, 1fr);grid-template-columns:1fr;grid-row-gap:5px}}.sponsor-content-detail-attendees{display:grid;grid-template-rows:auto;grid-template-columns:auto auto;justify-items:center;line-height:1.5rem}@media(max-width: 850px){.sponsor-content-detail-attendees{grid-template-columns:auto}.sponsor-content-detail-attendees>img{display:none}}.sponsor-content-detail-overview{display:grid;grid-template-rows:auto auto;grid-template-columns:minmax(auto, 350px) minmax(auto, 350px);justify-items:center;grid-row-gap:10px;grid-column-gap:50px;grid-auto-flow:column;line-height:1.5rem;margin-bottom:20px}@media(max-width: 850px){.sponsor-content-detail-overview{grid-auto-flow:row;grid-template-rows:repeat(6, auto);grid-template-columns:350px}}.sponsor-content-detail-overview>div:nth-child(1),.sponsor-content-detail-overview>div:nth-child(3),.sponsor-content-detail-overview>div:nth-child(5){color:#19c3fc;font-weight:800;margin-bottom:20px}.sponsor-content-detail-overview>div:nth-child(5){color:#9a76cf}.sponsor-content-detail-overview>div:nth-child(3){color:#ff3263}.sponsor-content-detail-overview>div:nth-child(2),.sponsor-content-detail-overview>div:nth-child(4),.sponsor-content-detail-overview>div:nth-child(6){border-radius:5px;color:#fff;padding:30px 20px;display:grid;grid-template-rows:repeat(4, auto);grid-template-columns:auto;justify-items:center;grid-row-gap:20px}.sponsor-content-detail-overview>div:nth-child(2)>div,.sponsor-content-detail-overview>div:nth-child(4)>div,.sponsor-content-detail-overview>div:nth-child(6)>div{display:grid;justify-items:center;grid-row-gap:5px;text-align:center}.sponsor-content-detail-overview>div:nth-child(2)>div>div:nth-child(odd),.sponsor-content-detail-overview>div:nth-child(4)>div>div:nth-child(odd),.sponsor-content-detail-overview>div:nth-child(6)>div>div:nth-child(odd){text-transform:uppercase;font-weight:800}.sponsor-content-detail-overview>div:nth-child(2){background-color:#19c3fc}.sponsor-content-detail-overview>div:nth-child(6){background-color:#9a76cf}.sponsor-content-detail-overview>div:nth-child(4){background-color:#ff3263}.sponsor-content-detail-reflection{display:grid;grid-template-columns:repeat(2, auto);grid-column-gap:20px;grid-template-rows:repeat(2, auto);grid-row-gap:20px;justify-items:center;margin-bottom:20px;line-height:1.5rem;padding-bottom:20px}@media(max-width: 850px){.sponsor-content-detail-reflection{grid-template-columns:auto;grid-template-rows:repeat(6, auto)}}.sponsor-content-detail-reflection>div{display:grid;grid-template-columns:auto;grid-template-rows:repeat(3, auto);justify-items:center;text-align:center}.sponsor-content-detail-reflection>div>img{width:250px;height:250px;padding:5%}.sponsor-content-detail-reflection>div:nth-child(2){font-size:1.1rem}.sponsor-content-detail-contact{display:grid;grid-template-columns:repeat(3, 1fr);justify-items:center;grid-column-gap:20px;line-height:1.5rem}@media(max-width: 850px){.sponsor-content-detail-contact{grid-template-rows:repeat(3, 1fr);grid-template-columns:auto;grid-row-gap:10px}}.sponsor-content-detail-contact>div{display:grid;grid-template-rows:repeat(3, auto);justify-items:center;grid-row-gap:5px}.sponsor-content-detail-contact>div>div:nth-child(1){font-weight:800}.sponsor-content-detail-introduction{justify-self:left;line-height:1.5rem}.sponsor-content-detail-brand{line-height:1.5rem;display:grid;grid-template-columns:1fr 1fr;grid-column-gap:50px}.sponsor-content-detail-brand>div:before{content:"• "}@media(max-width: 850px){.sponsor-content-detail-brand{grid-template-columns:1fr}}.sponsor-content-detail-expo{line-height:1.5rem;display:grid;grid-template-columns:1fr 1fr;grid-column-gap:50px}.sponsor-content-detail-expo>div:before{content:"• "}@media(max-width: 850px){.sponsor-content-detail-expo{grid-template-columns:1fr}}.sponsor-content-detail-expo-stand{text-align:center;font-size:.7rem}.sponsor-content-detail-expo-stand>a{font-size:1rem;display:grid;justify-items:center;row-gap:20px;text-align:center}.sponsor-content-detail-benefits{line-height:1.5rem;display:grid;grid-template-columns:1fr 1fr;grid-column-gap:50px}.sponsor-content-detail-benefits>div:before{content:"• "}@media(max-width: 850px){.sponsor-content-detail-benefits{grid-template-columns:1fr}}.sponsor-content-detail-exclusive{line-height:1.5rem;display:grid;grid-template-columns:1fr 1fr;grid-column-gap:50px}.sponsor-content-detail-exclusive>div:before{content:"• "}@media(max-width: 850px){.sponsor-content-detail-exclusive{grid-template-columns:1fr}}.sponsor-content-detail-white{background-color:#fff !important}.sponsor-content-detail:nth-child(odd),.sponsor-content-detail-packages:nth-child(odd){background-color:#000d28;color:#fff}.sponsor-content-detail:nth-child(even),.sponsor-content-detail-packages:nth-child(even){background-color:#fff}.sponsor .more-info{margin-top:10px;text-decoration:none}.sponsor-banana{height:100px;font-size:24px !important;background-image:linear-gradient(to left, #fc003d, #19c3fc);display:grid}.sponsor-banana>div{align-self:center}.sponsor-small-banana{height:50px;font-size:24px !important;background-image:linear-gradient(to left, #000d28, #19c3fc);display:grid}.sponsor-small-banana>div{align-self:center}img.sponsorLogo{max-width:unset}@media(max-width: 850px){img.sponsorLogo{max-width:80vw}}.collapseMe{height:0px;margin:0px;padding:0px}#agenda{line-height:1.3em;width:100%;display:grid;grid-auto-flow:row;justify-items:center;row-gap:3px;column-gap:5px;padding-bottom:5px;padding-left:2%;padding-right:2%;grid-template-rows:repeat(33, min-content);grid-template-columns:1fr 300px;grid-template-areas:"registration registration" "expo expo" "welcome welcome" "keynote keynote" "loading1 loading1" "break1 break1" "timeslot1 workshoptime1" "session1 workshop10" "loading2 workshop10" "movement1 workshop10" "timeslot2 workshop10" "session2 workshop10" "loading3 workshop10" "movement2 movement2" "timeslot3 ." "session3 ." "loading4 ." "lunch lunch" "timeslot4 workshoptime2" "session4 workshop20" "loading5 workshop20" "movement3 workshop20" "timeslot5 workshop20" "session5 workshop20" "loading6 workshop20" "break2 break2" "timeslot6 workshoptime3" "session6 workshop30" "loading7 workshop30" "movement4 workshop30" "timeslot7 workshop30" "session7 workshop30" "cocktail cocktail"}@media(max-width: 1220px){#agenda{grid-template-rows:unset;grid-template-columns:1fr;grid-template-areas:"registration" "expo" "welcome" "keynote" "loading1" "break1" "timeslot1" "session1" "loading2" "movement1" "timeslot2" "session2" "loading3" "movement2" "timeslot3" "session3" "lunch" "loading4" "timeslot4" "session4" "loading5" "movement3" "timeslot5" "session5" "loading6" "break2" "timeslot6" "session6" "loading7" "movement4" "timeslot7" "session7" "cocktail" "workshoptitle" "workshoptime1" "workshop10" "workshoptime2" "workshop20" "workshoptime3" "workshop30"}}.agenda>.hidden-row{display:none}.agenda-workshop-sponsor a{color:#000d28}.agenda-workshop-sponsor a:hover{color:#001e5b}.agenda-workshop-title{display:none}@media(max-width: 1220px){.agenda-workshop-title{display:grid}}.agenda-workshop-time{margin-top:10px;font-size:smaller;font-weight:800;color:#001e5b}.agenda-workshop-content{font-size:smaller;margin-top:10px}.agenda-workshop{background-color:#0479a0;padding:10px;border-radius:5px;text-align:center;justify-self:stretch}.agenda-row-style-break{background-color:#ed3259;display:grid;justify-self:stretch;color:#fff;border-radius:5px;padding:5px;grid-auto-flow:column;justify-content:stretch;align-items:center;padding:10px;font-size:.8rem;grid-template-columns:max-content max-content 1fr max-content max-content}.agenda-row-style-key{background-color:#990020;display:grid;justify-self:stretch;color:#fff;border-radius:5px;padding:5px;grid-auto-flow:column;justify-content:stretch;align-items:center;font-size:.8rem;padding:10px;grid-template-columns:max-content max-content 1fr max-content max-content}.agenda-row-style-highlight{background-color:#ff3263;display:grid;justify-self:stretch;color:#fff;border-radius:5px;padding:5px;grid-auto-flow:column;justify-content:stretch;align-items:center;font-size:1rem;padding:10px;grid-template-columns:max-content max-content 1fr max-content max-content}.agenda-row-style-keynote{background-color:#19c3fc;display:grid;justify-self:stretch;color:#fff;border-radius:5px;padding:5px;grid-auto-flow:column;justify-content:stretch;align-items:center;justify-content:unset;grid-auto-flow:row}.agenda-row-timeslot{display:grid;grid-auto-flow:column;grid-template-columns:repeat(5, 1fr);justify-items:center;row-gap:3px;column-gap:5px}@media(max-width: 850px){.agenda-row-timeslot{grid-auto-flow:row;grid-template-columns:auto}}.agenda-virtual-row-timeslot{display:grid;grid-auto-flow:column;grid-template-columns:repeat(6, 1fr);justify-items:center;justify-self:stretch;row-gap:3px;column-gap:5px}@media(max-width: 850px){.agenda-virtual-row-timeslot{grid-auto-flow:row;grid-template-columns:auto}}.agenda-session{background-color:#000d28;border-radius:5px;display:grid;justify-self:stretch;justify-items:center;color:#fff;text-align:center;padding-left:10px;padding-right:10px;padding-top:10px;padding-bottom:10px;grid-template-rows:55px 20px 170px 50px}@media(max-width: 850px){.agenda-session{grid-template-rows:repeat(3, auto);padding-bottom:0px}}.agenda-session-subtitle{margin-bottom:11px;font-size:small}.agenda-row-style-loading{font-size:.8rem}.agenda-session-time,.agenda-session-room{font-size:.8rem;margin:3px;align-self:center}@media(max-width: 850px){.agenda-session-time{display:none}}.agenda-session-name{color:#990020}.agenda-session-image,.agenda-session-name,.agenda-session-title{margin:3px;font-weight:700}.agenda-session-image{padding:10px;max-width:150px}@media(max-width: 850px){.agenda-session-image{display:none}}.agenda-session-remote{font-size:.7rem;color:#19c3fc;display:none}.agenda-keynote-session>.agenda-session-remote{color:#000d28}.speaker-image{width:100%;border-radius:50%}@media(max-width: 850px){.speaker-image{display:none}}.multi-speaker-container{display:grid}.multi-speaker-image{grid-row:1;grid-column:1}.hide{display:none}.clickable-session{cursor:pointer}@media(max-width: 850px){.clickable-session{grid-template-rows:repeat(3, min-content)}}.unclickable-session{align-items:center}.popupBackdrop{width:100%;height:100%;position:fixed;top:0;left:0;background-color:rgba(0,0,0,.6509803922);display:grid;justify-items:center;align-items:center;z-index:600}.popupBackdropHidden{display:none}.popupClose{color:#fff;font-weight:800;font-size:2rem;justify-self:right;cursor:pointer;grid-area:closeButton;margin-right:13px}.popupBio{background-color:#fff;display:grid;grid-template-columns:repeat(2, 1fr);grid-template-rows:auto;grid-column-gap:10px;overflow-y:auto;height:500px;padding:30px;grid-area:content;scrollbar-color:#fc003d #000d28}.popupBio::-webkit-scrollbar{width:12px}.popupBio::-webkit-scrollbar-track{background:#000d28}.popupBio::-webkit-scrollbar-thumb{background:#fc003d;background:linear-gradient(0deg, rgb(252, 0, 61) 25%, rgb(25, 195, 252) 75%);border-radius:20px;border:0}@media(max-width: 850px){.popupBio{grid-template-columns:auto;padding:10px;grid-template-rows:repeat(2, auto)}}.popupBioLeft{display:grid;grid-template-rows:repeat(6, auto);row-gap:5px;align-content:start}.popupBioRight{display:grid;grid-template-rows:repeat(3, auto);row-gap:5px;align-content:start}.popupShare{display:grid;justify-items:end;align-items:end;grid-area:shareButton;margin-bottom:5px;cursor:pointer}.feedbackPopupContent{display:grid;grid-template-rows:auto auto;justify-items:center;max-width:100%;margin-top:49px;padding-left:5%;padding-right:5%;grid-template-areas:". closeButton" "content content"}.popupContent{display:grid;grid-template-rows:auto auto;justify-items:center;max-width:100%;margin-top:49px;padding-left:5%;padding-right:5%;grid-template-rows:auto auto;grid-template-columns:1fr auto auto;grid-template-areas:". shareButton closeButton" "content content content";grid-column-gap:25px;grid-row-gap:5px}.bio-title,.bio-speaker-bio-title,.bio-speaker{color:#ff3263;font-weight:800;padding-bottom:20px;padding-top:20px;font-size:1.5rem}.bio-title{justify-self:left}.bio-subtitle{justify-self:center;font-size:.8rem;line-height:1.3rem}.bio-tagline,.bio-speaker-bio,.bio-talk-description{font-size:.8rem;line-height:1.3rem}.bio-speaker{justify-self:center}@media(max-width: 850px){.bio-speaker{grid-column:unset;grid-row:unset}}.bio-social{justify-self:center;display:grid;grid-auto-flow:column;column-gap:10px}.bio-social img{height:35px}@media(max-width: 850px){.bio-social{grid-column:unset;grid-row:unset}}.bio-tagline{justify-self:center}@media(max-width: 850px){.bio-tagline{grid-column:unset;grid-row:unset}}@media(max-width: 850px){.bio-speaker-bio-title{grid-column:unset;grid-row:unset}}.bio-speaker-bio{margin-top:5px;margin-bottom:20px}@media(max-width: 850px){.bio-speaker-bio{grid-column:unset;grid-row:unset}}.bio-title{justify-self:center}@media(max-width: 850px){.bio-title{margin-top:5px;grid-column:unset;grid-row:unset}}@media(max-width: 850px){.bio-talk-description{grid-column:unset;grid-row:unset;margin-top:10px}}.bio-track{font-size:.8rem;align-self:center;justify-self:end}@media(max-width: 850px){.bio-track{grid-column:unset;grid-row:unset;margin-top:5px;justify-self:start}}.largePopupImage{grid-column:1/1;grid-row:1/1;align-self:center;border-radius:50%;border-radius:50%;width:200px;height:200px;justify-self:center}@media(max-width: 850px){.largePopupImage{grid-column:unset;grid-row:unset}}.agenda-keynote-session{background-color:unset;color:#000;font-size:1.3rem;grid-template-rows:unset}.agenda-keynote-session img.speaker-image{height:160px;width:unset}.agenda-session-header{justify-self:stretch;display:grid;grid-auto-flow:column;grid-template-columns:max-content max-content 1fr max-content max-content;padding:5px;font-size:1rem}.time-from-time{text-align:left}.time-from-arrow{text-align:left;margin-left:5px;margin-right:10px}.time-title{text-align:center}.time-to-arrow{text-align:right;margin-left:10px;margin-right:5px}.time-to-time{text-align:right}.agenda-title-spacer{margin-left:5px;margin-right:5px}@media(max-width: 600px){.agenda-title-spacer{display:none}}.agenda-session-underline{height:1px;background-color:#fc003d;width:80%;margin-top:10px}@media(min-width: 850px){.agenda-session-underline{display:none}}.feedbackBase{margin:20px;display:grid;grid-template-columns:repeat(4, 300px);justify-self:center;grid-column-gap:20px;grid-row-gap:10px}@media(max-width: 1300px){.feedbackBase{grid-template-columns:repeat(3, 300px)}}@media(max-width: 990px){.feedbackBase{grid-template-columns:repeat(2, 300px)}}@media(max-width: 640px){.feedbackBase{grid-template-columns:repeat(1, 300px)}}.feedbackButton{align-content:center;width:300px;height:150px;background:#fff;border-width:2px;border-radius:10px;border-style:solid;border-color:#000d28;color:#000d28;border-width:4px;text-align:center;cursor:pointer;display:grid;justify-content:center;row-gap:10px}.feedbackButton:hover{background:#e6e6e6}.feedbackButtonTitle{font-size:larger;font-weight:bold;color:#fc003d}.feedbackButtonWorkshop{font-size:small;padding-left:5px;padding-right:5px}.popupRatingClose{color:#fc003d;background-color:#fff;border-top-left-radius:10px;border-top-right-radius:10px;padding:5px;grid-area:closeButton;margin-right:15px}.feedbackPopup{width:75vw;max-height:75vh;background-color:#fff;display:grid;grid-template-rows:auto;grid-row-gap:10px;overflow-y:auto;padding:30px;align-content:start;border-top-left-radius:10px;border-bottom-right-radius:10px;border-bottom-left-radius:10px;overflow-x:hidden;grid-area:content;scrollbar-color:#fc003d #000d28}.feedbackPopup::-webkit-scrollbar{width:12px}.feedbackPopup::-webkit-scrollbar-track{background:#000d28}.feedbackPopup::-webkit-scrollbar-thumb{background:#fc003d;background:linear-gradient(0deg, rgb(252, 0, 61) 25%, rgb(25, 195, 252) 75%);border-radius:20px;border:0}.feedbackTitle{font-size:x-large;color:#fc003d}.rating{display:grid;grid-auto-flow:row}.rating datalist{display:flex;flex-direction:column;justify-content:space-between;writing-mode:vertical-lr}.rating option{padding:0}.rating input[type=range]{margin:0}.textFeedback{width:90%;height:100px;font-size:larger}.questionTitle{margin-bottom:5px}.questionBase{margin-bottom:10px}input[type=radio]{width:30px;height:30px;border-radius:30px;accent-color:#fc003d}.radioSet{display:grid;grid-auto-flow:column;align-items:center;grid-template-columns:45px 100px 45px 100px}.doneButton{width:300px;justify-self:center;font-size:large;border-radius:10px;border-color:#ff3263;background:#fc003d;color:#fff;padding:10px;cursor:pointer}.doneButton:hover{background:#ff3062}.doneButton:active{background:#c90031}.doneButton:disabled{background-color:#000d28}.saveButton{display:none;width:300px;justify-self:center;font-size:x-large;border-radius:10px;border-color:#ff3263;background:#fc003d;color:#fff;padding:10px;cursor:pointer}.saveButton:hover{background:#ff3062}.saveButton:active{background:#c90031}.saveButton:disabled{background-color:#000d28}select{font-size:larger;width:90%;border-color:#fc003d;padding:10px;background-color:#fff;border-width:1px}input[type=text]{font-size:larger;width:90%;border-color:#fc003d;padding:10px}input[type=email]{font-size:larger;width:90%;border-color:#fc003d;padding:10px}input[type=number]{font-size:larger;width:90%;border-color:#fc003d;padding:10px}.submitButtons{display:grid;grid-auto-flow:column;margin-bottom:40px}.loading{justify-self:center;grid-area:1/span 4;font-size:xx-large}.feedbackTable{border:1px solid #fff;text-align:center;border-collapse:collapse}.feedbackTable td,.feedbackTable th{border:1px solid #fff;padding:5px}.feedbackTable tr:nth-child(even){background:#d0e4f5;color:#000d28}.feedbackTable thead{background:#fc003d;border-bottom:5px solid #fff}.feedbackTable tfoot{color:#fff;background:#000d28;border-top:3px solid #19c3fc}input[type=range].styled-slider{height:2.2em;-webkit-appearance:none;appearance:none}input[type=range].styled-slider:focus{outline:none}input[type=range].styled-slider::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:2em;height:2em;border-radius:1em;background:#19c3fc;border:none;box-shadow:0 0 2px #000;margin-top:calc(max((1em - 1px - 1px)*.5,0px) - 1em)}input[type=range].styled-slider::-webkit-slider-runnable-track{height:1em;border:1px solid #b2b2b2;border-radius:.5em;background:#000d28;box-shadow:none}input[type=range].styled-slider::-webkit-slider-thumb:hover{background:#19c3fc}input[type=range].styled-slider:hover::-webkit-slider-runnable-track{background:#000d28;border-color:#9a9a9a}input[type=range].styled-slider::-webkit-slider-thumb:active{background:#19c3fc}input[type=range].styled-slider:active::-webkit-slider-runnable-track{background:#000d28;border-color:#c1c1c1}input[type=range].styled-slider::-moz-range-thumb{width:2em;height:2em;border-radius:1em;background:#19c3fc;border:none;box-shadow:0 0 2px #000}input[type=range].styled-slider::-moz-range-track{height:max(1em - 1px - 1px,0px);border:1px solid #b2b2b2;border-radius:.5em;background:#000d28;box-shadow:none}input[type=range].styled-slider::-moz-range-thumb:hover{background:#19c3fc}input[type=range].styled-slider:hover::-moz-range-track{background:#000d28;border-color:#9a9a9a}input[type=range].styled-slider::-moz-range-thumb:active{background:#19c3fc}input[type=range].styled-slider:active::-moz-range-track{background:#000d28;border-color:#c1c1c1}input[type=range].styled-slider::-ms-fill-upper{background:rgba(0,0,0,0);border-color:rgba(0,0,0,0)}input[type=range].styled-slider::-ms-fill-lower{background:rgba(0,0,0,0);border-color:rgba(0,0,0,0)}input[type=range].styled-slider::-ms-thumb{width:2em;height:2em;border-radius:1em;background:#19c3fc;border:none;box-shadow:0 0 2px #000;margin-top:0;box-sizing:border-box}input[type=range].styled-slider::-ms-track{height:1em;border-radius:.5em;background:#000d28;border:1px solid #b2b2b2;box-shadow:none;box-sizing:border-box}input[type=range].styled-slider::-ms-thumb:hover{background:#19c3fc}input[type=range].styled-slider:hover::-ms-track{background:#000d28;border-color:#9a9a9a}input[type=range].styled-slider::-ms-thumb:active{background:#19c3fc}input[type=range].styled-slider:active::-ms-track{background:#000d28;border-color:#c1c1c1}@keyframes TransitioningBackground{0%{background-position:1% 0%}50%{background-position:99% 100%}100%{background-position:1% 0%}}.shimmer{animation:TransitioningBackground 10s ease infinite;transition:.6s}.shimmer:hover{transform:scale(1.2);cursor:pointer}.shimmer:hover::before,.shimmer:hover::after{display:block;transform:translateX(300px) skewX(-15deg);transition:.7s}.history{display:grid;grid-auto-flow:column;grid-column-gap:10px;grid-row-gap:10px}@media(max-width: 850px){.history{grid-auto-flow:row}}.history>div{min-height:170px;background:#d3d3d3;width:250px;border-radius:10px;display:grid;align-items:center;justify-items:center}.history>div>a{display:grid;justify-items:center;align-items:center;grid-auto-flow:row;row-gap:5px}@font-face{font-family:"Armata";src:url("/public/Armata-Regular.ttf")}span.third{color:#9a76cf}span.pink{color:#ff3263}span.blue{color:#19c3fc}span.dark{color:#0a0a0a}a{color:#ff3263}a:hover{color:#ff658a}html{position:relative;min-height:100%;scrollbar-color:#fc003d #000d28}body{background-color:#fff;font-family:"Armata",Helvetica,"Segoe UI",Verdana,sans-serif;color:#0a0a0a;margin:0;font-size:1rem;margin-bottom:30px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased !important;-moz-font-smoothing:antialiased !important;text-rendering:optimizelegibility !important;letter-spacing:.03rem;scrollbar-color:#fc003d #000d28}body::-webkit-scrollbar{width:12px}body::-webkit-scrollbar-track{background:#000d28}body::-webkit-scrollbar-thumb{background:#fc003d;background:linear-gradient(0deg, rgb(252, 0, 61) 25%, rgb(25, 195, 252) 75%);border-radius:20px;border:0}.googleMapEmbed{width:560px;height:315px}@media(max-width: 850px){.googleMapEmbed{max-width:80vw;height:168.75px}}.youtubes{width:560px;height:315px}@media(max-width: 850px){.youtubes{max-width:80vw;height:168.75px}}.menu{background-color:#000d28;color:#fff;height:40px;padding:10px;display:grid;align-items:center;grid-template-columns:auto auto;font-weight:bolder;position:sticky;top:0;z-index:10000}.menu a{color:#fff;text-decoration:none}.menu a:hover{color:#ff3263}.menu .left{justify-self:start;align-self:baseline}.menu .right{justify-self:end}.menu .right-mobile-icon{display:none}@media(max-width: 850px){.menu .right-mobile-icon{display:grid;justify-content:end;cursor:pointer}}.menu .right-menu{display:grid;grid-auto-flow:column;grid-gap:10px;text-align:center;align-items:center}@media(max-width: 840px){.menu .right-menu{grid-template-columns:repeat(11, min-content)}}@media(max-width: 850px){.menu .right-menu{display:none;position:relative;z-index:10001}.menu .right-menu-open{display:grid;grid-auto-flow:row;background:#000d28;padding:20px;border-color:#b2002a;border-width:1px;border-style:solid;margin-top:5px;grid-row-gap:20px;grid-template-columns:unset}.menu .right-menu-open>div.spacer{display:none}}.menu .right .spacer{color:#c5c5c5}.date a{color:#000d28}.event-logo{height:200px;padding-bottom:15px;padding-top:15px}.hero{background-image:url("/public/images/Background_Web.jpg");background-color:#000d28;background-position:center;background-repeat:no-repeat;background-size:cover;padding-top:40px;padding-bottom:40px;display:grid;color:#fff;justify-content:center;text-align:center;grid-row-gap:30px;padding-left:10px;padding-right:10px}.hero .brand{display:grid;justify-items:center}.hero .brand img{max-width:80%;max-height:100px;object-fit:contain}.hero .slogan{margin-top:10px;margin-bottom:40px}.hero .intro{font-size:1rem;line-height:1.5rem;width:100%}.content{padding-top:15px;padding-bottom:15px;padding-left:20%;padding-right:20%}@media(max-width: 850px){.content{padding-left:5%;padding-right:5%}}.highlight{font-weight:bold;color:#fc003d}@media(min-width: 850px){.sponsor-content-detail-content-sponsor-card:not(:last-child){margin-right:10px}}.sponsor-content-detail-event-bananas{display:grid;grid-template-columns:auto auto auto;justify-items:center;grid-row-gap:50px}@media(max-width: 850px){.sponsor-content-detail-event-bananas{grid-template-columns:auto}}.sponsor-content-detail-event-bananas .event{display:grid;grid-row-gap:10px;justify-content:center;justify-items:center}@media(min-width: 850px){.sponsor-content-detail-event-bananas .event:not(:last-child){margin-right:50px}}.sponsor-content-detail-event-bananas .event .location-pink{color:#ff3263;text-transform:uppercase;padding-top:10px;font-weight:800;font-size:2rem;text-align:center}.sponsor-content-detail-event-bananas .event .location-blue{color:#19c3fc;text-transform:uppercase;padding-top:10px;font-weight:800;font-size:2rem;text-align:center}.sponsor-content-detail-event-bananas .event .location-third{color:#9a76cf;text-transform:uppercase;padding-top:10px;font-weight:800;font-size:2rem;text-align:center}.sponsor-content-detail-event-bananas .event a{background-color:#000d28;font-size:.8rem}.sponsor-content-detail-collapse{padding-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px}.sponsor-content-detail-workshop{max-width:75%;display:grid}.sponsor-content-detail-workshop>a.button{justify-self:center;margin-bottom:25px;padding-top:15px;padding-bottom:15px}.sponsor-content-detail-media{display:grid;grid-auto-flow:column;grid-auto-columns:200px;grid-column-gap:20px;grid-row-gap:20px;margin-bottom:20px;grid-template-rows:auto auto;grid-template-columns:auto;justify-items:center;line-height:1.5rem}.sponsor-content-detail-media-points{display:grid;grid-template-columns:auto auto;margin-top:30px}@media(max-width: 850px){.sponsor-content-detail-media-points{grid-template-columns:auto;grid-template-rows:repeat(2, auto)}}.sponsor-content-detail-media-points>div>img{height:250px;padding-bottom:20px}@media(max-width: 850px){.sponsor-content-detail-media-points>div>img{height:200px}}.sponsor-content-detail-media-points>div{display:grid;grid-template-columns:auto;grid-template-rows:repeat(3, auto);justify-items:center;padding:0px 20px}.sponsor-content-detail-media-points>div>div:nth-child(2){font-weight:bold}@media(max-width: 850px){.sponsor-content-detail-media{grid-auto-flow:row;grid-template-rows:auto auto auto;grid-template-columns:auto auto}}@media(max-width: 530px){.sponsor-content-detail-media{grid-template-columns:auto}}.sponsor-content-detail-media-full{display:grid;grid-row-gap:20px;grid-column-gap:20px;grid-auto-flow:row;grid-template-columns:repeat(3, auto)}.sponsor-content-detail-mailing-list{display:grid;text-align:center;justify-items:center;font-size:1rem}.sponsor-content-detail-mailing-list input[type=text]{max-width:500px;width:100%;padding:20px;border:none;margin-bottom:10px;font-family:"Armata",Helvetica,"Segoe UI",Verdana,sans-serif}.sponsor-content-detail-mailing-list input[type=text]::placeholder{color:#19c3fc}.sponsor-content-detail-mailing-list input[type=email]{max-width:500px;width:100%;padding:20px;border:none;margin-bottom:10px;font-family:"Armata",Helvetica,"Segoe UI",Verdana,sans-serif}.sponsor-content-detail-mailing-list input[type=email]::placeholder{color:#19c3fc}.sponsor-content-detail-mailing-list a{color:#19c3fc}.sponsor-content-detail-mailing-list a:hover{color:#03a8df}.sponsor-content-detail-mailing-list div.checkbox{display:grid;grid-template-columns:auto auto;align-items:center}.sponsor-content-detail-mailing-list div.checkbox input[type=checkbox]{width:20px;height:20px}.callforspeakers{height:100px;font-size:24px !important;line-height:3rem !important;background-image:linear-gradient(to left, #fc003d, #19c3fc)}.devugblurb{max-width:500px;width:100%;padding:20px}.card{border:1px solid #286eff;border-radius:5px;height:200px;width:200px;font-size:.7rem;font-variant-caps:all-small-caps;font-weight:bold;display:grid;align-items:end;background-color:#000d28;background-repeat:no-repeat;background-size:contain;background-position:center}.card .title{padding:5px;width:190px;margin-bottom:10px;background-color:rgba(0,0,0,.705);color:#fff}.smallerCard{border:1px solid #286eff;border-radius:5px;height:150px;width:150px;font-size:.7rem;font-variant-caps:all-small-caps;font-weight:bold;display:grid;align-items:end;background-color:#000d28;background-repeat:no-repeat;background-size:contain;background-position:center}.smallerCard .title{padding:5px;width:140px;margin-bottom:10px;background-color:rgba(0,0,0,.705);color:#fff}.contactus{display:grid}.contactus .contactDetails{align-self:stretch;display:grid;align-items:center;grid-template-columns:repeat(auto-fill, 200px)}.contactus .contactDetails a{color:#000d28}.contactus .contactDetails a:hover{color:#001e5b}.footer{background-color:#000d28;color:#fff;width:100%;position:absolute;bottom:0;font-size:.8rem;overflow-x:clip;align-items:center;display:grid;grid-auto-flow:column;justify-items:center}@media(max-width: 605px){.footer{font-size:.5rem}}.footer div>a>img{min-height:30px;min-width:30px;height:100%;width:100%}.footer>div:nth-child(1){margin-left:15px}.footer>div:nth-child(2){display:grid;align-items:center;grid-auto-flow:column;justify-items:end;margin-right:15px}@media(max-width: 768px){.footer>div:nth-child(2)>a:nth-child(1){visibility:hidden}}input[type=submit].button{font-family:"Armata",Helvetica,"Segoe UI",Verdana,sans-serif;background-image:linear-gradient(to right, #4bd0fd, #19c3fc);text-decoration:none;min-width:200px;display:grid;align-items:center;justify-content:center;border:none;text-align:center;font-size:.9rem;font-weight:800;border-radius:20px;padding:10px 20px;text-transform:uppercase;color:#fff;line-height:1rem;cursor:pointer}input[type=submit].button:hover{background-image:linear-gradient(to left, #4bd0fd, #19c3fc) !important}a.button-blue{font-family:"Armata",Helvetica,"Segoe UI",Verdana,sans-serif;background-image:linear-gradient(to right, #4bd0fd, #19c3fc);text-decoration:none;min-width:200px;display:grid;align-items:center;justify-content:center;border:none;text-align:center;font-size:.9rem;font-weight:800;border-radius:20px;padding:10px 20px;text-transform:uppercase;color:#fff;line-height:1rem;cursor:pointer}a.button-blue:hover{background-image:linear-gradient(to left, #4bd0fd, #19c3fc) !important}a.button{font-family:"Armata",Helvetica,"Segoe UI",Verdana,sans-serif;background-image:linear-gradient(to right, #ff3062, #fc003d);text-decoration:none;min-width:200px;display:grid;align-items:center;justify-content:center;border:none;text-align:center;font-size:.9rem;font-weight:800;border-radius:20px;padding:10px 20px;text-transform:uppercase;color:#fff;line-height:1rem;cursor:pointer}a.button:hover{background-image:linear-gradient(to left, #ff3062, #fc003d) !important}div.button{font-family:"Armata",Helvetica,"Segoe UI",Verdana,sans-serif;background-image:linear-gradient(to right, #001e5b, #000d28);text-decoration:none;min-width:200px;display:grid;align-items:center;justify-content:center;border:none;text-align:center;font-size:.9rem;font-weight:800;border-radius:20px;padding:10px 20px;text-transform:uppercase;color:#fff;line-height:1rem;cursor:pointer}div.button:hover{background-image:linear-gradient(to left, #001e5b, #000d28) !important}a.smalllink{font-size:.7rem;color:#000d28;text-decoration:underline}.nudgeDown{margin-top:50px}.soldOutFooter{font-size:.7em}.totallySoldOut{column-span:all;grid-column-start:1;grid-column-end:5}.banner{text-align:center;padding:6px;background-color:#e3d9b9;font-weight:bold;position:sticky;top:0}.keyboardUserGroup{color:#000d28} +.sponsor{overflow-x:clip;display:grid;grid-template-columns:1fr;grid-template-rows:250px repeat(5, auto);margin-bottom:40px}.sponsor a{text-decoration:none;text-align:center}@media(max-width: 850px){.sponsor{margin-bottom:30px}}.sponsor-home{grid-template-rows:auto repeat(5, auto)}.sponsor hr{width:90%;border-style:none;height:2px;background-color:#f4f4f4}.sponsor-fake-button{font-family:"Armata",Helvetica,"Segoe UI",Verdana,sans-serif;background-image:linear-gradient(to right, rgb(0, 29.575, 91), #000d28);text-decoration:none;min-width:200px;display:grid;align-items:center;justify-content:center;border:none;text-align:center;font-size:.9rem;font-weight:800;border-radius:20px;padding:10px 20px;text-transform:uppercase;color:#fff;line-height:1rem;cursor:pointer}.sponsor-fake-button:hover{background-image:linear-gradient(to left, rgb(0, 29.575, 91), #000d28) !important}.sponsor-button{margin-top:10px;margin-bottom:10px;font-family:"Armata",Helvetica,"Segoe UI",Verdana,sans-serif;background-image:linear-gradient(to right, rgb(0, 29.575, 91), #000d28);text-decoration:none;min-width:200px;display:grid;align-items:center;justify-content:center;border:none;text-align:center;font-size:.9rem;font-weight:800;border-radius:20px;padding:10px 20px;text-transform:uppercase;color:#fff;line-height:1rem;cursor:pointer;cursor:pointer}.sponsor-button:hover{background-image:linear-gradient(to left, rgb(0, 29.575, 91), #000d28) !important}.sponsor-title{width:100%;background-color:#ff3263;overflow:hidden;display:grid;grid-template-columns:1fr;grid-template-rows:1fr;padding-top:10px;color:#fff}.sponsor-title-ellipse{width:100vw;height:100vw;border-radius:50%;background-color:#000;opacity:.08;margin-top:20px;grid-row:1/1;grid-column:1/1;z-index:10}.sponsor-title-button{margin-top:30px}.sponsor-title-content{grid-row:1/1;grid-column:1/1;z-index:100;justify-self:center;font-size:3rem;text-align:center;margin-top:40px;justify-items:center;display:grid;grid-template-rows:repeat(4, minmax(0, min-content));grid-row-gap:10px;text-transform:uppercase;padding-left:10px;padding-right:10px}@media(max-width: 850px){.sponsor-title-content{font-size:2.1rem;margin-top:0}}.sponsor-title-content-sponsor{display:grid;justify-items:center}.sponsor-title-content-packages-intro{font-size:1rem;width:350px}.sponsor-title-content-package{margin-top:0}.sponsor-title-content-package-image{display:grid;justify-items:center;align-items:start;margin-top:-130px;z-index:150;margin-bottom:-40px}@media(max-width: 850px){.sponsor-title-content-package-image{display:none}}.sponsor-title-content-package-image>img{height:300px;margin-top:50px}.sponsor-title-content-second{width:100%;font-size:1.5rem;display:grid;grid-auto-flow:column;grid-template-columns:repeat(5, auto);align-items:center;justify-items:stretch;text-align:center}@media(max-width: 600px){.sponsor-title-content-second{grid-auto-flow:row;grid-template-columns:unset;font-size:1.3rem}}.sponsor-title-content-third{font-size:1rem}.sponsor-title-blue{width:100%;background-color:#19c3fc;overflow:hidden;display:grid;grid-template-columns:1fr;grid-template-rows:1fr;padding-top:10px;color:#fff}.sponsor-title-blue-ellipse{width:100vw;height:100vw;border-radius:50%;background-color:#000;opacity:.08;margin-top:20px;grid-row:1/1;grid-column:1/1;z-index:10}.sponsor-title-blue-button{margin-top:30px}.sponsor-title-blue-content{grid-row:1/1;grid-column:1/1;z-index:100;justify-self:center;font-size:3rem;text-align:center;margin-top:40px;justify-items:center;display:grid;grid-template-rows:repeat(4, minmax(0, min-content));grid-row-gap:10px;text-transform:uppercase;padding-left:10px;padding-right:10px}@media(max-width: 850px){.sponsor-title-blue-content{font-size:2.1rem;margin-top:0}}.sponsor-title-blue-content-sponsor{display:grid;justify-items:center}.sponsor-title-blue-content-packages-intro{font-size:1rem;width:350px}.sponsor-title-blue-content-package{margin-top:0}.sponsor-title-blue-content-package-image{display:grid;justify-items:center;align-items:start;margin-top:-130px;z-index:150;margin-bottom:-40px}@media(max-width: 850px){.sponsor-title-blue-content-package-image{display:none}}.sponsor-title-blue-content-package-image>img{height:300px;margin-top:50px}.sponsor-title-blue-content-second{width:100%;font-size:1.5rem;display:grid;grid-auto-flow:column;grid-template-columns:repeat(5, auto);align-items:center;justify-items:stretch;text-align:center}@media(max-width: 600px){.sponsor-title-blue-content-second{grid-auto-flow:row;grid-template-columns:unset;font-size:1.3rem}}.sponsor-title-blue-content-third{font-size:1rem}.sponsor-title-third{width:100%;background-color:#9a76cf;overflow:hidden;display:grid;grid-template-columns:1fr;grid-template-rows:1fr;padding-top:10px;color:#fff}.sponsor-title-third-ellipse{width:100vw;height:100vw;border-radius:50%;background-color:#000;opacity:.08;margin-top:20px;grid-row:1/1;grid-column:1/1;z-index:10}.sponsor-title-third-button{margin-top:30px}.sponsor-title-third-content{grid-row:1/1;grid-column:1/1;z-index:100;justify-self:center;font-size:3rem;text-align:center;margin-top:40px;justify-items:center;display:grid;grid-template-rows:repeat(4, minmax(0, min-content));grid-row-gap:10px;text-transform:uppercase;padding-left:10px;padding-right:10px}@media(max-width: 850px){.sponsor-title-third-content{font-size:2.1rem;margin-top:0}}.sponsor-title-third-content-sponsor{display:grid;justify-items:center}.sponsor-title-third-content-packages-intro{font-size:1rem;width:350px}.sponsor-title-third-content-package{margin-top:0}.sponsor-title-third-content-package-image{display:grid;justify-items:center;align-items:start;margin-top:-130px;z-index:150;margin-bottom:-40px}@media(max-width: 850px){.sponsor-title-third-content-package-image{display:none}}.sponsor-title-third-content-package-image>img{height:300px;margin-top:50px}.sponsor-title-third-content-second{width:100%;font-size:1.5rem;display:grid;grid-auto-flow:column;grid-template-columns:repeat(5, auto);align-items:center;justify-items:stretch;text-align:center}@media(max-width: 600px){.sponsor-title-third-content-second{grid-auto-flow:row;grid-template-columns:unset;font-size:1.3rem}}.sponsor-title-third-content-third{font-size:1rem}.sponsor-content-detail,.sponsor-content-detail-packages{display:grid;justify-items:center;padding-bottom:20px;padding-top:20px;padding-left:20px;padding-right:20px;grid-row-gap:20px;max-width:100vw}.sponsor-content-detail-wide-body{overflow-x:hidden;overflow-y:hidden;display:flex;grid-column-gap:20px;width:100%}.sponsor-content-detail-wide-body img{border-style:solid;border-width:1px;border-color:#fc003d;padding:5px;background-color:#fff;height:150px}.sponsor-content-detail-tickets{display:grid;justify-items:center;text-align:center;padding-left:15px;padding-right:15px}.sponsor-content-detail-tickets-cards{width:100%;display:grid;text-align:center;padding:25px 10px;background-color:#fff;grid-row-gap:5px;text-align:center;line-height:1.5rem;grid-template-columns:1fr 1fr 1fr;grid-template-rows:1fr;column-gap:30px;align-content:center}@media(max-width: 1280px){.sponsor-content-detail-tickets-cards{grid-template-columns:1fr 1fr;grid-template-rows:1fr 1fr}}@media(max-width: 850px){.sponsor-content-detail-tickets-cards{grid-template-columns:1fr;grid-template-rows:min-content min-content min-content min-content}}.sponsor-content-detail-tickets-cards-price{color:#ff3263;font-size:1rem !important;font-weight:800 !important}@media(max-width: 850px){.sponsor-content-detail-tickets-cards{grid-template-columns:auto}}.sponsor-content-detail-tickets-cards>div{display:grid;align-items:center;row-gap:5px;justify-items:center;background-color:#f4f4f4;padding:10px;border-radius:5px;grid-template-rows:min-content 1fr min-content min-content}.sponsor-content-detail-tickets-cards>div>div:nth-child(1){color:#ff3263;font-weight:800}.sponsor-content-detail-tickets-cards>div>div:nth-child(2){font-size:.8rem}.sponsor-content-detail-tickets-cards>div>div:nth-child(3){font-size:.8rem;font-weight:800}.sponsor-content-detail-tickets-cards>div>a{width:max-content}.sponsor-content-detail-location{display:grid;justify-items:center;text-align:center;grid-row-gap:20px}.sponsor-content-detail-packages{grid-column-gap:20px;grid-template-columns:1fr 1fr 1fr;grid-template-rows:auto;justify-items:stretch;padding-left:15%;padding-right:15%}.sponsor-content-detail-packages>div{padding-left:0;padding-right:0}@media(max-width: 850px){.sponsor-content-detail-packages{grid-template-columns:auto;grid-template-rows:auto auto}}.sponsor-content-detail-package-cards{display:grid;grid-column-gap:20px;grid-row-gap:20px;grid-template-columns:100%;grid-template-columns:repeat(auto-fill, minmax(250px, 1fr));justify-items:center;align-items:baseline}@media(min-width: 2350px){.sponsor-content-detail-package-cards{grid-template-columns:1fr 1fr 1fr}}.sponsor-content-detail-package-card{padding:25px 10px;background-color:#f4f4f4;border-radius:5px;color:#ff3263;display:grid;justify-items:center;grid-row-gap:5px;width:200px;text-align:center;line-height:1.5rem}.sponsor-content-detail-package-card>img{width:150px}@media(max-width: 850px){.sponsor-content-detail-package-card>img{display:none}}.sponsor-content-detail-package-card>div>div.sponsor-content-detail-package-card-remaining{font-weight:800;color:rgb(203,0,48.5219512195)}.sponsor-content-detail-package-card>div:nth-child(1),.sponsor-content-detail-package-card>div:nth-child(5),.sponsor-content-detail-package-card>div:nth-child(7){font-weight:800}.sponsor-content-detail-package-card-blue{padding:25px 10px;background-color:#f4f4f4;border-radius:5px;color:#19c3fc;display:grid;justify-items:center;grid-row-gap:5px;width:200px;text-align:center;line-height:1.5rem}.sponsor-content-detail-package-card-blue>img{width:150px}@media(max-width: 850px){.sponsor-content-detail-package-card-blue>img{display:none}}.sponsor-content-detail-package-card-blue>div>div.sponsor-content-detail-package-card-remaining{font-weight:800;color:rgb(2.2532188841,129.9356223176,172.7467811159)}.sponsor-content-detail-package-card-blue>div:nth-child(1),.sponsor-content-detail-package-card-blue>div:nth-child(5),.sponsor-content-detail-package-card-blue>div:nth-child(7){font-weight:800}.sponsor-content-detail-sponsors{display:grid;grid-template-columns:repeat(3, minmax(0, max-content));justify-items:center;grid-row-gap:10px}@media(max-width: 850px){.sponsor-content-detail-sponsors{grid-template-columns:auto}}.sponsor-content-detail-content-sponsor{display:grid;justify-items:center}.sponsor-content-detail-sponsor{border-color:#ff3263;border-width:1px;border-style:solid}.sponsor-content-detail-sponsor-level{display:grid;justify-items:center;margin-bottom:15px}.sponsor-content-detail-sponsor-level img{border-style:solid;border-width:1px;border-color:rgba(240,99,133,.2784313725);padding:5px}.sponsor-content-detail-sponsor-level a{color:rgba(0,0,0,0) !important}.sponsor-content-detail-sponsor-level a:hover{color:rgba(0,0,0,0) !important}.sponsor-content-detail-heading,.sponsor-content-detail-heading-pink,.sponsor-content-detail-heading-third{color:#19c3fc;text-transform:uppercase;padding-top:10px;font-weight:800;font-size:2rem;margin-bottom:15px;text-align:center}.sponsor-content-detail-heading-smaller{font-size:1.6rem}.sponsor-content-detail-heading-third{color:#9a76cf}.sponsor-content-detail-heading-pink{color:#ff3263}@media(min-width: 850px){.sponsor-content-detail-heading-attendees{text-align:left}}.sponsor-content-detail-termsAndConditions{font-size:.6rem}.sponsor-content-detail-mission{display:grid;grid-template-columns:repeat(4, 1fr);grid-template-rows:1fr;grid-column-gap:50px;line-height:1.5rem}.sponsor-content-detail-mission>div{text-align:center;display:grid;justify-items:center;grid-row-gap:20px;grid-template-rows:auto auto 1fr;grid-template-columns:auto}@media(max-width: 850px){.sponsor-content-detail-mission>div>img{display:none;grid-template-rows:0 auto}}@media(max-width: 850px){.sponsor-content-detail-mission{grid-template-rows:repeat(4, 1fr);grid-template-columns:1fr;grid-row-gap:5px}}.sponsor-content-detail-attendees{display:grid;grid-template-rows:auto;grid-template-columns:auto auto;justify-items:center;line-height:1.5rem}@media(max-width: 850px){.sponsor-content-detail-attendees{grid-template-columns:auto}.sponsor-content-detail-attendees>img{display:none}}.sponsor-content-detail-overview{display:grid;grid-template-rows:auto auto;grid-template-columns:minmax(auto, 350px) minmax(auto, 350px);justify-items:center;grid-row-gap:10px;grid-column-gap:50px;grid-auto-flow:column;line-height:1.5rem;margin-bottom:20px}@media(max-width: 850px){.sponsor-content-detail-overview{grid-auto-flow:row;grid-template-rows:repeat(6, auto);grid-template-columns:350px}}.sponsor-content-detail-overview>div:nth-child(1),.sponsor-content-detail-overview>div:nth-child(3),.sponsor-content-detail-overview>div:nth-child(5){color:#19c3fc;font-weight:800;margin-bottom:20px}.sponsor-content-detail-overview>div:nth-child(5){color:#9a76cf}.sponsor-content-detail-overview>div:nth-child(3){color:#ff3263}.sponsor-content-detail-overview>div:nth-child(2),.sponsor-content-detail-overview>div:nth-child(4),.sponsor-content-detail-overview>div:nth-child(6){border-radius:5px;color:#fff;padding:30px 20px;display:grid;grid-template-rows:repeat(4, auto);grid-template-columns:auto;justify-items:center;grid-row-gap:20px}.sponsor-content-detail-overview>div:nth-child(2)>div,.sponsor-content-detail-overview>div:nth-child(4)>div,.sponsor-content-detail-overview>div:nth-child(6)>div{display:grid;justify-items:center;grid-row-gap:5px;text-align:center}.sponsor-content-detail-overview>div:nth-child(2)>div>div:nth-child(odd),.sponsor-content-detail-overview>div:nth-child(4)>div>div:nth-child(odd),.sponsor-content-detail-overview>div:nth-child(6)>div>div:nth-child(odd){text-transform:uppercase;font-weight:800}.sponsor-content-detail-overview>div:nth-child(2){background-color:#19c3fc}.sponsor-content-detail-overview>div:nth-child(6){background-color:#9a76cf}.sponsor-content-detail-overview>div:nth-child(4){background-color:#ff3263}.sponsor-content-detail-reflection{display:grid;grid-template-columns:repeat(2, auto);grid-column-gap:20px;grid-template-rows:repeat(2, auto);grid-row-gap:20px;justify-items:center;margin-bottom:20px;line-height:1.5rem;padding-bottom:20px}@media(max-width: 850px){.sponsor-content-detail-reflection{grid-template-columns:auto;grid-template-rows:repeat(6, auto)}}.sponsor-content-detail-reflection>div{display:grid;grid-template-columns:auto;grid-template-rows:repeat(3, auto);justify-items:center;text-align:center}.sponsor-content-detail-reflection>div>img{width:250px;height:250px;padding:5%}.sponsor-content-detail-reflection>div:nth-child(2){font-size:1.1rem}.sponsor-content-detail-contact{display:grid;grid-template-columns:repeat(3, 1fr);justify-items:center;grid-column-gap:20px;line-height:1.5rem}@media(max-width: 850px){.sponsor-content-detail-contact{grid-template-rows:repeat(3, 1fr);grid-template-columns:auto;grid-row-gap:10px}}.sponsor-content-detail-contact>div{display:grid;grid-template-rows:repeat(3, auto);justify-items:center;grid-row-gap:5px}.sponsor-content-detail-contact>div>div:nth-child(1){font-weight:800}.sponsor-content-detail-introduction{justify-self:left;line-height:1.5rem}.sponsor-content-detail-brand{line-height:1.5rem;display:grid;grid-template-columns:1fr 1fr;grid-column-gap:50px}.sponsor-content-detail-brand>div:before{content:"• "}@media(max-width: 850px){.sponsor-content-detail-brand{grid-template-columns:1fr}}.sponsor-content-detail-expo{line-height:1.5rem;display:grid;grid-template-columns:1fr 1fr;grid-column-gap:50px}.sponsor-content-detail-expo>div:before{content:"• "}@media(max-width: 850px){.sponsor-content-detail-expo{grid-template-columns:1fr}}.sponsor-content-detail-expo-stand{text-align:center;font-size:.7rem}.sponsor-content-detail-expo-stand>a{font-size:1rem;display:grid;justify-items:center;row-gap:20px;text-align:center}.sponsor-content-detail-benefits{line-height:1.5rem;display:grid;grid-template-columns:1fr 1fr;grid-column-gap:50px}.sponsor-content-detail-benefits>div:before{content:"• "}@media(max-width: 850px){.sponsor-content-detail-benefits{grid-template-columns:1fr}}.sponsor-content-detail-exclusive{line-height:1.5rem;display:grid;grid-template-columns:1fr 1fr;grid-column-gap:50px}.sponsor-content-detail-exclusive>div:before{content:"• "}@media(max-width: 850px){.sponsor-content-detail-exclusive{grid-template-columns:1fr}}.sponsor-content-detail-white{background-color:#fff !important}.sponsor-content-detail:nth-child(odd),.sponsor-content-detail-packages:nth-child(odd){background-color:#000d28;color:#fff}.sponsor-content-detail:nth-child(even),.sponsor-content-detail-packages:nth-child(even){background-color:#fff}.sponsor .more-info{margin-top:10px;text-decoration:none}.sponsor-banana{height:100px;font-size:24px !important;background-image:linear-gradient(to left, #fc003d, #19c3fc);display:grid}.sponsor-banana>div{align-self:center}.sponsor-small-banana{height:50px;font-size:24px !important;background-image:linear-gradient(to left, #000d28, #19c3fc);display:grid}.sponsor-small-banana>div{align-self:center}img.sponsorLogo{max-width:unset}@media(max-width: 850px){img.sponsorLogo{max-width:80vw}}.collapseMe{height:0px;margin:0px;padding:0px}#agenda{line-height:1.3em;width:100%;display:grid;grid-auto-flow:row;justify-items:center;row-gap:3px;column-gap:5px;padding-bottom:5px;padding-left:2%;padding-right:2%;grid-template-rows:repeat(33, min-content);grid-template-columns:1fr 300px;grid-template-areas:"registration registration" "expo expo" "welcome welcome" "keynote keynote" "loading1 loading1" "break1 break1" "timeslot1 workshoptime1" "session1 workshop10" "loading2 workshop10" "movement1 workshop10" "timeslot2 workshop10" "session2 workshop10" "loading3 workshop10" "movement2 movement2" "timeslot3 ." "session3 ." "loading4 ." "lunch lunch" "timeslot4 workshoptime2" "session4 workshop20" "loading5 workshop20" "movement3 workshop20" "timeslot5 workshop20" "session5 workshop20" "loading6 workshop20" "break2 break2" "timeslot6 workshoptime3" "session6 workshop30" "loading7 workshop30" "movement4 workshop30" "timeslot7 workshop30" "session7 workshop30" "cocktail cocktail"}@media(max-width: 1220px){#agenda{grid-template-rows:unset;grid-template-columns:1fr;grid-template-areas:"registration" "expo" "welcome" "keynote" "loading1" "break1" "timeslot1" "session1" "loading2" "movement1" "timeslot2" "session2" "loading3" "movement2" "timeslot3" "session3" "lunch" "loading4" "timeslot4" "session4" "loading5" "movement3" "timeslot5" "session5" "loading6" "break2" "timeslot6" "session6" "loading7" "movement4" "timeslot7" "session7" "cocktail" "workshoptitle" "workshoptime1" "workshop10" "workshoptime2" "workshop20" "workshoptime3" "workshop30"}}.agenda>.hidden-row{display:none}.agenda-workshop-sponsor a{color:#000d28}.agenda-workshop-sponsor a:hover{color:rgb(0,29.575,91)}.agenda-workshop-title{display:none}@media(max-width: 1220px){.agenda-workshop-title{display:grid}}.agenda-workshop-time{margin-top:10px;font-size:smaller;font-weight:800;color:#001e5b}.agenda-workshop-content{font-size:smaller;margin-top:10px}.agenda-workshop{background-color:#0479a0;padding:10px;border-radius:5px;text-align:center;justify-self:stretch}.agenda-row-style-break{background-color:#ed3259;display:grid;justify-self:stretch;color:#fff;border-radius:5px;padding:5px;grid-auto-flow:column;justify-content:stretch;align-items:center;padding:10px;font-size:.8rem;grid-template-columns:max-content max-content 1fr max-content max-content}.agenda-row-style-key{background-color:#990020;display:grid;justify-self:stretch;color:#fff;border-radius:5px;padding:5px;grid-auto-flow:column;justify-content:stretch;align-items:center;font-size:.8rem;padding:10px;grid-template-columns:max-content max-content 1fr max-content max-content}.agenda-row-style-highlight{background-color:#ff3263;display:grid;justify-self:stretch;color:#fff;border-radius:5px;padding:5px;grid-auto-flow:column;justify-content:stretch;align-items:center;font-size:1rem;padding:10px;grid-template-columns:max-content max-content 1fr max-content max-content}.agenda-row-style-keynote{background-color:#19c3fc;display:grid;justify-self:stretch;color:#fff;border-radius:5px;padding:5px;grid-auto-flow:column;justify-content:stretch;align-items:center;justify-content:unset;grid-auto-flow:row}.agenda-row-timeslot{display:grid;grid-auto-flow:column;grid-template-columns:repeat(5, 1fr);justify-items:center;row-gap:3px;column-gap:5px}@media(max-width: 850px){.agenda-row-timeslot{grid-auto-flow:row;grid-template-columns:auto}}.agenda-virtual-row-timeslot{display:grid;grid-auto-flow:column;grid-template-columns:repeat(6, 1fr);justify-items:center;justify-self:stretch;row-gap:3px;column-gap:5px}@media(max-width: 850px){.agenda-virtual-row-timeslot{grid-auto-flow:row;grid-template-columns:auto}}.agenda-session{background-color:#000d28;border-radius:5px;display:grid;justify-self:stretch;justify-items:center;color:#fff;text-align:center;padding-left:10px;padding-right:10px;padding-top:10px;padding-bottom:10px;grid-template-rows:55px 20px 170px 50px}@media(max-width: 850px){.agenda-session{grid-template-rows:repeat(3, auto);padding-bottom:0px}}.agenda-session-subtitle{margin-bottom:11px;font-size:small}.agenda-row-style-loading{font-size:.8rem}.agenda-session-time,.agenda-session-room{font-size:.8rem;margin:3px;align-self:center}@media(max-width: 850px){.agenda-session-time{display:none}}.agenda-session-name{color:#990020}.agenda-session-image,.agenda-session-name,.agenda-session-title{margin:3px;font-weight:700}.agenda-session-image{padding:10px;max-width:150px}@media(max-width: 850px){.agenda-session-image{display:none}}.agenda-session-remote{font-size:.7rem;color:#19c3fc;display:none}.agenda-keynote-session>.agenda-session-remote{color:#000d28}.speaker-image{width:100%;border-radius:50%}@media(max-width: 850px){.speaker-image{display:none}}.multi-speaker-container{display:grid}.multi-speaker-image{grid-row:1;grid-column:1}.hide{display:none}.clickable-session{cursor:pointer}@media(max-width: 850px){.clickable-session{grid-template-rows:repeat(3, min-content)}}.unclickable-session{align-items:center}.popupBackdrop{width:100%;height:100%;position:fixed;top:0;left:0;background-color:rgba(0,0,0,.6509803922);display:grid;justify-items:center;align-items:center;z-index:600}.popupBackdropHidden{display:none}.popupClose{color:#fff;font-weight:800;font-size:2rem;justify-self:right;cursor:pointer;grid-area:closeButton;margin-right:13px}.popupBio{background-color:#fff;display:grid;grid-template-columns:repeat(2, 1fr);grid-template-rows:auto;grid-column-gap:10px;overflow-y:auto;height:500px;padding:30px;grid-area:content;scrollbar-color:#fc003d #000d28}.popupBio::-webkit-scrollbar{width:12px}.popupBio::-webkit-scrollbar-track{background:#000d28}.popupBio::-webkit-scrollbar-thumb{background:#fc003d;background:linear-gradient(0deg, rgb(252, 0, 61) 25%, rgb(25, 195, 252) 75%);border-radius:20px;border:0}@media(max-width: 850px){.popupBio{grid-template-columns:auto;padding:10px;grid-template-rows:repeat(2, auto)}}.popupBioLeft{display:grid;grid-template-rows:repeat(6, auto);row-gap:5px;align-content:start}.popupBioRight{display:grid;grid-template-rows:repeat(3, auto);row-gap:5px;align-content:start}.popupShare{display:grid;justify-items:end;align-items:end;grid-area:shareButton;margin-bottom:5px;cursor:pointer}.feedbackPopupContent{display:grid;grid-template-rows:auto auto;justify-items:center;max-width:100%;margin-top:49px;padding-left:5%;padding-right:5%;grid-template-areas:". closeButton" "content content"}.popupContent{display:grid;grid-template-rows:auto auto;justify-items:center;max-width:100%;margin-top:49px;padding-left:5%;padding-right:5%;grid-template-rows:auto auto;grid-template-columns:1fr auto auto;grid-template-areas:". shareButton closeButton" "content content content";grid-column-gap:25px;grid-row-gap:5px}.bio-title,.bio-speaker-bio-title,.bio-speaker{color:#ff3263;font-weight:800;padding-bottom:20px;padding-top:20px;font-size:1.5rem}.bio-title{justify-self:left}.bio-subtitle{justify-self:center;font-size:.8rem;line-height:1.3rem}.bio-tagline,.bio-speaker-bio,.bio-talk-description{font-size:.8rem;line-height:1.3rem}.bio-speaker{justify-self:center}@media(max-width: 850px){.bio-speaker{grid-column:unset;grid-row:unset}}.bio-social{justify-self:center;display:grid;grid-auto-flow:column;column-gap:10px}.bio-social img{height:35px}@media(max-width: 850px){.bio-social{grid-column:unset;grid-row:unset}}.bio-tagline{justify-self:center}@media(max-width: 850px){.bio-tagline{grid-column:unset;grid-row:unset}}@media(max-width: 850px){.bio-speaker-bio-title{grid-column:unset;grid-row:unset}}.bio-speaker-bio{margin-top:5px;margin-bottom:20px}@media(max-width: 850px){.bio-speaker-bio{grid-column:unset;grid-row:unset}}.bio-title{justify-self:center}@media(max-width: 850px){.bio-title{margin-top:5px;grid-column:unset;grid-row:unset}}@media(max-width: 850px){.bio-talk-description{grid-column:unset;grid-row:unset;margin-top:10px}}.bio-track{font-size:.8rem;align-self:center;justify-self:end}@media(max-width: 850px){.bio-track{grid-column:unset;grid-row:unset;margin-top:5px;justify-self:start}}.largePopupImage{grid-column:1/1;grid-row:1/1;align-self:center;border-radius:50%;border-radius:50%;width:200px;height:200px;justify-self:center}@media(max-width: 850px){.largePopupImage{grid-column:unset;grid-row:unset}}.agenda-keynote-session{background-color:unset;color:#000;font-size:1.3rem;grid-template-rows:unset}.agenda-keynote-session img.speaker-image{height:160px;width:unset}.agenda-session-header{justify-self:stretch;display:grid;grid-auto-flow:column;grid-template-columns:max-content max-content 1fr max-content max-content;padding:5px;font-size:1rem}.time-from-time{text-align:left}.time-from-arrow{text-align:left;margin-left:5px;margin-right:10px}.time-title{text-align:center}.time-to-arrow{text-align:right;margin-left:10px;margin-right:5px}.time-to-time{text-align:right}.agenda-title-spacer{margin-left:5px;margin-right:5px}@media(max-width: 600px){.agenda-title-spacer{display:none}}.agenda-session-underline{height:1px;background-color:#fc003d;width:80%;margin-top:10px}@media(min-width: 850px){.agenda-session-underline{display:none}}.feedbackBase{margin:20px;display:grid;grid-template-columns:repeat(4, 300px);justify-self:center;grid-column-gap:20px;grid-row-gap:10px}@media(max-width: 1300px){.feedbackBase{grid-template-columns:repeat(3, 300px)}}@media(max-width: 990px){.feedbackBase{grid-template-columns:repeat(2, 300px)}}@media(max-width: 640px){.feedbackBase{grid-template-columns:repeat(1, 300px)}}.feedbackButton{align-content:center;width:300px;height:150px;background:#fff;border-width:2px;border-radius:10px;border-style:solid;border-color:#000d28;color:#000d28;border-width:4px;text-align:center;cursor:pointer;display:grid;justify-content:center;row-gap:10px}.feedbackButton:hover{background:hsl(0,0%,90%)}.feedbackButtonTitle{font-size:larger;font-weight:bold;color:#fc003d}.feedbackButtonWorkshop{font-size:small;padding-left:5px;padding-right:5px}.popupRatingClose{color:#fc003d;background-color:#fff;border-top-left-radius:10px;border-top-right-radius:10px;padding:5px;grid-area:closeButton;margin-right:15px}.feedbackPopup{width:75vw;max-height:75vh;background-color:#fff;display:grid;grid-template-rows:auto;grid-row-gap:10px;overflow-y:auto;padding:30px;align-content:start;border-top-left-radius:10px;border-bottom-right-radius:10px;border-bottom-left-radius:10px;overflow-x:hidden;grid-area:content;scrollbar-color:#fc003d #000d28}.feedbackPopup::-webkit-scrollbar{width:12px}.feedbackPopup::-webkit-scrollbar-track{background:#000d28}.feedbackPopup::-webkit-scrollbar-thumb{background:#fc003d;background:linear-gradient(0deg, rgb(252, 0, 61) 25%, rgb(25, 195, 252) 75%);border-radius:20px;border:0}.feedbackTitle{font-size:x-large;color:#fc003d}.rating{display:grid;grid-auto-flow:row}.rating datalist{display:flex;flex-direction:column;justify-content:space-between;writing-mode:vertical-lr}.rating option{padding:0}.rating input[type=range]{margin:0}.textFeedback{width:90%;height:100px;font-size:larger}.questionTitle{margin-bottom:5px}.questionBase{margin-bottom:10px}input[type=radio]{width:30px;height:30px;border-radius:30px;accent-color:#fc003d}.radioSet{display:grid;grid-auto-flow:column;align-items:center;grid-template-columns:45px 100px 45px 100px}.doneButton{width:300px;justify-self:center;font-size:large;border-radius:10px;border-color:#ff3263;background:#fc003d;color:#fff;padding:10px;cursor:pointer}.doneButton:hover{background:rgb(255,48,98.1071428571)}.doneButton:active{background:rgb(201,0,48.6547619048)}.doneButton:disabled{background-color:#000d28}.saveButton{display:none;width:300px;justify-self:center;font-size:x-large;border-radius:10px;border-color:#ff3263;background:#fc003d;color:#fff;padding:10px;cursor:pointer}.saveButton:hover{background:rgb(255,48,98.1071428571)}.saveButton:active{background:rgb(201,0,48.6547619048)}.saveButton:disabled{background-color:#000d28}select{font-size:larger;width:90%;border-color:#fc003d;padding:10px;background-color:#fff;border-width:1px}input[type=text]{font-size:larger;width:90%;border-color:#fc003d;padding:10px}input[type=email]{font-size:larger;width:90%;border-color:#fc003d;padding:10px}input[type=number]{font-size:larger;width:90%;border-color:#fc003d;padding:10px}.submitButtons{display:grid;grid-auto-flow:column;margin-bottom:40px}.loading{justify-self:center;grid-area:1/span 4;font-size:xx-large}.feedbackTable{border:1px solid #fff;text-align:center;border-collapse:collapse}.feedbackTable td,.feedbackTable th{border:1px solid #fff;padding:5px}.feedbackTable tr:nth-child(even){background:#d0e4f5;color:#000d28}.feedbackTable thead{background:#fc003d;border-bottom:5px solid #fff}.feedbackTable tfoot{color:#fff;background:#000d28;border-top:3px solid #19c3fc}input[type=range].styled-slider{height:2.2em;-webkit-appearance:none;appearance:none}input[type=range].styled-slider:focus{outline:none}input[type=range].styled-slider::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:2em;height:2em;border-radius:1em;background:#19c3fc;border:none;box-shadow:0 0 2px #000;margin-top:calc(max((1em - 1px - 1px)*.5,0px) - 1em)}input[type=range].styled-slider::-webkit-slider-runnable-track{height:1em;border:1px solid #b2b2b2;border-radius:.5em;background:#000d28;box-shadow:none}input[type=range].styled-slider::-webkit-slider-thumb:hover{background:#19c3fc}input[type=range].styled-slider:hover::-webkit-slider-runnable-track{background:#000d28;border-color:#9a9a9a}input[type=range].styled-slider::-webkit-slider-thumb:active{background:#19c3fc}input[type=range].styled-slider:active::-webkit-slider-runnable-track{background:#000d28;border-color:#c1c1c1}input[type=range].styled-slider::-moz-range-thumb{width:2em;height:2em;border-radius:1em;background:#19c3fc;border:none;box-shadow:0 0 2px #000}input[type=range].styled-slider::-moz-range-track{height:max(1em - 1px - 1px,0px);border:1px solid #b2b2b2;border-radius:.5em;background:#000d28;box-shadow:none}input[type=range].styled-slider::-moz-range-thumb:hover{background:#19c3fc}input[type=range].styled-slider:hover::-moz-range-track{background:#000d28;border-color:#9a9a9a}input[type=range].styled-slider::-moz-range-thumb:active{background:#19c3fc}input[type=range].styled-slider:active::-moz-range-track{background:#000d28;border-color:#c1c1c1}input[type=range].styled-slider::-ms-fill-upper{background:rgba(0,0,0,0);border-color:rgba(0,0,0,0)}input[type=range].styled-slider::-ms-fill-lower{background:rgba(0,0,0,0);border-color:rgba(0,0,0,0)}input[type=range].styled-slider::-ms-thumb{width:2em;height:2em;border-radius:1em;background:#19c3fc;border:none;box-shadow:0 0 2px #000;margin-top:0;box-sizing:border-box}input[type=range].styled-slider::-ms-track{height:1em;border-radius:.5em;background:#000d28;border:1px solid #b2b2b2;box-shadow:none;box-sizing:border-box}input[type=range].styled-slider::-ms-thumb:hover{background:#19c3fc}input[type=range].styled-slider:hover::-ms-track{background:#000d28;border-color:#9a9a9a}input[type=range].styled-slider::-ms-thumb:active{background:#19c3fc}input[type=range].styled-slider:active::-ms-track{background:#000d28;border-color:#c1c1c1}@keyframes TransitioningBackground{0%{background-position:1% 0%}50%{background-position:99% 100%}100%{background-position:1% 0%}}.shimmer{animation:TransitioningBackground 10s ease infinite;transition:.6s}.shimmer:hover{transform:scale(1.2);cursor:pointer}.shimmer:hover::before,.shimmer:hover::after{display:block;transform:translateX(300px) skewX(-15deg);transition:.7s}.history{display:grid;grid-auto-flow:column;grid-column-gap:10px;grid-row-gap:10px}@media(max-width: 850px){.history{grid-auto-flow:row}}.history>div{min-height:170px;background:#d3d3d3;width:250px;border-radius:10px;display:grid;align-items:center;justify-items:center}.history>div>a{display:grid;justify-items:center;align-items:center;grid-auto-flow:row;row-gap:5px}@font-face{font-family:"Armata";src:url("/public/Armata-Regular.ttf")}span.third{color:#9a76cf}span.pink{color:#ff3263}span.blue{color:#19c3fc}span.dark{color:#0a0a0a}a{color:#ff3263}a:hover{color:rgb(255,101,137.8097560976)}html{position:relative;min-height:100%;scrollbar-color:#fc003d #000d28}body{background-color:#fff;font-family:"Armata",Helvetica,"Segoe UI",Verdana,sans-serif;color:#0a0a0a;margin:0;font-size:1rem;margin-bottom:30px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased !important;-moz-font-smoothing:antialiased !important;text-rendering:optimizelegibility !important;letter-spacing:.03rem;scrollbar-color:#fc003d #000d28}body::-webkit-scrollbar{width:12px}body::-webkit-scrollbar-track{background:#000d28}body::-webkit-scrollbar-thumb{background:#fc003d;background:linear-gradient(0deg, rgb(252, 0, 61) 25%, rgb(25, 195, 252) 75%);border-radius:20px;border:0}.googleMapEmbed{width:560px;height:315px}@media(max-width: 850px){.googleMapEmbed{max-width:80vw;height:168.75px}}.youtubes{width:560px;height:315px}@media(max-width: 850px){.youtubes{max-width:80vw;height:168.75px}}.menu{background-color:#000d28;color:#fff;height:40px;padding:10px;display:grid;align-items:center;grid-template-columns:auto auto;font-weight:bolder;position:sticky;top:0;z-index:10000}.menu a{color:#fff;text-decoration:none}.menu a:hover{color:#ff3263}.menu .left{justify-self:start;align-self:baseline}.menu .right{justify-self:end}.menu .right-mobile-icon{display:none}@media(max-width: 850px){.menu .right-mobile-icon{display:grid;justify-content:end;cursor:pointer}}.menu .right-menu{display:grid;grid-auto-flow:column;grid-gap:10px;text-align:center;align-items:center}@media(max-width: 840px){.menu .right-menu{grid-template-columns:repeat(11, min-content)}}@media(max-width: 850px){.menu .right-menu{display:none;position:relative;z-index:10001}.menu .right-menu-open{display:grid;grid-auto-flow:row;background:#000d28;padding:20px;border-color:rgb(177.5,0,42.4268292683);border-width:1px;border-style:solid;margin-top:5px;grid-row-gap:20px;grid-template-columns:unset}.menu .right-menu-open>div.spacer{display:none}}.menu .right .spacer{color:#c5c5c5}.date a{color:#000d28}.event-logo{height:200px;padding-bottom:15px;padding-top:15px}.hero{background-image:url("/public/images/Background_Web.jpg");background-color:#000d28;background-position:center;background-repeat:no-repeat;background-size:cover;padding-top:40px;padding-bottom:40px;display:grid;color:#fff;justify-content:center;text-align:center;grid-row-gap:30px;padding-left:10px;padding-right:10px}.hero .brand{display:grid;justify-items:center}.hero .brand img{max-width:80%;max-height:100px;object-fit:contain}.hero .slogan{margin-top:10px;margin-bottom:40px}.hero .intro{font-size:1rem;line-height:1.5rem;width:100%}.content{padding-top:15px;padding-bottom:15px;padding-left:20%;padding-right:20%}@media(max-width: 850px){.content{padding-left:5%;padding-right:5%}}.highlight{font-weight:bold;color:#fc003d}@media(min-width: 850px){.sponsor-content-detail-content-sponsor-card:not(:last-child){margin-right:10px}}.sponsor-content-detail-event-bananas{display:grid;grid-template-columns:auto auto auto;justify-items:center;grid-row-gap:50px}@media(max-width: 850px){.sponsor-content-detail-event-bananas{grid-template-columns:auto}}.sponsor-content-detail-event-bananas .event{display:grid;grid-row-gap:10px;justify-content:center;justify-items:center}@media(min-width: 850px){.sponsor-content-detail-event-bananas .event:not(:last-child){margin-right:50px}}.sponsor-content-detail-event-bananas .event .location-pink{color:#ff3263;text-transform:uppercase;padding-top:10px;font-weight:800;font-size:2rem;text-align:center}.sponsor-content-detail-event-bananas .event .location-blue{color:#19c3fc;text-transform:uppercase;padding-top:10px;font-weight:800;font-size:2rem;text-align:center}.sponsor-content-detail-event-bananas .event .location-third{color:#9a76cf;text-transform:uppercase;padding-top:10px;font-weight:800;font-size:2rem;text-align:center}.sponsor-content-detail-event-bananas .event a{background-color:#000d28;font-size:.8rem}.sponsor-content-detail-collapse{padding-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px}.sponsor-content-detail-workshop{max-width:75%;display:grid}.sponsor-content-detail-workshop>a.button{justify-self:center;margin-bottom:25px;padding-top:15px;padding-bottom:15px}.sponsor-content-detail-media{display:grid;grid-auto-flow:column;grid-auto-columns:200px;grid-column-gap:20px;grid-row-gap:20px;margin-bottom:20px;grid-template-rows:auto auto;grid-template-columns:auto;justify-items:center;line-height:1.5rem}.sponsor-content-detail-media-points{display:grid;grid-template-columns:auto auto;margin-top:30px}@media(max-width: 850px){.sponsor-content-detail-media-points{grid-template-columns:auto;grid-template-rows:repeat(2, auto)}}.sponsor-content-detail-media-points>div>img{height:250px;padding-bottom:20px}@media(max-width: 850px){.sponsor-content-detail-media-points>div>img{height:200px}}.sponsor-content-detail-media-points>div{display:grid;grid-template-columns:auto;grid-template-rows:repeat(3, auto);justify-items:center;padding:0px 20px}.sponsor-content-detail-media-points>div>div:nth-child(2){font-weight:bold}@media(max-width: 850px){.sponsor-content-detail-media{grid-auto-flow:row;grid-template-rows:auto auto auto;grid-template-columns:auto auto}}@media(max-width: 530px){.sponsor-content-detail-media{grid-template-columns:auto}}.sponsor-content-detail-media-full{display:grid;grid-row-gap:20px;grid-column-gap:20px;grid-auto-flow:row;grid-template-columns:repeat(3, auto)}.sponsor-content-detail-mailing-list{display:grid;text-align:center;justify-items:center;font-size:1rem}.sponsor-content-detail-mailing-list input[type=text]{max-width:500px;width:100%;padding:20px;border:none;margin-bottom:10px;font-family:"Armata",Helvetica,"Segoe UI",Verdana,sans-serif}.sponsor-content-detail-mailing-list input[type=text]::placeholder{color:#19c3fc}.sponsor-content-detail-mailing-list input[type=email]{max-width:500px;width:100%;padding:20px;border:none;margin-bottom:10px;font-family:"Armata",Helvetica,"Segoe UI",Verdana,sans-serif}.sponsor-content-detail-mailing-list input[type=email]::placeholder{color:#19c3fc}.sponsor-content-detail-mailing-list a{color:#19c3fc}.sponsor-content-detail-mailing-list a:hover{color:rgb(2.9098712446,167.8025751073,223.0901287554)}.sponsor-content-detail-mailing-list div.checkbox{display:grid;grid-template-columns:auto auto;align-items:center}.sponsor-content-detail-mailing-list div.checkbox input[type=checkbox]{width:20px;height:20px}.callforspeakers{height:100px;font-size:24px !important;line-height:3rem !important;background-image:linear-gradient(to left, #fc003d, #19c3fc)}.devugblurb{max-width:500px;width:100%;padding:20px}.card{border:1px solid rgb(40,109.875,255);border-radius:5px;height:200px;width:200px;font-size:.7rem;font-variant-caps:all-small-caps;font-weight:bold;display:grid;align-items:end;background-color:#000d28;background-repeat:no-repeat;background-size:contain;background-position:center}.card .title{padding:5px;width:190px;margin-bottom:10px;background-color:rgba(0,0,0,.705);color:#fff}.smallerCard{border:1px solid rgb(40,109.875,255);border-radius:5px;height:150px;width:150px;font-size:.7rem;font-variant-caps:all-small-caps;font-weight:bold;display:grid;align-items:end;background-color:#000d28;background-repeat:no-repeat;background-size:contain;background-position:center}.smallerCard .title{padding:5px;width:140px;margin-bottom:10px;background-color:rgba(0,0,0,.705);color:#fff}.contactus{display:grid}.contactus .contactDetails{align-self:stretch;display:grid;align-items:center;grid-template-columns:repeat(auto-fill, 200px)}.contactus .contactDetails a{color:#000d28}.contactus .contactDetails a:hover{color:rgb(0,29.575,91)}.footer{background-color:#000d28;color:#fff;width:100%;position:absolute;bottom:0;font-size:.8rem;overflow-x:clip;align-items:center;display:grid;grid-auto-flow:column;justify-items:center}@media(max-width: 605px){.footer{font-size:.5rem}}.footer div>a>img{min-height:30px;min-width:30px;height:100%;width:100%}.footer>div:nth-child(1){margin-left:15px}.footer>div:nth-child(2){display:grid;align-items:center;grid-auto-flow:column;justify-items:end;margin-right:15px}@media(max-width: 768px){.footer>div:nth-child(2)>a:nth-child(1){visibility:hidden}}input[type=submit].button{font-family:"Armata",Helvetica,"Segoe UI",Verdana,sans-serif;background-image:linear-gradient(to right, rgb(75.3433476395, 208.1330472103, 252.6566523605), #19c3fc);text-decoration:none;min-width:200px;display:grid;align-items:center;justify-content:center;border:none;text-align:center;font-size:.9rem;font-weight:800;border-radius:20px;padding:10px 20px;text-transform:uppercase;color:#fff;line-height:1rem;cursor:pointer}input[type=submit].button:hover{background-image:linear-gradient(to left, rgb(75.3433476395, 208.1330472103, 252.6566523605), #19c3fc) !important}a.button-blue{font-family:"Armata",Helvetica,"Segoe UI",Verdana,sans-serif;background-image:linear-gradient(to right, rgb(75.3433476395, 208.1330472103, 252.6566523605), #19c3fc);text-decoration:none;min-width:200px;display:grid;align-items:center;justify-content:center;border:none;text-align:center;font-size:.9rem;font-weight:800;border-radius:20px;padding:10px 20px;text-transform:uppercase;color:#fff;line-height:1rem;cursor:pointer}a.button-blue:hover{background-image:linear-gradient(to left, rgb(75.3433476395, 208.1330472103, 252.6566523605), #19c3fc) !important}a.button{font-family:"Armata",Helvetica,"Segoe UI",Verdana,sans-serif;background-image:linear-gradient(to right, rgb(255, 48, 98.1071428571), #fc003d);text-decoration:none;min-width:200px;display:grid;align-items:center;justify-content:center;border:none;text-align:center;font-size:.9rem;font-weight:800;border-radius:20px;padding:10px 20px;text-transform:uppercase;color:#fff;line-height:1rem;cursor:pointer}a.button:hover{background-image:linear-gradient(to left, rgb(255, 48, 98.1071428571), #fc003d) !important}div.button{font-family:"Armata",Helvetica,"Segoe UI",Verdana,sans-serif;background-image:linear-gradient(to right, rgb(0, 29.575, 91), #000d28);text-decoration:none;min-width:200px;display:grid;align-items:center;justify-content:center;border:none;text-align:center;font-size:.9rem;font-weight:800;border-radius:20px;padding:10px 20px;text-transform:uppercase;color:#fff;line-height:1rem;cursor:pointer}div.button:hover{background-image:linear-gradient(to left, rgb(0, 29.575, 91), #000d28) !important}a.smalllink{font-size:.7rem;color:#000d28;text-decoration:underline}.nudgeDown{margin-top:50px}.soldOutFooter{font-size:.7em}.totallySoldOut{column-span:all;grid-column-start:1;grid-column-end:5}.banner{text-align:center;padding:6px;background-color:#e3d9b9;font-weight:bold;position:sticky;top:0}.keyboardUserGroup{color:#000d28} diff --git a/public/docs/DevConf 2025 Sponsorship Proposal.pdf b/public/docs/DevConf 2025 Sponsorship Proposal.pdf index 5bd7c890..67ac6134 100644 Binary files a/public/docs/DevConf 2025 Sponsorship Proposal.pdf and b/public/docs/DevConf 2025 Sponsorship Proposal.pdf differ diff --git a/scripts/devconf.js b/scripts/devconf.js index dec040f5..54220dff 100644 --- a/scripts/devconf.js +++ b/scripts/devconf.js @@ -1,2 +1,2 @@ -(()=>{"use strict";const e="https://ratings-2slkxdorza-nw.a.run.app",t=e=>document.getElementById(e)?.cloneNode(!0)?.content,n=(e,t,n)=>{e.querySelector(t).innerText=n},r=(e,t,n,r,o,a,i)=>{const s=()=>{window.currentSpeaker=void 0,document.querySelector("div.popupBackdrop").classList.add("popupBackdropHidden"),document.removeEventListener("keydown",c);const e=document.querySelector('div[data-popup-content="yes"]');e?.parentNode?.removeChild(e),o?.call(void 0)},c=e=>{"Escape"===e.key&&s()},l=document.querySelector("div.popupShare");l&&(l.onclick=async()=>{if(window.currentSpeaker){const e=`${window.location.origin+window.location.pathname}?currentSpeaker=${window.currentSpeaker.id}`,t={title:`DevConf Speaker: ${window.currentSpeaker.name}`,text:`DevConf Speaker: ${window.currentSpeaker.name}`,url:e};null!=navigator.share&&navigator.canShare(t)?await navigator.share(t):(await navigator.clipboard.writeText(e),alert("URL is copied to clipboard"))}}),document.querySelector("div.popupClose").onclick=()=>{s()};const d=document.querySelector("div.popupBackdropHidden");d.addEventListener("click",s),e.forEach((e=>{const o=t(e);o?(n&&e.classList.add(n),e.onclick=()=>{d.classList.remove("popupBackdropHidden"),document.addEventListener("keydown",c);let t="div.popupContent";i&&(t=`div.${i}`);const n=document.querySelector(t),r=e.attributes["data-slot-id"]?.value;r&&n.setAttribute("speaker-id",r),n.querySelectorAll("div.popupBio").forEach((e=>{n.removeChild(e)})),o.setAttribute("data-popup-content","yes"),n.insertAdjacentElement("beforeend",o),a?.call(void 0,n)}):r&&e.classList.add(r)}))},o=async e=>{let t;const n=(e=>{const t=window.sessionStorage.getItem(`event${e}`);if(t)try{return JSON.parse(t)}catch{return void alert("Oh no! Something has gone horribly wrong. Please close and reopen your browser and try again.")}})(e);if(n)return n;if(navigator.onLine)try{const n=await fetch(`https://sessionize.com/api/v2/${e}/view/all`);n.ok&&(t=await n.json(),window.sessionStorage.setItem(`event${e}`,JSON.stringify(t)))}catch{alert("Oh no! Something has gone horribly wrong. Please reload your browser and try again.")}return t},a={randomUUID:"undefined"!=typeof crypto&&crypto.randomUUID&&crypto.randomUUID.bind(crypto)};var i,s=new Uint8Array(16);function c(){if(!i&&!(i="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return i(s)}for(var l=[],d=0;d<256;++d)l.push((d+256).toString(16).slice(1));const u=function(e,t,n){if(a.randomUUID&&!t&&!e)return a.randomUUID();var r=(e=e||{}).random||(e.rng||c)();if(r[6]=15&r[6]|64,r[8]=63&r[8]|128,t){n=n||0;for(var o=0;o<16;++o)t[n+o]=r[o];return t}return function(e,t=0){return(l[e[t+0]]+l[e[t+1]]+l[e[t+2]]+l[e[t+3]]+"-"+l[e[t+4]]+l[e[t+5]]+"-"+l[e[t+6]]+l[e[t+7]]+"-"+l[e[t+8]]+l[e[t+9]]+"-"+l[e[t+10]]+l[e[t+11]]+l[e[t+12]]+l[e[t+13]]+l[e[t+14]]+l[e[t+15]]).toLowerCase()}(r)},p=/\$\$(?.+)\$\$(?.+)\$\$/;"undefined"==typeof fetch&&alert("Oh no 😢 We don't support your web browser. Please upgrade to a newer version!"),(async()=>{const e=document.getElementById("agenda");if(!e)return;const a=e.getAttribute("data-event-id");if(!a)return;let i;const s=e=>i.speakers.filter((t=>e.indexOf(t.id)>=0)),c=["🔹"],l=e=>{const t=s(e);if(1===t.length){const e=t[0];let n="";n=e.categoryItems.indexOf(204593)>=0?"South Africa":e.questionAnswers.find((e=>59078===e.questionId))?.answerValue;let r="";e.categoryItems.indexOf(204689)>=0&&(r="He/Him"),e.categoryItems.indexOf(204687)>=0&&(r="She/Her"),e.categoryItems.indexOf(204688)>=0&&(r="They/Them");const o=c[Math.floor(Math.random()*c.length)];return r?`${r} ${o} ${n}`:n??""}return""},d=e=>{const t=s(e).map((e=>e.fullName));return 1===t.length?t[0]:`${t.filter(((e,n)=>n{const t=s(e).map((e=>e.profilePicture));return 1===t.length?[]:t.slice(1)},p=e=>s(e)[0],g=e=>p(e).profilePicture,m=e=>i.sessions.filter((t=>t.id===e))[0],f=(e,t=!1)=>{const n=document.createElement("img");return n.src=e,n.classList.add("speaker-image"),t&&n.classList.add("hide"),n},y=(e,t,n=!1)=>{const r=document.createElement("div");r.setAttribute("x-imageset",""),r.classList.add("multi-speaker-container");const o=f(e);return o.classList.add("multi-speaker-image"),n&&o.classList.add("largePopupImage"),r.appendChild(o),t.forEach((e=>{const t=f(e,!0);t.classList.add("multi-speaker-image"),n&&t.classList.add("largePopupImage"),r.appendChild(t)})),r};if(i=await o(a),!i)return;document.querySelectorAll(".agenda-session").forEach((e=>{const n=e,r=n.attributes["data-slot-id"].value;if("999999"===r){const e=t("noSessionCardTemplate").querySelector("div");n.insertAdjacentElement("beforeend",e)}else{const e=m(r);if(e)t("sessionCardTemplate").querySelectorAll("div").forEach((t=>{switch(t.className){case"agenda-session-image":{const n=u(e.speakers);if(n.length>0){const r=y(g(e.speakers),n);t.appendChild(r)}else t.appendChild(f(g(e.speakers)));break}case"agenda-session-subtitle":t.innerText=l(e.speakers);break;case"agenda-session-name":t.innerText=d(e.speakers);break;case"agenda-session-title":t.innerText=e.title}n.insertAdjacentElement("beforeend",t)}));else{const e=t("tbaCardTemplate").querySelector("div");n.insertAdjacentElement("beforeend",e)}}})),r(document.querySelectorAll(".agenda-session"),(e=>{const r=e.attributes["data-slot-id"].value;if(!r&&"0"===r)return null;const o=m(r);if(o){const e=p(o.speakers),r=s(o.speakers).flatMap((e=>(e=>{const t=[];return e.links.forEach((e=>{const n=document.createElement("a");n.target="_blank",n.href=e.url;const r=document.createElement("img");switch(r.alt=e.title,e.title){case"Twitter":r.src="/public/images/icons8-twitter-50.png";break;case"LinkedIn":r.src="/public/images/icons8-linkedin-50.png";break;case"Blog":r.src="/public/images/icons8-website-50.png";break;default:r.src="/public/images/icons8-external-link-50.png"}n.appendChild(r),t.push(n)})),t})(e))),a=t("popupBioContent").firstElementChild,i=u(o.speakers);if(i.length>0){const t=a.querySelector("img.largePopupImage");t.classList.add("hide");const n=y(e.profilePicture,i,!0);t.insertAdjacentElement("afterend",n)}else a.querySelector("img.largePopupImage").src=e.profilePicture;n(a,"div.bio-speaker",d(o.speakers)),n(a,"div.bio-subtitle",l(o.speakers));const c=a.querySelector("div.bio-social");r.forEach((e=>{c.appendChild(e)}));const g=(e=>{const t=s(e).map((e=>e.bio));return 1===t.length?t[0]:t.join("
")})(o.speakers);return 0===i.length&&n(a,"div.bio-tagline",e.tagLine),n(a,"div.bio-title",o.title),n(a,"div.bio-talk-description",o.description),n(a,"div.bio-speaker-bio",g),a}return null}),"clickable-session","unclickable-session",void 0,(e=>{const t=e.attributes["speaker-id"].value;if(t){const e=m(t);if(e){const n=p(e.speakers);window.currentSpeaker={name:n.fullName,id:t}}}})),document.querySelectorAll(".agenda-row-style-loading").forEach((e=>{e.style.display="none"})),document.querySelectorAll(".agenda > .hidden-row").forEach((e=>{e.style.display="grid"})),setInterval((()=>{Array.from(document.querySelectorAll("div[x-imageSet]")).forEach((e=>{const t=e.querySelectorAll("img"),n=Array.from(t).findIndex((e=>!e.classList.contains("hide")));(e=>{let t=1;const n=()=>{t<=.1?e.classList.add("hide"):(e.style.opacity=t.toString(),t-=.025*t,requestAnimationFrame(n))};n()})(t[n]);let r=n+1;r>=t.length&&(r=0),(e=>{let t=.1;e.classList.remove("hide");const n=()=>{t>=1||(e.style.opacity=t.toString(),t+=.025*t,requestAnimationFrame(n))};n()})(t[r])}))}),3500);const h=new URLSearchParams(window.location.search).get("currentSpeaker");h&&document.querySelector(`div[data-slot-id="${h}"]`).click()})(),(async()=>{const a=document.getElementById("feedbackStage");if(!a)return;let i;const s=window.sessionStorage.getItem("questionStructure");if(s)i=JSON.parse(s);else{const e=await fetch("/public/ratingconfig.json");if(!e.ok)return;i=await e.json(),window.sessionStorage.setItem("questionStructure",JSON.stringify(i))}const c=a.getAttribute("data-rating-id");if(!c)return;const l=a.getAttribute("data-event-id");if(!l)return;const d=document.getElementById("sessionData").innerText.trim().split(" "),g=await o(l),m=document.getElementById("timings")?.innerHTML.trim().split(" "),f=document.getElementById("workshopData").innerText.trim().split(";;;").map((e=>e.trim())),y=window.localStorage.getItem(`rating${c}`);let h;h=y?JSON.parse(y):{event:c,submitter:u()};const v=e=>{const t=g.sessions.find((t=>t.id===e));if(!t)return"To Be Announced";const n=t.speakers.map((e=>g.speakers.find((t=>t?.id===e)))).filter((e=>!!e)).map((e=>e?.fullName)).join(" and ");return`${t.title} by ${n}`},b=(e,t,n)=>{h[`s${e}`]||(h[`s${e}`]={}),h[`s${e}`][t]=n,window.localStorage.setItem(`rating${c}`,JSON.stringify(h))},k=["no","none"],S=e=>{const t=h[`s${e}`]||{};return Object.keys(t).filter((n=>{const r=i.structure[e].questions.find((e=>e.id===n));if(!r)return!1;const o=t[n];if("timeslot-selector"===r.type&&"none"===o)return!1;const a=r.needs;if(!a)return!0;const s=t[a];return!s||!k.find((e=>e===s))})).length};a.removeChild(document.getElementById("feedbackLoading")),i.structure.forEach(((e,r)=>{let o,i=!1;if(void 0!==e.workshop){const t=f[e.workshop];"none"!==t&&(i=!0,o=t)}else{if(e.subtitle){const t=p.exec(e.subtitle);if(t){const e=t.groups?.start??"",n=t.groups?.end??"",r=m?.find((t=>t.startsWith(e)))?.substring(e.length),a=m?.find((e=>e.startsWith(n)))?.substring(n?.length);o=`${r} - ${a}`}else o=e.subtitle}i=!0}if(i){const i=t("feedbackButton").querySelector("div");i.setAttribute("data-id",r.toString()),n(i,".feedbackButtonTitle",e.title),n(i,".feedbackButtonProgressBar",`Questions Completed ${S(r)} / ${e.questions.length}`),o&&n(i,".feedbackButtonWorkshop",o),a.insertAdjacentElement("beforeend",i)}})),r(document.querySelectorAll(".feedbackButton"),(e=>{const r=+e.attributes["data-id"].value,o=t("feedbackPopup").firstElementChild,a=i.structure[r];n(o,"div.feedbackTitle",`Feedback for ${a.title}`),a.questions.forEach((e=>{const a=t("questionTemplate").firstElementChild;n(a,"div.questionTitle",e.label);const i=t(`${e.type}QuestionStyleTemplate`).firstElementChild;switch(e.type){case"email":((e,t,n)=>{const r=h[`s${n}`]?.[t.id];r&&(e.value=r),e.onchange=()=>{const{value:r}=e;r&&b(n,t.id,r)}})(i,e,r);break;case"level":case"role":case"influence":((e,t,n)=>{const r=h[`s${n}`]?.[t.id];r&&e.querySelectorAll("option").forEach((e=>{e.value===r&&(e.selected=!0)})),e.onchange=()=>{b(n,t.id,e.value)}})(i,e,r);break;case"text":((e,t,n)=>{const r=h[`s${n}`]?.[t.id];r&&(e.value=r),e.onchange=()=>{const{value:r}=e;r&&b(n,t.id,r)}})(i,e,r);break;case"rate":((e,t,n)=>{const r=e.querySelector('input[type="range"]'),o=h[`s${n}`]?.[t.id];o&&(r.value=o),r.oninput=()=>{const e=r.value;e&&b(n,t.id,e)}})(i,e,r);break;case"yesno":((e,t,n)=>{const r=h[`s${n}`]?.[t.id];r&&(e.querySelector(`input[name="yesno"][value="${r}"]`).checked=!0),e.onchange=()=>{const r=e.querySelector('input[name="yesno"]:checked')?.value;r&&b(n,t.id,r)}})(i,e,r);break;case"years":((e,t,n)=>{const r=h[`s${n}`]?.[t.id];r&&(e.value=r),e.onchange=()=>{const{value:r}=e;if(r){let e;try{e=+r}catch{}e&&e>=0&&e<=60&&b(n,t.id,r)}}})(i,e,r);break;case"timeslot-selector":((e,t,n)=>{const r=5*t.key+1,o=r+5;for(let t=r;t{e.value===a&&(e.selected=!0)})),e.onchange=()=>{b(n,t.id,e.value)}})(i,e,r)}i.attributes["data-rating-field-id"]=e.id,a.insertAdjacentElement("beforeend",i),o.insertAdjacentElement("beforeend",a)}));const s=t("doneButton").firstElementChild;return s.onclick=()=>{document.querySelector("div.popupClose").dispatchEvent(new Event("click"))},o.insertAdjacentElement("beforeend",s),o}),void 0,void 0,(()=>{document.querySelectorAll("div.feedbackButton").forEach((e=>{const t=+e.attributes["data-id"].value;n(e,".feedbackButtonProgressBar",`Questions Completed ${S(t)} / ${i.structure[t].questions.length}`)}))}),(e=>{e.querySelectorAll('input[type="range"]').forEach((e=>{e.dispatchEvent(new Event("input"))}))}),"feedbackPopupContent"),(()=>{const t=document.getElementById("saveDataButton");t.onclick=n=>{t.innerText="Saving...",t.disabled=!0,n.preventDefault(),grecaptcha.ready((async()=>{const n=await grecaptcha.execute("6LfkPcUlAAAAAHwYs14fkTiEZYsu5hAAq_bLKp-j",{action:"submit"});h.captcha=n,(await fetch(e,{method:"POST",body:JSON.stringify(h)})).ok?(t.disabled=!1,t.innerText="Save Complete",setTimeout((()=>{t.innerText="Save"}),2e3)):(t.innerText="Save",t.disabled=!1,alert("Oh no! Something has gone horribly wrong. Please reload your browser and try again."))}))},t.style.display="unset"})()})(),(()=>{const e=document.getElementsByClassName("sponsor-content-detail-wide-body")[0];if(!e)return;let t=0;setInterval((()=>{t+=.25,t>e.scrollWidth&&(t=0),e.scrollTo(t,0)}),10)})(),(()=>{const n=document.getElementById("speakerFeedbackReport");if(!n)return;const r=document.getElementById("speakerKey"),o=(e,t)=>{const n=t||0;if(0===n)return n.toFixed(2);let r="";return e>n&&(r="↑"),e{const a=document.getElementById("getDataButton");a&&(a.onclick=async()=>{const i=r.value;if(i&&32==i.length)try{a.disabled=!0,a.innerText="Loading...";const r=await fetch(`${e}?speaker=${i}`);if(r.ok){const e=await r.json(),a=e.filter((e=>!e.event));((e,r)=>{n.innerHTML="",console.dir(e),0!==e.length?e.forEach((e=>{const a=t("title").firstElementChild;a.innerText=e.event,n.insertAdjacentElement("beforeend",a);const i=t("feedbackTable").firstElementChild,s=e.feedback.reduce(((e,t)=>(e.presSum+=t.ratingPresentation,e.contentSum+=t.ratingContent,e.valueSum+=t.ratingValue,e)),{presSum:0,contentSum:0,valueSum:0}),c=s.presSum/e.feedback.length,l=s.contentSum/e.feedback.length,d=s.valueSum/e.feedback.length;if(i.querySelector("#presAvg").innerText=c.toFixed(2),i.querySelector("#contentAvg").innerText=l.toFixed(2),i.querySelector("#valueAvg").innerText=d.toFixed(2),r.length>0){const t=r[0];i.querySelector("#timeslotPresAvg").innerText=o(c,t[`${e.event}-ratingPresentationtimeslot`]),i.querySelector("#timeslotContentAvg").innerText=o(l,t[`${e.event}-ratingContenttimeslot`]),i.querySelector("#timeslotValueAvg").innerText=o(d,t[`${e.event}-ratingValuetimeslot`]),i.querySelector("#eventPresAvg").innerText=o(c,t[`${e.event}-ratingPresentation`]),i.querySelector("#eventContentAvg").innerText=o(l,t[`${e.event}-ratingContent`]),i.querySelector("#eventValueAvg").innerText=o(d,t[`${e.event}-ratingValue`]),i.querySelector("#globalPresAvg").innerText=o(c,t["global-ratingPresentation"]),i.querySelector("#globalContentAvg").innerText=o(l,t["global-ratingContent"]),i.querySelector("#globalValueAvg").innerText=o(d,t["global-ratingValue"])}else i.querySelectorAll(".additionalAverageInfo").forEach((e=>{e.style.display="none"}));const u=i.querySelector("#feedbackFooter");e.feedback.forEach((e=>{const n=t("feedbackRow").firstElementChild;n.querySelector(".presValue").innerText=e.ratingPresentation.toFixed(0),n.querySelector(".contentValue").innerText=e.ratingContent.toFixed(0),n.querySelector(".valueValue").innerText=e.ratingValue.toFixed(0),n.querySelector(".feedbackValue").innerText=e.feedback||"",u.insertAdjacentElement("beforebegin",n)})),n.insertAdjacentElement("beforeend",i)})):n.innerText="No data yet! Check back later!"})(e.filter((e=>e.event)),a),window.localStorage.setItem("speakerFeedbackKey",i)}else n.innerText=`Invalid speaker key [${r.status}]`}finally{a.disabled=!1,a.innerText="Get Report"}})})(),(()=>{const e=window.localStorage.getItem("speakerFeedbackKey");e&&(r.value=e)})()})()})(); +(()=>{"use strict";const e="https://ratings-2slkxdorza-nw.a.run.app",t=e=>document.getElementById(e)?.cloneNode(!0)?.content,n=(e,t,n)=>{e.querySelector(t).innerText=n},r=(e,t,n,r,o,a,i)=>{const s=()=>{window.currentSpeaker=void 0,document.querySelector("div.popupBackdrop").classList.add("popupBackdropHidden"),document.removeEventListener("keydown",c);const e=document.querySelector('div[data-popup-content="yes"]');e?.parentNode?.removeChild(e),o?.call(void 0)},c=e=>{"Escape"===e.key&&s()},l=document.querySelector("div.popupShare");l&&(l.onclick=async()=>{if(window.currentSpeaker){const e=`${window.location.origin+window.location.pathname}?currentSpeaker=${window.currentSpeaker.id}`,t={title:`DevConf Speaker: ${window.currentSpeaker.name}`,text:`DevConf Speaker: ${window.currentSpeaker.name}`,url:e};null!=navigator.share&&navigator.canShare(t)?await navigator.share(t):(await navigator.clipboard.writeText(e),alert("URL is copied to clipboard"))}}),document.querySelector("div.popupClose").onclick=()=>{s()};const d=document.querySelector("div.popupBackdropHidden");d.addEventListener("click",s),e.forEach((e=>{const o=t(e);o?(n&&e.classList.add(n),e.onclick=()=>{d.classList.remove("popupBackdropHidden"),document.addEventListener("keydown",c);let t="div.popupContent";i&&(t=`div.${i}`);const n=document.querySelector(t),r=e.attributes["data-slot-id"]?.value;r&&n.setAttribute("speaker-id",r),n.querySelectorAll("div.popupBio").forEach((e=>{n.removeChild(e)})),o.setAttribute("data-popup-content","yes"),n.insertAdjacentElement("beforeend",o),a?.call(void 0,n)}):r&&e.classList.add(r)}))},o=async e=>{let t;const n=(e=>{const t=window.sessionStorage.getItem(`event${e}`);if(t)try{return JSON.parse(t)}catch{return void alert("Oh no! Something has gone horribly wrong. Please close and reopen your browser and try again.")}})(e);if(n)return n;if(navigator.onLine)try{const n=await fetch(`https://sessionize.com/api/v2/${e}/view/all`);n.ok&&(t=await n.json(),window.sessionStorage.setItem(`event${e}`,JSON.stringify(t)))}catch{alert("Oh no! Something has gone horribly wrong. Please reload your browser and try again.")}return t},a={randomUUID:"undefined"!=typeof crypto&&crypto.randomUUID&&crypto.randomUUID.bind(crypto)};let i;const s=new Uint8Array(16);function c(){if(!i){if("undefined"==typeof crypto||!crypto.getRandomValues)throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");i=crypto.getRandomValues.bind(crypto)}return i(s)}const l=[];for(let e=0;e<256;++e)l.push((e+256).toString(16).slice(1));const d=function(e,t,n){if(a.randomUUID&&!t&&!e)return a.randomUUID();const r=(e=e||{}).random||(e.rng||c)();if(r[6]=15&r[6]|64,r[8]=63&r[8]|128,t){n=n||0;for(let e=0;e<16;++e)t[n+e]=r[e];return t}return function(e,t=0){return(l[e[t+0]]+l[e[t+1]]+l[e[t+2]]+l[e[t+3]]+"-"+l[e[t+4]]+l[e[t+5]]+"-"+l[e[t+6]]+l[e[t+7]]+"-"+l[e[t+8]]+l[e[t+9]]+"-"+l[e[t+10]]+l[e[t+11]]+l[e[t+12]]+l[e[t+13]]+l[e[t+14]]+l[e[t+15]]).toLowerCase()}(r)},u=/\$\$(?.+)\$\$(?.+)\$\$/;"undefined"==typeof fetch&&alert("Oh no 😢 We don't support your web browser. Please upgrade to a newer version!"),(async()=>{const e=document.getElementById("agenda");if(!e)return;const a=e.getAttribute("data-event-id");if(!a)return;let i;const s=e=>i.speakers.filter((t=>e.indexOf(t.id)>=0)),c=["🔹"],l=e=>{const t=s(e);if(1===t.length){const e=t[0];let n="";n=e.categoryItems.indexOf(204593)>=0?"South Africa":e.questionAnswers.find((e=>59078===e.questionId))?.answerValue;let r="";e.categoryItems.indexOf(204689)>=0&&(r="He/Him"),e.categoryItems.indexOf(204687)>=0&&(r="She/Her"),e.categoryItems.indexOf(204688)>=0&&(r="They/Them");const o=c[Math.floor(Math.random()*c.length)];return r?`${r} ${o} ${n}`:n??""}return""},d=e=>{const t=s(e).map((e=>e.fullName));return 1===t.length?t[0]:`${t.filter(((e,n)=>n{const t=s(e).map((e=>e.profilePicture));return 1===t.length?[]:t.slice(1)},p=e=>s(e)[0],g=e=>p(e).profilePicture,m=e=>i.sessions.filter((t=>t.id===e))[0],f=(e,t=!1)=>{const n=document.createElement("img");return n.src=e,n.classList.add("speaker-image"),t&&n.classList.add("hide"),n},y=(e,t,n=!1)=>{const r=document.createElement("div");r.setAttribute("x-imageset",""),r.classList.add("multi-speaker-container");const o=f(e);return o.classList.add("multi-speaker-image"),n&&o.classList.add("largePopupImage"),r.appendChild(o),t.forEach((e=>{const t=f(e,!0);t.classList.add("multi-speaker-image"),n&&t.classList.add("largePopupImage"),r.appendChild(t)})),r};if(i=await o(a),!i)return;document.querySelectorAll(".agenda-session").forEach((e=>{const n=e,r=n.attributes["data-slot-id"].value;if("999999"===r){const e=t("noSessionCardTemplate").querySelector("div");n.insertAdjacentElement("beforeend",e)}else{const e=m(r);if(e)t("sessionCardTemplate").querySelectorAll("div").forEach((t=>{switch(t.className){case"agenda-session-image":{const n=u(e.speakers);if(n.length>0){const r=y(g(e.speakers),n);t.appendChild(r)}else t.appendChild(f(g(e.speakers)));break}case"agenda-session-subtitle":t.innerText=l(e.speakers);break;case"agenda-session-name":t.innerText=d(e.speakers);break;case"agenda-session-title":t.innerText=e.title}n.insertAdjacentElement("beforeend",t)}));else{const e=t("tbaCardTemplate").querySelector("div");n.insertAdjacentElement("beforeend",e)}}})),r(document.querySelectorAll(".agenda-session"),(e=>{const r=e.attributes["data-slot-id"].value;if(!r&&"0"===r)return null;const o=m(r);if(o){const e=p(o.speakers),r=s(o.speakers).flatMap((e=>(e=>{const t=[];return e.links.forEach((e=>{const n=document.createElement("a");n.target="_blank",n.href=e.url;const r=document.createElement("img");switch(r.alt=e.title,e.title){case"Twitter":r.src="/public/images/icons8-twitter-50.png";break;case"LinkedIn":r.src="/public/images/icons8-linkedin-50.png";break;case"Blog":r.src="/public/images/icons8-website-50.png";break;default:r.src="/public/images/icons8-external-link-50.png"}n.appendChild(r),t.push(n)})),t})(e))),a=t("popupBioContent").firstElementChild,i=u(o.speakers);if(i.length>0){const t=a.querySelector("img.largePopupImage");t.classList.add("hide");const n=y(e.profilePicture,i,!0);t.insertAdjacentElement("afterend",n)}else a.querySelector("img.largePopupImage").src=e.profilePicture;n(a,"div.bio-speaker",d(o.speakers)),n(a,"div.bio-subtitle",l(o.speakers));const c=a.querySelector("div.bio-social");r.forEach((e=>{c.appendChild(e)}));const g=(e=>{const t=s(e).map((e=>e.bio));return 1===t.length?t[0]:t.join("
")})(o.speakers);return 0===i.length&&n(a,"div.bio-tagline",e.tagLine),n(a,"div.bio-title",o.title),n(a,"div.bio-talk-description",o.description),n(a,"div.bio-speaker-bio",g),a}return null}),"clickable-session","unclickable-session",void 0,(e=>{const t=e.attributes["speaker-id"].value;if(t){const e=m(t);if(e){const n=p(e.speakers);window.currentSpeaker={name:n.fullName,id:t}}}})),document.querySelectorAll(".agenda-row-style-loading").forEach((e=>{e.style.display="none"})),document.querySelectorAll(".agenda > .hidden-row").forEach((e=>{e.style.display="grid"})),setInterval((()=>{Array.from(document.querySelectorAll("div[x-imageSet]")).forEach((e=>{const t=e.querySelectorAll("img"),n=Array.from(t).findIndex((e=>!e.classList.contains("hide")));(e=>{let t=1;const n=()=>{t<=.1?e.classList.add("hide"):(e.style.opacity=t.toString(),t-=.025*t,requestAnimationFrame(n))};n()})(t[n]);let r=n+1;r>=t.length&&(r=0),(e=>{let t=.1;e.classList.remove("hide");const n=()=>{t>=1||(e.style.opacity=t.toString(),t+=.025*t,requestAnimationFrame(n))};n()})(t[r])}))}),3500);const h=new URLSearchParams(window.location.search).get("currentSpeaker");h&&document.querySelector(`div[data-slot-id="${h}"]`).click()})(),(async()=>{const a=document.getElementById("feedbackStage");if(!a)return;let i;const s=window.sessionStorage.getItem("questionStructure");if(s)i=JSON.parse(s);else{const e=await fetch("/public/ratingconfig.json");if(!e.ok)return;i=await e.json(),window.sessionStorage.setItem("questionStructure",JSON.stringify(i))}const c=a.getAttribute("data-rating-id");if(!c)return;const l=a.getAttribute("data-event-id");if(!l)return;const p=document.getElementById("sessionData").innerText.trim().split(" "),g=await o(l),m=document.getElementById("timings")?.innerHTML.trim().split(" "),f=document.getElementById("workshopData").innerText.trim().split(";;;").map((e=>e.trim())),y=window.localStorage.getItem(`rating${c}`);let h;h=y?JSON.parse(y):{event:c,submitter:d()};const v=e=>{const t=g.sessions.find((t=>t.id===e));if(!t)return"To Be Announced";const n=t.speakers.map((e=>g.speakers.find((t=>t?.id===e)))).filter((e=>!!e)).map((e=>e?.fullName)).join(" and ");return`${t.title} by ${n}`},b=(e,t,n)=>{h[`s${e}`]||(h[`s${e}`]={}),h[`s${e}`][t]=n,window.localStorage.setItem(`rating${c}`,JSON.stringify(h))},k=["no","none"],S=e=>{const t=h[`s${e}`]||{};return Object.keys(t).filter((n=>{const r=i.structure[e].questions.find((e=>e.id===n));if(!r)return!1;const o=t[n];if("timeslot-selector"===r.type&&"none"===o)return!1;const a=r.needs;if(!a)return!0;const s=t[a];return!s||!k.find((e=>e===s))})).length};a.removeChild(document.getElementById("feedbackLoading")),i.structure.forEach(((e,r)=>{let o,i=!1;if(void 0!==e.workshop){const t=f[e.workshop];"none"!==t&&(i=!0,o=t)}else{if(e.subtitle){const t=u.exec(e.subtitle);if(t){const e=t.groups?.start??"",n=t.groups?.end??"",r=m?.find((t=>t.startsWith(e)))?.substring(e.length),a=m?.find((e=>e.startsWith(n)))?.substring(n?.length);o=`${r} - ${a}`}else o=e.subtitle}i=!0}if(i){const i=t("feedbackButton").querySelector("div");i.setAttribute("data-id",r.toString()),n(i,".feedbackButtonTitle",e.title),n(i,".feedbackButtonProgressBar",`Questions Completed ${S(r)} / ${e.questions.length}`),o&&n(i,".feedbackButtonWorkshop",o),a.insertAdjacentElement("beforeend",i)}})),r(document.querySelectorAll(".feedbackButton"),(e=>{const r=+e.attributes["data-id"].value,o=t("feedbackPopup").firstElementChild,a=i.structure[r];n(o,"div.feedbackTitle",`Feedback for ${a.title}`),a.questions.forEach((e=>{const a=t("questionTemplate").firstElementChild;n(a,"div.questionTitle",e.label);const i=t(`${e.type}QuestionStyleTemplate`).firstElementChild;switch(e.type){case"email":((e,t,n)=>{const r=h[`s${n}`]?.[t.id];r&&(e.value=r),e.onchange=()=>{const{value:r}=e;r&&b(n,t.id,r)}})(i,e,r);break;case"level":case"role":case"influence":((e,t,n)=>{const r=h[`s${n}`]?.[t.id];r&&e.querySelectorAll("option").forEach((e=>{e.value===r&&(e.selected=!0)})),e.onchange=()=>{b(n,t.id,e.value)}})(i,e,r);break;case"text":((e,t,n)=>{const r=h[`s${n}`]?.[t.id];r&&(e.value=r),e.onchange=()=>{const{value:r}=e;r&&b(n,t.id,r)}})(i,e,r);break;case"rate":((e,t,n)=>{const r=e.querySelector('input[type="range"]'),o=h[`s${n}`]?.[t.id];o&&(r.value=o),r.oninput=()=>{const e=r.value;e&&b(n,t.id,e)}})(i,e,r);break;case"yesno":((e,t,n)=>{const r=h[`s${n}`]?.[t.id];r&&(e.querySelector(`input[name="yesno"][value="${r}"]`).checked=!0),e.onchange=()=>{const r=e.querySelector('input[name="yesno"]:checked')?.value;r&&b(n,t.id,r)}})(i,e,r);break;case"years":((e,t,n)=>{const r=h[`s${n}`]?.[t.id];r&&(e.value=r),e.onchange=()=>{const{value:r}=e;if(r){let e;try{e=+r}catch{}e&&e>=0&&e<=60&&b(n,t.id,r)}}})(i,e,r);break;case"timeslot-selector":((e,t,n)=>{const r=5*t.key+1,o=r+5;for(let t=r;t{e.value===a&&(e.selected=!0)})),e.onchange=()=>{b(n,t.id,e.value)}})(i,e,r)}i.attributes["data-rating-field-id"]=e.id,a.insertAdjacentElement("beforeend",i),o.insertAdjacentElement("beforeend",a)}));const s=t("doneButton").firstElementChild;return s.onclick=()=>{document.querySelector("div.popupClose").dispatchEvent(new Event("click"))},o.insertAdjacentElement("beforeend",s),o}),void 0,void 0,(()=>{document.querySelectorAll("div.feedbackButton").forEach((e=>{const t=+e.attributes["data-id"].value;n(e,".feedbackButtonProgressBar",`Questions Completed ${S(t)} / ${i.structure[t].questions.length}`)}))}),(e=>{e.querySelectorAll('input[type="range"]').forEach((e=>{e.dispatchEvent(new Event("input"))}))}),"feedbackPopupContent"),(()=>{const t=document.getElementById("saveDataButton");t.onclick=n=>{t.innerText="Saving...",t.disabled=!0,n.preventDefault(),grecaptcha.ready((async()=>{const n=await grecaptcha.execute("6LfkPcUlAAAAAHwYs14fkTiEZYsu5hAAq_bLKp-j",{action:"submit"});h.captcha=n,(await fetch(e,{method:"POST",body:JSON.stringify(h)})).ok?(t.disabled=!1,t.innerText="Save Complete",setTimeout((()=>{t.innerText="Save"}),2e3)):(t.innerText="Save",t.disabled=!1,alert("Oh no! Something has gone horribly wrong. Please reload your browser and try again."))}))},t.style.display="unset"})()})(),(()=>{const e=document.getElementsByClassName("sponsor-content-detail-wide-body")[0];if(!e)return;let t=0;setInterval((()=>{t+=.25,t>e.scrollWidth&&(t=0),e.scrollTo(t,0)}),10)})(),(()=>{const n=document.getElementById("speakerFeedbackReport");if(!n)return;const r=document.getElementById("speakerKey"),o=(e,t)=>{const n=t||0;if(0===n)return n.toFixed(2);let r="";return e>n&&(r="↑"),e{const a=document.getElementById("getDataButton");a&&(a.onclick=async()=>{const i=r.value;if(i&&32==i.length)try{a.disabled=!0,a.innerText="Loading...";const r=await fetch(`${e}?speaker=${i}`);if(r.ok){const e=await r.json(),a=e.filter((e=>!e.event));((e,r)=>{n.innerHTML="",console.dir(e),0!==e.length?e.forEach((e=>{const a=t("title").firstElementChild;a.innerText=e.event,n.insertAdjacentElement("beforeend",a);const i=t("feedbackTable").firstElementChild,s=e.feedback.reduce(((e,t)=>(e.presSum+=t.ratingPresentation,e.contentSum+=t.ratingContent,e.valueSum+=t.ratingValue,e)),{presSum:0,contentSum:0,valueSum:0}),c=s.presSum/e.feedback.length,l=s.contentSum/e.feedback.length,d=s.valueSum/e.feedback.length;if(i.querySelector("#presAvg").innerText=c.toFixed(2),i.querySelector("#contentAvg").innerText=l.toFixed(2),i.querySelector("#valueAvg").innerText=d.toFixed(2),r.length>0){const t=r[0];i.querySelector("#timeslotPresAvg").innerText=o(c,t[`${e.event}-ratingPresentationtimeslot`]),i.querySelector("#timeslotContentAvg").innerText=o(l,t[`${e.event}-ratingContenttimeslot`]),i.querySelector("#timeslotValueAvg").innerText=o(d,t[`${e.event}-ratingValuetimeslot`]),i.querySelector("#eventPresAvg").innerText=o(c,t[`${e.event}-ratingPresentation`]),i.querySelector("#eventContentAvg").innerText=o(l,t[`${e.event}-ratingContent`]),i.querySelector("#eventValueAvg").innerText=o(d,t[`${e.event}-ratingValue`]),i.querySelector("#globalPresAvg").innerText=o(c,t["global-ratingPresentation"]),i.querySelector("#globalContentAvg").innerText=o(l,t["global-ratingContent"]),i.querySelector("#globalValueAvg").innerText=o(d,t["global-ratingValue"])}else i.querySelectorAll(".additionalAverageInfo").forEach((e=>{e.style.display="none"}));const u=i.querySelector("#feedbackFooter");e.feedback.forEach((e=>{const n=t("feedbackRow").firstElementChild;n.querySelector(".presValue").innerText=e.ratingPresentation.toFixed(0),n.querySelector(".contentValue").innerText=e.ratingContent.toFixed(0),n.querySelector(".valueValue").innerText=e.ratingValue.toFixed(0),n.querySelector(".feedbackValue").innerText=e.feedback||"",u.insertAdjacentElement("beforebegin",n)})),n.insertAdjacentElement("beforeend",i)})):n.innerText="No data yet! Check back later!"})(e.filter((e=>e.event)),a),window.localStorage.setItem("speakerFeedbackKey",i)}else n.innerText=`Invalid speaker key [${r.status}]`}finally{a.disabled=!1,a.innerText="Get Report"}})})(),(()=>{const e=window.localStorage.getItem("speakerFeedbackKey");e&&(r.value=e)})()})()})(); //# sourceMappingURL=devconf.js.map \ No newline at end of file diff --git a/scripts/devconf.js.map b/scripts/devconf.js.map index 636eb408..9803bd92 100644 --- a/scripts/devconf.js.map +++ b/scripts/devconf.js.map @@ -1 +1 @@ -{"version":3,"file":"devconf.js","mappings":"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","sources":["webpack://devconf/./src/common.ts","webpack://devconf/./src/sessionize.ts","webpack://devconf/./node_modules/uuid/dist/esm-browser/native.js","webpack://devconf/./node_modules/uuid/dist/esm-browser/rng.js","webpack://devconf/./node_modules/uuid/dist/esm-browser/stringify.js","webpack://devconf/./node_modules/uuid/dist/esm-browser/v4.js","webpack://devconf/./src/feedback.ts","webpack://devconf/./src/devconf.ts","webpack://devconf/./src/event.ts","webpack://devconf/./src/sponsorBlock.ts","webpack://devconf/./src/speakerFeedback.ts"],"sourcesContent":["interface ICurrentSpeaker {\n name: string;\n id: string;\n}\n\ndeclare global {\n var currentSpeaker: ICurrentSpeaker | undefined;\n}\n\nexport const feedbackServerUrl = 'https://ratings-2slkxdorza-nw.a.run.app'\n// export const feedbackServerUrl = 'http://localhost:8080'\n\nexport const getTemplate = (templateId: string) => ((document.getElementById(templateId) as HTMLTemplateElement)\n ?.cloneNode(true) as HTMLTemplateElement)\n ?.content\n\nexport const setText = (parent: Element, query: string, value: string) => {\n (parent.querySelector(query) as HTMLDivElement).innerText = value\n}\n\nexport const addPopupHandler = (\n elementsToAddPopupTo: NodeListOf,\n popupContentBuilder: (div: HTMLDivElement) => Element | null,\n clickableClass?: string,\n unclickableClass?: string,\n onCloseHandler?: () => void,\n onOpenHandler?: (content: Element) => void,\n popupContentKey?: string,\n) => {\n const closePopup = () => {\n window.currentSpeaker = undefined;\n document.querySelector('div.popupBackdrop')!.classList.add('popupBackdropHidden')\n // eslint-disable-next-line no-use-before-define\n document.removeEventListener('keydown', handleCloseKeyPress)\n const contentToRemove = document.querySelector('div[data-popup-content=\"yes\"]')\n contentToRemove?.parentNode?.removeChild(contentToRemove)\n onCloseHandler?.call(this)\n }\n\n const handleCloseKeyPress = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n closePopup()\n }\n }\n\n const popupShare = document.querySelector('div.popupShare') as HTMLDivElement\n if (popupShare) {\n popupShare.onclick = async () => {\n if (window.currentSpeaker) {\n const url = `${window.location.origin + window.location.pathname}?currentSpeaker=${window.currentSpeaker.id}`\n\n const shareData = {\n title: `DevConf Speaker: ${window.currentSpeaker.name}`,\n text: `DevConf Speaker: ${window.currentSpeaker.name}`,\n url: url,\n }\n\n if (navigator.share != undefined && navigator.canShare(shareData)) {\n await navigator.share(shareData)\n } else {\n await navigator.clipboard.writeText(url);\n alert('URL is copied to clipboard')\n }\n }\n }\n }\n\n const popupClose = document.querySelector('div.popupClose')! as HTMLDivElement\n popupClose.onclick = () => {\n closePopup()\n }\n\n const backdrop = document.querySelector('div.popupBackdropHidden')!\n backdrop.addEventListener('click', closePopup)\n\n elementsToAddPopupTo.forEach((div) => {\n const popupContent = popupContentBuilder(div)\n if (popupContent) {\n if (clickableClass) {\n div.classList.add(clickableClass)\n }\n\n div.onclick = () => {\n backdrop.classList.remove('popupBackdropHidden')\n document.addEventListener('keydown', handleCloseKeyPress)\n\n let elementsToSelect = 'div.popupContent'\n if (popupContentKey) {\n elementsToSelect = `div.${popupContentKey}`\n }\n const popupContentStage = document.querySelector(elementsToSelect)!\n const dataSlotId = div.attributes['data-slot-id']?.value\n if (dataSlotId) {\n popupContentStage.setAttribute(\"speaker-id\", dataSlotId)\n }\n\n popupContentStage.querySelectorAll('div.popupBio').forEach((value) => {\n popupContentStage.removeChild(value)\n })\n\n popupContent.setAttribute('data-popup-content', 'yes')\n popupContentStage.insertAdjacentElement('beforeend', popupContent)\n onOpenHandler?.call(this, popupContentStage)\n }\n } else {\n if (unclickableClass) {\n div.classList.add(unclickableClass)\n }\n }\n })\n}","interface SessionizeSession {\n id: string;\n title: string;\n description: string;\n startsAt: Date;\n endsAt: Date;\n isServiceSession: boolean;\n isPlenumSession: boolean;\n speakers: string[];\n categoryItems: number[];\n questionAnswers: any[];\n roomId: number;\n}\n\ninterface SessionizeLink {\n title: string;\n url: string;\n linkType: string;\n}\n\nexport interface SessionizeSpeaker {\n id: string;\n firstName: string;\n lastName: string;\n bio: string;\n tagLine: string;\n profilePicture: string;\n isTopSpeaker: boolean;\n links: SessionizeLink[];\n sessions: number[];\n fullName: string;\n categoryItems: any[];\n questionAnswers: any[];\n}\n\ninterface SessionizeItem {\n id: number;\n name: string;\n sort: number;\n}\n\ninterface SessionizeCategory {\n id: number;\n title: string;\n items: SessionizeItem[];\n sort: number;\n}\n\ninterface SessionizeRoom {\n id: number;\n name: string;\n sort: number;\n}\n\nexport interface SessionizeEvent {\n sessions: SessionizeSession[];\n speakers: SessionizeSpeaker[];\n questions: any[];\n categories: SessionizeCategory[];\n rooms: SessionizeRoom[];\n}\n\nconst loadStoredData = (id: string): SessionizeEvent | undefined => {\n const sessionData = window.sessionStorage.getItem(`event${id}`)\n if (sessionData) {\n try {\n return JSON.parse(sessionData) as SessionizeEvent\n } catch {\n alert('Oh no! Something has gone horribly wrong. Please close and reopen your browser and try again.')\n return undefined\n }\n }\n\n return undefined\n}\n\nexport const loadSessionizeData = async (eventId: string): Promise => {\n let result: SessionizeEvent | undefined\n\n const existingData = loadStoredData(eventId)\n if (existingData) {\n return existingData\n }\n\n if (navigator.onLine) {\n try {\n const response = await fetch(`https://sessionize.com/api/v2/${eventId}/view/all`)\n if (response.ok) {\n result = await response.json() as SessionizeEvent\n window.sessionStorage.setItem(`event${eventId}`, JSON.stringify(result))\n }\n } catch {\n alert('Oh no! Something has gone horribly wrong. Please reload your browser and try again.')\n }\n }\n\n return result\n}\n","var randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);\nexport default {\n randomUUID\n};","// Unique ID creation requires a high quality random # generator. In the browser we therefore\n// require the crypto API and do not support built-in fallback to lower quality random number\n// generators (like Math.random()).\n\nvar getRandomValues;\nvar rnds8 = new Uint8Array(16);\nexport default function rng() {\n // lazy load so that environments that need to polyfill have a chance to do so\n if (!getRandomValues) {\n // getRandomValues needs to be invoked in a context where \"this\" is a Crypto implementation.\n getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto);\n if (!getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n }\n return getRandomValues(rnds8);\n}","import validate from './validate.js';\n\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\nvar byteToHex = [];\nfor (var i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\nexport function unsafeStringify(arr, offset = 0) {\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n //\n // Note to future-self: No, you can't remove the `toLowerCase()` call.\n // REF: https://github.com/uuidjs/uuid/pull/677#issuecomment-1757351351\n return (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase();\n}\nfunction stringify(arr, offset = 0) {\n var uuid = unsafeStringify(arr, offset);\n // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n return uuid;\n}\nexport default stringify;","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n options = options || {};\n var rnds = options.random || (options.rng || rng)();\n\n // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80;\n\n // Copy bytes to buffer, if provided\n if (buf) {\n offset = offset || 0;\n for (var i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n return buf;\n }\n return unsafeStringify(rnds);\n}\nexport default v4;","import { addPopupHandler, feedbackServerUrl, getTemplate, setText } from './common'\nimport { loadSessionizeData } from './sessionize'\nimport { v4 as uuidv4 } from 'uuid'\n\nconst timeKeyFinder = /\\$\\$(?.+)\\$\\$(?.+)\\$\\$/\n\ninterface QuestionStructure {\n id: string,\n label: string,\n type: 'rate' | 'text' | 'timeslot-selector' | 'yesno' | 'role' | 'level' | 'years' | 'email' | 'influence'\n key: number | undefined,\n needs?: string,\n}\n\ninterface SectionStructure {\n title: string,\n subtitle?: string,\n questions: QuestionStructure[]\n workshop?: number,\n}\n\ninterface QuestionaireStructure {\n structure: SectionStructure[],\n}\n\nconst tracks = 5\n\nexport default async () => {\n const stage = document.getElementById('feedbackStage') as HTMLDivElement\n if (!stage) {\n return\n }\n\n let questions: QuestionaireStructure\n const storedQuestions = window.sessionStorage.getItem('questionStructure')\n if (storedQuestions) {\n questions = JSON.parse(storedQuestions)\n } else {\n const questionsResponse = await fetch('/public/ratingconfig.json')\n if (!questionsResponse.ok) {\n return\n } else {\n questions = await questionsResponse.json()\n window.sessionStorage.setItem('questionStructure', JSON.stringify(questions))\n }\n }\n\n\n const ratingId = stage.getAttribute('data-rating-id');\n if (!ratingId) {\n return\n }\n\n const eventId = stage.getAttribute('data-event-id')\n if (!eventId) {\n return\n }\n\n const sessionStructure = document.getElementById('sessionData')!.innerText.trim().split(' ')\n const eventData = await loadSessionizeData(eventId)\n const timings = document.getElementById(\"timings\")?.innerHTML.trim().split(' ');\n const workshopStructure = document.getElementById('workshopData')!.innerText.trim().split(';;;').map(s => s.trim())\n\n const ratingStoredData = window.localStorage.getItem(`rating${ratingId}`)\n let ratingData: { [x: string]: {}; captcha?: any; event: string; submitter: string }\n if (!ratingStoredData) {\n ratingData = {\n event: ratingId,\n submitter: uuidv4(),\n }\n } else {\n ratingData = JSON.parse(ratingStoredData)\n }\n\n const talkTitle = (sessionId: string): string => {\n const session = eventData!.sessions.find((s) => s.id === sessionId)\n if (!session) {\n return \"To Be Announced\";\n }\n\n const speakers = session.speakers\n .map((speakerId) => eventData!.speakers.find((speaker) => speaker?.id === speakerId))\n .filter((speaker) => !!speaker)\n .map((speaker) => speaker?.fullName)\n .join(' and ');\n\n return `${session.title} by ${speakers}`\n }\n\n const setValue = (dataSlotId: number, id: string, value: string) => {\n if (!ratingData[`s${dataSlotId}`]) {\n ratingData[`s${dataSlotId}`] = {}\n }\n\n ratingData[`s${dataSlotId}`][id] = value\n\n window.localStorage.setItem(`rating${ratingId}`, JSON.stringify(ratingData))\n }\n\n const configureTimeSlotSelector = (inputElement: HTMLSelectElement, question: QuestionStructure, dataSlotId: number) => {\n const start = question.key! * tracks + 1\n const end = start + tracks\n\n for (let index = start; index < end; index++) {\n const sessionId = sessionStructure[index]\n if (sessionId === '999999') {\n continue\n }\n\n const option = document.createElement('option')\n\n option.value = sessionId\n option.text = talkTitle(sessionId)\n\n inputElement!.append(option)\n }\n\n const updateTimeSlot = () => {\n setValue(dataSlotId, question.id, inputElement.value)\n }\n\n const existingValue = ratingData[`s${dataSlotId}`]?.[question.id]\n if (existingValue) {\n inputElement.querySelectorAll('option').forEach((option) => {\n if (option.value === existingValue) {\n option.selected = true\n }\n })\n }\n\n inputElement.onchange = updateTimeSlot\n }\n\n const configureSelector = (inputElement: HTMLSelectElement, question: QuestionStructure, dataSlotId: number) => {\n const updateValue = () => {\n setValue(dataSlotId, question.id, inputElement.value)\n }\n\n const existingValue = ratingData[`s${dataSlotId}`]?.[question.id]\n if (existingValue) {\n inputElement.querySelectorAll('option').forEach((option) => {\n if (option.value === existingValue) {\n option.selected = true\n }\n })\n }\n\n inputElement.onchange = updateValue\n }\n\n const configureYesNo = (inputElement: HTMLDivElement, question: QuestionStructure, dataSlotId: number) => {\n const updateTimeSlot = () => {\n const value = (inputElement.querySelector('input[name=\"yesno\"]:checked') as HTMLInputElement)?.value\n if (value) {\n setValue(dataSlotId, question.id, value)\n }\n }\n\n const existingValue = ratingData[`s${dataSlotId}`]?.[question.id]\n if (existingValue) {\n (inputElement.querySelector(`input[name=\"yesno\"][value=\"${existingValue}\"]`) as HTMLInputElement).checked = true\n }\n\n inputElement.onchange = updateTimeSlot\n }\n\n const configureRating = (inputElement: HTMLDivElement, question: QuestionStructure, dataSlotId: number) => {\n const ratingElement = (inputElement.querySelector('input[type=\"range\"]') as HTMLInputElement)\n const updateValue = () => {\n const value = ratingElement.value\n if (value) {\n setValue(dataSlotId, question.id, value)\n }\n }\n\n const existingValue = ratingData[`s${dataSlotId}`]?.[question.id]\n if (existingValue) {\n ratingElement.value = existingValue\n }\n\n ratingElement.oninput = updateValue\n }\n\n const configureInput = (inputElement: HTMLInputElement, question: QuestionStructure, dataSlotId: number) => {\n const updateValue = () => {\n const { value } = inputElement\n if (value) {\n setValue(dataSlotId, question.id, value)\n }\n }\n\n const existingValue = ratingData[`s${dataSlotId}`]?.[question.id]\n if (existingValue) {\n inputElement.value = existingValue\n }\n\n inputElement.onchange = updateValue\n }\n\n const configureText = (inputElement: HTMLTextAreaElement, question: QuestionStructure, dataSlotId: number) => {\n const updateValue = () => {\n const { value } = inputElement\n if (value) {\n setValue(dataSlotId, question.id, value)\n }\n }\n\n const existingValue = ratingData[`s${dataSlotId}`]?.[question.id]\n if (existingValue) {\n inputElement.value = existingValue\n }\n\n inputElement.onchange = updateValue\n }\n\n const configureYears = (inputElement: HTMLInputElement, question: QuestionStructure, dataSlotId: number) => {\n const updateValue = () => {\n const { value } = inputElement\n if (value) {\n let valueAsNumber: number | undefined = undefined\n try {\n valueAsNumber = +value\n } catch { }\n\n if (valueAsNumber && valueAsNumber >= 0 && valueAsNumber <= 60) {\n setValue(dataSlotId, question.id, value)\n }\n }\n }\n\n const existingValue = ratingData[`s${dataSlotId}`]?.[question.id]\n if (existingValue) {\n inputElement.value = existingValue\n }\n\n inputElement.onchange = updateValue\n }\n\n const needsNotMet = ['no', 'none']\n\n const countComplete = (id: number): number => {\n const answers = ratingData[`s${id}`] || {}\n return Object.keys(answers).filter(key => {\n const questionStructure = questions.structure[id].questions.find(q => q.id === key)\n if (!questionStructure) {\n return false\n }\n\n const answeredValue = answers[key]\n if (questionStructure.type === 'timeslot-selector' && answeredValue === 'none') {\n return false\n }\n\n const needs = questionStructure.needs\n if (!needs) {\n return true\n }\n\n const needsValue = answers[needs]\n if (!needsValue) {\n return true\n }\n\n return !needsNotMet.find(n => n === needsValue)\n }).length\n }\n\n const updateCompleted = () => {\n document.querySelectorAll('div.feedbackButton').forEach((button) => {\n const id = +button.attributes['data-id'].value\n setText(button, '.feedbackButtonProgressBar', `Questions Completed ${countComplete(id)} / ${questions.structure[id].questions.length}`)\n })\n }\n\n const addPopups = () => {\n addPopupHandler(document.querySelectorAll('.feedbackButton'), (div) => {\n const dataSlotId = +div.attributes['data-id'].value\n const popupContent = getTemplate('feedbackPopup').firstElementChild!\n const section = questions.structure[dataSlotId]\n setText(popupContent, 'div.feedbackTitle', `Feedback for ${section.title}`)\n section.questions.forEach((question) => {\n const questionBaseElement = getTemplate('questionTemplate').firstElementChild!\n setText(questionBaseElement, 'div.questionTitle', question.label)\n\n const inputElement = getTemplate(`${question.type}QuestionStyleTemplate`).firstElementChild!\n\n switch (question.type) {\n case 'email': {\n configureInput(inputElement as HTMLInputElement, question, dataSlotId)\n break\n }\n case 'level':\n case 'role':\n case 'influence': {\n configureSelector(inputElement as HTMLSelectElement, question, dataSlotId)\n break\n }\n case 'text': {\n configureText(inputElement as HTMLTextAreaElement, question, dataSlotId)\n break\n }\n case 'rate': {\n configureRating(inputElement as HTMLDivElement, question, dataSlotId)\n break\n }\n case 'yesno': {\n configureYesNo(inputElement as HTMLDivElement, question, dataSlotId)\n break\n }\n case 'years': {\n configureYears(inputElement as HTMLInputElement, question, dataSlotId)\n break\n }\n case 'timeslot-selector': {\n configureTimeSlotSelector(inputElement as HTMLSelectElement, question, dataSlotId)\n break\n }\n }\n\n inputElement.attributes['data-rating-field-id'] = question.id\n questionBaseElement.insertAdjacentElement('beforeend', inputElement)\n popupContent.insertAdjacentElement('beforeend', questionBaseElement)\n })\n\n const doneButton = getTemplate('doneButton').firstElementChild! as HTMLButtonElement\n doneButton.onclick = () => {\n (document.querySelector('div.popupClose')! as HTMLDivElement).dispatchEvent(new Event('click'))\n }\n popupContent.insertAdjacentElement('beforeend', doneButton)\n return popupContent\n }, undefined, undefined, () => {\n updateCompleted()\n }, (content) => {\n content.querySelectorAll('input[type=\"range\"]').forEach(i => {\n i.dispatchEvent(new Event('input'))\n })\n },\n 'feedbackPopupContent')\n }\n\n const addSubmit = () => {\n const saveButton = (document.getElementById('saveDataButton') as HTMLButtonElement)\n saveButton.onclick = (event) => {\n saveButton.innerText = 'Saving...';\n saveButton.disabled = true\n event.preventDefault()\n // eslint-disable-next-line no-undef\n grecaptcha.ready(async () => {\n // eslint-disable-next-line no-undef\n const token = await grecaptcha.execute('6LfkPcUlAAAAAHwYs14fkTiEZYsu5hAAq_bLKp-j', { action: 'submit' })\n ratingData.captcha = token\n const uploadResult = await fetch(feedbackServerUrl, {\n method: 'POST',\n body: JSON.stringify(ratingData),\n })\n\n if (!uploadResult.ok) {\n saveButton.innerText = 'Save';\n saveButton.disabled = false\n alert('Oh no! Something has gone horribly wrong. Please reload your browser and try again.')\n } else {\n saveButton.disabled = false\n saveButton.innerText = 'Save Complete';\n setTimeout(() => {\n saveButton.innerText = 'Save';\n }, 2000)\n }\n })\n }\n\n saveButton.style.display = 'unset'\n }\n\n const addButtons = () => {\n stage.removeChild(document.getElementById('feedbackLoading')!)\n questions.structure.forEach((question, index) => {\n let show = false\n let subTitle: string | undefined = undefined\n if (question.workshop !== undefined) {\n const workshopTitle = workshopStructure[question.workshop]\n if (workshopTitle !== 'none') {\n show = true\n subTitle = workshopTitle\n }\n } else {\n if (question.subtitle) {\n const parsedSubtitle = timeKeyFinder.exec(question.subtitle)\n if (parsedSubtitle) {\n const start = parsedSubtitle.groups?.[\"start\"] ?? \"\"\n const end = parsedSubtitle.groups?.[\"end\"] ?? \"\"\n const startTiming = timings?.find(i => i.startsWith(start))?.substring(start.length)\n const endTiming = timings?.find(i => i.startsWith(end))?.substring(end?.length)\n subTitle = `${startTiming} - ${endTiming}`\n } else {\n subTitle = question.subtitle\n }\n }\n\n show = true\n }\n\n if (show) {\n const questionButton = getTemplate('feedbackButton').querySelector('div')!\n questionButton.setAttribute('data-id', index.toString())\n setText(questionButton, '.feedbackButtonTitle', question.title)\n setText(questionButton, '.feedbackButtonProgressBar', `Questions Completed ${countComplete(index)} / ${question.questions.length}`)\n if (subTitle) {\n setText(questionButton, '.feedbackButtonWorkshop', subTitle)\n }\n\n stage.insertAdjacentElement('beforeend', questionButton)\n }\n })\n }\n\n addButtons()\n addPopups()\n addSubmit()\n}\n","import feedback from \"./feedback\"\nimport event from \"./event\"\nimport sponsorBlock from \"./sponsorBlock\"\nimport speakerFeedback from \"./speakerFeedback\"\n\nif (typeof fetch === 'undefined') {\n // eslint-disable-next-line no-alert\n alert(\"Oh no 😢 We don't support your web browser. Please upgrade to a newer version!\")\n}\n\nevent()\nfeedback()\nsponsorBlock()\nspeakerFeedback()","import { addPopupHandler, getTemplate, setText } from './common'\nimport { SessionizeEvent, SessionizeSpeaker, loadSessionizeData } from './sessionize'\n\nexport default async () => {\n const agendaPlaceholder = document.getElementById('agenda')\n\n if (!agendaPlaceholder) {\n return\n }\n\n const eventId = agendaPlaceholder.getAttribute('data-event-id')\n\n if (!eventId) {\n return\n }\n\n let eventData: SessionizeEvent | undefined\n\n const toggleUI = () => {\n document.querySelectorAll('.agenda-row-style-loading').forEach((element) => {\n const div = element as HTMLDivElement\n div.style.display = 'none'\n })\n\n document.querySelectorAll('.agenda > .hidden-row').forEach((element) => {\n const div = element as HTMLDivElement\n div.style.display = 'grid'\n })\n }\n\n const getSpeakerInfo = (sessionSpeakers: Array) => {\n return eventData!.speakers.filter((s: SessionizeSpeaker) => sessionSpeakers.indexOf(s.id) >= 0)\n }\n\n const seperatorSet = [\"🔹\"]\n\n const speakerSubtitle = (sessionSpeakers: Array): string => {\n const speakers = getSpeakerInfo(sessionSpeakers)\n\n if (speakers.length === 1) {\n const speaker = speakers[0]\n let country = ''\n if (speaker.categoryItems.indexOf(204593) >= 0) {\n country = 'South Africa'\n } else {\n country = speaker.questionAnswers.find(i => i.questionId === 59078)?.answerValue\n }\n\n let pronoun = ''\n if (speaker.categoryItems.indexOf(204689) >= 0) {\n pronoun = 'He/Him'\n }\n\n if (speaker.categoryItems.indexOf(204687) >= 0) {\n pronoun = 'She/Her'\n }\n\n if (speaker.categoryItems.indexOf(204688) >= 0) {\n pronoun = 'They/Them'\n }\n\n const seperator = seperatorSet[Math.floor(Math.random() * seperatorSet.length)]\n\n if (pronoun) {\n return `${pronoun} ${seperator} ${country}`\n } else {\n return country ?? \"\"\n }\n }\n\n return \"\"\n }\n\n const multipleSpeakerNames = (sessionSpeakers: Array): string => {\n const remappedSpeakers = getSpeakerInfo(sessionSpeakers).map((s: SessionizeSpeaker) => s.fullName)\n\n if (remappedSpeakers.length === 1) {\n return remappedSpeakers[0]\n }\n\n return `${remappedSpeakers.filter((_, index) => index < remappedSpeakers.length - 1).join(', ')} & ${remappedSpeakers[remappedSpeakers.length - 1]}`\n }\n\n const getSpeakerBio = (sessionSpeakers: Array): string => {\n const remappedSpeakers = getSpeakerInfo(sessionSpeakers).map((s) => s.bio)\n\n if (remappedSpeakers.length === 1) {\n return remappedSpeakers[0]\n }\n\n return remappedSpeakers.join('
')\n }\n\n const otherSpeakerImages = (sessionSpeakers: Array): Array => {\n const remappedSpeakers = getSpeakerInfo(sessionSpeakers).map((s) => s.profilePicture)\n\n if (remappedSpeakers.length === 1) {\n return []\n }\n\n return remappedSpeakers.slice(1)\n }\n\n const singleSpeaker = (sessionSpeakers: Array) => getSpeakerInfo(sessionSpeakers)[0]\n\n const singleSpeakerImage = (sessionSpeakers: Array): string => singleSpeaker(sessionSpeakers).profilePicture\n\n const buildSocialBadges = (speaker: SessionizeSpeaker) => {\n const result: Array = []\n speaker.links.forEach((link) => {\n const aTag = document.createElement('a')\n aTag.target = '_blank'\n aTag.href = link.url\n const image = document.createElement('img')\n image.alt = link.title\n switch (link.title) {\n case 'Twitter': {\n image.src = '/public/images/icons8-twitter-50.png'\n break\n }\n case 'LinkedIn': {\n image.src = '/public/images/icons8-linkedin-50.png'\n break\n }\n case 'Blog': {\n image.src = '/public/images/icons8-website-50.png'\n break\n }\n default: {\n image.src = '/public/images/icons8-external-link-50.png'\n break\n }\n }\n aTag.appendChild(image)\n result.push(aTag)\n })\n\n return result\n }\n\n const getSession = (sessionId: String) => eventData!.sessions.filter((session) => session.id === sessionId)[0]\n\n const speakerImageCreator = (src: string, hide = false): HTMLImageElement => {\n const imageElement = document.createElement('img')\n imageElement.src = src\n imageElement.classList.add('speaker-image')\n if (hide) {\n imageElement.classList.add('hide')\n }\n return imageElement\n }\n\n const buildMuliSpeakerImageBlock = (primaryImage: string, otherImages: string[], isLargePopupImage = false): HTMLDivElement => {\n const imagesHolder = document.createElement('div')\n imagesHolder.setAttribute('x-imageset', '')\n imagesHolder.classList.add('multi-speaker-container')\n const firstImage = speakerImageCreator(primaryImage)\n firstImage.classList.add('multi-speaker-image')\n if (isLargePopupImage) {\n firstImage.classList.add('largePopupImage')\n }\n\n imagesHolder.appendChild(firstImage)\n\n otherImages.forEach((otherSpeaker) => {\n const nextImage = speakerImageCreator(otherSpeaker, true)\n nextImage.classList.add('multi-speaker-image')\n if (isLargePopupImage) {\n nextImage.classList.add('largePopupImage')\n }\n\n imagesHolder.appendChild(nextImage)\n })\n\n return imagesHolder\n }\n\n const addPopups = () => {\n addPopupHandler(document.querySelectorAll('.agenda-session'), (div) => {\n const dataSlotId = div.attributes['data-slot-id'].value\n if (!dataSlotId && dataSlotId === '0') {\n return null\n }\n\n const matchedSession = getSession(dataSlotId)\n\n if (matchedSession) {\n const speakerInfo = singleSpeaker(matchedSession.speakers)\n const socialLinks = getSpeakerInfo(matchedSession.speakers).flatMap((s) => buildSocialBadges(s))\n const contentNode = getTemplate('popupBioContent')\n const bioContent = contentNode.firstElementChild!\n const otherImages = otherSpeakerImages(matchedSession.speakers)\n if (otherImages.length > 0) {\n const imageElement = bioContent.querySelector('img.largePopupImage')!!\n imageElement.classList.add('hide')\n const multiImageElement = buildMuliSpeakerImageBlock(speakerInfo.profilePicture, otherImages, true)\n imageElement.insertAdjacentElement('afterend', multiImageElement)\n } else {\n const imageElement = (bioContent.querySelector('img.largePopupImage')! as HTMLImageElement)\n imageElement.src = speakerInfo.profilePicture\n }\n\n setText(bioContent, 'div.bio-speaker', multipleSpeakerNames(matchedSession.speakers))\n setText(bioContent, 'div.bio-subtitle', speakerSubtitle(matchedSession.speakers))\n const socialLinkPlaceholder = (bioContent.querySelector('div.bio-social')! as HTMLDivElement)\n socialLinks.forEach((link) => {\n socialLinkPlaceholder.appendChild(link)\n })\n\n const bio = getSpeakerBio(matchedSession.speakers)\n if (otherImages.length === 0) {\n setText(bioContent, 'div.bio-tagline', speakerInfo.tagLine)\n }\n\n setText(bioContent, 'div.bio-title', matchedSession.title)\n setText(bioContent, 'div.bio-talk-description', matchedSession.description)\n setText(bioContent, 'div.bio-speaker-bio', bio)\n return bioContent\n } else {\n return null;\n }\n }, 'clickable-session', 'unclickable-session', undefined, (div) => {\n const speakerId = div.attributes[\"speaker-id\"].value\n if (speakerId) {\n const matchedSession = getSession(speakerId)\n if (matchedSession) {\n const speakerInfo = singleSpeaker(matchedSession.speakers)\n window.currentSpeaker = {\n name: speakerInfo.fullName,\n id: speakerId\n }\n }\n }\n })\n }\n\n const fadeOut = (element: HTMLElement) => {\n let opacity = 1 // initial opacity\n const decrease = () => {\n if (opacity <= 0.1) {\n element.classList.add('hide')\n return\n }\n\n element.style.opacity = opacity.toString()\n opacity -= opacity * 0.025\n requestAnimationFrame(decrease)\n }\n\n decrease()\n }\n\n const fadeIn = (element: HTMLElement) => {\n let opacity = 0.1 // initial opacity\n element.classList.remove('hide')\n const increase = () => {\n if (opacity >= 1) {\n return\n }\n\n element.style.opacity = opacity.toString()\n opacity += opacity * 0.025\n requestAnimationFrame(increase)\n }\n\n increase()\n }\n\n const rotateImages = () => {\n setInterval(() => {\n const imageSets = Array.from(document.querySelectorAll('div[x-imageSet]'))\n imageSets.forEach((imageSet) => {\n const images: NodeListOf = imageSet.querySelectorAll('img')\n const currentImageIndex = Array.from(images).findIndex((i) => !i.classList.contains('hide'))\n fadeOut(images[currentImageIndex])\n let next = currentImageIndex + 1\n if (next >= images.length) {\n next = 0\n }\n\n fadeIn(images[next])\n })\n }, 3500)\n }\n\n const parseEventData = () => {\n document.querySelectorAll('.agenda-session').forEach((element) => {\n const div = element as HTMLDivElement\n const dataSlotId = div.attributes['data-slot-id'].value\n if (dataSlotId === '999999') {\n const tbaTemplate = getTemplate('noSessionCardTemplate').querySelector('div')\n div.insertAdjacentElement('beforeend', tbaTemplate!)\n } else {\n const matchedSession = getSession(dataSlotId)\n\n if (!matchedSession) {\n const tbaTemplate = getTemplate('tbaCardTemplate').querySelector('div')\n div.insertAdjacentElement('beforeend', tbaTemplate!)\n } else {\n const templateDivs = getTemplate('sessionCardTemplate').querySelectorAll('div')\n templateDivs.forEach((templateElement) => {\n switch (templateElement.className) {\n case 'agenda-session-image': {\n const otherImages = otherSpeakerImages(matchedSession.speakers)\n if (otherImages.length > 0) {\n const imagesHolder = buildMuliSpeakerImageBlock(singleSpeakerImage(matchedSession.speakers), otherImages)\n templateElement.appendChild(imagesHolder)\n } else {\n templateElement.appendChild(speakerImageCreator(singleSpeakerImage(matchedSession.speakers)))\n }\n\n break\n }\n case 'agenda-session-subtitle': {\n templateElement.innerText = speakerSubtitle(matchedSession.speakers)\n break;\n }\n case 'agenda-session-name': {\n templateElement.innerText = multipleSpeakerNames(matchedSession.speakers)\n break\n }\n case 'agenda-session-title': {\n templateElement.innerText = matchedSession.title\n break\n }\n }\n\n div.insertAdjacentElement('beforeend', templateElement)\n })\n }\n }\n })\n\n addPopups()\n toggleUI()\n rotateImages()\n }\n\n eventData = await loadSessionizeData(eventId)\n if (!eventData) {\n return\n }\n\n parseEventData()\n\n const requestedSpeakerId = new URLSearchParams(window.location.search).get(\"currentSpeaker\")\n if (requestedSpeakerId) {\n const speakerButton = document.querySelector(`div[data-slot-id=\"${requestedSpeakerId}\"]`) as HTMLElement\n speakerButton.click()\n }\n}\n","export default () => {\n const sponsorBlock = document.getElementsByClassName('sponsor-content-detail-wide-body')[0];\n if (!sponsorBlock) {\n return\n }\n\n let sponsorPosition = 0\n\n setInterval(() => {\n sponsorPosition += 0.25\n if (sponsorPosition > sponsorBlock.scrollWidth) {\n sponsorPosition = 0\n }\n \n sponsorBlock.scrollTo(sponsorPosition, 0);\n }, 10)\n}\n","import { feedbackServerUrl, getTemplate } from \"./common\";\n\ninterface EventData {\n event: string;\n feedback: Feedback[];\n}\n\ninterface Feedback {\n feedback?: string;\n ratingPresentation: number;\n ratingContent: number;\n ratingValue: number;\n}\n\n\nexport default () => {\n const target = document.getElementById('speakerFeedbackReport') as HTMLDivElement\n if (!target) {\n return\n }\n\n const speakerKeyElement = (document.getElementById('speakerKey') as HTMLInputElement)!\n\n const comparedValue = (speakerScore: number, average: number | undefined): string => {\n const avgValue = (average || 0)\n if (avgValue === 0) {\n return avgValue.toFixed(2);\n }\n\n let symbol = ''\n if (speakerScore > avgValue) {\n symbol = '↑'\n }\n\n if (speakerScore < avgValue) {\n symbol = '↓'\n }\n\n return `${avgValue.toFixed(2)} ${symbol}`\n }\n\n const showData = (data: EventData[], averages) => {\n target.innerHTML = ''\n console.dir(data)\n if (data.length === 0) {\n target.innerText = 'No data yet! Check back later!'\n return\n }\n\n data.forEach(event => {\n const title = getTemplate('title')!.firstElementChild as HTMLDivElement\n title.innerText = event.event\n target.insertAdjacentElement('beforeend', title)\n\n const feedbackTable = getTemplate('feedbackTable')!.firstElementChild as HTMLTableElement\n\n const feedbackTotals = event.feedback.reduce((acc, nextValue) => {\n acc.presSum += nextValue.ratingPresentation\n acc.contentSum += nextValue.ratingContent\n acc.valueSum += nextValue.ratingValue\n return acc\n }, { presSum: 0, contentSum: 0, valueSum: 0 });\n\n const presAvg = (feedbackTotals.presSum / event.feedback.length);\n const contentAvg = (feedbackTotals.contentSum / event.feedback.length);\n const valueAvg = (feedbackTotals.valueSum / event.feedback.length);\n\n (feedbackTable.querySelector('#presAvg') as HTMLTableCellElement).innerText = presAvg.toFixed(2);\n (feedbackTable.querySelector('#contentAvg') as HTMLTableCellElement).innerText = contentAvg.toFixed(2);\n (feedbackTable.querySelector('#valueAvg') as HTMLTableCellElement).innerText = valueAvg.toFixed(2);\n\n if (averages.length > 0) {\n const average = averages[0];\n (feedbackTable.querySelector('#timeslotPresAvg') as HTMLTableCellElement).innerText = comparedValue(presAvg, average[`${event.event}-ratingPresentationtimeslot`]);\n (feedbackTable.querySelector('#timeslotContentAvg') as HTMLTableCellElement).innerText = comparedValue(contentAvg, average[`${event.event}-ratingContenttimeslot`]);\n (feedbackTable.querySelector('#timeslotValueAvg') as HTMLTableCellElement).innerText = comparedValue(valueAvg, average[`${event.event}-ratingValuetimeslot`]);\n\n (feedbackTable.querySelector('#eventPresAvg') as HTMLTableCellElement).innerText = comparedValue(presAvg, average[`${event.event}-ratingPresentation`]);\n (feedbackTable.querySelector('#eventContentAvg') as HTMLTableCellElement).innerText = comparedValue(contentAvg, average[`${event.event}-ratingContent`]);\n (feedbackTable.querySelector('#eventValueAvg') as HTMLTableCellElement).innerText = comparedValue(valueAvg, average[`${event.event}-ratingValue`]);\n\n (feedbackTable.querySelector('#globalPresAvg') as HTMLTableCellElement).innerText = comparedValue(presAvg, average['global-ratingPresentation']);\n (feedbackTable.querySelector('#globalContentAvg') as HTMLTableCellElement).innerText = comparedValue(contentAvg, average['global-ratingContent']);\n (feedbackTable.querySelector('#globalValueAvg') as HTMLTableCellElement).innerText = comparedValue(valueAvg, average['global-ratingValue']);\n } else {\n feedbackTable.querySelectorAll('.additionalAverageInfo').forEach(item => {\n (item as HTMLTableRowElement).style.display = 'none';\n });\n }\n\n const footerRow = (feedbackTable.querySelector('#feedbackFooter') as HTMLTableRowElement)\n event.feedback.forEach((f) => {\n const row = getTemplate('feedbackRow')!.firstElementChild as HTMLTableRowElement\n (row.querySelector('.presValue') as HTMLTableCellElement).innerText = f.ratingPresentation.toFixed(0);\n (row.querySelector('.contentValue') as HTMLTableCellElement).innerText = f.ratingContent.toFixed(0);\n (row.querySelector('.valueValue') as HTMLTableCellElement).innerText = f.ratingValue.toFixed(0);\n (row.querySelector('.feedbackValue') as HTMLTableCellElement).innerText = f.feedback || ''\n\n footerRow.insertAdjacentElement('beforebegin', row)\n })\n\n target.insertAdjacentElement('beforeend', feedbackTable)\n })\n }\n\n const addButton = () => {\n const button = document.getElementById('getDataButton') as HTMLButtonElement\n if (!button) {\n return\n }\n\n button.onclick = async () => {\n const key = speakerKeyElement.value\n if (!key || key.length != 32) {\n return\n }\n\n try {\n button.disabled = true\n button.innerText = 'Loading...'\n const data = await fetch(`${feedbackServerUrl}?speaker=${key}`)\n if (data.ok) {\n const dataSet = await data.json() as Array;\n const averages = dataSet.filter(row => !row.event)\n showData(dataSet.filter(row => row.event) as EventData[], averages)\n window.localStorage.setItem('speakerFeedbackKey', key)\n } else {\n target.innerText = `Invalid speaker key [${data.status}]`\n }\n } finally {\n button.disabled = false\n button.innerText = 'Get Report'\n }\n }\n }\n\n const preloadSpeakerKey = () => {\n const speakerKey = window.localStorage.getItem('speakerFeedbackKey')\n if (speakerKey) {\n speakerKeyElement.value = speakerKey\n }\n }\n\n addButton()\n preloadSpeakerKey()\n}"],"names":["feedbackServerUrl","getTemplate","templateId","document","getElementById","cloneNode","content","setText","parent","query","value","querySelector","innerText","addPopupHandler","elementsToAddPopupTo","popupContentBuilder","clickableClass","unclickableClass","onCloseHandler","onOpenHandler","popupContentKey","closePopup","window","currentSpeaker","undefined","classList","add","removeEventListener","handleCloseKeyPress","contentToRemove","parentNode","removeChild","call","event","key","popupShare","onclick","async","url","location","origin","pathname","id","shareData","title","name","text","navigator","share","canShare","clipboard","writeText","alert","backdrop","addEventListener","forEach","div","popupContent","remove","elementsToSelect","popupContentStage","dataSlotId","attributes","setAttribute","querySelectorAll","insertAdjacentElement","loadSessionizeData","eventId","result","existingData","sessionData","sessionStorage","getItem","JSON","parse","loadStoredData","onLine","response","fetch","ok","json","setItem","stringify","randomUUID","crypto","bind","getRandomValues","rnds8","Uint8Array","rng","Error","byteToHex","i","push","toString","slice","options","buf","offset","rnds","random","arr","toLowerCase","unsafeStringify","timeKeyFinder","agendaPlaceholder","getAttribute","eventData","getSpeakerInfo","sessionSpeakers","speakers","filter","s","indexOf","seperatorSet","speakerSubtitle","length","speaker","country","categoryItems","questionAnswers","find","questionId","answerValue","pronoun","seperator","Math","floor","multipleSpeakerNames","remappedSpeakers","map","fullName","_","index","join","otherSpeakerImages","profilePicture","singleSpeaker","singleSpeakerImage","getSession","sessionId","sessions","session","speakerImageCreator","src","hide","imageElement","createElement","buildMuliSpeakerImageBlock","primaryImage","otherImages","isLargePopupImage","imagesHolder","firstImage","appendChild","otherSpeaker","nextImage","element","tbaTemplate","matchedSession","templateElement","className","speakerInfo","socialLinks","flatMap","links","link","aTag","target","href","image","alt","buildSocialBadges","bioContent","firstElementChild","multiImageElement","socialLinkPlaceholder","bio","getSpeakerBio","tagLine","description","speakerId","style","display","setInterval","Array","from","imageSet","images","currentImageIndex","findIndex","contains","opacity","decrease","requestAnimationFrame","fadeOut","next","increase","fadeIn","requestedSpeakerId","URLSearchParams","search","get","click","stage","questions","storedQuestions","questionsResponse","ratingId","sessionStructure","trim","split","timings","innerHTML","workshopStructure","ratingStoredData","localStorage","ratingData","submitter","talkTitle","setValue","needsNotMet","countComplete","answers","Object","keys","questionStructure","structure","q","answeredValue","type","needs","needsValue","n","question","subTitle","show","workshop","workshopTitle","subtitle","parsedSubtitle","exec","start","groups","end","startTiming","startsWith","substring","endTiming","questionButton","section","questionBaseElement","label","inputElement","existingValue","onchange","configureInput","option","selected","configureSelector","configureText","ratingElement","oninput","configureRating","checked","configureYesNo","valueAsNumber","configureYears","append","configureTimeSlotSelector","doneButton","dispatchEvent","Event","button","saveButton","disabled","preventDefault","grecaptcha","ready","token","execute","action","captcha","method","body","setTimeout","addSubmit","feedback","sponsorBlock","getElementsByClassName","sponsorPosition","scrollWidth","scrollTo","speakerKeyElement","comparedValue","speakerScore","average","avgValue","toFixed","symbol","data","dataSet","averages","row","console","dir","feedbackTable","feedbackTotals","reduce","acc","nextValue","presSum","ratingPresentation","contentSum","ratingContent","valueSum","ratingValue","presAvg","contentAvg","valueAvg","item","footerRow","f","showData","status","addButton","speakerKey","preloadSpeakerKey","speakerFeedback"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"devconf.js","mappings":"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","sources":["webpack://devconf/./src/common.ts","webpack://devconf/./src/sessionize.ts","webpack://devconf/./node_modules/uuid/dist/esm-browser/native.js","webpack://devconf/./node_modules/uuid/dist/esm-browser/rng.js","webpack://devconf/./node_modules/uuid/dist/esm-browser/stringify.js","webpack://devconf/./node_modules/uuid/dist/esm-browser/v4.js","webpack://devconf/./src/feedback.ts","webpack://devconf/./src/devconf.ts","webpack://devconf/./src/event.ts","webpack://devconf/./src/sponsorBlock.ts","webpack://devconf/./src/speakerFeedback.ts"],"sourcesContent":["interface ICurrentSpeaker {\n name: string;\n id: string;\n}\n\ndeclare global {\n var currentSpeaker: ICurrentSpeaker | undefined;\n}\n\nexport const feedbackServerUrl = 'https://ratings-2slkxdorza-nw.a.run.app'\n// export const feedbackServerUrl = 'http://localhost:8080'\n\nexport const getTemplate = (templateId: string) => ((document.getElementById(templateId) as HTMLTemplateElement)\n ?.cloneNode(true) as HTMLTemplateElement)\n ?.content\n\nexport const setText = (parent: Element, query: string, value: string) => {\n (parent.querySelector(query) as HTMLDivElement).innerText = value\n}\n\nexport const addPopupHandler = (\n elementsToAddPopupTo: NodeListOf,\n popupContentBuilder: (div: HTMLDivElement) => Element | null,\n clickableClass?: string,\n unclickableClass?: string,\n onCloseHandler?: () => void,\n onOpenHandler?: (content: Element) => void,\n popupContentKey?: string,\n) => {\n const closePopup = () => {\n window.currentSpeaker = undefined;\n document.querySelector('div.popupBackdrop')!.classList.add('popupBackdropHidden')\n // eslint-disable-next-line no-use-before-define\n document.removeEventListener('keydown', handleCloseKeyPress)\n const contentToRemove = document.querySelector('div[data-popup-content=\"yes\"]')\n contentToRemove?.parentNode?.removeChild(contentToRemove)\n onCloseHandler?.call(this)\n }\n\n const handleCloseKeyPress = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n closePopup()\n }\n }\n\n const popupShare = document.querySelector('div.popupShare') as HTMLDivElement\n if (popupShare) {\n popupShare.onclick = async () => {\n if (window.currentSpeaker) {\n const url = `${window.location.origin + window.location.pathname}?currentSpeaker=${window.currentSpeaker.id}`\n\n const shareData = {\n title: `DevConf Speaker: ${window.currentSpeaker.name}`,\n text: `DevConf Speaker: ${window.currentSpeaker.name}`,\n url: url,\n }\n\n if (navigator.share != undefined && navigator.canShare(shareData)) {\n await navigator.share(shareData)\n } else {\n await navigator.clipboard.writeText(url);\n alert('URL is copied to clipboard')\n }\n }\n }\n }\n\n const popupClose = document.querySelector('div.popupClose')! as HTMLDivElement\n popupClose.onclick = () => {\n closePopup()\n }\n\n const backdrop = document.querySelector('div.popupBackdropHidden')!\n backdrop.addEventListener('click', closePopup)\n\n elementsToAddPopupTo.forEach((div) => {\n const popupContent = popupContentBuilder(div)\n if (popupContent) {\n if (clickableClass) {\n div.classList.add(clickableClass)\n }\n\n div.onclick = () => {\n backdrop.classList.remove('popupBackdropHidden')\n document.addEventListener('keydown', handleCloseKeyPress)\n\n let elementsToSelect = 'div.popupContent'\n if (popupContentKey) {\n elementsToSelect = `div.${popupContentKey}`\n }\n const popupContentStage = document.querySelector(elementsToSelect)!\n const dataSlotId = div.attributes['data-slot-id']?.value\n if (dataSlotId) {\n popupContentStage.setAttribute(\"speaker-id\", dataSlotId)\n }\n\n popupContentStage.querySelectorAll('div.popupBio').forEach((value) => {\n popupContentStage.removeChild(value)\n })\n\n popupContent.setAttribute('data-popup-content', 'yes')\n popupContentStage.insertAdjacentElement('beforeend', popupContent)\n onOpenHandler?.call(this, popupContentStage)\n }\n } else {\n if (unclickableClass) {\n div.classList.add(unclickableClass)\n }\n }\n })\n}","interface SessionizeSession {\n id: string;\n title: string;\n description: string;\n startsAt: Date;\n endsAt: Date;\n isServiceSession: boolean;\n isPlenumSession: boolean;\n speakers: string[];\n categoryItems: number[];\n questionAnswers: any[];\n roomId: number;\n}\n\ninterface SessionizeLink {\n title: string;\n url: string;\n linkType: string;\n}\n\nexport interface SessionizeSpeaker {\n id: string;\n firstName: string;\n lastName: string;\n bio: string;\n tagLine: string;\n profilePicture: string;\n isTopSpeaker: boolean;\n links: SessionizeLink[];\n sessions: number[];\n fullName: string;\n categoryItems: any[];\n questionAnswers: any[];\n}\n\ninterface SessionizeItem {\n id: number;\n name: string;\n sort: number;\n}\n\ninterface SessionizeCategory {\n id: number;\n title: string;\n items: SessionizeItem[];\n sort: number;\n}\n\ninterface SessionizeRoom {\n id: number;\n name: string;\n sort: number;\n}\n\nexport interface SessionizeEvent {\n sessions: SessionizeSession[];\n speakers: SessionizeSpeaker[];\n questions: any[];\n categories: SessionizeCategory[];\n rooms: SessionizeRoom[];\n}\n\nconst loadStoredData = (id: string): SessionizeEvent | undefined => {\n const sessionData = window.sessionStorage.getItem(`event${id}`)\n if (sessionData) {\n try {\n return JSON.parse(sessionData) as SessionizeEvent\n } catch {\n alert('Oh no! Something has gone horribly wrong. Please close and reopen your browser and try again.')\n return undefined\n }\n }\n\n return undefined\n}\n\nexport const loadSessionizeData = async (eventId: string): Promise => {\n let result: SessionizeEvent | undefined\n\n const existingData = loadStoredData(eventId)\n if (existingData) {\n return existingData\n }\n\n if (navigator.onLine) {\n try {\n const response = await fetch(`https://sessionize.com/api/v2/${eventId}/view/all`)\n if (response.ok) {\n result = await response.json() as SessionizeEvent\n window.sessionStorage.setItem(`event${eventId}`, JSON.stringify(result))\n }\n } catch {\n alert('Oh no! Something has gone horribly wrong. Please reload your browser and try again.')\n }\n }\n\n return result\n}\n","const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);\nexport default { randomUUID };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF0aXZlLWJyb3dzZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbmF0aXZlLWJyb3dzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxVQUFVLEdBQ2QsT0FBTyxNQUFNLEtBQUssV0FBVyxJQUFJLE1BQU0sQ0FBQyxVQUFVLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7QUFFdkYsZUFBZSxFQUFFLFVBQVUsRUFBRSxDQUFDIn0=","let getRandomValues;\nconst rnds8 = new Uint8Array(16);\nexport default function rng() {\n if (!getRandomValues) {\n if (typeof crypto === 'undefined' || !crypto.getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n getRandomValues = crypto.getRandomValues.bind(crypto);\n }\n return getRandomValues(rnds8);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm5nLWJyb3dzZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcm5nLWJyb3dzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsSUFBSSxlQUEwRCxDQUFDO0FBRS9ELE1BQU0sS0FBSyxHQUFHLElBQUksVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBRWpDLE1BQU0sQ0FBQyxPQUFPLFVBQVUsR0FBRztJQUV6QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDckIsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDN0QsTUFBTSxJQUFJLEtBQUssQ0FDYiwwR0FBMEcsQ0FDM0csQ0FBQztRQUNKLENBQUM7UUFFRCxlQUFlLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVELE9BQU8sZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2hDLENBQUMifQ==","import validate from './validate.js';\nconst byteToHex = [];\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\nexport function unsafeStringify(arr, offset = 0) {\n return (byteToHex[arr[offset + 0]] +\n byteToHex[arr[offset + 1]] +\n byteToHex[arr[offset + 2]] +\n byteToHex[arr[offset + 3]] +\n '-' +\n byteToHex[arr[offset + 4]] +\n byteToHex[arr[offset + 5]] +\n '-' +\n byteToHex[arr[offset + 6]] +\n byteToHex[arr[offset + 7]] +\n '-' +\n byteToHex[arr[offset + 8]] +\n byteToHex[arr[offset + 9]] +\n '-' +\n byteToHex[arr[offset + 10]] +\n byteToHex[arr[offset + 11]] +\n byteToHex[arr[offset + 12]] +\n byteToHex[arr[offset + 13]] +\n byteToHex[arr[offset + 14]] +\n byteToHex[arr[offset + 15]]).toLowerCase();\n}\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset);\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n return uuid;\n}\nexport default stringify;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaW5naWZ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0cmluZ2lmeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLFFBQVEsTUFBTSxlQUFlLENBQUM7QUFNckMsTUFBTSxTQUFTLEdBQWEsRUFBRSxDQUFDO0FBRS9CLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM3QixTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwRCxDQUFDO0FBRUQsTUFBTSxVQUFVLGVBQWUsQ0FBQyxHQUFlLEVBQUUsTUFBTSxHQUFHLENBQUM7SUFNekQsT0FBTyxDQUNMLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzFCLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzFCLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzFCLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzFCLEdBQUc7UUFDSCxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMxQixTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMxQixHQUFHO1FBQ0gsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDMUIsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDMUIsR0FBRztRQUNILFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzFCLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzFCLEdBQUc7UUFDSCxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsQ0FBQztRQUMzQixTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsQ0FBQztRQUMzQixTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsQ0FBQztRQUMzQixTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsQ0FBQztRQUMzQixTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsQ0FBQztRQUMzQixTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUM1QixDQUFDLFdBQVcsRUFBRSxDQUFDO0FBQ2xCLENBQUM7QUFFRCxTQUFTLFNBQVMsQ0FBQyxHQUFlLEVBQUUsTUFBTSxHQUFHLENBQUM7SUFDNUMsTUFBTSxJQUFJLEdBQUcsZUFBZSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztJQU8xQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDcEIsTUFBTSxTQUFTLENBQUMsNkJBQTZCLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQsZUFBZSxTQUFTLENBQUMifQ==","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n options = options || {};\n const rnds = options.random || (options.rng || rng)();\n rnds[6] = (rnds[6] & 0x0f) | 0x40;\n rnds[8] = (rnds[8] & 0x3f) | 0x80;\n if (buf) {\n offset = offset || 0;\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n return buf;\n }\n return unsafeStringify(rnds);\n}\nexport default v4;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidjQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdjQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxNQUFNLE1BQU0sYUFBYSxDQUFDO0FBQ2pDLE9BQU8sR0FBRyxNQUFNLFVBQVUsQ0FBQztBQUMzQixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJakQsU0FBUyxFQUFFLENBQUMsT0FBeUIsRUFBRSxHQUFnQixFQUFFLE1BQWU7SUFDdEUsSUFBSSxNQUFNLENBQUMsVUFBVSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDMUMsT0FBTyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVELE9BQU8sR0FBRyxPQUFPLElBQUksRUFBRSxDQUFDO0lBRXhCLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUM7SUFHdEQsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQztJQUNsQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBR2xDLElBQUksR0FBRyxFQUFFLENBQUM7UUFDUixNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsQ0FBQztRQUVyQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDNUIsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUIsQ0FBQztRQUVELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVELE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQy9CLENBQUM7QUFFRCxlQUFlLEVBQUUsQ0FBQyJ9","import { addPopupHandler, feedbackServerUrl, getTemplate, setText } from './common'\nimport { loadSessionizeData } from './sessionize'\nimport { v4 as uuidv4 } from 'uuid'\n\nconst timeKeyFinder = /\\$\\$(?.+)\\$\\$(?.+)\\$\\$/\n\ninterface QuestionStructure {\n id: string,\n label: string,\n type: 'rate' | 'text' | 'timeslot-selector' | 'yesno' | 'role' | 'level' | 'years' | 'email' | 'influence'\n key: number | undefined,\n needs?: string,\n}\n\ninterface SectionStructure {\n title: string,\n subtitle?: string,\n questions: QuestionStructure[]\n workshop?: number,\n}\n\ninterface QuestionaireStructure {\n structure: SectionStructure[],\n}\n\nconst tracks = 5\n\nexport default async () => {\n const stage = document.getElementById('feedbackStage') as HTMLDivElement\n if (!stage) {\n return\n }\n\n let questions: QuestionaireStructure\n const storedQuestions = window.sessionStorage.getItem('questionStructure')\n if (storedQuestions) {\n questions = JSON.parse(storedQuestions)\n } else {\n const questionsResponse = await fetch('/public/ratingconfig.json')\n if (!questionsResponse.ok) {\n return\n } else {\n questions = await questionsResponse.json()\n window.sessionStorage.setItem('questionStructure', JSON.stringify(questions))\n }\n }\n\n\n const ratingId = stage.getAttribute('data-rating-id');\n if (!ratingId) {\n return\n }\n\n const eventId = stage.getAttribute('data-event-id')\n if (!eventId) {\n return\n }\n\n const sessionStructure = document.getElementById('sessionData')!.innerText.trim().split(' ')\n const eventData = await loadSessionizeData(eventId)\n const timings = document.getElementById(\"timings\")?.innerHTML.trim().split(' ');\n const workshopStructure = document.getElementById('workshopData')!.innerText.trim().split(';;;').map(s => s.trim())\n\n const ratingStoredData = window.localStorage.getItem(`rating${ratingId}`)\n let ratingData: { [x: string]: {}; captcha?: any; event: string; submitter: string }\n if (!ratingStoredData) {\n ratingData = {\n event: ratingId,\n submitter: uuidv4(),\n }\n } else {\n ratingData = JSON.parse(ratingStoredData)\n }\n\n const talkTitle = (sessionId: string): string => {\n const session = eventData!.sessions.find((s) => s.id === sessionId)\n if (!session) {\n return \"To Be Announced\";\n }\n\n const speakers = session.speakers\n .map((speakerId) => eventData!.speakers.find((speaker) => speaker?.id === speakerId))\n .filter((speaker) => !!speaker)\n .map((speaker) => speaker?.fullName)\n .join(' and ');\n\n return `${session.title} by ${speakers}`\n }\n\n const setValue = (dataSlotId: number, id: string, value: string) => {\n if (!ratingData[`s${dataSlotId}`]) {\n ratingData[`s${dataSlotId}`] = {}\n }\n\n ratingData[`s${dataSlotId}`][id] = value\n\n window.localStorage.setItem(`rating${ratingId}`, JSON.stringify(ratingData))\n }\n\n const configureTimeSlotSelector = (inputElement: HTMLSelectElement, question: QuestionStructure, dataSlotId: number) => {\n const start = question.key! * tracks + 1\n const end = start + tracks\n\n for (let index = start; index < end; index++) {\n const sessionId = sessionStructure[index]\n if (sessionId === '999999') {\n continue\n }\n\n const option = document.createElement('option')\n\n option.value = sessionId\n option.text = talkTitle(sessionId)\n\n inputElement!.append(option)\n }\n\n const updateTimeSlot = () => {\n setValue(dataSlotId, question.id, inputElement.value)\n }\n\n const existingValue = ratingData[`s${dataSlotId}`]?.[question.id]\n if (existingValue) {\n inputElement.querySelectorAll('option').forEach((option) => {\n if (option.value === existingValue) {\n option.selected = true\n }\n })\n }\n\n inputElement.onchange = updateTimeSlot\n }\n\n const configureSelector = (inputElement: HTMLSelectElement, question: QuestionStructure, dataSlotId: number) => {\n const updateValue = () => {\n setValue(dataSlotId, question.id, inputElement.value)\n }\n\n const existingValue = ratingData[`s${dataSlotId}`]?.[question.id]\n if (existingValue) {\n inputElement.querySelectorAll('option').forEach((option) => {\n if (option.value === existingValue) {\n option.selected = true\n }\n })\n }\n\n inputElement.onchange = updateValue\n }\n\n const configureYesNo = (inputElement: HTMLDivElement, question: QuestionStructure, dataSlotId: number) => {\n const updateTimeSlot = () => {\n const value = (inputElement.querySelector('input[name=\"yesno\"]:checked') as HTMLInputElement)?.value\n if (value) {\n setValue(dataSlotId, question.id, value)\n }\n }\n\n const existingValue = ratingData[`s${dataSlotId}`]?.[question.id]\n if (existingValue) {\n (inputElement.querySelector(`input[name=\"yesno\"][value=\"${existingValue}\"]`) as HTMLInputElement).checked = true\n }\n\n inputElement.onchange = updateTimeSlot\n }\n\n const configureRating = (inputElement: HTMLDivElement, question: QuestionStructure, dataSlotId: number) => {\n const ratingElement = (inputElement.querySelector('input[type=\"range\"]') as HTMLInputElement)\n const updateValue = () => {\n const value = ratingElement.value\n if (value) {\n setValue(dataSlotId, question.id, value)\n }\n }\n\n const existingValue = ratingData[`s${dataSlotId}`]?.[question.id]\n if (existingValue) {\n ratingElement.value = existingValue\n }\n\n ratingElement.oninput = updateValue\n }\n\n const configureInput = (inputElement: HTMLInputElement, question: QuestionStructure, dataSlotId: number) => {\n const updateValue = () => {\n const { value } = inputElement\n if (value) {\n setValue(dataSlotId, question.id, value)\n }\n }\n\n const existingValue = ratingData[`s${dataSlotId}`]?.[question.id]\n if (existingValue) {\n inputElement.value = existingValue\n }\n\n inputElement.onchange = updateValue\n }\n\n const configureText = (inputElement: HTMLTextAreaElement, question: QuestionStructure, dataSlotId: number) => {\n const updateValue = () => {\n const { value } = inputElement\n if (value) {\n setValue(dataSlotId, question.id, value)\n }\n }\n\n const existingValue = ratingData[`s${dataSlotId}`]?.[question.id]\n if (existingValue) {\n inputElement.value = existingValue\n }\n\n inputElement.onchange = updateValue\n }\n\n const configureYears = (inputElement: HTMLInputElement, question: QuestionStructure, dataSlotId: number) => {\n const updateValue = () => {\n const { value } = inputElement\n if (value) {\n let valueAsNumber: number | undefined = undefined\n try {\n valueAsNumber = +value\n } catch { }\n\n if (valueAsNumber && valueAsNumber >= 0 && valueAsNumber <= 60) {\n setValue(dataSlotId, question.id, value)\n }\n }\n }\n\n const existingValue = ratingData[`s${dataSlotId}`]?.[question.id]\n if (existingValue) {\n inputElement.value = existingValue\n }\n\n inputElement.onchange = updateValue\n }\n\n const needsNotMet = ['no', 'none']\n\n const countComplete = (id: number): number => {\n const answers = ratingData[`s${id}`] || {}\n return Object.keys(answers).filter(key => {\n const questionStructure = questions.structure[id].questions.find(q => q.id === key)\n if (!questionStructure) {\n return false\n }\n\n const answeredValue = answers[key]\n if (questionStructure.type === 'timeslot-selector' && answeredValue === 'none') {\n return false\n }\n\n const needs = questionStructure.needs\n if (!needs) {\n return true\n }\n\n const needsValue = answers[needs]\n if (!needsValue) {\n return true\n }\n\n return !needsNotMet.find(n => n === needsValue)\n }).length\n }\n\n const updateCompleted = () => {\n document.querySelectorAll('div.feedbackButton').forEach((button) => {\n const id = +button.attributes['data-id'].value\n setText(button, '.feedbackButtonProgressBar', `Questions Completed ${countComplete(id)} / ${questions.structure[id].questions.length}`)\n })\n }\n\n const addPopups = () => {\n addPopupHandler(document.querySelectorAll('.feedbackButton'), (div) => {\n const dataSlotId = +div.attributes['data-id'].value\n const popupContent = getTemplate('feedbackPopup').firstElementChild!\n const section = questions.structure[dataSlotId]\n setText(popupContent, 'div.feedbackTitle', `Feedback for ${section.title}`)\n section.questions.forEach((question) => {\n const questionBaseElement = getTemplate('questionTemplate').firstElementChild!\n setText(questionBaseElement, 'div.questionTitle', question.label)\n\n const inputElement = getTemplate(`${question.type}QuestionStyleTemplate`).firstElementChild!\n\n switch (question.type) {\n case 'email': {\n configureInput(inputElement as HTMLInputElement, question, dataSlotId)\n break\n }\n case 'level':\n case 'role':\n case 'influence': {\n configureSelector(inputElement as HTMLSelectElement, question, dataSlotId)\n break\n }\n case 'text': {\n configureText(inputElement as HTMLTextAreaElement, question, dataSlotId)\n break\n }\n case 'rate': {\n configureRating(inputElement as HTMLDivElement, question, dataSlotId)\n break\n }\n case 'yesno': {\n configureYesNo(inputElement as HTMLDivElement, question, dataSlotId)\n break\n }\n case 'years': {\n configureYears(inputElement as HTMLInputElement, question, dataSlotId)\n break\n }\n case 'timeslot-selector': {\n configureTimeSlotSelector(inputElement as HTMLSelectElement, question, dataSlotId)\n break\n }\n }\n\n inputElement.attributes['data-rating-field-id'] = question.id\n questionBaseElement.insertAdjacentElement('beforeend', inputElement)\n popupContent.insertAdjacentElement('beforeend', questionBaseElement)\n })\n\n const doneButton = getTemplate('doneButton').firstElementChild! as HTMLButtonElement\n doneButton.onclick = () => {\n (document.querySelector('div.popupClose')! as HTMLDivElement).dispatchEvent(new Event('click'))\n }\n popupContent.insertAdjacentElement('beforeend', doneButton)\n return popupContent\n }, undefined, undefined, () => {\n updateCompleted()\n }, (content) => {\n content.querySelectorAll('input[type=\"range\"]').forEach(i => {\n i.dispatchEvent(new Event('input'))\n })\n },\n 'feedbackPopupContent')\n }\n\n const addSubmit = () => {\n const saveButton = (document.getElementById('saveDataButton') as HTMLButtonElement)\n saveButton.onclick = (event) => {\n saveButton.innerText = 'Saving...';\n saveButton.disabled = true\n event.preventDefault()\n // eslint-disable-next-line no-undef\n grecaptcha.ready(async () => {\n // eslint-disable-next-line no-undef\n const token = await grecaptcha.execute('6LfkPcUlAAAAAHwYs14fkTiEZYsu5hAAq_bLKp-j', { action: 'submit' })\n ratingData.captcha = token\n const uploadResult = await fetch(feedbackServerUrl, {\n method: 'POST',\n body: JSON.stringify(ratingData),\n })\n\n if (!uploadResult.ok) {\n saveButton.innerText = 'Save';\n saveButton.disabled = false\n alert('Oh no! Something has gone horribly wrong. Please reload your browser and try again.')\n } else {\n saveButton.disabled = false\n saveButton.innerText = 'Save Complete';\n setTimeout(() => {\n saveButton.innerText = 'Save';\n }, 2000)\n }\n })\n }\n\n saveButton.style.display = 'unset'\n }\n\n const addButtons = () => {\n stage.removeChild(document.getElementById('feedbackLoading')!)\n questions.structure.forEach((question, index) => {\n let show = false\n let subTitle: string | undefined = undefined\n if (question.workshop !== undefined) {\n const workshopTitle = workshopStructure[question.workshop]\n if (workshopTitle !== 'none') {\n show = true\n subTitle = workshopTitle\n }\n } else {\n if (question.subtitle) {\n const parsedSubtitle = timeKeyFinder.exec(question.subtitle)\n if (parsedSubtitle) {\n const start = parsedSubtitle.groups?.[\"start\"] ?? \"\"\n const end = parsedSubtitle.groups?.[\"end\"] ?? \"\"\n const startTiming = timings?.find(i => i.startsWith(start))?.substring(start.length)\n const endTiming = timings?.find(i => i.startsWith(end))?.substring(end?.length)\n subTitle = `${startTiming} - ${endTiming}`\n } else {\n subTitle = question.subtitle\n }\n }\n\n show = true\n }\n\n if (show) {\n const questionButton = getTemplate('feedbackButton').querySelector('div')!\n questionButton.setAttribute('data-id', index.toString())\n setText(questionButton, '.feedbackButtonTitle', question.title)\n setText(questionButton, '.feedbackButtonProgressBar', `Questions Completed ${countComplete(index)} / ${question.questions.length}`)\n if (subTitle) {\n setText(questionButton, '.feedbackButtonWorkshop', subTitle)\n }\n\n stage.insertAdjacentElement('beforeend', questionButton)\n }\n })\n }\n\n addButtons()\n addPopups()\n addSubmit()\n}\n","import feedback from \"./feedback\"\nimport event from \"./event\"\nimport sponsorBlock from \"./sponsorBlock\"\nimport speakerFeedback from \"./speakerFeedback\"\n\nif (typeof fetch === 'undefined') {\n // eslint-disable-next-line no-alert\n alert(\"Oh no 😢 We don't support your web browser. Please upgrade to a newer version!\")\n}\n\nevent()\nfeedback()\nsponsorBlock()\nspeakerFeedback()","import { addPopupHandler, getTemplate, setText } from './common'\nimport { SessionizeEvent, SessionizeSpeaker, loadSessionizeData } from './sessionize'\n\nexport default async () => {\n const agendaPlaceholder = document.getElementById('agenda')\n\n if (!agendaPlaceholder) {\n return\n }\n\n const eventId = agendaPlaceholder.getAttribute('data-event-id')\n\n if (!eventId) {\n return\n }\n\n let eventData: SessionizeEvent | undefined\n\n const toggleUI = () => {\n document.querySelectorAll('.agenda-row-style-loading').forEach((element) => {\n const div = element as HTMLDivElement\n div.style.display = 'none'\n })\n\n document.querySelectorAll('.agenda > .hidden-row').forEach((element) => {\n const div = element as HTMLDivElement\n div.style.display = 'grid'\n })\n }\n\n const getSpeakerInfo = (sessionSpeakers: Array) => {\n return eventData!.speakers.filter((s: SessionizeSpeaker) => sessionSpeakers.indexOf(s.id) >= 0)\n }\n\n const seperatorSet = [\"🔹\"]\n\n const speakerSubtitle = (sessionSpeakers: Array): string => {\n const speakers = getSpeakerInfo(sessionSpeakers)\n\n if (speakers.length === 1) {\n const speaker = speakers[0]\n let country = ''\n if (speaker.categoryItems.indexOf(204593) >= 0) {\n country = 'South Africa'\n } else {\n country = speaker.questionAnswers.find(i => i.questionId === 59078)?.answerValue\n }\n\n let pronoun = ''\n if (speaker.categoryItems.indexOf(204689) >= 0) {\n pronoun = 'He/Him'\n }\n\n if (speaker.categoryItems.indexOf(204687) >= 0) {\n pronoun = 'She/Her'\n }\n\n if (speaker.categoryItems.indexOf(204688) >= 0) {\n pronoun = 'They/Them'\n }\n\n const seperator = seperatorSet[Math.floor(Math.random() * seperatorSet.length)]\n\n if (pronoun) {\n return `${pronoun} ${seperator} ${country}`\n } else {\n return country ?? \"\"\n }\n }\n\n return \"\"\n }\n\n const multipleSpeakerNames = (sessionSpeakers: Array): string => {\n const remappedSpeakers = getSpeakerInfo(sessionSpeakers).map((s: SessionizeSpeaker) => s.fullName)\n\n if (remappedSpeakers.length === 1) {\n return remappedSpeakers[0]\n }\n\n return `${remappedSpeakers.filter((_, index) => index < remappedSpeakers.length - 1).join(', ')} & ${remappedSpeakers[remappedSpeakers.length - 1]}`\n }\n\n const getSpeakerBio = (sessionSpeakers: Array): string => {\n const remappedSpeakers = getSpeakerInfo(sessionSpeakers).map((s) => s.bio)\n\n if (remappedSpeakers.length === 1) {\n return remappedSpeakers[0]\n }\n\n return remappedSpeakers.join('
')\n }\n\n const otherSpeakerImages = (sessionSpeakers: Array): Array => {\n const remappedSpeakers = getSpeakerInfo(sessionSpeakers).map((s) => s.profilePicture)\n\n if (remappedSpeakers.length === 1) {\n return []\n }\n\n return remappedSpeakers.slice(1)\n }\n\n const singleSpeaker = (sessionSpeakers: Array) => getSpeakerInfo(sessionSpeakers)[0]\n\n const singleSpeakerImage = (sessionSpeakers: Array): string => singleSpeaker(sessionSpeakers).profilePicture\n\n const buildSocialBadges = (speaker: SessionizeSpeaker) => {\n const result: Array = []\n speaker.links.forEach((link) => {\n const aTag = document.createElement('a')\n aTag.target = '_blank'\n aTag.href = link.url\n const image = document.createElement('img')\n image.alt = link.title\n switch (link.title) {\n case 'Twitter': {\n image.src = '/public/images/icons8-twitter-50.png'\n break\n }\n case 'LinkedIn': {\n image.src = '/public/images/icons8-linkedin-50.png'\n break\n }\n case 'Blog': {\n image.src = '/public/images/icons8-website-50.png'\n break\n }\n default: {\n image.src = '/public/images/icons8-external-link-50.png'\n break\n }\n }\n aTag.appendChild(image)\n result.push(aTag)\n })\n\n return result\n }\n\n const getSession = (sessionId: String) => eventData!.sessions.filter((session) => session.id === sessionId)[0]\n\n const speakerImageCreator = (src: string, hide = false): HTMLImageElement => {\n const imageElement = document.createElement('img')\n imageElement.src = src\n imageElement.classList.add('speaker-image')\n if (hide) {\n imageElement.classList.add('hide')\n }\n return imageElement\n }\n\n const buildMuliSpeakerImageBlock = (primaryImage: string, otherImages: string[], isLargePopupImage = false): HTMLDivElement => {\n const imagesHolder = document.createElement('div')\n imagesHolder.setAttribute('x-imageset', '')\n imagesHolder.classList.add('multi-speaker-container')\n const firstImage = speakerImageCreator(primaryImage)\n firstImage.classList.add('multi-speaker-image')\n if (isLargePopupImage) {\n firstImage.classList.add('largePopupImage')\n }\n\n imagesHolder.appendChild(firstImage)\n\n otherImages.forEach((otherSpeaker) => {\n const nextImage = speakerImageCreator(otherSpeaker, true)\n nextImage.classList.add('multi-speaker-image')\n if (isLargePopupImage) {\n nextImage.classList.add('largePopupImage')\n }\n\n imagesHolder.appendChild(nextImage)\n })\n\n return imagesHolder\n }\n\n const addPopups = () => {\n addPopupHandler(document.querySelectorAll('.agenda-session'), (div) => {\n const dataSlotId = div.attributes['data-slot-id'].value\n if (!dataSlotId && dataSlotId === '0') {\n return null\n }\n\n const matchedSession = getSession(dataSlotId)\n\n if (matchedSession) {\n const speakerInfo = singleSpeaker(matchedSession.speakers)\n const socialLinks = getSpeakerInfo(matchedSession.speakers).flatMap((s) => buildSocialBadges(s))\n const contentNode = getTemplate('popupBioContent')\n const bioContent = contentNode.firstElementChild!\n const otherImages = otherSpeakerImages(matchedSession.speakers)\n if (otherImages.length > 0) {\n const imageElement = bioContent.querySelector('img.largePopupImage')!!\n imageElement.classList.add('hide')\n const multiImageElement = buildMuliSpeakerImageBlock(speakerInfo.profilePicture, otherImages, true)\n imageElement.insertAdjacentElement('afterend', multiImageElement)\n } else {\n const imageElement = (bioContent.querySelector('img.largePopupImage')! as HTMLImageElement)\n imageElement.src = speakerInfo.profilePicture\n }\n\n setText(bioContent, 'div.bio-speaker', multipleSpeakerNames(matchedSession.speakers))\n setText(bioContent, 'div.bio-subtitle', speakerSubtitle(matchedSession.speakers))\n const socialLinkPlaceholder = (bioContent.querySelector('div.bio-social')! as HTMLDivElement)\n socialLinks.forEach((link) => {\n socialLinkPlaceholder.appendChild(link)\n })\n\n const bio = getSpeakerBio(matchedSession.speakers)\n if (otherImages.length === 0) {\n setText(bioContent, 'div.bio-tagline', speakerInfo.tagLine)\n }\n\n setText(bioContent, 'div.bio-title', matchedSession.title)\n setText(bioContent, 'div.bio-talk-description', matchedSession.description)\n setText(bioContent, 'div.bio-speaker-bio', bio)\n return bioContent\n } else {\n return null;\n }\n }, 'clickable-session', 'unclickable-session', undefined, (div) => {\n const speakerId = div.attributes[\"speaker-id\"].value\n if (speakerId) {\n const matchedSession = getSession(speakerId)\n if (matchedSession) {\n const speakerInfo = singleSpeaker(matchedSession.speakers)\n window.currentSpeaker = {\n name: speakerInfo.fullName,\n id: speakerId\n }\n }\n }\n })\n }\n\n const fadeOut = (element: HTMLElement) => {\n let opacity = 1 // initial opacity\n const decrease = () => {\n if (opacity <= 0.1) {\n element.classList.add('hide')\n return\n }\n\n element.style.opacity = opacity.toString()\n opacity -= opacity * 0.025\n requestAnimationFrame(decrease)\n }\n\n decrease()\n }\n\n const fadeIn = (element: HTMLElement) => {\n let opacity = 0.1 // initial opacity\n element.classList.remove('hide')\n const increase = () => {\n if (opacity >= 1) {\n return\n }\n\n element.style.opacity = opacity.toString()\n opacity += opacity * 0.025\n requestAnimationFrame(increase)\n }\n\n increase()\n }\n\n const rotateImages = () => {\n setInterval(() => {\n const imageSets = Array.from(document.querySelectorAll('div[x-imageSet]'))\n imageSets.forEach((imageSet) => {\n const images: NodeListOf = imageSet.querySelectorAll('img')\n const currentImageIndex = Array.from(images).findIndex((i) => !i.classList.contains('hide'))\n fadeOut(images[currentImageIndex])\n let next = currentImageIndex + 1\n if (next >= images.length) {\n next = 0\n }\n\n fadeIn(images[next])\n })\n }, 3500)\n }\n\n const parseEventData = () => {\n document.querySelectorAll('.agenda-session').forEach((element) => {\n const div = element as HTMLDivElement\n const dataSlotId = div.attributes['data-slot-id'].value\n if (dataSlotId === '999999') {\n const tbaTemplate = getTemplate('noSessionCardTemplate').querySelector('div')\n div.insertAdjacentElement('beforeend', tbaTemplate!)\n } else {\n const matchedSession = getSession(dataSlotId)\n\n if (!matchedSession) {\n const tbaTemplate = getTemplate('tbaCardTemplate').querySelector('div')\n div.insertAdjacentElement('beforeend', tbaTemplate!)\n } else {\n const templateDivs = getTemplate('sessionCardTemplate').querySelectorAll('div')\n templateDivs.forEach((templateElement) => {\n switch (templateElement.className) {\n case 'agenda-session-image': {\n const otherImages = otherSpeakerImages(matchedSession.speakers)\n if (otherImages.length > 0) {\n const imagesHolder = buildMuliSpeakerImageBlock(singleSpeakerImage(matchedSession.speakers), otherImages)\n templateElement.appendChild(imagesHolder)\n } else {\n templateElement.appendChild(speakerImageCreator(singleSpeakerImage(matchedSession.speakers)))\n }\n\n break\n }\n case 'agenda-session-subtitle': {\n templateElement.innerText = speakerSubtitle(matchedSession.speakers)\n break;\n }\n case 'agenda-session-name': {\n templateElement.innerText = multipleSpeakerNames(matchedSession.speakers)\n break\n }\n case 'agenda-session-title': {\n templateElement.innerText = matchedSession.title\n break\n }\n }\n\n div.insertAdjacentElement('beforeend', templateElement)\n })\n }\n }\n })\n\n addPopups()\n toggleUI()\n rotateImages()\n }\n\n eventData = await loadSessionizeData(eventId)\n if (!eventData) {\n return\n }\n\n parseEventData()\n\n const requestedSpeakerId = new URLSearchParams(window.location.search).get(\"currentSpeaker\")\n if (requestedSpeakerId) {\n const speakerButton = document.querySelector(`div[data-slot-id=\"${requestedSpeakerId}\"]`) as HTMLElement\n speakerButton.click()\n }\n}\n","export default () => {\n const sponsorBlock = document.getElementsByClassName('sponsor-content-detail-wide-body')[0];\n if (!sponsorBlock) {\n return\n }\n\n let sponsorPosition = 0\n\n setInterval(() => {\n sponsorPosition += 0.25\n if (sponsorPosition > sponsorBlock.scrollWidth) {\n sponsorPosition = 0\n }\n \n sponsorBlock.scrollTo(sponsorPosition, 0);\n }, 10)\n}\n","import { feedbackServerUrl, getTemplate } from \"./common\";\n\ninterface EventData {\n event: string;\n feedback: Feedback[];\n}\n\ninterface Feedback {\n feedback?: string;\n ratingPresentation: number;\n ratingContent: number;\n ratingValue: number;\n}\n\n\nexport default () => {\n const target = document.getElementById('speakerFeedbackReport') as HTMLDivElement\n if (!target) {\n return\n }\n\n const speakerKeyElement = (document.getElementById('speakerKey') as HTMLInputElement)!\n\n const comparedValue = (speakerScore: number, average: number | undefined): string => {\n const avgValue = (average || 0)\n if (avgValue === 0) {\n return avgValue.toFixed(2);\n }\n\n let symbol = ''\n if (speakerScore > avgValue) {\n symbol = '↑'\n }\n\n if (speakerScore < avgValue) {\n symbol = '↓'\n }\n\n return `${avgValue.toFixed(2)} ${symbol}`\n }\n\n const showData = (data: EventData[], averages) => {\n target.innerHTML = ''\n console.dir(data)\n if (data.length === 0) {\n target.innerText = 'No data yet! Check back later!'\n return\n }\n\n data.forEach(event => {\n const title = getTemplate('title')!.firstElementChild as HTMLDivElement\n title.innerText = event.event\n target.insertAdjacentElement('beforeend', title)\n\n const feedbackTable = getTemplate('feedbackTable')!.firstElementChild as HTMLTableElement\n\n const feedbackTotals = event.feedback.reduce((acc, nextValue) => {\n acc.presSum += nextValue.ratingPresentation\n acc.contentSum += nextValue.ratingContent\n acc.valueSum += nextValue.ratingValue\n return acc\n }, { presSum: 0, contentSum: 0, valueSum: 0 });\n\n const presAvg = (feedbackTotals.presSum / event.feedback.length);\n const contentAvg = (feedbackTotals.contentSum / event.feedback.length);\n const valueAvg = (feedbackTotals.valueSum / event.feedback.length);\n\n (feedbackTable.querySelector('#presAvg') as HTMLTableCellElement).innerText = presAvg.toFixed(2);\n (feedbackTable.querySelector('#contentAvg') as HTMLTableCellElement).innerText = contentAvg.toFixed(2);\n (feedbackTable.querySelector('#valueAvg') as HTMLTableCellElement).innerText = valueAvg.toFixed(2);\n\n if (averages.length > 0) {\n const average = averages[0];\n (feedbackTable.querySelector('#timeslotPresAvg') as HTMLTableCellElement).innerText = comparedValue(presAvg, average[`${event.event}-ratingPresentationtimeslot`]);\n (feedbackTable.querySelector('#timeslotContentAvg') as HTMLTableCellElement).innerText = comparedValue(contentAvg, average[`${event.event}-ratingContenttimeslot`]);\n (feedbackTable.querySelector('#timeslotValueAvg') as HTMLTableCellElement).innerText = comparedValue(valueAvg, average[`${event.event}-ratingValuetimeslot`]);\n\n (feedbackTable.querySelector('#eventPresAvg') as HTMLTableCellElement).innerText = comparedValue(presAvg, average[`${event.event}-ratingPresentation`]);\n (feedbackTable.querySelector('#eventContentAvg') as HTMLTableCellElement).innerText = comparedValue(contentAvg, average[`${event.event}-ratingContent`]);\n (feedbackTable.querySelector('#eventValueAvg') as HTMLTableCellElement).innerText = comparedValue(valueAvg, average[`${event.event}-ratingValue`]);\n\n (feedbackTable.querySelector('#globalPresAvg') as HTMLTableCellElement).innerText = comparedValue(presAvg, average['global-ratingPresentation']);\n (feedbackTable.querySelector('#globalContentAvg') as HTMLTableCellElement).innerText = comparedValue(contentAvg, average['global-ratingContent']);\n (feedbackTable.querySelector('#globalValueAvg') as HTMLTableCellElement).innerText = comparedValue(valueAvg, average['global-ratingValue']);\n } else {\n feedbackTable.querySelectorAll('.additionalAverageInfo').forEach(item => {\n (item as HTMLTableRowElement).style.display = 'none';\n });\n }\n\n const footerRow = (feedbackTable.querySelector('#feedbackFooter') as HTMLTableRowElement)\n event.feedback.forEach((f) => {\n const row = getTemplate('feedbackRow')!.firstElementChild as HTMLTableRowElement\n (row.querySelector('.presValue') as HTMLTableCellElement).innerText = f.ratingPresentation.toFixed(0);\n (row.querySelector('.contentValue') as HTMLTableCellElement).innerText = f.ratingContent.toFixed(0);\n (row.querySelector('.valueValue') as HTMLTableCellElement).innerText = f.ratingValue.toFixed(0);\n (row.querySelector('.feedbackValue') as HTMLTableCellElement).innerText = f.feedback || ''\n\n footerRow.insertAdjacentElement('beforebegin', row)\n })\n\n target.insertAdjacentElement('beforeend', feedbackTable)\n })\n }\n\n const addButton = () => {\n const button = document.getElementById('getDataButton') as HTMLButtonElement\n if (!button) {\n return\n }\n\n button.onclick = async () => {\n const key = speakerKeyElement.value\n if (!key || key.length != 32) {\n return\n }\n\n try {\n button.disabled = true\n button.innerText = 'Loading...'\n const data = await fetch(`${feedbackServerUrl}?speaker=${key}`)\n if (data.ok) {\n const dataSet = await data.json() as Array;\n const averages = dataSet.filter(row => !row.event)\n showData(dataSet.filter(row => row.event) as EventData[], averages)\n window.localStorage.setItem('speakerFeedbackKey', key)\n } else {\n target.innerText = `Invalid speaker key [${data.status}]`\n }\n } finally {\n button.disabled = false\n button.innerText = 'Get Report'\n }\n }\n }\n\n const preloadSpeakerKey = () => {\n const speakerKey = window.localStorage.getItem('speakerFeedbackKey')\n if (speakerKey) {\n speakerKeyElement.value = speakerKey\n }\n }\n\n addButton()\n preloadSpeakerKey()\n}"],"names":["feedbackServerUrl","getTemplate","templateId","document","getElementById","cloneNode","content","setText","parent","query","value","querySelector","innerText","addPopupHandler","elementsToAddPopupTo","popupContentBuilder","clickableClass","unclickableClass","onCloseHandler","onOpenHandler","popupContentKey","closePopup","window","currentSpeaker","undefined","classList","add","removeEventListener","handleCloseKeyPress","contentToRemove","parentNode","removeChild","call","event","key","popupShare","onclick","async","url","location","origin","pathname","id","shareData","title","name","text","navigator","share","canShare","clipboard","writeText","alert","backdrop","addEventListener","forEach","div","popupContent","remove","elementsToSelect","popupContentStage","dataSlotId","attributes","setAttribute","querySelectorAll","insertAdjacentElement","loadSessionizeData","eventId","result","existingData","sessionData","sessionStorage","getItem","JSON","parse","loadStoredData","onLine","response","fetch","ok","json","setItem","stringify","randomUUID","crypto","bind","getRandomValues","rnds8","Uint8Array","rng","Error","byteToHex","i","push","toString","slice","options","buf","offset","rnds","random","arr","toLowerCase","unsafeStringify","timeKeyFinder","agendaPlaceholder","getAttribute","eventData","getSpeakerInfo","sessionSpeakers","speakers","filter","s","indexOf","seperatorSet","speakerSubtitle","length","speaker","country","categoryItems","questionAnswers","find","questionId","answerValue","pronoun","seperator","Math","floor","multipleSpeakerNames","remappedSpeakers","map","fullName","_","index","join","otherSpeakerImages","profilePicture","singleSpeaker","singleSpeakerImage","getSession","sessionId","sessions","session","speakerImageCreator","src","hide","imageElement","createElement","buildMuliSpeakerImageBlock","primaryImage","otherImages","isLargePopupImage","imagesHolder","firstImage","appendChild","otherSpeaker","nextImage","element","tbaTemplate","matchedSession","templateElement","className","speakerInfo","socialLinks","flatMap","links","link","aTag","target","href","image","alt","buildSocialBadges","bioContent","firstElementChild","multiImageElement","socialLinkPlaceholder","bio","getSpeakerBio","tagLine","description","speakerId","style","display","setInterval","Array","from","imageSet","images","currentImageIndex","findIndex","contains","opacity","decrease","requestAnimationFrame","fadeOut","next","increase","fadeIn","requestedSpeakerId","URLSearchParams","search","get","click","stage","questions","storedQuestions","questionsResponse","ratingId","sessionStructure","trim","split","timings","innerHTML","workshopStructure","ratingStoredData","localStorage","ratingData","submitter","talkTitle","setValue","needsNotMet","countComplete","answers","Object","keys","questionStructure","structure","q","answeredValue","type","needs","needsValue","n","question","subTitle","show","workshop","workshopTitle","subtitle","parsedSubtitle","exec","start","groups","end","startTiming","startsWith","substring","endTiming","questionButton","section","questionBaseElement","label","inputElement","existingValue","onchange","configureInput","option","selected","configureSelector","configureText","ratingElement","oninput","configureRating","checked","configureYesNo","valueAsNumber","configureYears","append","configureTimeSlotSelector","doneButton","dispatchEvent","Event","button","saveButton","disabled","preventDefault","grecaptcha","ready","token","execute","action","captcha","method","body","setTimeout","addSubmit","feedback","sponsorBlock","getElementsByClassName","sponsorPosition","scrollWidth","scrollTo","speakerKeyElement","comparedValue","speakerScore","average","avgValue","toFixed","symbol","data","dataSet","averages","row","console","dir","feedbackTable","feedbackTotals","reduce","acc","nextValue","presSum","ratingPresentation","contentSum","ratingContent","valueSum","ratingValue","presAvg","contentAvg","valueAvg","item","footerRow","f","showData","status","addButton","speakerKey","preloadSpeakerKey","speakerFeedback"],"sourceRoot":""} \ No newline at end of file diff --git a/scss/sponsors.scss b/scss/sponsors.scss index c7f59bf0..a65520a7 100644 --- a/scss/sponsors.scss +++ b/scss/sponsors.scss @@ -204,7 +204,7 @@ grid-row-gap: 5px; text-align: center; line-height: 1.5rem; - grid-template-columns: 1fr 1fr 1fr 1fr; + grid-template-columns: 1fr 1fr 1fr; grid-template-rows: 1fr; column-gap: 30px; align-content: center; diff --git a/tsconfig.json b/tsconfig.json index 404ad352..ae90d323 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,18 +3,17 @@ "_site" ], "compilerOptions": { - "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ + "esModuleInterop": true, "lib": [ "dom", - "es2015", - ], /* Specify library files to be included in the compilation. */ - "module": "es6", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ + "ESNext", + ], + "module": "ESNext", "moduleResolution": "node", - "noImplicitAny": false, /* Raise error on expressions and declarations with an implied 'any' type. */ - "rootDir": "./src", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ + "noImplicitAny": false, + "rootDir": "./src", "sourceMap": true, - - "strict": true, /* Enable all strict type-checking options. */ - "target": "ES2021", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */ + "strict": true, + "target": "ES2022" } } \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 20736dd6..c8d723e8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -38,10 +38,10 @@ debug "^4.3.1" minimatch "^3.1.2" -"@eslint/core@^0.6.0": - version "0.6.0" - resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.6.0.tgz#9930b5ba24c406d67a1760e94cdbac616a6eb674" - integrity sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg== +"@eslint/core@^0.7.0": + version "0.7.0" + resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.7.0.tgz#a1bb4b6a4e742a5ff1894b7ee76fbf884ec72bd3" + integrity sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw== "@eslint/eslintrc@^3.1.0": version "3.1.0" @@ -58,10 +58,10 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@9.11.1": - version "9.11.1" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.11.1.tgz#8bcb37436f9854b3d9a561440daf916acd940986" - integrity sha512-/qu+TWz8WwPWc7/HcIJKi+c+MOm46GdVaSlTTQcaqaL53+GsoA6MxWp5PtTx48qbSP7ylM1Kn7nhvkugfJvRSA== +"@eslint/js@9.13.0": + version "9.13.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.13.0.tgz#c5f89bcd57eb54d5d4fa8b77693e9c28dc97e547" + integrity sha512-IFLyoY4d72Z5y/6o/BazFBezupzI/taV8sGumxTAVw3lXG9A6md1Dc34T9s1FoD/an9pJH8RHbAxsaEbBed9lA== "@eslint/object-schema@^2.1.4": version "2.1.4" @@ -75,6 +75,19 @@ dependencies: levn "^0.4.1" +"@humanfs/core@^0.19.1": + version "0.19.1" + resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.1.tgz#17c55ca7d426733fe3c561906b8173c336b40a77" + integrity sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA== + +"@humanfs/node@^0.16.5": + version "0.16.6" + resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.6.tgz#ee2a10eaabd1131987bf0488fd9b820174cd765e" + integrity sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw== + dependencies: + "@humanfs/core" "^0.19.1" + "@humanwhocodes/retry" "^0.3.0" + "@humanwhocodes/module-importer@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" @@ -85,6 +98,11 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.0.tgz#6d86b8cb322660f03d3f0aa94b99bdd8e172d570" integrity sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew== +"@humanwhocodes/retry@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.1.tgz#c72a5c76a9fbaf3488e231b13dc52c0da7bab42a" + integrity sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA== + "@jridgewell/gen-mapping@^0.3.0": version "0.3.3" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" @@ -146,7 +164,7 @@ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== -"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": +"@nodelib/fs.walk@^1.2.3": version "1.2.8" resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== @@ -154,6 +172,89 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@parcel/watcher-android-arm64@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.4.1.tgz#c2c19a3c442313ff007d2d7a9c2c1dd3e1c9ca84" + integrity sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg== + +"@parcel/watcher-darwin-arm64@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.4.1.tgz#c817c7a3b4f3a79c1535bfe54a1c2818d9ffdc34" + integrity sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA== + +"@parcel/watcher-darwin-x64@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.4.1.tgz#1a3f69d9323eae4f1c61a5f480a59c478d2cb020" + integrity sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg== + +"@parcel/watcher-freebsd-x64@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.4.1.tgz#0d67fef1609f90ba6a8a662bc76a55fc93706fc8" + integrity sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w== + +"@parcel/watcher-linux-arm-glibc@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.4.1.tgz#ce5b340da5829b8e546bd00f752ae5292e1c702d" + integrity sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA== + +"@parcel/watcher-linux-arm64-glibc@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.4.1.tgz#6d7c00dde6d40608f9554e73998db11b2b1ff7c7" + integrity sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA== + +"@parcel/watcher-linux-arm64-musl@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.4.1.tgz#bd39bc71015f08a4a31a47cd89c236b9d6a7f635" + integrity sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA== + +"@parcel/watcher-linux-x64-glibc@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.4.1.tgz#0ce29966b082fb6cdd3de44f2f74057eef2c9e39" + integrity sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg== + +"@parcel/watcher-linux-x64-musl@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.4.1.tgz#d2ebbf60e407170bb647cd6e447f4f2bab19ad16" + integrity sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ== + +"@parcel/watcher-win32-arm64@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.4.1.tgz#eb4deef37e80f0b5e2f215dd6d7a6d40a85f8adc" + integrity sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg== + +"@parcel/watcher-win32-ia32@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.4.1.tgz#94fbd4b497be39fd5c8c71ba05436927842c9df7" + integrity sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw== + +"@parcel/watcher-win32-x64@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.4.1.tgz#4bf920912f67cae5f2d264f58df81abfea68dadf" + integrity sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A== + +"@parcel/watcher@^2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-2.4.1.tgz#a50275151a1bb110879c6123589dba90c19f1bf8" + integrity sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA== + dependencies: + detect-libc "^1.0.3" + is-glob "^4.0.3" + micromatch "^4.0.5" + node-addon-api "^7.0.0" + optionalDependencies: + "@parcel/watcher-android-arm64" "2.4.1" + "@parcel/watcher-darwin-arm64" "2.4.1" + "@parcel/watcher-darwin-x64" "2.4.1" + "@parcel/watcher-freebsd-x64" "2.4.1" + "@parcel/watcher-linux-arm-glibc" "2.4.1" + "@parcel/watcher-linux-arm64-glibc" "2.4.1" + "@parcel/watcher-linux-arm64-musl" "2.4.1" + "@parcel/watcher-linux-x64-glibc" "2.4.1" + "@parcel/watcher-linux-x64-musl" "2.4.1" + "@parcel/watcher-win32-arm64" "2.4.1" + "@parcel/watcher-win32-ia32" "2.4.1" + "@parcel/watcher-win32-x64" "2.4.1" + "@rtsao/scc@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8" @@ -196,69 +297,69 @@ dependencies: undici-types "~5.26.4" -"@types/node@^22.7.4": - version "22.7.4" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.7.4.tgz#e35d6f48dca3255ce44256ddc05dee1c23353fcc" - integrity sha512-y+NPi1rFzDs1NdQHHToqeiX2TIS79SWEAw9GYhkkx8bD0ChpfqC+n2j5OXOCpzfojBEBt6DnEnnG9MY0zk1XLg== +"@types/node@^22.8.5": + version "22.8.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.8.5.tgz#a978fb6755dbb32889b0bc3e37554dbc04f261a6" + integrity sha512-5iYk6AMPtsMbkZqCO1UGF9W5L38twq11S2pYWkybGHH2ogPUvXWNlQqJBzuEZWKj/WRH+QTeiv6ySWqJtvIEgA== dependencies: - undici-types "~6.19.2" + undici-types "~6.19.8" -"@typescript-eslint/eslint-plugin@^8.8.0": - version "8.8.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.8.0.tgz#b2b02a5447cdc885950eb256b3b8a97b92031bd3" - integrity sha512-wORFWjU30B2WJ/aXBfOm1LX9v9nyt9D3jsSOxC3cCaTQGCW5k4jNpmjFv3U7p/7s4yvdjHzwtv2Sd2dOyhjS0A== +"@typescript-eslint/eslint-plugin@^8.12.2": + version "8.12.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.12.2.tgz#c2ef660bb83fd1432368319312a2581fc92ccac1" + integrity sha512-gQxbxM8mcxBwaEmWdtLCIGLfixBMHhQjBqR8sVWNTPpcj45WlYL2IObS/DNMLH1DBP0n8qz+aiiLTGfopPEebw== dependencies: "@eslint-community/regexpp" "^4.10.0" - "@typescript-eslint/scope-manager" "8.8.0" - "@typescript-eslint/type-utils" "8.8.0" - "@typescript-eslint/utils" "8.8.0" - "@typescript-eslint/visitor-keys" "8.8.0" + "@typescript-eslint/scope-manager" "8.12.2" + "@typescript-eslint/type-utils" "8.12.2" + "@typescript-eslint/utils" "8.12.2" + "@typescript-eslint/visitor-keys" "8.12.2" graphemer "^1.4.0" ignore "^5.3.1" natural-compare "^1.4.0" ts-api-utils "^1.3.0" -"@typescript-eslint/parser@^8.8.0": - version "8.8.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.8.0.tgz#ee4397c70230c4eee030456924c0fba480072f5e" - integrity sha512-uEFUsgR+tl8GmzmLjRqz+VrDv4eoaMqMXW7ruXfgThaAShO9JTciKpEsB+TvnfFfbg5IpujgMXVV36gOJRLtZg== +"@typescript-eslint/parser@^8.12.2": + version "8.12.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.12.2.tgz#2e8173b34e1685e918b2d571c16c906d3747bad2" + integrity sha512-MrvlXNfGPLH3Z+r7Tk+Z5moZAc0dzdVjTgUgwsdGweH7lydysQsnSww3nAmsq8blFuRD5VRlAr9YdEFw3e6PBw== dependencies: - "@typescript-eslint/scope-manager" "8.8.0" - "@typescript-eslint/types" "8.8.0" - "@typescript-eslint/typescript-estree" "8.8.0" - "@typescript-eslint/visitor-keys" "8.8.0" + "@typescript-eslint/scope-manager" "8.12.2" + "@typescript-eslint/types" "8.12.2" + "@typescript-eslint/typescript-estree" "8.12.2" + "@typescript-eslint/visitor-keys" "8.12.2" debug "^4.3.4" -"@typescript-eslint/scope-manager@8.8.0": - version "8.8.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.8.0.tgz#30b23a6ae5708bd7882e40675ef2f1b2beac741f" - integrity sha512-EL8eaGC6gx3jDd8GwEFEV091210U97J0jeEHrAYvIYosmEGet4wJ+g0SYmLu+oRiAwbSA5AVrt6DxLHfdd+bUg== +"@typescript-eslint/scope-manager@8.12.2": + version "8.12.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.12.2.tgz#6db0213745e6392c8e90fe9af5915e6da32eb94a" + integrity sha512-gPLpLtrj9aMHOvxJkSbDBmbRuYdtiEbnvO25bCMza3DhMjTQw0u7Y1M+YR5JPbMsXXnSPuCf5hfq0nEkQDL/JQ== dependencies: - "@typescript-eslint/types" "8.8.0" - "@typescript-eslint/visitor-keys" "8.8.0" + "@typescript-eslint/types" "8.12.2" + "@typescript-eslint/visitor-keys" "8.12.2" -"@typescript-eslint/type-utils@8.8.0": - version "8.8.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.8.0.tgz#a0ca1c8a90d94b101176a169d7a0958187408d33" - integrity sha512-IKwJSS7bCqyCeG4NVGxnOP6lLT9Okc3Zj8hLO96bpMkJab+10HIfJbMouLrlpyOr3yrQ1cA413YPFiGd1mW9/Q== +"@typescript-eslint/type-utils@8.12.2": + version "8.12.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.12.2.tgz#132b0c52d45f6814e6f2e32416c7951ed480b016" + integrity sha512-bwuU4TAogPI+1q/IJSKuD4shBLc/d2vGcRT588q+jzayQyjVK2X6v/fbR4InY2U2sgf8MEvVCqEWUzYzgBNcGQ== dependencies: - "@typescript-eslint/typescript-estree" "8.8.0" - "@typescript-eslint/utils" "8.8.0" + "@typescript-eslint/typescript-estree" "8.12.2" + "@typescript-eslint/utils" "8.12.2" debug "^4.3.4" ts-api-utils "^1.3.0" -"@typescript-eslint/types@8.8.0": - version "8.8.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.8.0.tgz#08ea5df6c01984d456056434641491fbf7a1bf43" - integrity sha512-QJwc50hRCgBd/k12sTykOJbESe1RrzmX6COk8Y525C9l7oweZ+1lw9JiU56im7Amm8swlz00DRIlxMYLizr2Vw== +"@typescript-eslint/types@8.12.2": + version "8.12.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.12.2.tgz#8d70098c0e90442495b53d0296acdca6d0f3f73c" + integrity sha512-VwDwMF1SZ7wPBUZwmMdnDJ6sIFk4K4s+ALKLP6aIQsISkPv8jhiw65sAK6SuWODN/ix+m+HgbYDkH+zLjrzvOA== -"@typescript-eslint/typescript-estree@8.8.0": - version "8.8.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.8.0.tgz#072eaab97fdb63513fabfe1cf271812affe779e3" - integrity sha512-ZaMJwc/0ckLz5DaAZ+pNLmHv8AMVGtfWxZe/x2JVEkD5LnmhWiQMMcYT7IY7gkdJuzJ9P14fRy28lUrlDSWYdw== +"@typescript-eslint/typescript-estree@8.12.2": + version "8.12.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.12.2.tgz#206df9b1cbff212aaa9401985ef99f04daa84da5" + integrity sha512-mME5MDwGe30Pq9zKPvyduyU86PH7aixwqYR2grTglAdB+AN8xXQ1vFGpYaUSJ5o5P/5znsSBeNcs5g5/2aQwow== dependencies: - "@typescript-eslint/types" "8.8.0" - "@typescript-eslint/visitor-keys" "8.8.0" + "@typescript-eslint/types" "8.12.2" + "@typescript-eslint/visitor-keys" "8.12.2" debug "^4.3.4" fast-glob "^3.3.2" is-glob "^4.0.3" @@ -266,22 +367,22 @@ semver "^7.6.0" ts-api-utils "^1.3.0" -"@typescript-eslint/utils@8.8.0": - version "8.8.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.8.0.tgz#bd8607e3a68c461b69169c7a5824637dc9e8b3f1" - integrity sha512-QE2MgfOTem00qrlPgyByaCHay9yb1+9BjnMFnSFkUKQfu7adBXDTnCAivURnuPPAG/qiB+kzKkZKmKfaMT0zVg== +"@typescript-eslint/utils@8.12.2": + version "8.12.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.12.2.tgz#726cc9f49f5866605bd15bbc1768ffc15637930e" + integrity sha512-UTTuDIX3fkfAz6iSVa5rTuSfWIYZ6ATtEocQ/umkRSyC9O919lbZ8dcH7mysshrCdrAM03skJOEYaBugxN+M6A== dependencies: "@eslint-community/eslint-utils" "^4.4.0" - "@typescript-eslint/scope-manager" "8.8.0" - "@typescript-eslint/types" "8.8.0" - "@typescript-eslint/typescript-estree" "8.8.0" + "@typescript-eslint/scope-manager" "8.12.2" + "@typescript-eslint/types" "8.12.2" + "@typescript-eslint/typescript-estree" "8.12.2" -"@typescript-eslint/visitor-keys@8.8.0": - version "8.8.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.8.0.tgz#f93965abd38c82a1a1f5574290a50d02daf1cd2e" - integrity sha512-8mq51Lx6Hpmd7HnA2fcHQo3YgfX1qbccxQOgZcb4tvasu//zXRaA1j5ZRFeCw/VRAdFi4mRM9DnZw0Nu0Q2d1g== +"@typescript-eslint/visitor-keys@8.12.2": + version "8.12.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.12.2.tgz#94d7410f78eb6d134b9fcabaf1eeedb910ba8c38" + integrity sha512-PChz8UaKQAVNHghsHcPyx1OMHoFRUEA7rJSK/mDhdq85bk+PLsUHUBqTQTFt18VJZbmxBovM65fezlheQRsSDA== dependencies: - "@typescript-eslint/types" "8.8.0" + "@typescript-eslint/types" "8.12.2" eslint-visitor-keys "^3.4.3" "@webassemblyjs/ast@1.12.1", "@webassemblyjs/ast@^1.12.1": @@ -450,10 +551,10 @@ acorn@^8.11.3: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== -acorn@^8.12.0: - version "8.12.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" - integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== +acorn@^8.14.0: + version "8.14.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0" + integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== acorn@^8.7.1, acorn@^8.8.2: version "8.11.2" @@ -631,6 +732,13 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" +braces@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + browserslist@^4.21.10: version "4.22.3" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.3.tgz#299d11b7e947a6b843981392721169e27d60c5a6" @@ -861,6 +969,11 @@ define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0, de has-property-descriptors "^1.0.0" object-keys "^1.1.1" +detect-libc@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg== + doctrine@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" @@ -1092,17 +1205,17 @@ eslint-import-resolver-node@^0.3.9: is-core-module "^2.13.0" resolve "^1.22.4" -eslint-module-utils@^2.9.0: +eslint-module-utils@^2.12.0: version "2.12.0" resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz#fe4cfb948d61f49203d7b08871982b65b9af0b0b" integrity sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg== dependencies: debug "^3.2.7" -eslint-plugin-import@^2.30.0: - version "2.30.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.30.0.tgz#21ceea0fc462657195989dd780e50c92fe95f449" - integrity sha512-/mHNE9jINJfiD2EKkg1BKyPyUk4zdnT54YgbOgfjSakWT5oyX/qQLVNTkehyfpcMxZXMy1zyonZ2v7hZTX43Yw== +eslint-plugin-import@^2.31.0: + version "2.31.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz#310ce7e720ca1d9c0bb3f69adfd1c6bdd7d9e0e7" + integrity sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A== dependencies: "@rtsao/scc" "^1.1.0" array-includes "^3.1.8" @@ -1112,7 +1225,7 @@ eslint-plugin-import@^2.30.0: debug "^3.2.7" doctrine "^2.1.0" eslint-import-resolver-node "^0.3.9" - eslint-module-utils "^2.9.0" + eslint-module-utils "^2.12.0" hasown "^2.0.2" is-core-module "^2.15.1" is-glob "^4.0.3" @@ -1121,6 +1234,7 @@ eslint-plugin-import@^2.30.0: object.groupby "^1.0.3" object.values "^1.2.0" semver "^6.3.1" + string.prototype.trimend "^1.0.8" tsconfig-paths "^3.15.0" eslint-scope@5.1.1: @@ -1131,10 +1245,10 @@ eslint-scope@5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-scope@^8.0.2: - version "8.0.2" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.0.2.tgz#5cbb33d4384c9136083a71190d548158fe128f94" - integrity sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA== +eslint-scope@^8.1.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.2.0.tgz#377aa6f1cb5dc7592cfd0b7f892fd0cf352ce442" + integrity sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A== dependencies: esrecurse "^4.3.0" estraverse "^5.2.0" @@ -1149,21 +1263,26 @@ eslint-visitor-keys@^4.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz#e3adc021aa038a2a8e0b2f8b0ce8f66b9483b1fb" integrity sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw== -eslint@^9.11.1: - version "9.11.1" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.11.1.tgz#701e5fc528990153f9cef696d8427003b5206567" - integrity sha512-MobhYKIoAO1s1e4VUrgx1l1Sk2JBR/Gqjjgw8+mfgoLE2xwsHur4gdfTxyTgShrhvdVFTaJSgMiQBl1jv/AWxg== +eslint-visitor-keys@^4.1.0, eslint-visitor-keys@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz#687bacb2af884fcdda8a6e7d65c606f46a14cd45" + integrity sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw== + +eslint@^9.13.0: + version "9.13.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.13.0.tgz#7659014b7dda1ff876ecbd990f726e11c61596e6" + integrity sha512-EYZK6SX6zjFHST/HRytOdA/zE72Cq/bfw45LSyuwrdvcclb/gqV8RRQxywOBEWO2+WDpva6UZa4CcDeJKzUCFA== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.11.0" "@eslint/config-array" "^0.18.0" - "@eslint/core" "^0.6.0" + "@eslint/core" "^0.7.0" "@eslint/eslintrc" "^3.1.0" - "@eslint/js" "9.11.1" + "@eslint/js" "9.13.0" "@eslint/plugin-kit" "^0.2.0" + "@humanfs/node" "^0.16.5" "@humanwhocodes/module-importer" "^1.0.1" - "@humanwhocodes/retry" "^0.3.0" - "@nodelib/fs.walk" "^1.2.8" + "@humanwhocodes/retry" "^0.3.1" "@types/estree" "^1.0.6" "@types/json-schema" "^7.0.15" ajv "^6.12.4" @@ -1171,9 +1290,9 @@ eslint@^9.11.1: cross-spawn "^7.0.2" debug "^4.3.2" escape-string-regexp "^4.0.0" - eslint-scope "^8.0.2" - eslint-visitor-keys "^4.0.0" - espree "^10.1.0" + eslint-scope "^8.1.0" + eslint-visitor-keys "^4.1.0" + espree "^10.2.0" esquery "^1.5.0" esutils "^2.0.2" fast-deep-equal "^3.1.3" @@ -1183,13 +1302,11 @@ eslint@^9.11.1: ignore "^5.2.0" imurmurhash "^0.1.4" is-glob "^4.0.0" - is-path-inside "^3.0.3" json-stable-stringify-without-jsonify "^1.0.1" lodash.merge "^4.6.2" minimatch "^3.1.2" natural-compare "^1.4.0" optionator "^0.9.3" - strip-ansi "^6.0.1" text-table "^0.2.0" espree@^10.0.1: @@ -1201,14 +1318,14 @@ espree@^10.0.1: acorn-jsx "^5.3.2" eslint-visitor-keys "^4.0.0" -espree@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-10.1.0.tgz#8788dae611574c0f070691f522e4116c5a11fc56" - integrity sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA== +espree@^10.2.0: + version "10.3.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-10.3.0.tgz#29267cf5b0cb98735b65e64ba07e0ed49d1eed8a" + integrity sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg== dependencies: - acorn "^8.12.0" + acorn "^8.14.0" acorn-jsx "^5.3.2" - eslint-visitor-keys "^4.0.0" + eslint-visitor-keys "^4.2.0" esquery@^1.5.0: version "1.6.0" @@ -1296,6 +1413,13 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + find-up@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" @@ -1700,11 +1824,6 @@ is-number@^7.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -is-path-inside@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" @@ -1901,6 +2020,14 @@ micromatch@^4.0.0, micromatch@^4.0.4: braces "^3.0.2" picomatch "^2.3.1" +micromatch@^4.0.5: + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== + dependencies: + braces "^3.0.3" + picomatch "^2.3.1" + mime-db@1.52.0: version "1.52.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" @@ -1952,6 +2079,11 @@ neo-async@^2.6.2: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== +node-addon-api@^7.0.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-7.1.1.tgz#1aba6693b0f255258a049d621329329322aad558" + integrity sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ== + node-releases@^2.0.14: version "2.0.14" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" @@ -2299,11 +2431,12 @@ safe-regex-test@^1.0.3: es-errors "^1.3.0" is-regex "^1.1.4" -sass@^1.79.4: - version "1.79.4" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.79.4.tgz#f9c45af35fbeb53d2c386850ec842098d9935267" - integrity sha512-K0QDSNPXgyqO4GZq2HO5Q70TLxTH6cIT59RdoCHMivrC8rqzaTw5ab9prjz9KUN1El4FLXrBXJhik61JR4HcGg== +sass@^1.80.5: + version "1.80.5" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.80.5.tgz#0ba965223d44df22497f2966b498cf5c453fae8f" + integrity sha512-TQd2aoQl/+zsxRMEDSxVdpPIqeq9UFc6pr7PzkugiTx3VYCFPUaa3P4RrBQsqok4PO200Vkz0vXQBNlg7W907g== dependencies: + "@parcel/watcher" "^2.4.1" chokidar "^4.0.0" immutable "^4.0.0" source-map-js ">=0.6.2 <2.0.0" @@ -2723,10 +2856,10 @@ typed-array-length@^1.0.6: is-typed-array "^1.1.13" possible-typed-array-names "^1.0.0" -typescript@^5.6.2: - version "5.6.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.2.tgz#d1de67b6bef77c41823f822df8f0b3bcff60a5a0" - integrity sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw== +typescript@^5.6.3: + version "5.6.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.3.tgz#5f3449e31c9d94febb17de03cc081dd56d81db5b" + integrity sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw== unbox-primitive@^1.0.2: version "1.0.2" @@ -2748,7 +2881,7 @@ undici-types@~5.26.4: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== -undici-types@~6.19.2: +undici-types@~6.19.8: version "6.19.8" resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== @@ -2768,10 +2901,10 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -uuid@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-10.0.0.tgz#5a95aa454e6e002725c79055fd42aaba30ca6294" - integrity sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ== +uuid@^11.0.2: + version "11.0.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-11.0.2.tgz#a8d68ba7347d051e7ea716cc8dcbbab634d66875" + integrity sha512-14FfcOJmqdjbBPdDjFQyk/SdT4NySW4eM0zcG+HqbHP5jzuH56xO3J1DGhgs/cEMCfwYi3HQI1gnTO62iaG+tQ== watchpack@^2.4.1: version "2.4.1"