Skip to Content
Home » Blog » How Do I Get a Copy of My Florida Accident Report?

Apr
2026

How Do I Get a Copy of My Florida Accident Report?

on Car Accidents

Prosper Shaked, personal injury attorney

Written and reviewed by
Personal injury attorney, North Miami Beach
Updated September 28, 2026

Quick Answer: Get Your Report in Minutes

Florida officially calls an accident report a crash report. This guide explains how to obtain a copy and understand what it says. The fastest way is the Florida Crash Portal, run by the state’s highway safety department (FLHSMV). One report costs $12 online: a $10 state fee plus a $2 convenience fee per transaction. Once the report is in the system and you finish the purchase, you can download it right away as a PDF inside a ZIP file. If your auto insurer or your lawyer already has a copy, you can ask them for it instead. Note: If your crash just happened, the report may not be there yet. FLHSMV says reports can take up to 10 days to become available, and a crash that takes longer to investigate can take longer.

Which Method Is Right for You?

Call us today at (305) 694-2676 or contact us online for a free case evaluation. Hablamos español.
Representative

Answer a quick question to find the best way to get your crash report.

Were you involved in the accident (as a driver, passenger, pedestrian, or cyclist)?


Buy It Online ($12) — Instant Download

The Florida Crash Portal is your best option. If the report is already available, you’ll have it in minutes. Follow the step-by-step guide below to walk through the process.

Call Your Insurance Company

First, check if the Driver Exchange of Information you received at the scene already has what you need — it may be enough to file your claim without the full crash report.

If you do need the full report and you have already reported the crash to your auto insurer, the adjuster may have a copy or be able to get one. Call the claims number on your insurance card and ask them to email or mail it to you. Note: Not every insurer will send one, and it can take several days.

Need it faster? If it’s already available, you can buy it online for $12.

Your Attorney Will Get It for You

If you’ve hired a car accident lawyer, they will purchase the crash report on your behalf as soon as it’s available. Ask your attorney’s office for a copy.

If you don’t have an attorney yet, we’d be happy to provide you a copy of the report during our consultation. Call us at (305) 694-2676.

You May Still Be Eligible

Florida law lets certain others get crash reports, including the parties’ lawyers, their insurers, and their licensed insurance agents. FCC-licensed radio and TV stations and qualifying newspapers can get a version without certain personal details, such as home and work addresses, driver license numbers, dates of birth, and phone numbers. Sixty days after a report is filed, it can also be released for the uses the federal Driver’s Privacy Protection Act allows. Visit the Florida Crash Portal eligibility page and select the exemption that applies to you.

Driver Exchange vs. Crash Report: What’s the Difference?

Many people confuse the document they received from the police officer at the scene with the official crash report. They are two different documents that serve different purposes.

Given at the Scene

Driver Exchange of Information

  • Handed to you by the officer on-site
  • Names & addresses of drivers and vehicle owners
  • Insurance policy numbers
  • Date, time, and location of the accident
  • Free — you already have this
Generated Later

Florida Crash Report

  • Completed by the officer after investigating
  • Description and diagram of how the crash occurred
  • Witness names, addresses, and phone numbers
  • Traffic citations or tickets issued
  • $12 — purchased from the Florida Crash Portal

Bottom line: The driver exchange has enough info to file insurance claims. The crash report is most useful when there’s a dispute about how the accident happened, when you need witness information, or when your attorney needs it for your case.

Before You Start: What You’ll Need

Make sure you have these items ready before purchasing your crash report online.

  • ✓Your driver’s license number (the portal asks for it as proof of eligibility)
  • ✓Last name of a driver involved in the accident
  • ✓Approximate date of the crash
  • ✓Credit or debit card for payment ($12.00)
  • ✓Email address (for passcode verification & download link)
✅ You’re all set! Follow the step-by-step guide below to purchase your report.

Step-by-Step: Buy a Florida Crash Report

Get started with your complimentary case evaluation today; call us at (305) 694-2676 or reach us online using our secure contact form.
Representative

Step 1 of 11

Visit the Florida Crash Portal

Go to services.flhsmv.gov/CrashReportPurchasing. You’ll see the Important Information page with the fees.

Review the information, then click the “Accept” button at the bottom-right of the page.

Step 1 of 11
FLHSMV crash portal Important Information page with the fees and the Accept button
Click to enlarge

Select Your Eligibility Exemption

On the Eligibility page, select the reason you’re purchasing the crash report:

  • “Party involved in a crash” — if you were a driver or passenger
  • “Legal representative of a party involved” — if you are the attorney or legal representative of a party involved

Further down, the page lists permitted uses under the federal Driver’s Privacy Protection Act (DPPA). The portal allows only one selection on the whole page, so if you already chose an option above, leave that list alone.

Then enter your driver’s license state and number under Proof of Eligibility, and click “Accept.”

Step 2 of 11
Eligibility page with exemption options and proof of eligibility fields
Click to enlarge

Choose Your Search Method

The portal gives you three ways to find your crash report. Choose the one that works best for you — we recommend searching by Last Name as it’s the easiest.

See the tabs below this guide for details on each search method.

Step 3 of 11
How would you like to search? screen with Report Number, VIN, and Last Name options
Click to enlarge

Enter Your Search Details

If searching by Last Name: type the last name of a person involved in the accident, select the crash date (if you’re not sure of the exact day, check the +/- 3 days box), and fill in the captcha characters. The County field is optional.

Click “Search” when ready.

Step 4 of 11
Crash Report Search form with last name, crash date, +/- 3 days box, county, and captcha; entries are covered
Click to enlarge

Find and Select Your Report

Review the search results. In larger counties like Miami-Dade or Broward, there may be multiple results for common last names. Use the street name where your accident occurred to identify the correct report.

Click “Add to Cart” next to the correct report.

Step 5 of 11
Search results showing crash reports with Add to Cart buttons
Click to enlarge

Open Your Shopping Cart

After you add the report, its button changes to “Remove from Cart” and a “View Cart” button appears above the results. Click “View Cart” to proceed to checkout.

Step 6 of 11
Search results after adding a report, with the View Cart and Remove from Cart buttons; personal details are covered
Click to enlarge

Enter Your Email and Get a Passcode

Type the email address where you want the download link sent and click the button to generate a passcode. Check your inbox for an email from FLHSMV with your one-time passcode.

Step 7 of 11
Email entry and Generate Passcode button
Click to enlarge

Enter the Passcode

Enter the passcode you received by email and click “Submit”. You have 30 minutes. If the email doesn’t arrive, click “Resend Passcode”.

Step 8 of 11
Check your email screen with the passcode field, Submit button, and Resend Passcode link
Click to enlarge

Confirm Your Order

Review the report details to make sure it’s the correct accident. The cart shows the breakdown: $10.00 per report plus the $2.00 convenience fee, $12.00 total for one report. If everything looks right, click “Proceed to Payment”.

Step 9 of 11
Review Cart screen with the $12.00 total and the Proceed to Payment button; personal details are covered
Click to enlarge

Enter Payment Information

Payment takes two short forms. First fill in Customer Information (country, full name, address, city, state, and ZIP code) and click “Next”.

Step 10 of 11
Customer Information form with the Next button
Click to enlarge

Then fill in Payment Information (card number, expiration month and year, security code, and the name on the card) and click “Next”.

Step 10 of 11 (continued)
Payment Information form with the card fields and the Next button; entries are covered
Click to enlarge

The Verification section then shows a summary of both forms, with an Edit button for each. Check the “I’m not a robot” box and click “Submit Payment”.

Step 10 of 11 (verification)
Verification screen with the order summary, the I am not a robot check, and the Submit Payment button; personal details are covered
Click to enlarge

Download Your Crash Report

Once payment is processed, click “Download” to save your crash report. The report will download as a PDF file inside a ZIP folder.

A download link will also be emailed to you. You have 48 hours to download the report. After that, you would have to buy it again.

If the portal keeps sending you back to the payment page: don’t pay again. The portal checks eligibility report by report, and it may not release a report if you are not on it and don’t represent someone who is. Stop and contact FLHSMV (850-617-3416, option 1, or [email protected]) before trying again.
Step 11 of 11
Receipt page with the Download button and the 48-hour download deadline; order numbers are covered
Click to enlarge

Search Method Details

The Florida Crash Portal lets you search for your report using any of these three methods:



Search by Last Name (Recommended)

Enter the last name of any driver or vehicle owner involved in the crash. You’ll also need to provide the crash date and complete a captcha. If you don’t remember the exact day, the +/- 3 days box widens the search.

The County field is optional but can help narrow results if the last name is common.

Tip: If multiple results appear, match the correct report by comparing the street name where your accident occurred.

Search by VIN Number

Enter the Vehicle Identification Number (VIN) of any vehicle involved in the crash. You can find the VIN on your vehicle registration, insurance card, or on a metal plate at the base of the windshield on the driver’s side.

Tip: This method is useful if a name search isn’t returning results — sometimes a typo in the officer’s report can prevent a last name match. The VIN provides an alternative, often more accurate way to locate the report.

Search by Report Number

If the responding police officer gave you a report number, you can enter it directly. It is not the same as the police agency’s case number. This is the fastest search method since it returns an exact match.

Tip: The report number is usually printed on the Driver Exchange of Information sheet the officer gave you at the scene.

How to Read Your Florida Crash Report

Once you have your crash report, here’s what each section means and where to find the information that matters most.

The top of the first page contains the basic identifying information for the crash:

  • HSMV Crash Report Number — The unique state-assigned number. Use this to reference or look up the report later.
  • Reporting Agency Case Number — The local police or sheriff’s internal case number. Use this if you need to contact the responding agency.
  • Crash Date & Time — When the accident occurred. Verify this matches your recollection.
  • County/City of Crash — The jurisdiction where the accident happened. The county where a crash happened is one place a lawsuit can be filed. In general, Florida law also allows filing where a defendant lives.
  • Long Form vs. Short Form — A “Long Form” is required when the crash caused a death or an injury, or someone complained of pain or discomfort; involved DUI or leaving the scene; left a vehicle unable to be driven so that a tow truck had to remove it; or involved a commercial vehicle. For other crashes on public roads, the officer must complete a “Short Form” or provide a Driver Exchange of Information for the drivers and passengers to fill out. A driver self-report is a different document: when a crash caused only damage to vehicles or other property and no police report is required, the driver must send one to FLHSMV within 10 days.

This section describes the conditions at the time of the crash. Insurance adjusters and attorneys review this closely because road and weather conditions can affect fault determinations:

  • Roadway Surface Condition — Whether the road was dry, wet, icy, or had debris. Each condition has a number code on the form (for example, 1 = Dry, 2 = Wet).
  • Weather Condition — Clear, cloudy, rain, fog, etc. Poor weather doesn’t excuse negligent driving, but it provides context.
  • Light Condition — Daylight, dusk, dawn, or dark (with or without street lighting). Important in visibility-related crashes.
  • Type of Intersection — Whether the crash occurred at a four-way intersection, T-intersection, roundabout, or non-intersection. This helps establish right-of-way.
  • Manner of Collision — How the vehicles made contact: front-to-rear (rear-end), angle, sideswipe, head-on, etc. In a “Front to Rear” collision, for example, Florida law starts from a presumption that the rear driver was careless, but that presumption can be overcome with evidence.

Each vehicle involved in the crash gets its own section. Here you’ll find:

  • Vehicle Number (1, 2, etc.) — The officer assigns each vehicle a number. These numbers correspond to the crash diagram, so “Vehicle 1” in the narrative is the same as “V1” on the diagram.
  • Driver Name, Address, DOB, and DL Number — Identifying information for each driver. Check for accuracy — misspellings are common and can cause problems later.
  • Insurance Information — The policy number and insurance company for each vehicle. This is the information you’ll need to file a claim.
  • Vehicle Year, Make, Model, VIN — Identifies the specific vehicle. Useful for confirming correct vehicles are listed.
  • Vehicle Damage Area — A coded diagram showing where on the vehicle the damage occurred (front, rear, left side, etc.).
  • Contributing Cause (Driver) — The officer’s assessment of what each driver did wrong, if anything. Common codes include “Failed to yield right-of-way,” “Careless driving,” “Followed too closely,” and “No improper action.” This is one of the most important fields for determining fault.
Important: The contributing cause assigned by the officer is not a legal finding of fault — it’s the officer’s initial assessment. It can be challenged, but insurance companies rely heavily on it.

Every person involved — drivers, passengers, pedestrians, and cyclists — is listed with:

  • Injury Severity — Classified using the codes on the Florida crash report form:
    • 1 – None — No injury
    • 2 – Possible — Complaint of pain but no visible injury
    • 3 – Non-Incapacitating — Visible injury (bruises, cuts) but person can still function
    • 4 – Incapacitating — Serious injury preventing normal activity (broken bones, etc.)
    • 5 – Fatal (within 30 days) — Death resulted from the crash within 30 days
    • 6 – Non-Traffic Fatality — A death recorded on the report that was not caused by the crash
  • Seating Position — Where the person was seated in the vehicle. This can be relevant for injury claims.
  • Safety Equipment — Whether the person was wearing a seatbelt, using a child seat, or wearing a helmet. Florida’s seatbelt laws can affect comparative fault in some cases.
  • Transported By — Whether the person was taken to a hospital by ambulance, helicopter, or private vehicle, and which hospital. This documents the immediate medical response.

The crash diagram is a hand-drawn or computer-generated illustration by the investigating officer showing:

  • Road layout — The shape of the roadway, lanes, intersections, and traffic controls (stop signs, signals)
  • Vehicle positions — Where each vehicle was before, during, and after the impact, labeled as V1, V2, etc.
  • Direction of travel — Arrows showing which way each vehicle was moving
  • Point of impact — Usually marked with an “X” or “POI”
  • Final rest positions — Where the vehicles ended up after the collision
  • North arrow — Compass orientation to help you understand the layout
Tip: Compare the diagram to your own memory of the crash. If the diagram doesn’t match what happened, this is important information to share with your attorney — diagrams are sometimes inaccurate, especially in complex multi-vehicle crashes.

The narrative is the officer’s written summary of how the crash occurred. This is often the most important section of the entire report because it tells the story in plain language. Look for:

  • Sequence of events — What happened first, second, and so on. The officer will describe each vehicle’s actions leading up to the collision.
  • Fault language — Phrases like “Vehicle 1 failed to yield” or “Driver 2 was traveling at a high rate of speed” indicate who the officer believes caused the crash.
  • Statements from drivers — The officer may quote what each driver said at the scene. Anything you told the officer may be documented here. Under Florida law, statements a driver gives the officer to complete the crash report generally cannot be used as evidence at trial, though there are exceptions.
  • Witness accounts — Summaries of what witnesses observed, which can corroborate or contradict the drivers’ statements.
Important: The narrative reflects the officer’s interpretation based on evidence at the scene. If you believe it contains errors, an attorney can help you gather additional evidence (surveillance footage, witness interviews, accident reconstruction) to challenge it.

If any driver was issued a traffic citation (ticket) at the scene, it will be documented in the report. This section shows:

  • Florida Statute violated — The specific law the driver is accused of breaking (e.g., 316.0895 for following too closely, 316.123 for failure to yield)
  • Which driver was cited — Corresponds to the vehicle numbers (V1, V2)
  • Charge description — A plain-language description of the violation

A citation is not proof of fault. Florida law generally keeps traffic tickets out of evidence at trial, although insurance adjusters do take them into account. And the absence of a citation doesn’t mean a driver wasn’t at fault; officers sometimes choose not to issue tickets even when a violation occurred.

The report lists the names, addresses, and phone numbers of any witnesses the officer spoke with at the scene. This information is valuable because:

  • Independent witnesses who saw the crash can support your version of events
  • Witness contact information may be difficult or impossible to obtain later if not documented in the report
  • Your attorney can interview witnesses to build a stronger case
Note: Not all witnesses are listed. Some leave the scene before the officer can speak with them. If you know of a witness who isn’t in the report, write down their information as soon as possible.

Frequently Asked Questions

Call your auto insurance company and ask them to send you a copy of the report. Insurers usually get the crash report when they handle a claim, so the adjuster may be able to email or mail you a copy. They are not required to, and there is no guarantee. You can also request a copy by mail from FLHSMV or in person at the Florida Highway Patrol station nearest the crash; the state fee still applies, and mail requests take four to six weeks. The police department or sheriff’s office that handled the crash may also keep a copy.

Disclaimer: Many auto insurance companies are extremely slow and you may need to wait several days to receive the report. If you purchase the report directly from the Florida Crash Portal, you can download it as soon as the purchase is complete.

In most cases, you do not need a copy of the accident report. If you were involved in an accident in Florida, the reporting police officer should have provided all parties with a printed Driver Exchange of Information. That document contains everything you need to file insurance claims, including:

  • Date and time of accident
  • Location of accident
  • Names and addresses of drivers involved
  • Names and addresses of the vehicle owners
  • Insurance policy numbers for the vehicles involved

However, the accident report is useful when it’s unclear how the accident occurred. The report includes additional details such as:

  • A description of how the accident occurred
  • A diagram depicting how the accident occurred
  • Names, addresses, and phone numbers of the witnesses the officer identified
  • Descriptions of any traffic citations or “tickets” issued

No. If you hire a car accident lawyer to represent you for injuries sustained in an accident, your lawyer will purchase a copy of the report as soon as it is uploaded onto the Florida Crash Portal. If you would like a copy, your attorney should provide you with one.

Under Section 316.066, Florida Statutes, law enforcement officers are required to submit a “Long Form” crash report within 10 days after the investigation is completed. FLHSMV says reports can take up to 10 days to become available, and more complex crashes (multiple vehicles, serious injuries, fatalities) can take longer to investigate before the 10-day submission window even begins.

If your crash just occurred and you can’t find the report, check back daily — it will be uploaded once the officer completes the investigation and submits it. Don’t assume it’s missing after just a day or two.

In some cases, it can take longer than 10 days. If the report still hasn’t appeared after 10 days, call the Records Division of the specific agency that responded to your accident — whether that’s the local Police Department, County Sheriff’s Office, or Florida Highway Patrol. They can tell you if the report is still being processed or if there’s a data entry issue (such as a misspelled name) preventing it from showing up in your search results.

Answers written and reviewed by Prosper Shaked, personal injury attorney.

Were You Injured in a Florida Car Accident?

If you were injured in a crash and are weighing your options, we will be happy to obtain a copy of the crash report for you at no cost as part of your free consultation. If the report is already available, we will send you a copy during the consultation by email or text message if you prefer, explain what it means for you, and advise you on your options.

Call (305) 694-2676 for a Free Consultation

Enlarged screenshot

LyogPT09PT0gU0NPUEVEIFNUWUxFUyDigJQgYWxsIHVuZGVyIC5wcm9zcGVyLWludGVyYWN0aXZlLXBvc3QgPT09PT0gKi8KCi8qIEhpZGUgdGhlbWUtaW5qZWN0ZWQgQ1RBIGluc2lkZSB0aGlzIHBvc3QgKi8KLnByb3NwZXItaW50ZXJhY3RpdmUtcG9zdCAubC1jb250YWluZXIsCi5wcm9zcGVyLWludGVyYWN0aXZlLXBvc3QgLnRleHQtY29udGVudCAudHJpYW5nbGUgewogIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKfQoucHJvc3Blci1pbnRlcmFjdGl2ZS1wb3N0IHsKICBmb250LWZhbWlseTogLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAiU2Vnb2UgVUkiLCBSb2JvdG8sIE94eWdlbiwgVWJ1bnR1LCBzYW5zLXNlcmlmOwogIGNvbG9yOiAjMzMzOwogIGxpbmUtaGVpZ2h0OiAxLjc7CiAgbWF4LXdpZHRoOiA4MjBweDsKICBtYXJnaW46IDAgYXV0bzsKICBwYWRkaW5nOiAyMHB4Owp9Ci5wcm9zcGVyLWludGVyYWN0aXZlLXBvc3QgKiwKLnByb3NwZXItaW50ZXJhY3RpdmUtcG9zdCAqOjpiZWZvcmUsCi5wcm9zcGVyLWludGVyYWN0aXZlLXBvc3QgKjo6YWZ0ZXIgewogIGJveC1zaXppbmc6IGJvcmRlci1ib3g7Cn0KLnByb3NwZXItaW50ZXJhY3RpdmUtcG9zdCBidXR0b246Zm9jdXMsCi5wcm9zcGVyLWludGVyYWN0aXZlLXBvc3QgYTpmb2N1cywKLnByb3NwZXItaW50ZXJhY3RpdmUtcG9zdCBsaTpmb2N1cyB7CiAgb3V0bGluZTogbm9uZSAhaW1wb3J0YW50OwogIGJveC1zaGFkb3c6IG5vbmUgIWltcG9ydGFudDsKfQoucHJvc3Blci1pbnRlcmFjdGl2ZS1wb3N0IGgyIHsKICBjb2xvcjogIzFiM2E1YyAhaW1wb3J0YW50OwogIGZvbnQtc2l6ZTogMS42cmVtICFpbXBvcnRhbnQ7CiAgbWFyZ2luOiAycmVtIDAgMXJlbSAhaW1wb3J0YW50OwogIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCAjZThlY2YxICFpbXBvcnRhbnQ7CiAgcGFkZGluZy1ib3R0b206IDAuNXJlbSAhaW1wb3J0YW50Owp9Ci5wcm9zcGVyLWludGVyYWN0aXZlLXBvc3QgaDMgewogIGNvbG9yOiAjMWIzYTVjICFpbXBvcnRhbnQ7CiAgZm9udC1zaXplOiAxLjI1cmVtICFpbXBvcnRhbnQ7CiAgbWFyZ2luOiAxLjVyZW0gMCAwLjc1cmVtICFpbXBvcnRhbnQ7Cn0KLnByb3NwZXItaW50ZXJhY3RpdmUtcG9zdCBwIHsKICBtYXJnaW46IDAgMCAxcmVtOwp9Ci5wcm9zcGVyLWludGVyYWN0aXZlLXBvc3QgYSB7CiAgY29sb3I6ICMxYjNhNWM7CiAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Cn0KLnByb3NwZXItaW50ZXJhY3RpdmUtcG9zdCBhOmhvdmVyIHsKICBjb2xvcjogIzI5ODBiOTsKfQoKLyogLS0tLS0tLS0tLSBRVUlDSyBBTlNXRVIgSEVSTyBCT1ggLS0tLS0tLS0tLSAqLwoucGlwLWhlcm8tYm94IHsKICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjMWIzYTVjIDAlLCAjMjM0YjczIDEwMCUpOwogIGNvbG9yOiAjZmZmICFpbXBvcnRhbnQ7CiAgYm9yZGVyLXJhZGl1czogMTJweDsKICBwYWRkaW5nOiAyOHB4IDMycHg7CiAgbWFyZ2luLWJvdHRvbTogMnJlbTsKICBib3gtc2hhZG93OiAwIDRweCAyMHB4IHJnYmEoMjcsNTgsOTIsMC4xOCk7Cn0KLnBpcC1oZXJvLWJveCBoMiB7CiAgZm9udC1zaXplOiAxLjc1cmVtOwogIG1hcmdpbjogMCAwIDEycHg7CiAgY29sb3I6ICNmZmYgIWltcG9ydGFudDsKICBsaW5lLWhlaWdodDogMS4zOwogIGJvcmRlci1ib3R0b206IG5vbmU7CiAgcGFkZGluZy1ib3R0b206IDA7Cn0KLnBpcC1oZXJvLWJveCAucGlwLWhlcm8tYW5zd2VyIHsKICBmb250LXNpemU6IDEuMDVyZW07CiAgbWFyZ2luLWJvdHRvbTogMThweDsKICBjb2xvcjogI2ZmZiAhaW1wb3J0YW50OwogIG9wYWNpdHk6IDE7CiAgbGluZS1oZWlnaHQ6IDEuNjsKfQoucGlwLWhlcm8tYm94IC5waXAtaGVyby1hY3Rpb25zIHsKICBkaXNwbGF5OiBmbGV4OwogIGZsZXgtd3JhcDogd3JhcDsKICBnYXA6IDEycHg7Cn0KLnBpcC1oZXJvLWJveCAucGlwLWJ0biB7CiAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICBnYXA6IDhweDsKICBwYWRkaW5nOiAxMnB4IDI0cHg7CiAgYm9yZGVyLXJhZGl1czogOHB4OwogIGZvbnQtd2VpZ2h0OiA2MDA7CiAgZm9udC1zaXplOiAwLjk1cmVtOwogIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4xNXMsIGJveC1zaGFkb3cgMC4xNXM7CiAgY3Vyc29yOiBwb2ludGVyOwogIGJvcmRlcjogbm9uZTsKfQoucGlwLWhlcm8tYm94IC5waXAtYnRuOmhvdmVyIHsKICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTFweCk7CiAgYm94LXNoYWRvdzogMCA0cHggMTJweCByZ2JhKDAsMCwwLDAuMik7Cn0KLnBpcC1idG4tcHJpbWFyeSB7CiAgYmFja2dyb3VuZDogI2ZmZjsKICBjb2xvcjogIzFiM2E1YyAhaW1wb3J0YW50Owp9CgovKiAtLS0tLS0tLS0tIERFQ0lTSU9OIFRPT0wgLS0tLS0tLS0tLSAqLwoucGlwLWRlY2lzaW9uLXRvb2wgewogIGJhY2tncm91bmQ6ICNmN2Y5ZmI7CiAgYm9yZGVyOiAycHggc29saWQgI2UwZTdlZjsKICBib3JkZXItcmFkaXVzOiAxMnB4OwogIHBhZGRpbmc6IDI4cHggMzJweDsKICBtYXJnaW4tYm90dG9tOiAycmVtOwp9Ci5waXAtZGVjaXNpb24tdG9vbCBoMiB7CiAgYm9yZGVyOiBub25lOwogIHBhZGRpbmc6IDA7CiAgbWFyZ2luLXRvcDogMDsKICBmb250LXNpemU6IDEuMzVyZW07Cn0KLnBpcC1kZWNpc2lvbi1xdWVzdGlvbiB7CiAgZm9udC1zaXplOiAxLjA1cmVtOwogIGZvbnQtd2VpZ2h0OiA2MDA7CiAgbWFyZ2luLWJvdHRvbTogMTJweDsKICBjb2xvcjogIzFiM2E1YzsKfQoucGlwLWRlY2lzaW9uLW9wdGlvbnMgewogIGRpc3BsYXk6IGZsZXg7CiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICBnYXA6IDEwcHg7CiAgbWFyZ2luLWJvdHRvbTogOHB4Owp9Ci5waXAtZGVjaXNpb24tYnRuIHsKICBkaXNwbGF5OiBibG9jazsKICB3aWR0aDogMTAwJTsKICB0ZXh0LWFsaWduOiBsZWZ0OwogIHBhZGRpbmc6IDE0cHggMjBweDsKICBib3JkZXI6IDJweCBzb2xpZCAjZDBkOGU0ICFpbXBvcnRhbnQ7CiAgYm9yZGVyLXJhZGl1czogOHB4OwogIGJhY2tncm91bmQ6ICNmZmYgIWltcG9ydGFudDsKICBmb250LXNpemU6IDAuOTVyZW07CiAgY3Vyc29yOiBwb2ludGVyOwogIHRyYW5zaXRpb246IGFsbCAwLjE1czsKICBjb2xvcjogIzMzMyAhaW1wb3J0YW50OwogIGZvbnQtZmFtaWx5OiBpbmhlcml0Owp9Ci5waXAtZGVjaXNpb24tYnRuOmhvdmVyIHsKICBib3JkZXItY29sb3I6ICMxYjNhNWM7CiAgYmFja2dyb3VuZDogI2YwZjRmODsKfQoucGlwLWRlY2lzaW9uLWJ0bi5zZWxlY3RlZCB7CiAgYm9yZGVyLWNvbG9yOiAjMWIzYTVjOwogIGJhY2tncm91bmQ6ICNlYWYwZjc7CiAgZm9udC13ZWlnaHQ6IDYwMDsKfQoucGlwLWRlY2lzaW9uLXJlc3VsdCB7CiAgYmFja2dyb3VuZDogI2ZmZjsKICBib3JkZXI6IDJweCBzb2xpZCAjMWIzYTVjOwogIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgcGFkZGluZzogMjBweCAyNHB4OwogIG1hcmdpbi10b3A6IDE2cHg7CiAgZGlzcGxheTogbm9uZTsKfQoucGlwLWRlY2lzaW9uLXJlc3VsdC52aXNpYmxlIHsKICBkaXNwbGF5OiBibG9jazsKICBhbmltYXRpb246IHBpcEZhZGVJbiAwLjNzIGVhc2U7Cn0KLnBpcC1kZWNpc2lvbi1yZXN1bHQgaDMgewogIG1hcmdpbi10b3A6IDA7CiAgY29sb3I6ICMxYjNhNWM7Cn0KLnBpcC1kZWNpc2lvbi1yZXN0YXJ0IHsKICBtYXJnaW4tdG9wOiAxMnB4OwogIHBhZGRpbmc6IDhweCAxNnB4OwogIGJhY2tncm91bmQ6ICNmMGY0ZjggIWltcG9ydGFudDsKICBib3JkZXI6IDFweCBzb2xpZCAjZDBkOGU0ICFpbXBvcnRhbnQ7CiAgYm9yZGVyLXJhZGl1czogNnB4OwogIGN1cnNvcjogcG9pbnRlcjsKICBmb250LXNpemU6IDAuODVyZW07CiAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgY29sb3I6ICM1NTU7Cn0KLnBpcC1kZWNpc2lvbi1yZXN0YXJ0OmhvdmVyIHsKICBiYWNrZ3JvdW5kOiAjZTRlYWYwOwp9CgovKiAtLS0tLS0tLS0tIENIRUNLTElTVCAtLS0tLS0tLS0tICovCi5waXAtY2hlY2tsaXN0IHsKICBiYWNrZ3JvdW5kOiAjZmZmYmYwOwogIGJvcmRlcjogMnB4IHNvbGlkICNmMGU0YzQ7CiAgYm9yZGVyLXJhZGl1czogMTJweDsKICBwYWRkaW5nOiAyNHB4IDI4cHg7CiAgbWFyZ2luLWJvdHRvbTogMnJlbTsKfQoucGlwLWNoZWNrbGlzdCBoMiB7CiAgYm9yZGVyOiBub25lOwogIHBhZGRpbmc6IDA7CiAgbWFyZ2luLXRvcDogMDsKICBmb250LXNpemU6IDEuMjVyZW07CiAgY29sb3I6ICM4YTZkMjA7Cn0KLnBpcC1jaGVja2xpc3Qtc3VidGV4dCB7CiAgZm9udC1zaXplOiAwLjlyZW07CiAgY29sb3I6ICM4YTZkMjA7CiAgbWFyZ2luLWJvdHRvbTogMTZweDsKfQoucGlwLWNoZWNrbGlzdC1pdGVtcyB7CiAgbGlzdC1zdHlsZTogbm9uZSAhaW1wb3J0YW50OwogIHBhZGRpbmc6IDAgIWltcG9ydGFudDsKICBtYXJnaW46IDAgIWltcG9ydGFudDsKfQoucGlwLWNoZWNrbGlzdC1pdGVtcyBsaSB7CiAgZGlzcGxheTogZmxleCAhaW1wb3J0YW50OwogIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgZ2FwOiAxMnB4OwogIHBhZGRpbmc6IDEwcHggMCAhaW1wb3J0YW50OwogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZjBlNGM0OwogIGZvbnQtc2l6ZTogMC45NXJlbTsKICBjdXJzb3I6IHBvaW50ZXI7CiAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgbGlzdC1zdHlsZTogbm9uZSAhaW1wb3J0YW50OwogIGJhY2tncm91bmQtaW1hZ2U6IG5vbmUgIWltcG9ydGFudDsKfQoucGlwLWNoZWNrbGlzdC1pdGVtcyBsaTo6YmVmb3JlLAoucGlwLWNoZWNrbGlzdC1pdGVtcyBsaTo6bWFya2VyIHsKICBjb250ZW50OiBub25lICFpbXBvcnRhbnQ7CiAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50Owp9Ci5waXAtY2hlY2tsaXN0LWl0ZW1zIGxpOmxhc3QtY2hpbGQgewogIGJvcmRlci1ib3R0b206IG5vbmU7Cn0KLnBpcC1jaGVjay1ib3ggewogIHdpZHRoOiAyMnB4OwogIGhlaWdodDogMjJweDsKICBib3JkZXI6IDJweCBzb2xpZCAjYzliOTdhOwogIGJvcmRlci1yYWRpdXM6IDRweDsKICBkaXNwbGF5OiBmbGV4OwogIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgZmxleC1zaHJpbms6IDA7CiAgdHJhbnNpdGlvbjogYWxsIDAuMTVzOwogIGZvbnQtc2l6ZTogMTRweDsKICBjb2xvcjogdHJhbnNwYXJlbnQ7Cn0KLnBpcC1jaGVja2xpc3QtaXRlbXMgbGkuY2hlY2tlZCAucGlwLWNoZWNrLWJveCB7CiAgYmFja2dyb3VuZDogIzFiM2E1YzsKICBib3JkZXItY29sb3I6ICMxYjNhNWM7CiAgY29sb3I6ICNmZmY7Cn0KLnBpcC1jaGVja2xpc3QtaXRlbXMgbGkuY2hlY2tlZCBzcGFuOmxhc3QtY2hpbGQgewogIHRleHQtZGVjb3JhdGlvbjogbGluZS10aHJvdWdoOwogIG9wYWNpdHk6IDAuNTsKfQoucGlwLWNoZWNrbGlzdC1yZWFkeSB7CiAgZGlzcGxheTogbm9uZTsKICBtYXJnaW4tdG9wOiAxNnB4OwogIHBhZGRpbmc6IDEycHggMjBweDsKICBiYWNrZ3JvdW5kOiAjZThmNWU5OwogIGJvcmRlci1yYWRpdXM6IDhweDsKICBjb2xvcjogIzJlN2QzMjsKICBmb250LXdlaWdodDogNjAwOwogIGZvbnQtc2l6ZTogMC45NXJlbTsKICBhbmltYXRpb246IHBpcEZhZGVJbiAwLjNzIGVhc2U7Cn0KLnBpcC1jaGVja2xpc3QtcmVhZHkudmlzaWJsZSB7CiAgZGlzcGxheTogYmxvY2s7Cn0KCi8qIC0tLS0tLS0tLS0gU1RFUCBXSVpBUkQgLS0tLS0tLS0tLSAqLwoucGlwLXdpemFyZCB7CiAgYm9yZGVyOiAycHggc29saWQgI2UwZTdlZjsKICBib3JkZXItcmFkaXVzOiAxMnB4OwogIG92ZXJmbG93OiBoaWRkZW47CiAgbWFyZ2luLWJvdHRvbTogMnJlbTsKfQoucGlwLXdpemFyZC1oZWFkZXIgewogIGJhY2tncm91bmQ6ICMxYjNhNWM7CiAgY29sb3I6ICNmZmYgIWltcG9ydGFudDsKICBwYWRkaW5nOiAxOHB4IDI4cHg7CiAgZGlzcGxheTogZmxleDsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICBmbGV4LXdyYXA6IHdyYXA7CiAgZ2FwOiAxMHB4Owp9Ci5waXAtd2l6YXJkLWhlYWRlciBoMiB7CiAgY29sb3I6ICNmZmYgIWltcG9ydGFudDsKICBtYXJnaW46IDA7CiAgcGFkZGluZzogMDsKICBib3JkZXI6IG5vbmU7CiAgZm9udC1zaXplOiAxLjJyZW07Cn0KLnBpcC13aXphcmQtc3RlcC1pbmRpY2F0b3IgewogIGZvbnQtc2l6ZTogMC44NXJlbTsKICBvcGFjaXR5OiAwLjg1OwogIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgY29sb3I6ICNmZmYgIWltcG9ydGFudDsKfQoucGlwLXByb2dyZXNzLWJhciB7CiAgd2lkdGg6IDEwMCU7CiAgaGVpZ2h0OiA0cHg7CiAgYmFja2dyb3VuZDogcmdiYSgyNTUsMjU1LDI1NSwwLjIpOwp9Ci5waXAtcHJvZ3Jlc3MtZmlsbCB7CiAgaGVpZ2h0OiAxMDAlOwogIGJhY2tncm91bmQ6ICM1ZGFkZTI7CiAgdHJhbnNpdGlvbjogd2lkdGggMC4zNXMgZWFzZTsKICBib3JkZXItcmFkaXVzOiAwIDJweCAycHggMDsKfQoucGlwLXdpemFyZC1ib2R5IHsKICBwYWRkaW5nOiAyOHB4OwogIGJhY2tncm91bmQ6ICNmZmY7CiAgbWluLWhlaWdodDogMjAwcHg7Cn0KLnBpcC1zdGVwIHsKICBkaXNwbGF5OiBub25lOwogIGFuaW1hdGlvbjogcGlwRmFkZUluIDAuM3MgZWFzZTsKfQoucGlwLXN0ZXAuYWN0aXZlIHsKICBkaXNwbGF5OiBibG9jazsKfQoucGlwLXN0ZXAtdGl0bGUgewogIGZvbnQtc2l6ZTogMS4xcmVtOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgY29sb3I6ICMxYjNhNWM7CiAgbWFyZ2luLWJvdHRvbTogMTRweDsKfQoucGlwLXN0ZXAgcCB7CiAgbWFyZ2luLWJvdHRvbTogMTJweDsKfQoucGlwLXN0ZXAtaW1nLXdyYXBwZXIgewogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICBtYXJnaW46IDE4cHggMDsKICBjdXJzb3I6IHBvaW50ZXI7CiAgYm9yZGVyLXJhZGl1czogOHB4OwogIG92ZXJmbG93OiBoaWRkZW47CiAgYm9yZGVyOiAxcHggc29saWQgI2UwZTdlZjsKICB0cmFuc2l0aW9uOiBib3gtc2hhZG93IDAuMnM7Cn0KLnBpcC1zdGVwLWltZy13cmFwcGVyOmhvdmVyIHsKICBib3gtc2hhZG93OiAwIDRweCAxNnB4IHJnYmEoMCwwLDAsMC4xMik7Cn0KLnBpcC1zdGVwLWltZy13cmFwcGVyIGltZyB7CiAgd2lkdGg6IDEwMCU7CiAgaGVpZ2h0OiBhdXRvOwogIGRpc3BsYXk6IGJsb2NrOwp9Ci5waXAtc3RlcC1iYWRnZSB7CiAgcG9zaXRpb246IGFic29sdXRlOwogIHRvcDogMTJweDsKICBsZWZ0OiAxMnB4OwogIGJhY2tncm91bmQ6ICMxYjNhNWM7CiAgY29sb3I6ICNmZmYgIWltcG9ydGFudDsKICBmb250LXNpemU6IDAuNzVyZW07CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBwYWRkaW5nOiA0cHggMTJweDsKICBib3JkZXItcmFkaXVzOiAyMHB4OwogIHBvaW50ZXItZXZlbnRzOiBub25lOwp9Ci5waXAtem9vbS1oaW50IHsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgYm90dG9tOiAxMnB4OwogIHJpZ2h0OiAxMnB4OwogIGJhY2tncm91bmQ6IHJnYmEoMCwwLDAsMC42KTsKICBjb2xvcjogI2ZmZiAhaW1wb3J0YW50OwogIGZvbnQtc2l6ZTogMC43NXJlbTsKICBwYWRkaW5nOiA0cHggMTBweDsKICBib3JkZXItcmFkaXVzOiA0cHg7CiAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgb3BhY2l0eTogMDsKICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMnM7Cn0KLnBpcC1zdGVwLWltZy13cmFwcGVyOmhvdmVyIC5waXAtem9vbS1oaW50IHsKICBvcGFjaXR5OiAxOwp9Ci5waXAtd2l6YXJkLWZvb3RlciB7CiAgZGlzcGxheTogZmxleDsKICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICBwYWRkaW5nOiAxOHB4IDI4cHg7CiAgYmFja2dyb3VuZDogI2Y3ZjlmYjsKICBib3JkZXItdG9wOiAxcHggc29saWQgI2UwZTdlZjsKfQoucGlwLW5hdi1idG4gewogIHBhZGRpbmc6IDEwcHggMjRweDsKICBib3JkZXItcmFkaXVzOiA4cHg7CiAgZm9udC13ZWlnaHQ6IDYwMDsKICBmb250LXNpemU6IDAuOXJlbTsKICBjdXJzb3I6IHBvaW50ZXI7CiAgYm9yZGVyOiAycHggc29saWQgIzFiM2E1YzsKICB0cmFuc2l0aW9uOiBhbGwgMC4xNXM7CiAgZm9udC1mYW1pbHk6IGluaGVyaXQ7Cn0KLnBpcC1uYXYtYnRuLXByZXYgewogIGJhY2tncm91bmQ6ICNmZmYgIWltcG9ydGFudDsKICBjb2xvcjogIzFiM2E1YyAhaW1wb3J0YW50Owp9Ci5waXAtbmF2LWJ0bi1wcmV2OmhvdmVyIHsKICBiYWNrZ3JvdW5kOiAjZjBmNGY4ICFpbXBvcnRhbnQ7Cn0KLnBpcC1uYXYtYnRuLXByZXY6ZGlzYWJsZWQgewogIG9wYWNpdHk6IDAuMzsKICBjdXJzb3I6IG5vdC1hbGxvd2VkOwp9Ci5waXAtbmF2LWJ0bi1uZXh0IHsKICBiYWNrZ3JvdW5kOiAjMWIzYTVjICFpbXBvcnRhbnQ7CiAgY29sb3I6ICNmZmYgIWltcG9ydGFudDsKfQoucGlwLW5hdi1idG4tbmV4dDpob3ZlciB7CiAgYmFja2dyb3VuZDogIzIzNGI3MyAhaW1wb3J0YW50Owp9Ci5waXAtc3RlcC1kb3RzIHsKICBkaXNwbGF5OiBmbGV4OwogIGdhcDogNnB4Owp9Ci5waXAtc3RlcC1kb3QgewogIHdpZHRoOiAxMHB4OwogIGhlaWdodDogMTBweDsKICBib3JkZXItcmFkaXVzOiA1MCU7CiAgYmFja2dyb3VuZDogI2QwZDhlNDsKICBjdXJzb3I6IHBvaW50ZXI7CiAgdHJhbnNpdGlvbjogYWxsIDAuMnM7CiAgYm9yZGVyOiBub25lOwogIHBhZGRpbmc6IDA7Cn0KLnBpcC1zdGVwLWRvdC5hY3RpdmUgewogIGJhY2tncm91bmQ6ICMxYjNhNWM7CiAgdHJhbnNmb3JtOiBzY2FsZSgxLjIpOwp9Ci5waXAtc3RlcC1kb3QuY29tcGxldGVkIHsKICBiYWNrZ3JvdW5kOiAjNWRhZGUyOwp9CgovKiAtLS0tLS0tLS0tIFRBQkJFRCBTRUFSQ0ggTUVUSE9EUyAtLS0tLS0tLS0tICovCi5waXAtdGFicyB7CiAgbWFyZ2luLWJvdHRvbTogMnJlbTsKfQoucGlwLXRhYnMtbmF2IHsKICBkaXNwbGF5OiBmbGV4OwogIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCAjZTBlN2VmOwogIG1hcmdpbi1ib3R0b206IDA7Cn0KLnBpcC10YWItYnRuIHsKICBwYWRkaW5nOiAxMnB4IDI0cHg7CiAgZm9udC1zaXplOiAwLjlyZW07CiAgZm9udC13ZWlnaHQ6IDYwMDsKICBib3JkZXI6IDJweCBzb2xpZCAjZTBlN2VmICFpbXBvcnRhbnQ7CiAgYm9yZGVyLWJvdHRvbTogbm9uZSAhaW1wb3J0YW50OwogIGJhY2tncm91bmQ6ICNmN2Y5ZmIgIWltcG9ydGFudDsKICBjb2xvcjogIzY2NiAhaW1wb3J0YW50OwogIGN1cnNvcjogcG9pbnRlcjsKICBib3JkZXItcmFkaXVzOiA4cHggOHB4IDAgMDsKICBtYXJnaW4tYm90dG9tOiAtMnB4OwogIHRyYW5zaXRpb246IGFsbCAwLjE1czsKICBmb250LWZhbWlseTogaW5oZXJpdDsKfQoucGlwLXRhYi1idG46aG92ZXIgewogIGJhY2tncm91bmQ6ICNlZWYyZjYgIWltcG9ydGFudDsKICBjb2xvcjogIzMzMyAhaW1wb3J0YW50Owp9Ci5waXAtdGFiLWJ0bi5hY3RpdmUgewogIGJhY2tncm91bmQ6ICNmZmYgIWltcG9ydGFudDsKICBjb2xvcjogIzFiM2E1YyAhaW1wb3J0YW50OwogIGJvcmRlci1jb2xvcjogIzFiM2E1YzsKICBib3JkZXItYm90dG9tOiAycHggc29saWQgI2ZmZjsKfQoucGlwLXRhYi1wYW5lbCB7CiAgZGlzcGxheTogbm9uZTsKICBwYWRkaW5nOiAyNHB4OwogIGJvcmRlcjogMnB4IHNvbGlkICNlMGU3ZWY7CiAgYm9yZGVyLXRvcDogbm9uZTsKICBib3JkZXItcmFkaXVzOiAwIDAgMTBweCAxMHB4OwogIGJhY2tncm91bmQ6ICNmZmY7CiAgYW5pbWF0aW9uOiBwaXBGYWRlSW4gMC4yNXMgZWFzZTsKfQoucGlwLXRhYi1wYW5lbC5hY3RpdmUgewogIGRpc3BsYXk6IGJsb2NrOwp9Ci5waXAtdGFiLXBhbmVsIC5waXAtdGlwIHsKICBiYWNrZ3JvdW5kOiAjZWFmMGY3OwogIGJvcmRlci1sZWZ0OiA0cHggc29saWQgIzFiM2E1YzsKICBwYWRkaW5nOiAxMnB4IDE2cHg7CiAgYm9yZGVyLXJhZGl1czogMCA2cHggNnB4IDA7CiAgZm9udC1zaXplOiAwLjlyZW07CiAgbWFyZ2luLXRvcDogOHB4Owp9CgovKiAtLS0tLS0tLS0tIEZBUSBBQ0NPUkRJT04gLS0tLS0tLS0tLSAqLwoucGlwLWFjY29yZGlvbiB7CiAgbWFyZ2luLWJvdHRvbTogMnJlbTsKfQoucHJvc3Blci1pbnRlcmFjdGl2ZS1wb3N0IC5waXAtYWNjb3JkaW9uLWl0ZW0sCi5waXAtYWNjb3JkaW9uLWl0ZW0gewogIGJvcmRlcjogMnB4IHNvbGlkICNlMGU3ZWYgIWltcG9ydGFudDsKICBib3JkZXItcmFkaXVzOiAxMHB4ICFpbXBvcnRhbnQ7CiAgbWFyZ2luLWJvdHRvbTogMTBweCAhaW1wb3J0YW50OwogIG1hcmdpbi10b3A6IDAgIWltcG9ydGFudDsKICBwYWRkaW5nOiAwICFpbXBvcnRhbnQ7CiAgb3ZlcmZsb3c6IGhpZGRlbiAhaW1wb3J0YW50OwogIG1pbi1oZWlnaHQ6IGF1dG8gIWltcG9ydGFudDsKfQovKiBLaWxsIGVtcHR5IDxwPiB0YWdzIGluamVjdGVkIGJ5IHdwYXV0b3AgaW5zaWRlIGFjY29yZGlvbiBpdGVtcyAqLwoucHJvc3Blci1pbnRlcmFjdGl2ZS1wb3N0IC5waXAtYWNjb3JkaW9uLWl0ZW0gPiBwLAoucGlwLWFjY29yZGlvbi1pdGVtID4gcCB7CiAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogIG1hcmdpbjogMCAhaW1wb3J0YW50OwogIHBhZGRpbmc6IDAgIWltcG9ydGFudDsKICBoZWlnaHQ6IDAgIWltcG9ydGFudDsKICBsaW5lLWhlaWdodDogMCAhaW1wb3J0YW50Owp9Ci5wcm9zcGVyLWludGVyYWN0aXZlLXBvc3QgLnBpcC1hY2NvcmRpb24gYnV0dG9uLnBpcC1hY2NvcmRpb24taGVhZGVyLAoucGlwLWFjY29yZGlvbi1oZWFkZXIgewogIGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7CiAgcG9zaXRpb246IHJlbGF0aXZlICFpbXBvcnRhbnQ7CiAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsKICBwYWRkaW5nOiAxNHB4IDUwcHggMTRweCAyMHB4ICFpbXBvcnRhbnQ7CiAgbWFyZ2luOiAwICFpbXBvcnRhbnQ7CiAgYmFja2dyb3VuZDogI2ZmZiAhaW1wb3J0YW50OwogIGJvcmRlcjogbm9uZSAhaW1wb3J0YW50OwogIGJvcmRlci1yYWRpdXM6IDAgIWltcG9ydGFudDsKICBmb250LXNpemU6IDEuMDVyZW0gIWltcG9ydGFudDsKICBmb250LXdlaWdodDogNjAwICFpbXBvcnRhbnQ7CiAgY29sb3I6ICMxYjNhNWMgIWltcG9ydGFudDsKICBjdXJzb3I6IHBvaW50ZXI7CiAgdGV4dC1hbGlnbjogbGVmdCAhaW1wb3J0YW50OwogIHRleHQtdHJhbnNmb3JtOiBub25lICFpbXBvcnRhbnQ7CiAgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbCAhaW1wb3J0YW50OwogIGxpbmUtaGVpZ2h0OiAxLjQgIWltcG9ydGFudDsKICBtaW4taGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7CiAgaGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7CiAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjE1czsKICBmb250LWZhbWlseTogLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAiU2Vnb2UgVUkiLCBSb2JvdG8sIE94eWdlbiwgVWJ1bnR1LCBzYW5zLXNlcmlmICFpbXBvcnRhbnQ7Cn0KLnByb3NwZXItaW50ZXJhY3RpdmUtcG9zdCAucGlwLWFjY29yZGlvbiBidXR0b24ucGlwLWFjY29yZGlvbi1oZWFkZXI6aG92ZXIsCi5waXAtYWNjb3JkaW9uLWhlYWRlcjpob3ZlciB7CiAgYmFja2dyb3VuZDogI2Y3ZjlmYiAhaW1wb3J0YW50Owp9Ci5wcm9zcGVyLWludGVyYWN0aXZlLXBvc3QgLnBpcC1hY2NvcmRpb24tYXJyb3csCi5waXAtYWNjb3JkaW9uLWFycm93IHsKICBwb3NpdGlvbjogYWJzb2x1dGUgIWltcG9ydGFudDsKICByaWdodDogMjRweCAhaW1wb3J0YW50OwogIHRvcDogNTAlICFpbXBvcnRhbnQ7CiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpICFpbXBvcnRhbnQ7CiAgZm9udC1zaXplOiAxLjJyZW0gIWltcG9ydGFudDsKICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4yNXM7Cn0KLnBpcC1hY2NvcmRpb24taXRlbS5vcGVuIC5waXAtYWNjb3JkaW9uLWFycm93IHsKICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSkgcm90YXRlKDE4MGRlZykgIWltcG9ydGFudDsKfQoucGlwLWFjY29yZGlvbi1ib2R5IHsKICBtYXgtaGVpZ2h0OiAwOwogIG92ZXJmbG93OiBoaWRkZW47CiAgdHJhbnNpdGlvbjogbWF4LWhlaWdodCAwLjM1cyBlYXNlOwp9Ci5waXAtYWNjb3JkaW9uLWJvZHktaW5uZXIgewogIHBhZGRpbmc6IDAgMjRweCAyMHB4Owp9Ci5waXAtYWNjb3JkaW9uLWJvZHktaW5uZXIgdWwgewogIHBhZGRpbmctbGVmdDogMjBweCAhaW1wb3J0YW50OwogIG1hcmdpbjogOHB4IDA7CiAgbGlzdC1zdHlsZS10eXBlOiBkaXNjICFpbXBvcnRhbnQ7Cn0KLnBpcC1hY2NvcmRpb24tYm9keS1pbm5lciBsaSB7CiAgbWFyZ2luLWJvdHRvbTogNnB4OwogIGxpc3Qtc3R5bGUtdHlwZTogZGlzYyAhaW1wb3J0YW50OwogIGJhY2tncm91bmQtaW1hZ2U6IG5vbmUgIWltcG9ydGFudDsKfQoucGlwLWFjY29yZGlvbi1ib2R5LWlubmVyIGxpOjpiZWZvcmUgewogIGNvbnRlbnQ6IG5vbmUgIWltcG9ydGFudDsKfQoucGlwLWFjY29yZGlvbi1ib2R5LWlubmVyIC5waXAtZGlzY2xhaW1lciB7CiAgYmFja2dyb3VuZDogI2ZmZjhlMTsKICBib3JkZXItbGVmdDogNHB4IHNvbGlkICNmOWE4MjU7CiAgcGFkZGluZzogMTJweCAxNnB4OwogIGJvcmRlci1yYWRpdXM6IDAgNnB4IDZweCAwOwogIGZvbnQtc2l6ZTogMC45cmVtOwogIG1hcmdpbi10b3A6IDEycHg7Cn0KCi8qIC0tLS0tLS0tLS0gTEVHQUwgV0FSTklORyBDQUxMT1VUIC0tLS0tLS0tLS0gKi8KLnBpcC1sZWdhbC13YXJuaW5nIHsKICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwyNTUsMjU1LDAuMDgpOwogIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsMC4xNSk7CiAgcGFkZGluZzogMTRweCAxOHB4OwogIGJvcmRlci1yYWRpdXM6IDZweDsKICBmb250LXNpemU6IDAuOHJlbTsKICBsaW5lLWhlaWdodDogMS43OwogIGNvbG9yOiByZ2JhKDI1NSwyNTUsMjU1LDAuNik7CiAgbWFyZ2luLXRvcDogMThweDsKICBtYXJnaW4tYm90dG9tOiA2cHg7Cn0KLnBpcC1sZWdhbC13YXJuaW5nIHN0cm9uZyB7CiAgY29sb3I6IHJnYmEoMjU1LDI1NSwyNTUsMC43NSk7Cn0KCi8qIC0tLS0tLS0tLS0gSU5KVVJFRCBDVEEgQk9YIC0tLS0tLS0tLS0gKi8KLnBpcC1pbmp1cmVkLWN0YSB7CiAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgIzFiM2E1YyAwJSwgIzIzNGI3MyAxMDAlKTsKICBjb2xvcjogI2ZmZiAhaW1wb3J0YW50OwogIGJvcmRlci1yYWRpdXM6IDEycHg7CiAgcGFkZGluZzogMjhweCAzMnB4OwogIG1hcmdpbi1ib3R0b206IDJyZW07CiAgYm94LXNoYWRvdzogMCA0cHggMjBweCByZ2JhKDI3LDU4LDkyLDAuMTgpOwp9Ci5waXAtaW5qdXJlZC1jdGEgaDIgewogIGNvbG9yOiAjZmZmICFpbXBvcnRhbnQ7CiAgbWFyZ2luOiAwIDAgMTJweDsKICBwYWRkaW5nOiAwOwogIGJvcmRlcjogbm9uZTsKICBmb250LXNpemU6IDEuMzVyZW07Cn0KLnBpcC1pbmp1cmVkLWN0YSBwIHsKICBjb2xvcjogI2ZmZiAhaW1wb3J0YW50OwogIG9wYWNpdHk6IDE7CiAgbGluZS1oZWlnaHQ6IDEuNjsKICBtYXJnaW4tYm90dG9tOiAxNHB4Owp9Ci5waXAtaW5qdXJlZC1jdGEgLnBpcC1idG4gewogIGRpc3BsYXk6IGlubGluZS1mbGV4OwogIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgZ2FwOiA4cHg7CiAgcGFkZGluZzogMTJweCAyNHB4OwogIGJvcmRlci1yYWRpdXM6IDhweDsKICBmb250LXdlaWdodDogNjAwOwogIGZvbnQtc2l6ZTogMC45NXJlbTsKICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuMTVzLCBib3gtc2hhZG93IDAuMTVzOwogIGN1cnNvcjogcG9pbnRlcjsKICBib3JkZXI6IG5vbmU7CiAgYmFja2dyb3VuZDogI2ZmZjsKICBjb2xvcjogIzFiM2E1YyAhaW1wb3J0YW50Owp9Ci5waXAtaW5qdXJlZC1jdGEgLnBpcC1idG46aG92ZXIgewogIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMXB4KTsKICBib3gtc2hhZG93OiAwIDRweCAxMnB4IHJnYmEoMCwwLDAsMC4yKTsKfQoKLyogLS0tLS0tLS0tLSBET0NVTUVOVCBDT01QQVJJU09OIC0tLS0tLS0tLS0gKi8KLnBpcC1jb21wYXJpc29uIHsKICBtYXJnaW4tYm90dG9tOiAycmVtOwp9Ci5waXAtY29tcGFyaXNvbiA+IHAgewogIG1hcmdpbi1ib3R0b206IDE2cHg7Cn0KLnBpcC1jb21wYXJpc29uLWdyaWQgewogIGRpc3BsYXk6IGdyaWQ7CiAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyOwogIGdhcDogMTZweDsKfQoucGlwLWNvbXBhcmlzb24tY2FyZCB7CiAgYm9yZGVyLXJhZGl1czogMTBweDsKICBwYWRkaW5nOiAyMnB4IDI0cHg7CiAgYm9yZGVyOiAycHggc29saWQgI2UwZTdlZjsKfQoucGlwLWNvbXBhcmlzb24tY2FyZC5jYXJkLWV4Y2hhbmdlIHsKICBiYWNrZ3JvdW5kOiAjZjdmOWZiOwogIGJvcmRlci1jb2xvcjogI2QwZDhlNDsKfQoucGlwLWNvbXBhcmlzb24tY2FyZC5jYXJkLXJlcG9ydCB7CiAgYmFja2dyb3VuZDogI2VhZjBmNzsKICBib3JkZXItY29sb3I6ICMxYjNhNWM7Cn0KLnBpcC1jb21wYXJpc29uLWNhcmQgaDMgewogIG1hcmdpbi10b3A6IDA7CiAgZm9udC1zaXplOiAxLjA1cmVtOwp9Ci5waXAtY29tcGFyaXNvbi1jYXJkIC5waXAtY2FyZC1sYWJlbCB7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogMC43NXJlbTsKICBmb250LXdlaWdodDogNzAwOwogIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgbGV0dGVyLXNwYWNpbmc6IDAuNXB4OwogIHBhZGRpbmc6IDNweCAxMHB4OwogIGJvcmRlci1yYWRpdXM6IDRweDsKICBtYXJnaW4tYm90dG9tOiAxMHB4Owp9Ci5jYXJkLWV4Y2hhbmdlIC5waXAtY2FyZC1sYWJlbCB7CiAgYmFja2dyb3VuZDogI2QwZDhlNDsKICBjb2xvcjogIzRhNTU2ODsKfQouY2FyZC1yZXBvcnQgLnBpcC1jYXJkLWxhYmVsIHsKICBiYWNrZ3JvdW5kOiAjMWIzYTVjOwogIGNvbG9yOiAjZmZmICFpbXBvcnRhbnQ7Cn0KLnBpcC1jb21wYXJpc29uLWNhcmQgdWwgewogIHBhZGRpbmctbGVmdDogMThweCAhaW1wb3J0YW50OwogIG1hcmdpbjogMTBweCAwIDA7CiAgZm9udC1zaXplOiAwLjlyZW07CiAgbGlzdC1zdHlsZS10eXBlOiBkaXNjICFpbXBvcnRhbnQ7Cn0KLnBpcC1jb21wYXJpc29uLWNhcmQgbGkgewogIG1hcmdpbi1ib3R0b206IDZweDsKICBsaXN0LXN0eWxlLXR5cGU6IGRpc2MgIWltcG9ydGFudDsKICBiYWNrZ3JvdW5kLWltYWdlOiBub25lICFpbXBvcnRhbnQ7Cn0KLnBpcC1jb21wYXJpc29uLWNhcmQgbGk6OmJlZm9yZSB7CiAgY29udGVudDogbm9uZSAhaW1wb3J0YW50Owp9Ci5waXAtY29tcGFyaXNvbi1ib3R0b20gewogIG1hcmdpbi10b3A6IDE0cHg7CiAgcGFkZGluZzogMTJweCAxNnB4OwogIGJhY2tncm91bmQ6ICNlYWYwZjc7CiAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCAjMWIzYTVjOwogIGJvcmRlci1yYWRpdXM6IDAgNnB4IDZweCAwOwogIGZvbnQtc2l6ZTogMC45cmVtOwp9Ci8qIC0tLS0tLS0tLS0gTElHSFRCT1ggLS0tLS0tLS0tLSAqLwoucGlwLWxpZ2h0Ym94LW92ZXJsYXkgewogIHBvc2l0aW9uOiBmaXhlZDsKICB0b3A6IDA7CiAgbGVmdDogMDsKICB3aWR0aDogMTAwJTsKICBoZWlnaHQ6IDEwMCU7CiAgYmFja2dyb3VuZDogcmdiYSgwLDAsMCwwLjg1KTsKICB6LWluZGV4OiAxMDAwMDA7CiAgZGlzcGxheTogbm9uZTsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGp1c3RpZnktY29udGVudDogY2VudGVyOwogIHBhZGRpbmc6IDMwcHg7CiAgY3Vyc29yOiB6b29tLW91dDsKfQoucGlwLWxpZ2h0Ym94LW92ZXJsYXkub3BlbiB7CiAgZGlzcGxheTogZmxleDsKfQoucGlwLWxpZ2h0Ym94LW92ZXJsYXkgaW1nIHsKICBtYXgtd2lkdGg6IDk1JTsKICBtYXgtaGVpZ2h0OiA5MHZoOwogIGJvcmRlci1yYWRpdXM6IDhweDsKICBib3gtc2hhZG93OiAwIDhweCA0MHB4IHJnYmEoMCwwLDAsMC41KTsKfQoucGlwLWxpZ2h0Ym94LWNsb3NlIHsKICBwb3NpdGlvbjogZml4ZWQ7CiAgdG9wOiAyMHB4OwogIHJpZ2h0OiAyOHB4OwogIGJhY2tncm91bmQ6IHJnYmEoMjU1LDI1NSwyNTUsMC4xNSkgIWltcG9ydGFudDsKICBib3JkZXI6IG5vbmUgIWltcG9ydGFudDsKICBjb2xvcjogI2ZmZiAhaW1wb3J0YW50OwogIGZvbnQtc2l6ZTogMnJlbTsKICB3aWR0aDogNDhweDsKICBoZWlnaHQ6IDQ4cHg7CiAgYm9yZGVyLXJhZGl1czogNTAlOwogIGN1cnNvcjogcG9pbnRlcjsKICB6LWluZGV4OiAxMDAwMDE7CiAgZGlzcGxheTogbm9uZTsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGp1c3RpZnktY29udGVudDogY2VudGVyOwogIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xNXM7Cn0KLnBpcC1saWdodGJveC1jbG9zZTpob3ZlciB7CiAgYmFja2dyb3VuZDogcmdiYSgyNTUsMjU1LDI1NSwwLjMpICFpbXBvcnRhbnQ7Cn0KLnBpcC1saWdodGJveC1vdmVybGF5Lm9wZW4gKyAucGlwLWxpZ2h0Ym94LWNsb3NlLAoucGlwLWxpZ2h0Ym94LWNsb3NlLm9wZW4gewogIGRpc3BsYXk6IGZsZXg7Cn0KCi8qIC0tLS0tLS0tLS0gQU5JTUFUSU9OUyAtLS0tLS0tLS0tICovCkBrZXlmcmFtZXMgcGlwRmFkZUluIHsKICBmcm9tIHsgb3BhY2l0eTogMDsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDhweCk7IH0KICB0byB7IG9wYWNpdHk6IDE7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsgfQp9CgovKiAtLS0tLS0tLS0tIFJFU1BPTlNJVkUgLS0tLS0tLS0tLSAqLwpAbWVkaWEgKG1heC13aWR0aDogNzY4cHgpIHsKICAucGlwLWNvbXBhcmlzb24tZ3JpZCB7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjsKICB9CiAgLnBpcC13aXphcmQtYm9keSB7CiAgICBwYWRkaW5nOiAyMnB4OwogIH0KICAucGlwLXRhYi1idG4gewogICAgcGFkZGluZzogMTFweCAxOHB4OwogICAgZm9udC1zaXplOiAwLjg1cmVtOwogIH0KfQpAbWVkaWEgKG1heC13aWR0aDogNjQwcHgpIHsKICAucHJvc3Blci1pbnRlcmFjdGl2ZS1wb3N0IHsKICAgIHBhZGRpbmc6IDEycHg7CiAgfQogIC5waXAtaGVyby1ib3ggewogICAgcGFkZGluZzogMjJweCAyMHB4OwogIH0KICAucGlwLWhlcm8tYm94IGgyIHsKICAgIGZvbnQtc2l6ZTogMS4zNXJlbTsKICB9CiAgLnBpcC1oZXJvLWJveCAucGlwLWJ0biB7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICB9CiAgLnBpcC13aXphcmQtYm9keSB7CiAgICBwYWRkaW5nOiAyMHB4OwogIH0KICAucGlwLXdpemFyZC1mb290ZXIgewogICAgcGFkZGluZzogMTRweCAxOHB4OwogIH0KICAucGlwLXN0ZXAtZG90cyB7CiAgICBkaXNwbGF5OiBub25lOwogIH0KICAucGlwLXRhYi1idG4gewogICAgcGFkZGluZzogMTBweCAxNHB4OwogICAgZm9udC1zaXplOiAwLjhyZW07CiAgfQogIC5waXAtdGFicy1uYXYgewogICAgb3ZlcmZsb3cteDogYXV0bzsKICB9Cn0=
LyogLS0tLS0tLS0tLSBERUNJU0lPTiBUT09MIC0tLS0tLS0tLS0gKi8KZnVuY3Rpb24gcmVzZXREZWNpc2lvblRvb2woKSB7CiAgdmFyIHN0ZXBzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI2RlY2lzaW9uVG9vbCAucGlwLWRlY2lzaW9uLXN0ZXAnKTsKICB2YXIgcmVzdWx0cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNkZWNpc2lvblRvb2wgLnBpcC1kZWNpc2lvbi1yZXN1bHQnKTsKICB2YXIgYnRucyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNkZWNpc2lvblRvb2wgLnBpcC1kZWNpc2lvbi1idG4nKTsKICBzdGVwcy5mb3JFYWNoKGZ1bmN0aW9uKHMsIGkpIHsgcy5zdHlsZS5kaXNwbGF5ID0gaSA9PT0gMCA/ICdibG9jaycgOiAnbm9uZSc7IH0pOwogIHJlc3VsdHMuZm9yRWFjaChmdW5jdGlvbihyKSB7IHIuY2xhc3NMaXN0LnJlbW92ZSgndmlzaWJsZScpOyB9KTsKICBidG5zLmZvckVhY2goZnVuY3Rpb24oYikgeyBiLmNsYXNzTGlzdC5yZW1vdmUoJ3NlbGVjdGVkJyk7IH0pOwp9Cgpkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjZGVjaXNpb25Ub29sIC5waXAtZGVjaXNpb24tYnRuJykuZm9yRWFjaChmdW5jdGlvbihidG4pIHsKICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpIHsKICAgIHZhciBuZXh0ID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2RhdGEtbmV4dCcpOwogICAgdmFyIGN1cnJlbnRTdGVwID0gdGhpcy5jbG9zZXN0KCcucGlwLWRlY2lzaW9uLXN0ZXAnKTsKICAgIC8vIGhpZ2hsaWdodAogICAgY3VycmVudFN0ZXAucXVlcnlTZWxlY3RvckFsbCgnLnBpcC1kZWNpc2lvbi1idG4nKS5mb3JFYWNoKGZ1bmN0aW9uKGIpIHsgYi5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZCcpOyB9KTsKICAgIHRoaXMuY2xhc3NMaXN0LmFkZCgnc2VsZWN0ZWQnKTsKCiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICBjdXJyZW50U3RlcC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICBpZiAobmV4dC5zdGFydHNXaXRoKCdyZXN1bHQtJykpIHsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChuZXh0KS5jbGFzc0xpc3QuYWRkKCd2aXNpYmxlJyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2RlY2lzaW9uVG9vbCAucGlwLWRlY2lzaW9uLXN0ZXBbZGF0YS1zdGVwPSInICsgbmV4dCArICciXScpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwogICAgICB9CiAgICB9LCAyMDApOwogIH0pOwp9KTsKCi8qIC0tLS0tLS0tLS0gREVDSVNJT04gVE9PTCBSRVNUQVJUIChldmVudCBkZWxlZ2F0aW9uKSAtLS0tLS0tLS0tICovCmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZWNpc2lvblRvb2wnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKGUpIHsKICBpZiAoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdwaXAtZGVjaXNpb24tcmVzdGFydCcpKSB7CiAgICByZXNldERlY2lzaW9uVG9vbCgpOwogIH0KfSk7CgovKiAtLS0tLS0tLS0tIENIRUNLTElTVCAoZXZlbnQgZGVsZWdhdGlvbikgLS0tLS0tLS0tLSAqLwpmdW5jdGlvbiB0b2dnbGVDaGVjayhsaSkgewogIGxpLmNsYXNzTGlzdC50b2dnbGUoJ2NoZWNrZWQnKTsKICB2YXIgaXNDaGVja2VkID0gbGkuY2xhc3NMaXN0LmNvbnRhaW5zKCdjaGVja2VkJyk7CiAgbGkuc2V0QXR0cmlidXRlKCdhcmlhLWNoZWNrZWQnLCBpc0NoZWNrZWQgPyAndHJ1ZScgOiAnZmFsc2UnKTsKICB2YXIgdG90YWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjY2hlY2tsaXN0IGxpJykubGVuZ3RoOwogIHZhciBjaGVja2VkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI2NoZWNrbGlzdCBsaS5jaGVja2VkJykubGVuZ3RoOwogIHZhciByZWFkeUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NoZWNrbGlzdFJlYWR5Jyk7CiAgaWYgKGNoZWNrZWQgPT09IHRvdGFsKSB7CiAgICByZWFkeUVsLmNsYXNzTGlzdC5hZGQoJ3Zpc2libGUnKTsKICB9IGVsc2UgewogICAgcmVhZHlFbC5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJyk7CiAgfQp9Cgpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2hlY2tsaXN0JykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbihlKSB7CiAgdmFyIGxpID0gZS50YXJnZXQuY2xvc2VzdCgnbGknKTsKICBpZiAobGkpIHRvZ2dsZUNoZWNrKGxpKTsKfSk7Cgpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2hlY2tsaXN0JykuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGZ1bmN0aW9uKGUpIHsKICBpZiAoZS5rZXkgPT09ICdFbnRlcicgfHwgZS5rZXkgPT09ICcgJykgewogICAgdmFyIGxpID0gZS50YXJnZXQuY2xvc2VzdCgnbGknKTsKICAgIGlmIChsaSkgewogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIHRvZ2dsZUNoZWNrKGxpKTsKICAgIH0KICB9Cn0pOwoKLyogLS0tLS0tLS0tLSBTVEVQIFdJWkFSRCAtLS0tLS0tLS0tICovCnZhciB3aXphcmRDdXJyZW50ID0gMTsKdmFyIHdpemFyZFRvdGFsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI3dpemFyZEJvZHkgLnBpcC1zdGVwJykubGVuZ3RoOwoKLy8gQnVpbGQgZG90cwooZnVuY3Rpb24oKSB7CiAgdmFyIGRvdHNDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnd2l6YXJkRG90cycpOwogIGZvciAodmFyIGkgPSAxOyBpIDw9IHdpemFyZFRvdGFsOyBpKyspIHsKICAgIHZhciBkb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTsKICAgIGRvdC5jbGFzc05hbWUgPSAncGlwLXN0ZXAtZG90JyArIChpID09PSAxID8gJyBhY3RpdmUnIDogJycpOwogICAgZG90LnNldEF0dHJpYnV0ZSgnZGF0YS1zdGVwJywgaSk7CiAgICBkb3Quc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgJ0dvIHRvIHN0ZXAgJyArIGkpOwogICAgZG90LnNldEF0dHJpYnV0ZSgndGl0bGUnLCAnR28gdG8gc3RlcCAnICsgaSk7CiAgICBkb3QuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpIHsKICAgICAgZ29Ub1N0ZXAocGFyc2VJbnQodGhpcy5nZXRBdHRyaWJ1dGUoJ2RhdGEtc3RlcCcpKSk7CiAgICB9KTsKICAgIGRvdHNDb250YWluZXIuYXBwZW5kQ2hpbGQoZG90KTsKICB9Cn0pKCk7CgpmdW5jdGlvbiBnb1RvU3RlcChuKSB7CiAgaWYgKG4gPCAxIHx8IG4gPiB3aXphcmRUb3RhbCkgcmV0dXJuOwogIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyN3aXphcmRCb2R5IC5waXAtc3RlcCcpLmZvckVhY2goZnVuY3Rpb24ocykgeyBzLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpOyB9KTsKICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjd2l6YXJkQm9keSAucGlwLXN0ZXBbZGF0YS1zdGVwPSInICsgbiArICciXScpLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpOwogIHdpemFyZEN1cnJlbnQgPSBuOwogIHVwZGF0ZVdpemFyZFVJKCk7Cn0KCmZ1bmN0aW9uIHdpemFyZE5hdihkaXIpIHsKICBnb1RvU3RlcCh3aXphcmRDdXJyZW50ICsgZGlyKTsKfQoKZnVuY3Rpb24gdXBkYXRlV2l6YXJkVUkoKSB7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3dpemFyZEluZGljYXRvcicpLnRleHRDb250ZW50ID0gJ1N0ZXAgJyArIHdpemFyZEN1cnJlbnQgKyAnIG9mICcgKyB3aXphcmRUb3RhbDsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnd2l6YXJkUHJvZ3Jlc3MnKS5zdHlsZS53aWR0aCA9ICgod2l6YXJkQ3VycmVudCAvIHdpemFyZFRvdGFsKSAqIDEwMCkgKyAnJSc7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3dpemFyZFByZXYnKS5kaXNhYmxlZCA9IHdpemFyZEN1cnJlbnQgPT09IDE7CiAgdmFyIG5leHRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnd2l6YXJkTmV4dCcpOwogIG5leHRCdG4udGV4dENvbnRlbnQgPSB3aXphcmRDdXJyZW50ID09PSB3aXphcmRUb3RhbCA/ICdWaXNpdCBGbG9yaWRhIENyYXNoIFBvcnRhbCBcdTIxOTInIDogJ05leHQgXHUyMTkyJzsKICAvLyBVcGRhdGUgZG90cwogIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5waXAtc3RlcC1kb3QnKS5mb3JFYWNoKGZ1bmN0aW9uKGQpIHsKICAgIHZhciBzID0gcGFyc2VJbnQoZC5nZXRBdHRyaWJ1dGUoJ2RhdGEtc3RlcCcpKTsKICAgIGQuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJywgJ2NvbXBsZXRlZCcpOwogICAgaWYgKHMgPT09IHdpemFyZEN1cnJlbnQpIGQuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7CiAgICBlbHNlIGlmIChzIDwgd2l6YXJkQ3VycmVudCkgZC5jbGFzc0xpc3QuYWRkKCdjb21wbGV0ZWQnKTsKICB9KTsKfQoKLyogLS0tLS0tLS0tLSBXSVpBUkQgTkFWIChldmVudCBkZWxlZ2F0aW9uKSAtLS0tLS0tLS0tICovCmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5waXAtd2l6YXJkLWZvb3RlcicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oZSkgewogIHZhciBidG4gPSBlLnRhcmdldC5jbG9zZXN0KCcucGlwLW5hdi1idG4tcHJldicpOwogIGlmIChidG4gJiYgIWJ0bi5kaXNhYmxlZCkgewogICAgd2l6YXJkTmF2KC0xKTsKICAgIHJldHVybjsKICB9CiAgYnRuID0gZS50YXJnZXQuY2xvc2VzdCgnLnBpcC1uYXYtYnRuLW5leHQnKTsKICBpZiAoYnRuKSB7CiAgICBpZiAod2l6YXJkQ3VycmVudCA9PT0gd2l6YXJkVG90YWwpIHsKICAgICAgd2luZG93Lm9wZW4oJ2h0dHBzOi8vc2VydmljZXMuZmxoc212Lmdvdi9DcmFzaFJlcG9ydFB1cmNoYXNpbmcvJywgJ19ibGFuaycpOwogICAgfSBlbHNlIHsKICAgICAgd2l6YXJkTmF2KDEpOwogICAgfQogIH0KfSk7CgovKiAtLS0tLS0tLS0tIFdJWkFSRCBLRVlCT0FSRCBOQVYgLS0tLS0tLS0tLSAqLwpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZnVuY3Rpb24oZSkgewogIHZhciB3aXphcmQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnd2l6YXJkJyk7CiAgaWYgKCF3aXphcmQpIHJldHVybjsKICB2YXIgaGFzRm9jdXMgPSB3aXphcmQuY29udGFpbnMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCk7CiAgaWYgKCFoYXNGb2N1cykgcmV0dXJuOwogIGlmIChlLmtleSA9PT0gJ0Fycm93TGVmdCcpIHsKICAgIHdpemFyZE5hdigtMSk7CiAgfSBlbHNlIGlmIChlLmtleSA9PT0gJ0Fycm93UmlnaHQnKSB7CiAgICBpZiAod2l6YXJkQ3VycmVudCA9PT0gd2l6YXJkVG90YWwpIHJldHVybjsKICAgIHdpemFyZE5hdigxKTsKICB9Cn0pOwoKLyogLS0tLS0tLS0tLSBUQUJTIChldmVudCBkZWxlZ2F0aW9uKSAtLS0tLS0tLS0tICovCmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5waXAtdGFicy1uYXYnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKGUpIHsKICB2YXIgYnRuID0gZS50YXJnZXQuY2xvc2VzdCgnLnBpcC10YWItYnRuJyk7CiAgaWYgKCFidG4pIHJldHVybjsKICB2YXIgcGFuZWxJZCA9IGJ0bi5nZXRBdHRyaWJ1dGUoJ2FyaWEtY29udHJvbHMnKTsKICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucGlwLXRhYi1idG4nKS5mb3JFYWNoKGZ1bmN0aW9uKGIpIHsKICAgIGIuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7CiAgICBiLnNldEF0dHJpYnV0ZSgnYXJpYS1zZWxlY3RlZCcsICdmYWxzZScpOwogIH0pOwogIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5waXAtdGFiLXBhbmVsJykuZm9yRWFjaChmdW5jdGlvbihwKSB7IHAuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7IH0pOwogIGJ0bi5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTsKICBidG4uc2V0QXR0cmlidXRlKCdhcmlhLXNlbGVjdGVkJywgJ3RydWUnKTsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChwYW5lbElkKS5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTsKfSk7CgovKiAtLS0tLS0tLS0tIEFDQ09SRElPTiAoZXZlbnQgZGVsZWdhdGlvbikgLS0tLS0tLS0tLSAqLwpkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucGlwLWFjY29yZGlvbicpLmZvckVhY2goZnVuY3Rpb24oYWNjb3JkaW9uKSB7CiAgYWNjb3JkaW9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oZSkgewogICAgdmFyIGhlYWRlciA9IGUudGFyZ2V0LmNsb3Nlc3QoJy5waXAtYWNjb3JkaW9uLWhlYWRlcicpOwogICAgaWYgKCFoZWFkZXIpIHJldHVybjsKICAgIHZhciBpdGVtID0gaGVhZGVyLnBhcmVudEVsZW1lbnQ7CiAgICB2YXIgYm9keSA9IGl0ZW0ucXVlcnlTZWxlY3RvcignLnBpcC1hY2NvcmRpb24tYm9keScpOwogICAgdmFyIGlzT3BlbiA9IGl0ZW0uY2xhc3NMaXN0LmNvbnRhaW5zKCdvcGVuJyk7CgogICAgLy8gQ2xvc2UgYWxsIGl0ZW1zIHdpdGhpbiB0aGlzIGFjY29yZGlvbiBvbmx5CiAgICBhY2NvcmRpb24ucXVlcnlTZWxlY3RvckFsbCgnLnBpcC1hY2NvcmRpb24taXRlbScpLmZvckVhY2goZnVuY3Rpb24oYWkpIHsKICAgICAgYWkuY2xhc3NMaXN0LnJlbW92ZSgnb3BlbicpOwogICAgICBhaS5xdWVyeVNlbGVjdG9yKCcucGlwLWFjY29yZGlvbi1ib2R5Jykuc3R5bGUubWF4SGVpZ2h0ID0gbnVsbDsKICAgICAgYWkucXVlcnlTZWxlY3RvcignLnBpcC1hY2NvcmRpb24taGVhZGVyJykuc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgJ2ZhbHNlJyk7CiAgICB9KTsKCiAgICBpZiAoIWlzT3BlbikgewogICAgICBpdGVtLmNsYXNzTGlzdC5hZGQoJ29wZW4nKTsKICAgICAgYm9keS5zdHlsZS5tYXhIZWlnaHQgPSBib2R5LnNjcm9sbEhlaWdodCArICdweCc7CiAgICAgIGhlYWRlci5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCAndHJ1ZScpOwogICAgfQogIH0pOwp9KTsKCi8qIC0tLS0tLS0tLS0gTElHSFRCT1ggLS0tLS0tLS0tLSAqLwpmdW5jdGlvbiBvcGVuTGlnaHRib3god3JhcHBlcikgewogIHZhciBpbWdTcmMgPSB3cmFwcGVyLnF1ZXJ5U2VsZWN0b3IoJ2ltZycpLnNyYzsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGlnaHRib3hJbWcnKS5zcmMgPSBpbWdTcmM7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xpZ2h0Ym94T3ZlcmxheScpLmNsYXNzTGlzdC5hZGQoJ29wZW4nKTsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGlnaHRib3hDbG9zZScpLmNsYXNzTGlzdC5hZGQoJ29wZW4nKTsKICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7CiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnByb3NwZXItaW50ZXJhY3RpdmUtcG9zdCcpLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsaWdodGJveENsb3NlJykuZm9jdXMoKTsKfQoKZnVuY3Rpb24gY2xvc2VMaWdodGJveCgpIHsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGlnaHRib3hPdmVybGF5JykuY2xhc3NMaXN0LnJlbW92ZSgnb3BlbicpOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsaWdodGJveENsb3NlJykuY2xhc3NMaXN0LnJlbW92ZSgnb3BlbicpOwogIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnJzsKICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucHJvc3Blci1pbnRlcmFjdGl2ZS1wb3N0JykucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWhpZGRlbicpOwp9CgovKiBMaWdodGJveCBldmVudCBkZWxlZ2F0aW9uIG9uIC5wcm9zcGVyLWludGVyYWN0aXZlLXBvc3QgZm9yIGltZyB3cmFwcGVyIGNsaWNrcyAqLwpkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucHJvc3Blci1pbnRlcmFjdGl2ZS1wb3N0JykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbihlKSB7CiAgdmFyIHdyYXBwZXIgPSBlLnRhcmdldC5jbG9zZXN0KCcucGlwLXN0ZXAtaW1nLXdyYXBwZXInKTsKICBpZiAod3JhcHBlcikgb3BlbkxpZ2h0Ym94KHdyYXBwZXIpOwp9KTsKCi8qIExpZ2h0Ym94IG92ZXJsYXkgYW5kIGNsb3NlIGJ1dHRvbiAqLwpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGlnaHRib3hPdmVybGF5JykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpIHsKICBjbG9zZUxpZ2h0Ym94KCk7Cn0pOwpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGlnaHRib3hDbG9zZScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKSB7CiAgY2xvc2VMaWdodGJveCgpOwp9KTsKCmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBmdW5jdGlvbihlKSB7CiAgaWYgKGUua2V5ID09PSAnRXNjYXBlJykgY2xvc2VMaWdodGJveCgpOwp9KTs=