OSU Area Calculator — Find Your osu! Tablet Active Area

osu! Area Calc

Tablet Area Visualizer & Converter

Calibration
mm
mm
Active Area
mm
mm
mm
mm
Active Area (mm)
Aspect Ratio
Enter plotted mm values into OpenTabletDriver or Wacom drivers.

 

In the rhythm game osu!, your aim matters just as much as your timing. Every small movement of your hand on a graphics tablet controls where the cursor goes on the screen. If your tablet area is too large, your movements feel slow. If it is too small, your aim feels shaky and inaccurate. This is why many serious players adjust their tablet active area.

An OSU Area Calculator helps you find the exact physical area on your tablet that maps to the osu! playfield. It converts screen resolution and tablet size into precise millimeter measurements. With the right area settings, your aim becomes more consistent, your movements feel natural, and your overall performance improves.

This guide explains what the OSU Area Calculator is, how it works, and how to use it properly with real examples.

What the OSU Area Calculator Is

The OSU Area Calculator is a specialized tool for osu! players who use a graphics tablet. Instead of calculating simple geometric areas like circles or ovals, this calculator focuses on mapping your tablet surface to your screen.

Related Calculator:  Composite Area Calculator — Quick Area for Mixed Shapes & Complex Outlines

In osu!, the cursor moves based on where your pen touches the tablet. The calculator helps you define:

  • The width of your active tablet area

  • The height of your active tablet area

  • The position of that area (offsets)

This makes it easier to copy pro player settings, switch tablets, or fine-tune your own setup without guessing.

How the OSU Area Calculator Works

Inputs You Enter

Most OSU area calculators ask for:

  • Screen resolution (for example, 1920 × 1080)

  • Tablet size (width and height in millimeters)

  • Desired active width or height

  • Aspect ratio lock (on or off)

  • X and Y offsets

These values describe both your monitor and your tablet.

Calculation Process

The calculator:

  1. Matches your tablet area to your screen’s aspect ratio

  2. Calculates the active width and height in millimeters

  3. Positions the area using offsets

  4. Displays a visual preview of the active area

Output You Get

The result is a precise rectangle on your tablet surface that maps perfectly to your osu! playfield. You can then apply these values in your tablet driver settings.

Key Concepts and Formulas

Unlike normal area calculators, this tool focuses on ratio and scaling rather than pure geometry.

Aspect Ratio Matching

To keep cursor movement consistent, the tablet area should match the screen ratio:

\frac{Active\ Width}{Active\ Height} = \frac{Screen\ Width}{Screen\ Height}

This ensures that horizontal and vertical movements feel balanced.

Scaling Logic

If you set one dimension (for example, width), the other dimension is calculated automatically using the same ratio.

Related Calculator:  Aero Port Area Calculator – Total Area of Multiple Circular Ports

This prevents stretched or squished cursor movement.

Offset Positioning

Offsets move the active area left, right, up, or down on the tablet. This helps you place the area where your hand feels most comfortable.

Step-by-Step Examples

Example 1: 16:9 Screen Setup

You use a 1920 × 1080 monitor (16:9 ratio) and want a tablet width of 80 mm.

Step 1: Use the ratio

Height = \frac{80 \times 9}{16}
Height = 45

Your active area becomes 80 mm × 45 mm.

This keeps your movement natural and accurate.

Example 2: Switching Tablets

You move from a small tablet to a larger one. Instead of guessing, you:

  • Enter your old active width

  • Enter your new tablet size

  • Keep the same aspect ratio

The calculator gives you matching values, so your muscle memory stays consistent.

Features of the OSU Area Calculator

Visual Area Preview

You can see exactly where your active area sits on the tablet.

Aspect Ratio Lock

Keeps movement balanced and prevents distortion.

Preset Support

Some tools let you load popular player presets.

Precise Measurements

All values are shown in millimeters for accuracy.

Easy Conversion

Switch between tablets or resolutions without re-learning aim.

Uses and Applications

Improving Aim Consistency

A properly sized area reduces over-aiming and under-aiming.

Speed Control

Smaller areas make fast maps easier to play.

Comfort Optimization

Offsets let you place the active zone where your hand feels natural.

Copying Pro Settings

You can match the area used by top players accurately.

Tablet Switching

Move to a new tablet without losing muscle memory.

Helpful Tips for Best Results

Lock the Aspect Ratio

This prevents weird cursor movement.

Related Calculator:  Open Area Calculator – Measure Your Open Space Quickly

Start Medium, Then Adjust

Do not jump to extreme sizes immediately.

Measure Your Tablet Correctly

Use the manufacturer’s dimensions or measure with a ruler.

Avoid Constant Changes

Give your muscle memory time to adapt.

Keep Sensitivity Stable

Do not change both area and sensitivity at the same time.

Common Mistakes to Avoid

Using the Full Tablet Area

This often makes aim too slow and tiring.

Ignoring Aspect Ratio

This causes uneven movement.

Copying Without Understanding

Pro settings may not suit your playstyle.

Changing Too Often

Frequent changes hurt consistency.

Wrong Resolution Input

Always use your real screen resolution.

Frequently Asked Questions

What is OSU Area?

It is the part of your tablet that controls the cursor in osu!.

Is Smaller Area Better?

Not always. It depends on your comfort and playstyle.

Do Mouse Players Need This?

No, this is mainly for tablet users.

Should I Lock Aspect Ratio?

Yes, for balanced movement.

Can This Improve My Rank?

It helps with consistency, which supports improvement.

Final Words

The OSU Area Calculator is a powerful tool for any osu! tablet player who wants better aim, smoother control, and consistent performance. By using proper area mapping, aspect ratio matching, and comfortable offsets, you can make your tablet feel like a natural extension of your hand.

Instead of guessing your settings, use the calculator to find precise values that match your screen and tablet. With the right setup and enough practice, your gameplay will feel more controlled, accurate, and enjoyable.

Similar Posts

  • Dome Surface Area Calculator – Easy Spherical Cap Geometry Tool

    Dome Surface Area Calculator Dome Calculator Architectural Surface Area & Volume. Base Radius (r) ftmcmin Base Diameter (d) Dome Height (h) Visualize as Geodesic Dome Roof Surface Area — sq ft Floor Area — sq ft Internal Volume — cu ft Circumference — ft Work Shown   Domes are beautiful curved structures that appear in…

  • Burn Surface Area Calculator – Estimate TBSA Quickly

    var c = document.getElementById(“wp-burn-bsa-root”); if(c) { // 1. Decode and inject HTML var decoded = atob(p); c.innerHTML = decoded; // 2. Execute Scripts (innerHTML does not auto-execute scripts) var scripts = c.getElementsByTagName(“script”); var arr = []; // Copy to array because the collection is live and might change for(var i=0; i The measurement used for…

  • Ring Area Calculator – Find the Area of a Circular Ring Easily

    // Base64 Content var b64 = “PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KCjxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAiPgogICAgPHRpdGxlPlJpbmcgQXJlYSBDYWxjdWxhdG9yPC90aXRsZT4KICAgIDxzdHlsZT4KICAgICAgICA6cm9vdCB7CiAgICAgICAgICAgIC0tcHJpbWFyeTogIzU0NmU3YTsKICAgICAgICAgICAgLyogU3RlZWwgR3JleSAqLwogICAgICAgICAgICAtLXByaW1hcnktbGlnaHQ6ICNlY2VmZjE7CiAgICAgICAgICAgIC0tYWNjZW50OiAjZmY5ODAwOwogICAgICAgICAgICAvKiBJbmR1c3RyaWFsIE9yYW5nZSAqLwogICAgICAgICAgICAtLWJnLXBhZ2U6ICNmNWY3Zjg7CiAgICAgICAgICAgIC0tYmctY2FyZDogI2ZmZmZmZjsKICAgICAgICAgICAgLS10ZXh0OiAjMzc0NzRmOwogICAgICAgIH0KCiAgICAgICAgKiB7CiAgICAgICAgICAgIG1hcmdpbjogMDsKICAgICAgICAgICAgcGFkZGluZzogMDsKICAgICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICAgICAgZm9udC1mYW1pbHk6ICdTZWdvZSBVSScsIHN5c3RlbS11aSwgc2Fucy1zZXJpZjsKICAgICAgICB9CgogICAgICAgIGJvZHkgewogICAgICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1iZy1wYWdlKTsKICAgICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgICAgIHBhZGRpbmc6IDMwcHggMTVweDsKICAgICAgICAgICAgY29sb3I6IHZhcigtLXRleHQpOwogICAgICAgICAgICAvKiBSZW1vdmVkIG1pbi1oZWlnaHQ6IDEwMHZoIHRvIGF2b2lkIGJsYW5rIHNwYWNlcyBpbiBpZnJhbWVzICovCiAgICAgICAgfQoKICAgICAgICAuY2FsYy1jYXJkIHsKICAgICAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tYmctY2FyZCk7CiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDEycHg7CiAgICAgICAgICAgIGJveC1zaGFkb3c6IDAgNHB4IDIwcHggcmdiYSgwLCAwLCAwLCAwLjEpOwogICAgICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICAgICAgbWF4LXdpZHRoOiA4MDBweDsKICAgICAgICAgICAgcGFkZGluZzogMjVweDsKICAgICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAgICAgZ2FwOiAyNXB4OwogICAgICAgIH0KCiAgICAgICAgLmhlYWRlciB7CiAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICAgICAgbWFyZ2luLWJvdHRvbTogNXB4OwogICAgICAgIH0KCiAgICAgICAgLmhlYWRlciBoMiB7CiAgICAgICAgICAgIGNvbG9yOiB2YXIoLS1wcmltYXJ5KTsKICAgICAgICAgICAgZm9udC1zaXplOiAxLjZyZW07CiAgICAgICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICAgICAgICAgIGxldHRlci1zcGFjaW5nOiAxcHg7CiAgICAgICAgfQoKICAgICAgICAuaGVhZGVyIHAgewogICAgICAgICAgICBjb2xvcjogIzkwYTRhZTsKICAgICAgICAgICAgZm9udC1zaXplOiAwLjlyZW07CiAgICAgICAgICAgIG1hcmdpbi10b3A6IDVweDsKICAgICAgICB9CgogICAgICAgIC5hcHAtbGF5b3V0IHsKICAgICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICAgICAgICBnYXA6IDMwcHg7CiAgICAgICAgfQoKICAgICAgICAuY29udHJvbHMgewogICAgICAgICAgICBmbGV4OiAxOwogICAgICAgICAgICBtaW4td2lkdGg6IDI4MHB4OwogICAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgICAgICBnYXA6IDE1cHg7CiAgICAgICAgfQoKICAgICAgICAudmlzLXBhbmVsIHsKICAgICAgICAgICAgZmxleDogMTsKICAgICAgICAgICAgbWluLXdpZHRoOiAyODBweDsKICAgICAgICAgICAgYmFja2dyb3VuZDogI2ZmZjsKICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2NmZDhkYzsKICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgICAgbWluLWhlaWdodDogMzAwcHg7CiAgICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB9CgogICAgICAgIC50YWItZ3JwIHsKICAgICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgICAgYmFja2dyb3VuZDogI2VjZWZmMTsKICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgICAgICBwYWRkaW5nOiA0cHg7CiAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7CiAgICAgICAgfQoKICAgICAgICAudGFiIHsKICAgICAgICAgICAgZmxleDogMTsKICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgICAgICBwYWRkaW5nOiA4cHg7CiAgICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgICAgICBjb2xvcjogIzc4OTA5YzsKICAgICAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICAgICAgZm9udC1zaXplOiAwLjlyZW07CiAgICAgICAgICAgIHRyYW5zaXRpb246IDAuMnM7CiAgICAgICAgfQoKICAgICAgICAudGFiLmFjdGl2ZSB7CiAgICAgICAgICAgIGJhY2tncm91bmQ6ICNmZmY7CiAgICAgICAgICAgIGNvbG9yOiB2YXIoLS1wcmltYXJ5KTsKICAgICAgICAgICAgYm94LXNoYWRvdzogMCAycHggNXB4IHJnYmEoMCwgMCwgMCwgMC4wNSk7CiAgICAgICAgfQoKICAgICAgICAuaW5wdXQtcm93IHsKICAgICAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDsKICAgICAgICB9CgogICAgICAgIC5pbnB1dC1yb3cgbGFiZWwgewogICAgICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICAgICAgZm9udC1zaXplOiAwLjg1cmVtOwogICAgICAgICAgICBmb250LXdlaWdodDogNzAwOwogICAgICAgICAgICBjb2xvcjogIzU0NmU3YTsKICAgICAgICAgICAgbWFyZ2luLWJvdHRvbTogNXB4OwogICAgICAgIH0KCiAgICAgICAgLmlucHV0LXdyYXAgewogICAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgICAgIGJhY2tncm91bmQ6ICNmYmZiZmI7CiAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNjZmQ4ZGM7CiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDVweDsKICAgICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICB9CgogICAgICAgIC5pbnB1dC13cmFwOmZvY3VzLXdpdGhpbiB7CiAgICAgICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tYWNjZW50KTsKICAgICAgICB9CgogICAgICAgIGlucHV0IHsKICAgICAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgICAgIHBhZGRpbmc6IDEwcHg7CiAgICAgICAgICAgIGZvbnQtc2l6ZTogMXJlbTsKICAgICAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICAgICAgY29sb3I6ICMyNjMyMzg7CiAgICAgICAgfQoKICAgICAgICAudW5pdCB7CiAgICAgICAgICAgIHBhZGRpbmc6IDAgMTBweDsKICAgICAgICAgICAgY29sb3I6ICM5MGE0YWU7CiAgICAgICAgICAgIGZvbnQtc2l6ZTogMC44cmVtOwogICAgICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgICB9CgogICAgICAgIC5zdGF0LWdyaWQgewogICAgICAgICAgICBkaXNwbGF5OiBncmlkOwogICAgICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7CiAgICAgICAgICAgIGdhcDogMTBweDsKICAgICAgICAgICAgbWFyZ2luLXRvcDogMTBweDsKICAgICAgICB9CgogICAgICAgIC5zdGF0LWJveCB7CiAgICAgICAgICAgIGJhY2tncm91bmQ6ICNlY2VmZjE7CiAgICAgICAgICAgIHBhZGRpbmc6IDEycHg7CiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIH0KCiAgICAgICAgLnN0YXQtdmFsIHsKICAgICAgICAgICAgZm9udC1zaXplOiAxLjNyZW07CiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICAgICAgICAgIGNvbG9yOiB2YXIoLS1wcmltYXJ5KTsKICAgICAgICB9CgogICAgICAgIC5zdGF0LWxibCB7CiAgICAgICAgICAgIGZvbnQtc2l6ZTogMC43NXJlbTsKICAgICAgICAgICAgY29sb3I6ICM3ODkwOWM7CiAgICAgICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgICAgICBtYXJnaW4tdG9wOiA0cHg7CiAgICAgICAgfQoKICAgICAgICAuc3RhdC1tYWluIHsKICAgICAgICAgICAgZ3JpZC1jb2x1bW46IHNwYW4gMjsKICAgICAgICAgICAgYmFja2dyb3VuZDogI2ZmZjNlMDsKICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2ZmZTBiMjsKICAgICAgICB9CgogICAgICAgIC5zdGF0LW1haW4gLnN0YXQtdmFsIHsKICAgICAgICAgICAgY29sb3I6ICNlNjUxMDA7CiAgICAgICAgICAgIGZvbnQtc2l6ZTogMS44cmVtOwogICAgICAgIH0KCiAgICAgICAgLnN0YXQtbWFpbiAuc3RhdC1sYmwgewogICAgICAgICAgICBjb2xvcjogI2VmNmMwMDsKICAgICAgICB9CgogICAgICAgIC5lcnItbXNnIHsKICAgICAgICAgICAgY29sb3I6ICNkMzJmMmY7CiAgICAgICAgICAgIGZvbnQtc2l6ZTogMC44NXJlbTsKICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgICAgICBtaW4taGVpZ2h0OiAyMHB4OwogICAgICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgIH0KCiAgICAgICAgLyogU1ZHICovCiAgICAgICAgc3ZnIHsKICAgICAgICAgICAgd2lkdGg6IDkwJTsKICAgICAgICAgICAgaGVpZ2h0OiA5MCU7CiAgICAgICAgICAgIG92ZXJmbG93OiB2aXNpYmxlOwogICAgICAgIH0KCiAgICAgICAgLnJpbmctc2hhcGUgewogICAgICAgICAgICBmaWxsOiByZ2JhKDg0LCAxMTAsIDEyMiwgMC4yKTsKICAgICAgICAgICAgc3Ryb2tlOiB2YXIoLS1wcmltYXJ5KTsKICAgICAgICAgICAgc3Ryb2tlLXdpZHRoOiAyOwogICAgICAgICAgICBmaWxsLXJ1bGU6IGV2ZW5vZGQ7CiAgICAgICAgfQoKICAgICAgICAubGluZS1yIHsKICAgICAgICAgICAgc3Ryb2tlOiB2YXIoLS1hY2NlbnQpOwogICAgICAgICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICAgICAgICAgIG1hcmtlci1lbmQ6IHVybCgjYXJyb3cpOwogICAgICAgIH0KCiAgICAgICAgLnRleHQtZGltIHsKICAgICAgICAgICAgZmlsbDogdmFyKC0tcHJpbWFyeSk7CiAgICAgICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgICAgICAgIHRleHQtYW5jaG9yOiBtaWRkbGU7CiAgICAgICAgfQogICAgPC9zdHlsZT4KPC9oZWFkPgoKPGJvZHk+CgogICAgPGRpdiBjbGFzcz0iY2FsYy1jYXJkIj4KICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkZXIiPgogICAgICAgICAgICA8aDI+UmluZyBBcmVhIENhbGN1bGF0b3I8L2gyPgogICAgICAgICAgICA8cD5DYWxjdWxhdGUgYXJlYSBvZiBhbiBBbm51bHVzIChXYXNoZXIpPC9wPgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJhcHAtbGF5b3V0Ij4KICAgICAgICAgICAgPCEtLSBJbnB1dCBTZWN0aW9uIC0tPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250cm9scyI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWItZ3JwIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWIgYWN0aXZlIiBvbmNsaWNrPSJzZXRNb2RlKCdyYWRpdXMnKSI+UmFkaXVzIChSLCByKTwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYiIgb25jbGljaz0ic2V0TW9kZSgnZGlhbWV0ZXInKSI+RGlhbWV0ZXIgKEQsIGQpPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbnB1dC1yb3ciPgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBpZD0ibGJsX291dGVyIj5PdXRlciBSYWRpdXMgKFIpPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbnB1dC13cmFwIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9Im51bWJlciIgaWQ9ImlucF9vdXQiIHZhbHVlPSIyMCIgb25pbnB1dD0iY2FsY3VsYXRlKCkiPgogICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0idW5pdCI+dW5pdHM8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbnB1dC1yb3ciPgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBpZD0ibGJsX2lubmVyIj5Jbm5lciBSYWRpdXMgKHIpPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbnB1dC13cmFwIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9Im51bWJlciIgaWQ9ImlucF9pbiIgdmFsdWU9IjEwIiBvbmlucHV0PSJjYWxjdWxhdGUoKSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ1bml0Ij51bml0czwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImVyci1tc2ciIGlkPSJlcnJfbXNnIj48L2Rpdj4KCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdGF0LWdyaWQiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN0YXQtYm94IHN0YXQtbWFpbiI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN0YXQtdmFsIiBpZD0icmVzX2FyZWEiPi0tPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN0YXQtbGJsIj5SaW5nIEFyZWE8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdGF0LWJveCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN0YXQtdmFsIiBpZD0icmVzX3BlcmltIj4tLTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdGF0LWxibCI+VG90YWwgUGVyaW1ldGVyPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3RhdC1ib3giPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdGF0LXZhbCIgaWQ9InJlc190aGljayI+LS08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3RhdC1sYmwiPlRoaWNrbmVzcyAodyk8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDwhLS0gVmlzdWFsaXphdGlvbiAtLT4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idmlzLXBhbmVsIj4KICAgICAgICAgICAgICAgIDxzdmcgdmlld0JveD0iLTExMCAtMTEwIDIyMCAyMjAiPgogICAgICAgICAgICAgICAgICAgIDxkZWZzPgogICAgICAgICAgICAgICAgICAgICAgICA8bWFya2VyIGlkPSJhcnJvdyIgbWFya2VyV2lkdGg9IjYiIG1hcmtlckhlaWdodD0iNiIgcmVmWD0iNSIgcmVmWT0iMyIgb3JpZW50PSJhdXRvIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0wLDAgTDYsMyBMMCw2IEwxLDMgeiIgZmlsbD0iI2ZmOTgwMCIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXJrZXI+CiAgICAgICAgICAgICAgICAgICAgPC9kZWZzPgoKICAgICAgICAgICAgICAgICAgICA8IS0tIFBhdGggZm9yIEFubnVsdXMgLS0+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggaWQ9InNoYXBlIiBjbGFzcz0icmluZy1zaGFwZSIgZD0iIiAvPgoKICAgICAgICAgICAgICAgICAgICA8IS0tIERpbWVuc2lvbnMgLS0+CiAgICAgICAgICAgICAgICAgICAgPGxpbmUgaWQ9ImRpbV9vdXQiIGNsYXNzPSJsaW5lLXIiIHgxPSIwIiB5MT0iMCIgeDI9IjAiIHkyPSIwIiBvcGFjaXR5PSIwIiAvPgogICAgICAgICAgICAgICAgICAgIDx0ZXh0IGlkPSJ0eHRfb3V0IiBjbGFzcz0idGV4dC1kaW0iIHg9IjAiIHk9IjAiIG9wYWNpdHk9IjAiPlI8L3RleHQ+CgogICAgICAgICAgICAgICAgICAgIDxsaW5lIGlkPSJkaW1faW4iIGNsYXNzPSJsaW5lLXIiIHgxPSIwIiB5MT0iMCIgeDI9IjAiIHkyPSIwIiBvcGFjaXR5PSIwIiAvPgogICAgICAgICAgICAgICAgICAgIDx0ZXh0IGlkPSJ0eHRfaW4iIGNsYXNzPSJ0ZXh0LWRpbSIgeD0iMCIgeT0iMCIgb3BhY2l0eT0iMCI+cjwvdGV4dD4KCiAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBjeD0iMCIgY3k9IjAiIHI9IjIiIGZpbGw9IiMzNzQ3NGYiIC8+CiAgICAgICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8c2NyaXB0PgogICAgICAgIGxldCBtb2RlID0gJ3JhZGl1cyc7CgogICAgICAgIGZ1bmN0aW9uIHNldE1vZGUobSkgewogICAgICAgICAgICBtb2RlID0gbTsKICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnRhYicpLmZvckVhY2godCA9PiB0LmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpKTsKICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgLnRhYltvbmNsaWNrPSJzZXRNb2RlKCcke219JykiXWApLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpOwoKICAgICAgICAgICAgaWYgKG1vZGUgPT09ICdyYWRpdXMnKSB7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGJsX291dGVyJykuaW5uZXJUZXh0ID0gJ091dGVyIFJhZGl1cyAoUiknOwogICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xibF9pbm5lcicpLmlubmVyVGV4dCA9ICdJbm5lciBSYWRpdXMgKHIpJzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYmxfb3V0ZXInKS5pbm5lclRleHQgPSAnT3V0ZXIgRGlhbWV0ZXIgKEQpJzsKICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYmxfaW5uZXInKS5pbm5lclRleHQgPSAnSW5uZXIgRGlhbWV0ZXIgKGQpJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYWxjdWxhdGUoKTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGNhbGN1bGF0ZSgpIHsKICAgICAgICAgICAgY29uc3Qgb3V0VmFsID0gcGFyc2VGbG9hdChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wX291dCcpLnZhbHVlKTsKICAgICAgICAgICAgY29uc3QgaW5WYWwgPSBwYXJzZUZsb2F0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnBfaW4nKS52YWx1ZSk7CgogICAgICAgICAgICBpZiAoaXNOYU4ob3V0VmFsKSB8fCBpc05hTihpblZhbCkpIHJldHVybjsKCiAgICAgICAgICAgIGxldCBSLCByOwoKICAgICAgICAgICAgaWYgKG1vZGUgPT09ICdyYWRpdXMnKSB7CiAgICAgICAgICAgICAgICBSID0gb3V0VmFsOwogICAgICAgICAgICAgICAgciA9IGluVmFsOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgUiA9IG91dFZhbCAvIDI7CiAgICAgICAgICAgICAgICByID0gaW5WYWwgLyAyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjb25zdCBlcnIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXJyX21zZycpOwogICAgICAgICAgICBpZiAociA+PSBSKSB7CiAgICAgICAgICAgICAgICBlcnIuaW5uZXJUZXh0ID0gbW9kZSA9PT0gJ3JhZGl1cycgPyAiT3V0ZXIgUmFkaXVzIG11c3QgYmUgPiBJbm5lciBSYWRpdXMiIDogIk91dGVyIERpYW1ldGVyIG11c3QgYmUgPiBJbm5lciBEaWFtZXRlciI7CiAgICAgICAgICAgICAgICAvLyBDbGVhciByZXN1bHRzPyBPciBzaG93IHdoYXQgd2UgY2FuCiAgICAgICAgICAgICAgICAvLyBJbnZhbGlkIGdlb21ldHJ5CiAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2hhcGUnKS5zZXRBdHRyaWJ1dGUoJ2QnLCAnJyk7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzX2FyZWEnKS5pbm5lclRleHQgPSAnLS0nOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZXJyLmlubmVyVGV4dCA9ICIiOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBDYWxjcwogICAgICAgICAgICBjb25zdCBBcmVhID0gTWF0aC5QSSAqIChSICogUiAtIHIgKiByKTsKICAgICAgICAgICAgY29uc3QgUGVyaW0gPSAyICogTWF0aC5QSSAqIChSICsgcik7CiAgICAgICAgICAgIGNvbnN0IFRoaWNrID0gUiAtIHI7CgogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzX2FyZWEnKS5pbm5lclRleHQgPSBBcmVhLnRvRml4ZWQoMik7CiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXNfcGVyaW0nKS5pbm5lclRleHQgPSBQZXJpbS50b0ZpeGVkKDIpOwogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzX3RoaWNrJykuaW5uZXJUZXh0ID0gVGhpY2sudG9GaXhlZCgyKTsKCiAgICAgICAgICAgIGRyYXcoUiwgcik7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBkcmF3KFIsIHIpIHsKICAgICAgICAgICAgLy8gRHJhdyBjZW50ZXJlZCBhdCAwLDAKICAgICAgICAgICAgLy8gTWF4IHZpZXcgaXMgLTEwMCB0byAxMDAgc28gUm1heCB+IDkwCiAgICAgICAgICAgIGNvbnN0IG1heFIgPSBSOwogICAgICAgICAgICBjb25zdCBzY2FsZSA9IDk1IC8gbWF4UjsKCiAgICAgICAgICAgIGNvbnN0IHNSID0gUiAqIHNjYWxlOwogICAgICAgICAgICBjb25zdCBzciA9IHIgKiBzY2FsZTsKCiAgICAgICAgICAgIC8vIEFubnVsdXMgUGF0aCB1c2luZyBTVkcgcGF0aCBhcmMgY29tbWFuZHMgCiAgICAgICAgICAgIC8vIE1vdmUgdG8gKFIsIDApLCBBcmMgdG8gKC1SLCAwKSwgQXJjIHRvIChSLCAwKQogICAgICAgICAgICAvLyBNb3ZlIHRvIChyLCAwKSwgQXJjIHRvICgtciwgMCksIEFyYyB0byAociwgMCkgKFJldmVyc2UgZGlyZWN0aW9uIGZvciBob2xlPykKICAgICAgICAgICAgLy8gT3Igc2ltcGxlcjogQ2lyY2xlIFIsIGhvbGUgQ2lyY2xlIHIuIFNWRyAnZXZlbm9kZCcgcnVsZSBoYW5kbGVzIGhvbGUgaWYgZGlyZWN0aW9uIGlzIHNhbWU/CiAgICAgICAgICAgIC8vIEFjdHVhbGx5LCBjcmVhdGluZyBjb21wb3VuZCBwYXRoOgogICAgICAgICAgICAvLyBNIGN4LGN5LVIgQSBSLFIgMCAxLDAgY3gsY3krUiBBIFIsUiAwIDEsMCBjeCxjeS1SCiAgICAgICAgICAgIC8vIE0gY3gsY3ktciBBIHIsciAwIDEsMSBjeCxjeStyIEEgcixyIDAgMSwxIGN4LGN5LXIgKENvdW50ZXIgY2xvY2t3aXNlIGlubmVyKQoKICAgICAgICAgICAgLy8gT3V0ZXIgQ2lyY2xlIChDbG9ja3dpc2UpCiAgICAgICAgICAgIGNvbnN0IGRPdXQgPSBgTSAwLC0ke3NSfSBBICR7c1J9LCR7c1J9IDAgMSwxIDAsJHtzUn0gQSAke3NSfSwke3NSfSAwIDEsMSAwLC0ke3NSfSBaYDsKICAgICAgICAgICAgLy8gSW5uZXIgQ2lyY2xlIChDb3VudGVyIENsb2Nrd2lzZSB0byBtYWtlIGEgaG9sZSB3aXRoIG5vbnplcm8gcnVsZSwgb3IganVzdCBzZXBhcmF0ZSBzdWJwYXRoIHdpdGggZXZlbm9kZCkKICAgICAgICAgICAgY29uc3QgZEluID0gYE0gMCwtJHtzcn0gQSAke3NyfSwke3NyfSAwIDEsMCAwLCR7c3J9IEEgJHtzcn0sJHtzcn0gMCAxLDAgMCwtJHtzcn0gWmA7CgogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2hhcGUnKS5zZXRBdHRyaWJ1dGUoJ2QnLCBkT3V0ICsgIiAiICsgZEluKTsKCiAgICAgICAgICAgIC8vIERyYXcgZGltZW5zaW9uIGxpbmUgZm9yIFIKICAgICAgICAgICAgLy8gQW5nbGVkIGF0IC00NSBkZWcKICAgICAgICAgICAgY29uc3QgYW5nID0gLU1hdGguUEkgLyA0OwogICAgICAgICAgICBjb25zdCBjb3MgPSBNYXRoLmNvcyhhbmcpLCBzaW4gPSBNYXRoLnNpbihhbmcpOwoKICAgICAgICAgICAgY29uc3QgbFIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGltX291dCcpOwogICAgICAgICAgICBsUi5zZXRBdHRyaWJ1dGUoJ3gxJywgMCk7IGxSLnNldEF0dHJpYnV0ZSgneTEnLCAwKTsKICAgICAgICAgICAgbFIuc2V0QXR0cmlidXRlKCd4MicsIHNSICogY29zKTsgbFIuc2V0QXR0cmlidXRlKCd5MicsIHNSICogc2luKTsKICAgICAgICAgICAgbFIuc2V0QXR0cmlidXRlKCdvcGFjaXR5JywgMSk7CgogICAgICAgICAgICBjb25zdCB0UiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0eHRfb3V0Jyk7CiAgICAgICAgICAgIHRSLnNldEF0dHJpYnV0ZSgneCcsIChzUiAvIDIgKyAxMCkgKiBjb3MpOwogICAgICAgICAgICB0Ui5zZXRBdHRyaWJ1dGUoJ3knLCAoc1IgLyAyICsgMTApICogc2luKTsKICAgICAgICAgICAgdFIuc2V0QXR0cmlidXRlKCdvcGFjaXR5JywgMSk7CiAgICAgICAgICAgIHRSLnRleHRDb250ZW50ID0gKG1vZGUgPT09ICdyYWRpdXMnID8gJ1InIDogJ0QvMicpOwoKICAgICAgICAgICAgLy8gRGltIGxpbmUgZm9yIHIKICAgICAgICAgICAgLy8gQW5nbGVkIGF0IC0xMzUgZGVnCiAgICAgICAgICAgIGNvbnN0IGFuZzIgPSAtMyAqIE1hdGguUEkgLyA0OwogICAgICAgICAgICBjb25zdCBjb3MyID0gTWF0aC5jb3MoYW5nMiksIHNpbjIgPSBNYXRoLnNpbihhbmcyKTsKCiAgICAgICAgICAgIGNvbnN0IGxyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RpbV9pbicpOwogICAgICAgICAgICBsci5zZXRBdHRyaWJ1dGUoJ3gxJywgMCk7IGxyLnNldEF0dHJpYnV0ZSgneTEnLCAwKTsKICAgICAgICAgICAgbHIuc2V0QXR0cmlidXRlKCd4MicsIHNyICogY29zMik7IGxyLnNldEF0dHJpYnV0ZSgneTInLCBzciAqIHNpbjIpOwogICAgICAgICAgICBsci5zZXRBdHRyaWJ1dGUoJ29wYWNpdHknLCAxKTsKCiAgICAgICAgICAgIGNvbnN0IHRyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3R4dF9pbicpOwogICAgICAgICAgICB0ci5zZXRBdHRyaWJ1dGUoJ3gnLCAoc3IgLyAyKSAqIGNvczIpOyAvLyBUZXh0IG5lYXIgY2VudGVyIG9mIGxpbmUKICAgICAgICAgICAgdHIuc2V0QXR0cmlidXRlKCd5JywgKHNyIC8gMikgKiBzaW4yIC0gNSk7CiAgICAgICAgICAgIHRyLnNldEF0dHJpYnV0ZSgnb3BhY2l0eScsIDEpOwogICAgICAgICAgICB0ci50ZXh0Q29udGVudCA9IChtb2RlID09PSAncmFkaXVzJyA/ICdyJyA6ICdkLzInKTsKICAgICAgICB9CgogICAgICAgIC8vIEluaXQKICAgICAgICBjYWxjdWxhdGUoKTsKCiAgICA8L3NjcmlwdD4KPC9ib2R5PgoKPC9odG1sPg==”; var htmlContent = “”; try { htmlContent = atob(b64); } catch (e) { console.error(“Base64 decode failed”, e); wrapper.innerHTML = ” Error loading calculator. “; return; } // Create Iframe var iframe = document.createElement(‘iframe’); iframe.style.width = “100%”; iframe.style.border = “none”; iframe.style.overflow = “hidden”; iframe.scrolling = “no”; iframe.style.minHeight = “400px”;…

  • Heptagon Area Calculator — Find the Area of a 7-Sided Shape

    Heptagon Area Calculator (7-sided) Heptagon Area Calculator Calculate area of a 7-sided polygon (Heptagon). Supports Regular (s, P, a, R) and Irregular (Coordinate) modes. Calculation Mode Regular Heptagon (Side Length)Regular Heptagon (Perimeter)Regular Heptagon (Apothem)Regular Heptagon (Circumradius)Irregular (Coordinates) Side Length (s) mcmmminftyd Perimeter (P) mcmmminft Apothem (a) mcmmminft Circumradius (R) mcmmminft Enter X,Y for 7 vertices…

  • Area of Surface of Revolution Calculator – Calculate Surface Area by Integration

    // Base64 Content var b64 = “PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KCjxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAiPgogICAgPHRpdGxlPkFyZWEgb2YgU3VyZmFjZSBvZiBSZXZvbHV0aW9uIENhbGN1bGF0b3I8L3RpdGxlPgogICAgPHN0eWxlPgogICAgICAgIDpyb290IHsKICAgICAgICAgICAgLS1wcmltYXJ5OiAjMDBiY2Q0OwogICAgICAgICAgICAvKiBDeWFuICovCiAgICAgICAgICAgIC0tcHJpbWFyeS1kYXJrOiAjMDA5N2E3OwogICAgICAgICAgICAtLWFjY2VudDogI2ZmNDA4MTsKICAgICAgICAgICAgLyogUGluayAqLwogICAgICAgICAgICAtLWJnLXBhZ2U6ICMyNjMyMzg7CiAgICAgICAgICAgIC8qIERhcmsgTWF0ZXJpYWwgKi8KICAgICAgICAgICAgLS1iZy1jYXJkOiAjMzc0NzRmOwogICAgICAgICAgICAtLXRleHQtbWFpbjogI2VjZWZmMTsKICAgICAgICAgICAgLS10ZXh0LXN1YjogI2IwYmVjNTsKICAgICAgICB9CgogICAgICAgICogewogICAgICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgICAgIGZvbnQtZmFtaWx5OiAnU2Vnb2UgVUknLCBzeXN0ZW0tdWksIHNhbnMtc2VyaWY7CiAgICAgICAgfQoKICAgICAgICBib2R5IHsKICAgICAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tYmctcGFnZSk7CiAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgICAgICBtaW4taGVpZ2h0OiAxMDB2aDsKICAgICAgICAgICAgcGFkZGluZzogMzBweCAxNXB4OwogICAgICAgICAgICBjb2xvcjogdmFyKC0tdGV4dC1tYWluKTsKICAgICAgICB9CgogICAgICAgIC5jYWxjLWNhcmQgewogICAgICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1iZy1jYXJkKTsKICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMTJweDsKICAgICAgICAgICAgYm94LXNoYWRvdzogMCAxMHB4IDMwcHggcmdiYSgwLCAwLCAwLCAwLjUpOwogICAgICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICAgICAgbWF4LXdpZHRoOiA5NTBweDsKICAgICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB9CgogICAgICAgIC8qIFRvcCBCYXIgKi8KICAgICAgICAuYXBwLWJhciB7CiAgICAgICAgICAgIGJhY2tncm91bmQ6ICMyNjMyMzg7CiAgICAgICAgICAgIHBhZGRpbmc6IDIwcHg7CiAgICAgICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjNDU1YTY0OwogICAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgfQoKICAgICAgICAuYXBwLXRpdGxlIGgyIHsKICAgICAgICAgICAgZm9udC1zaXplOiAxLjRyZW07CiAgICAgICAgICAgIGNvbG9yOiB2YXIoLS1wcmltYXJ5KTsKICAgICAgICB9CgogICAgICAgIC5hcHAtdGl0bGUgcCB7CiAgICAgICAgICAgIGZvbnQtc2l6ZTogMC45cmVtOwogICAgICAgICAgICBjb2xvcjogdmFyKC0tdGV4dC1zdWIpOwogICAgICAgIH0KCiAgICAgICAgLyogTGF5b3V0ICovCiAgICAgICAgLm1haW4tbGF5b3V0IHsKICAgICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICAgIH0KCiAgICAgICAgLyogQ29udHJvbHMgKi8KICAgICAgICAuY29udHJvbHMgewogICAgICAgICAgICBmbGV4OiAxOwogICAgICAgICAgICBtaW4td2lkdGg6IDMwMHB4OwogICAgICAgICAgICBwYWRkaW5nOiAyNXB4OwogICAgICAgICAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjNDU1YTY0OwogICAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgICAgICBnYXA6IDIwcHg7CiAgICAgICAgfQoKICAgICAgICAuaW5wdXQtZ3JvdXAgbGFiZWwgewogICAgICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICAgICAgY29sb3I6IHZhcigtLXRleHQtc3ViKTsKICAgICAgICAgICAgZm9udC1zaXplOiAwLjg1cmVtOwogICAgICAgICAgICBtYXJnaW4tYm90dG9tOiA1cHg7CiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgfQoKICAgICAgICAuaW5wdXQtYm94IHsKICAgICAgICAgICAgYmFja2dyb3VuZDogIzQ1NWE2NDsKICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAgICBwYWRkaW5nOiAwIDEwcHg7CiAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICM1NDZlN2E7CiAgICAgICAgfQoKICAgICAgICAucHJlZml4IHsKICAgICAgICAgICAgY29sb3I6ICM5MGE0YWU7CiAgICAgICAgICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgICAgICAgfQoKICAgICAgICBpbnB1dCwKICAgICAgICBzZWxlY3QgewogICAgICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgICAgICAgICAgYm9yZGVyOiBub25lOwogICAgICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgICAgICBwYWRkaW5nOiAxMnB4OwogICAgICAgICAgICBmb250LXNpemU6IDFyZW07CiAgICAgICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgfQoKICAgICAgICBvcHRpb24gewogICAgICAgICAgICBiYWNrZ3JvdW5kOiAjNDU1YTY0OwogICAgICAgIH0KCiAgICAgICAgLnJvdy1pbnB1dHMgewogICAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgICBnYXA6IDEwcHg7CiAgICAgICAgfQoKICAgICAgICAuYnRuLWNhbGMgewogICAgICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wcmltYXJ5KTsKICAgICAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgICAgIHBhZGRpbmc6IDE0cHg7CiAgICAgICAgICAgIGZvbnQtc2l6ZTogMS4xcmVtOwogICAgICAgICAgICBib3JkZXItcmFkaXVzOiAzMHB4OwogICAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgICAgICB0cmFuc2l0aW9uOiAwLjJzOwogICAgICAgICAgICBtYXJnaW4tdG9wOiAxMHB4OwogICAgICAgICAgICBib3gtc2hhZG93OiAwIDRweCAxMHB4IHJnYmEoMCwgMTg4LCAyMTIsIDAuMyk7CiAgICAgICAgfQoKICAgICAgICAuYnRuLWNhbGM6aG92ZXIgewogICAgICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wcmltYXJ5LWRhcmspOwogICAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEuMDIpOwogICAgICAgIH0KCiAgICAgICAgLyogUmVzdWx0IFBhbmVsICovCiAgICAgICAgLnJlcy1wYW5lbCB7CiAgICAgICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMTg4LCAyMTIsIDAuMSk7CiAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLXByaW1hcnktZGFyayk7CiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgICAgICAgICAgcGFkZGluZzogMTVweDsKICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgICAgICBtYXJnaW4tdG9wOiAxMHB4OwogICAgICAgIH0KCiAgICAgICAgLnJlcy12YWwgewogICAgICAgICAgICBmb250LXNpemU6IDJyZW07CiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICAgICAgICAgIGNvbG9yOiB2YXIoLS1wcmltYXJ5KTsKICAgICAgICB9CgogICAgICAgIC5yZXMtbGJsIHsKICAgICAgICAgICAgZm9udC1zaXplOiAwLjhyZW07CiAgICAgICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICAgICAgICAgIGxldHRlci1zcGFjaW5nOiAxcHg7CiAgICAgICAgICAgIGNvbG9yOiB2YXIoLS1wcmltYXJ5LWRhcmspOwogICAgICAgIH0KCiAgICAgICAgLyogM0QgVmlzdWFsaXplciAqLwogICAgICAgIC52aXN1YWxpemVyIHsKICAgICAgICAgICAgZmxleDogMjsKICAgICAgICAgICAgbWluLXdpZHRoOiA0MDBweDsKICAgICAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICBjdXJzb3I6IG1vdmU7CiAgICAgICAgICAgIGhlaWdodDogNTAwcHg7CiAgICAgICAgfQoKICAgICAgICBjYW52YXMgewogICAgICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB9CgogICAgICAgIC52aXMtb3ZlcmxheSB7CiAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICAgICAgdG9wOiAxNXB4OwogICAgICAgICAgICByaWdodDogMTVweDsKICAgICAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjYpOwogICAgICAgICAgICBwYWRkaW5nOiAxMHB4OwogICAgICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgICAgIGZvbnQtc2l6ZTogMC44cmVtOwogICAgICAgICAgICBjb2xvcjogI2FhYTsKICAgICAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgfQoKICAgICAgICAudGFiLWdycCB7CiAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICAgIGdhcDogNXB4OwogICAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4OwogICAgICAgIH0KCiAgICAgICAgLnRhYiB7CiAgICAgICAgICAgIGZsZXg6IDE7CiAgICAgICAgICAgIGJhY2tncm91bmQ6ICMzNzQ3NGY7CiAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICM1NDZlN2E7CiAgICAgICAgICAgIGNvbG9yOiAjYjBiZWM1OwogICAgICAgICAgICBwYWRkaW5nOiA4cHg7CiAgICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgICAgIGZvbnQtc2l6ZTogMC45cmVtOwogICAgICAgIH0KCiAgICAgICAgLnRhYi5hY3RpdmUgewogICAgICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wcmltYXJ5KTsKICAgICAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLXByaW1hcnkpOwogICAgICAgIH0KCiAgICAgICAgLmhpZGRlbiB7CiAgICAgICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgfQogICAgPC9zdHlsZT4KPC9oZWFkPgoKPGJvZHk+CgogICAgPGRpdiBjbGFzcz0iY2FsYy1jYXJkIj4KICAgICAgICA8ZGl2IGNsYXNzPSJhcHAtYmFyIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iYXBwLXRpdGxlIj4KICAgICAgICAgICAgICAgIDxoMj5TdXJmYWNlIG9mIFJldm9sdXRpb24gQ2FsY3VsYXRvcjwvaDI+CiAgICAgICAgICAgICAgICA8cD5DYWxjdWxhdGUgYXJlYSAmIHZpc3VhbGl6ZSB0aGUgM0Qgc29saWQuPC9wPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0ibWFpbi1sYXlvdXQiPgogICAgICAgICAgICA8IS0tIENvbnRyb2xzIC0tPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250cm9scyI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWItZ3JwIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWIgYWN0aXZlIiBvbmNsaWNrPSJzZXRNb2RlKCdmdW5jJykiPkZ1bmN0aW9uIHk9Zih4KTwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYiIgb25jbGljaz0ic2V0TW9kZSgncGFyYW0nKSI+UGFyYW1ldHJpYzwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtZ3JvdXAiPgogICAgICAgICAgICAgICAgICAgIDxsYWJlbD5BeGlzIG9mIFJldm9sdXRpb248L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWJveCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9ImF4aXNfcm90Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IngiPlgtQXhpcyAoSG9yaXpvbnRhbCk8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9InkiPlktQXhpcyAoVmVydGljYWwpPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgPGRpdiBpZD0iaW5wX2Z1bmMiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWdyb3VwIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPkZ1bmN0aW9uPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtYm94Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJwcmVmaXgiPmYoeCk9PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJmbl94IiB2YWx1ZT0iMiArIHNpbih4KSIgcGxhY2Vob2xkZXI9ImUuZy4geF4yIj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icm93LWlucHV0cyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWdyb3VwIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5TdGFydCB4PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWJveCI+PGlucHV0IHR5cGU9Im51bWJlciIgaWQ9IngxIiB2YWx1ZT0iMCI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbnB1dC1ncm91cCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+RW5kIHg8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtYm94Ij48aW5wdXQgdHlwZT0ibnVtYmVyIiBpZD0ieDIiIHZhbHVlPSI2LjI4Ij48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICA8ZGl2IGlkPSJpbnBfcGFyYW0iIGNsYXNzPSJoaWRkZW4iPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWdyb3VwIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPngodCk8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbnB1dC1ib3giPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InByZWZpeCI+eD08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9InBfeCIgdmFsdWU9ImNvcyh0KSIgcGxhY2Vob2xkZXI9ImUuZy4gdCAtIHNpbih0KSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWdyb3VwIiBzdHlsZT0ibWFyZ2luLXRvcDoxMHB4Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnkodCk8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbnB1dC1ib3giPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InByZWZpeCI+eT08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9InBfeSIgdmFsdWU9InNpbih0KSIgcGxhY2Vob2xkZXI9ImUuZy4gMSAtIGNvcyh0KSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InJvdy1pbnB1dHMiIHN0eWxlPSJtYXJnaW4tdG9wOjEwcHgiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbnB1dC1ncm91cCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+U3RhcnQgdDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbnB1dC1ib3giPjxpbnB1dCB0eXBlPSJudW1iZXIiIGlkPSJ0MSIgdmFsdWU9IjAiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtZ3JvdXAiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPkVuZCB0PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWJveCI+PGlucHV0IHR5cGU9Im51bWJlciIgaWQ9InQyIiB2YWx1ZT0iMy4xNCI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuLWNhbGMiIG9uY2xpY2s9ImNhbGN1bGF0ZSgpIj5DYWxjdWxhdGU8L2J1dHRvbj4KCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyZXMtcGFuZWwiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InJlcy1sYmwiPlN1cmZhY2UgQXJlYTwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InJlcy12YWwiIGlkPSJyZXNfYXJlYSI+LS08L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBzdHlsZT0iZm9udC1zaXplOjAuOHJlbTsgY29sb3I6I2IwYmVjNTsgdGV4dC1hbGlnbjpjZW50ZXI7IG1hcmdpbi10b3A6NXB4OyI+CiAgICAgICAgICAgICAgICAgICAgRHJhZyB0aGUgdmlldyB0byByb3RhdGUgdGhlIDNEIG1vZGVsLgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPCEtLSAzRCBWaWV3IC0tPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ2aXN1YWxpemVyIiBpZD0idmlzX3dyYXAiPgogICAgICAgICAgICAgICAgPGNhbnZhcyBpZD0iY2FudmFzIj48L2NhbnZhcz4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InZpcy1vdmVybGF5Ij4KICAgICAgICAgICAgICAgICAgICBNb3VzZSBEcmFnOiBSb3RhdGU8YnI+CiAgICAgICAgICAgICAgICAgICAgU2Nyb2xsOiBab29tCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8c2NyaXB0PgogICAgICAgIC8qIC0tLSBNYXRoIEVuZ2luZSAtLS0gKi8KICAgICAgICBjb25zdCBNYXRoRW5naW5lID0gKCgpID0+IHsKICAgICAgICAgICAgY29uc3QgVCA9IHsgTjogMSwgSTogMiwgT3A6IDMsIExQOiA0LCBSUDogNSwgRU9GOiA2IH07CiAgICAgICAgICAgIGZ1bmN0aW9uIHRvayhzKSB7IGNvbnN0IHQgPSBbXTsgbGV0IGkgPSAwOyB3aGlsZSAoaSA8IHMubGVuZ3RoKSB7IGNvbnN0IGMgPSBzW2ldOyBpZiAoL1xzLy50ZXN0KGMpKSB7IGkrKzsgY29udGludWU7IH0gaWYgKC9bMC05Ll0vLnRlc3QoYykpIHsgbGV0IG4gPSAnJzsgd2hpbGUgKGkgPCBzLmxlbmd0aCAmJiAvWzAtOS5dLy50ZXN0KHNbaV0pKSBuICs9IHNbaSsrXTsgdC5wdXNoKHsgdHlwZTogVC5OLCB2aXM6IHBhcnNlRmxvYXQobikgfSk7IH0gZWxzZSBpZiAoL1thLXpdLy50ZXN0KGMpKSB7IGxldCBpZCA9ICcnOyB3aGlsZSAoaSA8IHMubGVuZ3RoICYmIC9bYS16MC05XS8udGVzdChzW2ldKSkgaWQgKz0gc1tpKytdOyB0LnB1c2goeyB0eXBlOiBULkksIHZpczogaWQudG9Mb3dlckNhc2UoKSB9KTsgfSBlbHNlIGlmICgnKy0qL14nLmluY2x1ZGVzKGMpKSB7IHQucHVzaCh7IHR5cGU6IFQuT3AsIHZpczogYyB9KTsgaSsrOyB9IGVsc2UgaWYgKGMgPT09ICcoJykgeyB0LnB1c2goeyB0eXBlOiBULkxQIH0pOyBpKys7IH0gZWxzZSBpZiAoYyA9PT0gJyknKSB7IHQucHVzaCh7IHR5cGU6IFQuUlAgfSk7IGkrKzsgfSBlbHNlIGkrKzsgfSB0LnB1c2goeyB0eXBlOiBULkVPRiB9KTsgcmV0dXJuIHQ7IH0KICAgICAgICAgICAgY2xhc3MgUCB7CiAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcih0cykgeyB0aGlzLnRzID0gdHM7IHRoaXMucCA9IDA7IH0gcGVlaygpIHsgcmV0dXJuIHRoaXMudHNbdGhpcy5wXTsgfSBjb25zdW1lKCkgeyByZXR1cm4gdGhpcy50c1t0aGlzLnArK107IH0gcGFyc2UoKSB7IHJldHVybiB0aGlzLkUoKTsgfQogICAgICAgICAgICAgICAgRSgpIHsgbGV0IGwgPSB0aGlzLlRlbSgpOyB3aGlsZSAodGhpcy5wZWVrKCkudmlzID09PSAnKycgfHwgdGhpcy5wZWVrKCkudmlzID09PSAnLScpIHsgY29uc3QgbyA9IHRoaXMuY29uc3VtZSgpLnZpczsgbCA9IHsgdHlwZTogJ0InLCBvcDogbywgbCwgcjogdGhpcy5UZW0oKSB9OyB9IHJldHVybiBsOyB9CiAgICAgICAgICAgICAgICBUZW0oKSB7IGxldCBsID0gdGhpcy5GYWMoKTsgd2hpbGUgKHRoaXMucGVlaygpLnZpcyA9PT0gJyonIHx8IHRoaXMucGVlaygpLnZpcyA9PT0gJy8nKSB7IGNvbnN0IG8gPSB0aGlzLmNvbnN1bWUoKS52aXM7IGwgPSB7IHR5cGU6ICdCJywgb3A6IG8sIGwsIHI6IHRoaXMuRmFjKCkgfTsgfSByZXR1cm4gbDsgfQogICAgICAgICAgICAgICAgRmFjKCkgeyBsZXQgbCA9IHRoaXMuQmFzKCk7IGlmICh0aGlzLnBlZWsoKS52aXMgPT09ICdeJykgeyB0aGlzLmNvbnN1bWUoKTsgbCA9IHsgdHlwZTogJ0InLCBvcDogJ14nLCBsLCByOiB0aGlzLkZhYygpIH07IH0gcmV0dXJuIGw7IH0KICAgICAgICAgICAgICAgIEJhcygpIHsgY29uc3QgdCA9IHRoaXMucGVlaygpOyBpZiAodC50eXBlID09PSBULk4pIHJldHVybiB7IHR5cGU6ICdMJywgdjogdGhpcy5jb25zdW1lKCkudmlzIH07IGlmICh0LnR5cGUgPT09IFQuSSkgeyBjb25zdCBuID0gdGhpcy5jb25zdW1lKCkudmlzOyBpZiAodGhpcy5wZWVrKCkudHlwZSA9PT0gVC5MUCkgeyB0aGlzLmNvbnN1bWUoKTsgY29uc3QgYSA9IHRoaXMuRSgpOyB0aGlzLmNvbnN1bWUoKTsgcmV0dXJuIHsgdHlwZTogJ0MnLCBuLCBhIH07IH0gaWYgKFsneCcsICd0J10uaW5jbHVkZXMobikpIHJldHVybiB7IHR5cGU6ICdWJyB9OyBpZiAobiA9PT0gJ3BpJykgcmV0dXJuIHsgdHlwZTogJ0wnLCB2OiBNYXRoLlBJIH07IHJldHVybiB7IHR5cGU6ICdMJywgdjogMCB9OyB9IGlmICh0LnR5cGUgPT09IFQuTFApIHsgdGhpcy5jb25zdW1lKCk7IGNvbnN0IGUgPSB0aGlzLkUoKTsgdGhpcy5jb25zdW1lKCk7IHJldHVybiBlOyB9IGlmICh0LnZpcyA9PT0gJy0nKSB7IHRoaXMuY29uc3VtZSgpOyByZXR1cm4geyB0eXBlOiAnVScsIG9wOiAnLScsIGE6IHRoaXMuQmFzKCkgfTsgfSB0aGlzLmNvbnN1bWUoKTsgcmV0dXJuIHsgdHlwZTogJ0wnLCB2OiAwIH07IH0KICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBldihuLCB4KSB7IGlmICghbikgcmV0dXJuIDA7IGlmIChuLnR5cGUgPT09ICdMJykgcmV0dXJuIG4udjsgaWYgKG4udHlwZSA9PT0gJ1YnKSByZXR1cm4geDsgaWYgKG4udHlwZSA9PT0gJ0InKSB7IGNvbnN0IGwgPSBldihuLmwsIHgpLCByID0gZXYobi5yLCB4KTsgc3dpdGNoIChuLm9wKSB7IGNhc2UgJysnOiByZXR1cm4gbCArIHI7IGNhc2UgJy0nOiByZXR1cm4gbCAtIHI7IGNhc2UgJyonOiByZXR1cm4gbCAqIHI7IGNhc2UgJy8nOiByZXR1cm4gbCAvIHI7IGNhc2UgJ14nOiByZXR1cm4gTWF0aC5wb3cobCwgcik7IH0gfSBpZiAobi50eXBlID09PSAnVScpIHJldHVybiAtZXYobi5hLCB4KTsgaWYgKG4udHlwZSA9PT0gJ0MnKSB7IGNvbnN0IGEgPSBldihuLmEsIHgpOyBzd2l0Y2ggKG4ubikgeyBjYXNlICdzaW4nOiByZXR1cm4gTWF0aC5zaW4oYSk7IGNhc2UgJ2Nvcyc6IHJldHVybiBNYXRoLmNvcyhhKTsgY2FzZSAndGFuJzogcmV0dXJuIE1hdGgudGFuKGEpOyBjYXNlICdzcXJ0JzogcmV0dXJuIE1hdGguc3FydChhKTsgY2FzZSAnYWJzJzogcmV0dXJuIE1hdGguYWJzKGEpOyBjYXNlICdsbic6IHJldHVybiBNYXRoLmxvZyhhKTsgfSB9IHJldHVybiAwOyB9CiAgICAgICAgICAgIHJldHVybiB7IGM6IHMgPT4geyB0cnkgeyBjb25zdCBhc3QgPSBuZXcgUCh0b2socykpLnBhcnNlKCk7IHJldHVybiB4ID0+IGV2KGFzdCwgeCk7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIG51bGw7IH0gfSB9OwogICAgICAgIH0pKCk7CgogICAgICAgIC8vIEludGVncmF0aW9uCiAgICAgICAgZnVuY3Rpb24gYWRhcHRpdmVTaW1wc29ucyhmLCBhLCBiLCBlcHMgPSAxZS01KSB7CiAgICAgICAgICAgIGNvbnN0IG1pZCA9IChhICsgYikgLyAyLCBoID0gKGIgLSBhKSAvIDI7CiAgICAgICAgICAgIGNvbnN0IFMgPSAoaCAvIDMpICogKGYoYSkgKyA0ICogZihtaWQpICsgZihiKSk7CiAgICAgICAgICAgIGNvbnN0IHJlYyA9IChsLCByLCBlLCBTX3ByZXYsIGQpID0+IHsKICAgICAgICAgICAgICAgIGlmIChkID4gMTUpIHJldHVybiBTX3ByZXY7CiAgICAgICAgICAgICAgICBjb25zdCBtID0gKGwgKyByKSAvIDIsIGgyID0gKHIgLSBsKSAvIDI7CiAgICAgICAgICAgICAgICBjb25zdCBMUyA9IChoMiAvIDYpICogKGYobCkgKyA0ICogZigobCArIG0pIC8gMikgKyBmKG0pKTsKICAgICAgICAgICAgICAgIGNvbnN0IFJTID0gKGgyIC8gNikgKiAoZihtKSArIDQgKiBmKChtICsgcikgLyAyKSArIGYocikpOwogICAgICAgICAgICAgICAgaWYgKE1hdGguYWJzKExTICsgUlMgLSBTX3ByZXYpIDw9IDE1ICogZSkgcmV0dXJuIExTICsgUlMgKyAoTFMgKyBSUyAtIFNfcHJldikgLyAxNTsKICAgICAgICAgICAgICAgIHJldHVybiByZWMobCwgbSwgZSAvIDIsIExTLCBkICsgMSkgKyByZWMobSwgciwgZSAvIDIsIFJTLCBkICsgMSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHJldHVybiByZWMoYSwgYiwgZXBzLCBTLCAwKTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGRlcml2YXRpdmUoZiwgeCwgaCA9IDFlLTUpIHsgcmV0dXJuIChmKHggKyBoKSAtIGYoeCAtIGgpKSAvICgyICogaCk7IH0KCiAgICAgICAgLy8gLS0tIDNEIEVuZ2luZSAtLS0KICAgICAgICBjb25zdCBDYW52YXMzRCA9ICgoKSA9PiB7CiAgICAgICAgICAgIGxldCBjdnMsIGN0eCwgbm9kZXMgPSBbXSwgbGlua3MgPSBbXSwgY3gsIGN5OwogICAgICAgICAgICBsZXQgcm90WCA9IDAuNCwgcm90WSA9IDAuNCwgY2FtWiA9IDUwMDsKICAgICAgICAgICAgbGV0IHNjYWxlID0gMTsKCiAgICAgICAgICAgIGZ1bmN0aW9uIGluaXQoZWxJZCkgewogICAgICAgICAgICAgICAgY3ZzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxJZCk7CiAgICAgICAgICAgICAgICBjdHggPSBjdnMuZ2V0Q29udGV4dCgnMmQnKTsKICAgICAgICAgICAgICAgIHJlc2l6ZSgpOwoKICAgICAgICAgICAgICAgIC8vIEV2ZW50cwogICAgICAgICAgICAgICAgbGV0IGRyYWdnaW5nID0gZmFsc2UsIGx4LCBseTsKICAgICAgICAgICAgICAgIGN2cy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBlID0+IHsgZHJhZ2dpbmcgPSB0cnVlOyBseCA9IGUuY2xpZW50WDsgbHkgPSBlLmNsaWVudFk7IH0pOwogICAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCAoKSA9PiB7IGRyYWdnaW5nID0gZmFsc2U7IH0pOwogICAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIGUgPT4gewogICAgICAgICAgICAgICAgICAgIGlmICghZHJhZ2dpbmcpIHJldHVybjsKICAgICAgICAgICAgICAgICAgICBjb25zdCBkeCA9IGUuY2xpZW50WCAtIGx4LCBkeSA9IGUuY2xpZW50WSAtIGx5OwogICAgICAgICAgICAgICAgICAgIHJvdFkgKz0gZHggKiAwLjAxOwogICAgICAgICAgICAgICAgICAgIHJvdFggKz0gZHkgKiAwLjAxOwogICAgICAgICAgICAgICAgICAgIGx4ID0gZS5jbGllbnRYOyBseSA9IGUuY2xpZW50WTsKICAgICAgICAgICAgICAgICAgICByZW5kZXIoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgY3ZzLmFkZEV2ZW50TGlzdGVuZXIoJ3doZWVsJywgZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgIGNhbVogKz0gZS5kZWx0YVk7CiAgICAgICAgICAgICAgICAgICAgY2FtWiA9IE1hdGgubWF4KDEwMCwgTWF0aC5taW4oMjAwMCwgY2FtWikpOwogICAgICAgICAgICAgICAgICAgIHJlbmRlcigpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgcmVzaXplKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZnVuY3Rpb24gcmVzaXplKCkgewogICAgICAgICAgICAgICAgaWYgKCFjdnMpIHJldHVybjsKICAgICAgICAgICAgICAgIGN2cy53aWR0aCA9IGN2cy5wYXJlbnRFbGVtZW50LmNsaWVudFdpZHRoOwogICAgICAgICAgICAgICAgY3ZzLmhlaWdodCA9IGN2cy5wYXJlbnRFbGVtZW50LmNsaWVudEhlaWdodDsKICAgICAgICAgICAgICAgIGN4ID0gY3ZzLndpZHRoIC8gMjsgY3kgPSBjdnMuaGVpZ2h0IC8gMjsKICAgICAgICAgICAgICAgIHJlbmRlcigpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmdW5jdGlvbiBzZXRNZXNoKHB0cywgZWRnZXMpIHsKICAgICAgICAgICAgICAgIC8vIENlbnRlciB0aGUgbWVzaAogICAgICAgICAgICAgICAgbGV0IG1pblggPSBJbmZpbml0eSwgbWF4WCA9IC1JbmZpbml0eTsKICAgICAgICAgICAgICAgIGxldCBtaW5ZID0gSW5maW5pdHksIG1heFkgPSAtSW5maW5pdHk7CiAgICAgICAgICAgICAgICBsZXQgbWluWiA9IEluZmluaXR5LCBtYXhaID0gLUluZmluaXR5OwoKICAgICAgICAgICAgICAgIHB0cy5mb3JFYWNoKHAgPT4gewogICAgICAgICAgICAgICAgICAgIGlmIChwLnggPCBtaW5YKSBtaW5YID0gcC54OyBpZiAocC54ID4gbWF4WCkgbWF4WCA9IHAueDsKICAgICAgICAgICAgICAgICAgICBpZiAocC55IDwgbWluWSkgbWluWSA9IHAueTsgaWYgKHAueSA+IG1heFkpIG1heFkgPSBwLnk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHAueiA8IG1pblopIG1pblogPSBwLno7IGlmIChwLnogPiBtYXhaKSBtYXhaID0gcC56OwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgY29uc3QgbWlkWCA9IChtaW5YICsgbWF4WCkgLyAyLCBtaWRZID0gKG1pblkgKyBtYXhZKSAvIDIsIG1pZFogPSAobWluWiArIG1heFopIC8gMjsKICAgICAgICAgICAgICAgIGNvbnN0IG1heFJhbmdlID0gTWF0aC5tYXgobWF4WCAtIG1pblgsIG1heFkgLSBtaW5ZLCBtYXhaIC0gbWluWikgfHwgMTsKCiAgICAgICAgICAgICAgICAvLyBOb3JtYWxpemUgdG8gLTEwMCB0byAxMDAgcmFuZ2UKICAgICAgICAgICAgICAgIGNvbnN0IHMgPSAyMDAgLyBtYXhSYW5nZTsKCiAgICAgICAgICAgICAgICBub2RlcyA9IHB0cy5tYXAocCA9PiAoewogICAgICAgICAgICAgICAgICAgIHg6IChwLnggLSBtaWRYKSAqIHMsCiAgICAgICAgICAgICAgICAgICAgeTogKHAueSAtIG1pZFkpICogcywKICAgICAgICAgICAgICAgICAgICB6OiAocC56IC0gbWlkWikgKiBzCiAgICAgICAgICAgICAgICB9KSk7CgogICAgICAgICAgICAgICAgLy8gR2VuZXJhdGUgc2ltcGxlIGxpbmtzOiByaW5ncyBhbmQgbG9uZ2l0dWRlIGxpbmVzCiAgICAgICAgICAgICAgICAvLyBBc3N1bWluZyBzaW1wbGlmaWVkIHJpbmcgZ2VuZXJhdGlvbiBsb2dpYyBpbiBjYWxjdWxhdGUKICAgICAgICAgICAgICAgIC8vIEhlcmUgd2UganVzdCBhY2NlcHQgbm9kZXMgYW5kIGN1c3RvbSBkcmF3IGxvZ2ljIG9yIGdlbmVyaWMgbGlua3MKICAgICAgICAgICAgICAgIC8vIFdlJ2xsIHVzZSBnZW5lcmljIGxpbmtzIGZvciB3aXJlZnJhbWUKCiAgICAgICAgICAgICAgICBsaW5rcyA9IGVkZ2VzIHx8IFtdOwogICAgICAgICAgICAgICAgaWYgKCFlZGdlcykgewogICAgICAgICAgICAgICAgICAgIC8vIEF1dG8gZ2VuZXJhdGU/PyBObywgY29tcGxleC4gUGFzcyBlZGdlcyBleHBsaWNpdGx5LgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmVuZGVyKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZ1bmN0aW9uIHJlbmRlcigpIHsKICAgICAgICAgICAgICAgIGlmICghY3R4KSByZXR1cm47CiAgICAgICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gJyMwMDAnOwogICAgICAgICAgICAgICAgY3R4LmZpbGxSZWN0KDAsIDAsIGN2cy53aWR0aCwgY3ZzLmhlaWdodCk7CgogICAgICAgICAgICAgICAgLy8gUHJvamVjdAogICAgICAgICAgICAgICAgY29uc3QgcDJkID0gbm9kZXMubWFwKHAgPT4gewogICAgICAgICAgICAgICAgICAgIC8vIFJvdGF0ZSBZCiAgICAgICAgICAgICAgICAgICAgbGV0IHggPSBwLnggKiBNYXRoLmNvcyhyb3RZKSAtIHAueiAqIE1hdGguc2luKHJvdFkpOwogICAgICAgICAgICAgICAgICAgIGxldCB6ID0gcC56ICogTWF0aC5jb3Mocm90WSkgKyBwLnggKiBNYXRoLnNpbihyb3RZKTsKICAgICAgICAgICAgICAgICAgICAvLyBSb3RhdGUgWAogICAgICAgICAgICAgICAgICAgIGxldCB5ID0gcC55ICogTWF0aC5jb3Mocm90WCkgLSB6ICogTWF0aC5zaW4ocm90WCk7CiAgICAgICAgICAgICAgICAgICAgeiA9IHogKiBNYXRoLmNvcyhyb3RYKSArIHAueSAqIE1hdGguc2luKHJvdFgpOwoKICAgICAgICAgICAgICAgICAgICAvLyBQZXJzcGVjdGl2ZQogICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvdiA9IDUwMDsKICAgICAgICAgICAgICAgICAgICBjb25zdCBzY2FsZSA9IGZvdiAvIChmb3YgKyB6ICsgY2FtWik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgeDogY3ggKyB4ICogc2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICAgIHk6IGN5IC0geSAqIHNjYWxlLCAvLyBJbnZlcnQgWSBmb3Igc2NyZWVuCiAgICAgICAgICAgICAgICAgICAgICAgIHZpc2libGU6ICh6ICsgY2FtWiA+IC1mb3YpCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIERyYXcgRWRnZXMKICAgICAgICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9ICdyZ2JhKDAsIDE4OCwgMjEyLCAwLjQpJzsKICAgICAgICAgICAgICAgIGN0eC5saW5lV2lkdGggPSAxOwogICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpOwogICAgICAgICAgICAgICAgbGlua3MuZm9yRWFjaChsID0+IHsKICAgICAgICAgICAgICAgICAgICBjb25zdCB1ID0gcDJkW2wuYV0sIHYgPSBwMmRbbC5iXTsKICAgICAgICAgICAgICAgICAgICBpZiAodS52aXNpYmxlICYmIHYudmlzaWJsZSkgewogICAgICAgICAgICAgICAgICAgICAgICBjdHgubW92ZVRvKHUueCwgdS55KTsKICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmxpbmVUbyh2LngsIHYueSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBjdHguc3Ryb2tlKCk7CgogICAgICAgICAgICAgICAgLy8gSGlnaGxpZ2h0IHNpbGhvdWV0dGU/IAogICAgICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9ICcjZmZlJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHsgaW5pdCwgc2V0TWVzaCB9OwogICAgICAgIH0pKCk7CgogICAgICAgIC8vIE1haW4gQXBwIExvZ2ljCiAgICAgICAgbGV0IG1vZGUgPSAnZnVuYyc7CgogICAgICAgIGZ1bmN0aW9uIHNldE1vZGUobSkgewogICAgICAgICAgICBtb2RlID0gbTsKICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnRhYicpLmZvckVhY2goZWwgPT4gZWwuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJykpOwogICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAudGFiW29uY2xpY2s9InNldE1vZGUoJyR7bX0nKSJdYCkuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7CiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnBfZnVuYycpLmNsYXNzTGlzdC50b2dnbGUoJ2hpZGRlbicsIG0gIT09ICdmdW5jJyk7CiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnBfcGFyYW0nKS5jbGFzc0xpc3QudG9nZ2xlKCdoaWRkZW4nLCBtICE9PSAncGFyYW0nKTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGNhbGN1bGF0ZSgpIHsKICAgICAgICAgICAgLy8gR2F0aGVyIElucHV0cwogICAgICAgICAgICBjb25zdCBheGlzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F4aXNfcm90JykudmFsdWU7IC8vIHggb3IgeQogICAgICAgICAgICBsZXQgZnVuY1gsIGZ1bmNZLCB0U3RhcnQsIHRFbmQ7CiAgICAgICAgICAgIGxldCBwdHMgPSBbXTsgLy8ge3gsIHksIHp9CiAgICAgICAgICAgIGxldCBlZGdlcyA9IFtdOyAvLyB7YSwgYn0KCiAgICAgICAgICAgIGlmIChtb2RlID09PSAnZnVuYycpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGZzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZuX3gnKS52YWx1ZTsKICAgICAgICAgICAgICAgIGNvbnN0IGYgPSBNYXRoRW5naW5lLmMoZnMpOwogICAgICAgICAgICAgICAgY29uc3QgeDEgPSBwYXJzZUZsb2F0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd4MScpLnZhbHVlKTsKICAgICAgICAgICAgICAgIGNvbnN0IHgyID0gcGFyc2VGbG9hdChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgneDInKS52YWx1ZSk7CgogICAgICAgICAgICAgICAgaWYgKCFmKSByZXR1cm4gYWxlcnQoIkludmFsaWQgRnVuY3Rpb24iKTsKCiAgICAgICAgICAgICAgICAvLyBBcmVhIENhbGMKICAgICAgICAgICAgICAgIC8vIFNfeCA9IEludCAycGkgKiB5ICogc3FydCgxK3knXjIpIGR4CiAgICAgICAgICAgICAgICAvLyBTX3kgPSBJbnQgMnBpICogeCAqIHNxcnQoMSt5J14yKSBkeAogICAgICAgICAgICAgICAgY29uc3QgaW50ZWdyYW5kID0geCA9PiB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgeSA9IE1hdGguYWJzKGYoeCkpOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGR5ID0gZGVyaXZhdGl2ZShmLCB4KTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBkcyA9IE1hdGguc3FydCgxICsgZHkgKiBkeSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChheGlzID09PSAneCcpID8gKDIgKiBNYXRoLlBJICogeSAqIGRzKSA6ICgyICogTWF0aC5QSSAqIHggKiBkcyk7IC8vIHggbXVzdCBiZSBwb3NpdGl2ZSBmb3IgWSByb3QKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgY29uc3QgYXJlYSA9IGFkYXB0aXZlU2ltcHNvbnMoaW50ZWdyYW5kLCB4MSwgeDIpOwogICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc19hcmVhJykuaW5uZXJUZXh0ID0gYXJlYS50b0ZpeGVkKDQpOwoKICAgICAgICAgICAgICAgIC8vIEdlbmVyYXRlIE1lc2gKICAgICAgICAgICAgICAgIC8vIFN0ZXBzIGFsb25nIGN1cnZlCiAgICAgICAgICAgICAgICBjb25zdCBjdXJ2ZXMgPSAzMDsgLy8gcmluZ3MKICAgICAgICAgICAgICAgIGNvbnN0IHNlZ21lbnRzID0gMjQ7IC8vIHNlZ21lbnRzIHBlciByaW5nCgogICAgICAgICAgICAgICAgLy8gTm9kZXMKICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgYSBncmlkOiBbaT1jdXJ2ZSBzdGVwXVtqPXJvdGF0aW9uIHN0ZXBdCiAgICAgICAgICAgICAgICBsZXQgZ3JpZCA9IFtdOwoKICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IGN1cnZlczsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IGkgLyBjdXJ2ZXM7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgeFZhbCA9IHgxICsgKHgyIC0geDEpICogdDsKICAgICAgICAgICAgICAgICAgICBjb25zdCB5VmFsID0gZih4VmFsKTsKCiAgICAgICAgICAgICAgICAgICAgbGV0IHJpbmcgPSBbXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHNlZ21lbnRzOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5nID0gKGogLyBzZWdtZW50cykgKiBNYXRoLlBJICogMjsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHB4LCBweSwgcHo7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXhpcyA9PT0gJ3gnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSb3RhdGlvbiBhcm91bmQgWDogeCBzdGF5cywgeSByb3RhdGVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBweCA9IHhWYWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBweSA9IHlWYWwgKiBNYXRoLmNvcyhhbmcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHogPSB5VmFsICogTWF0aC5zaW4oYW5nKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJvdGF0aW9uIGFyb3VuZCBZOiB5IHN0YXlzLCB4IHJvdGF0ZXM/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBObywgZm9yIGZ1bmN0aW9uIHk9Zih4KSwgd2Ugcm90YXRlIHRoZSBwb2ludCAoeCwgeSkgYXJvdW5kIFkgYXhpcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJhZGl1cyBpcyB4LiBIZWlnaHQgaXMgeS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB4ID0geFZhbCAqIE1hdGguY29zKGFuZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBweSA9IHlWYWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBweiA9IHhWYWwgKiBNYXRoLnNpbihhbmcpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJpbmcucHVzaCh7IHg6IHB4LCB5OiBweSwgejogcHogfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdyaWQucHVzaChyaW5nKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBCdWlsZCBGbGF0IExpc3QgJiBFZGdlcwogICAgICAgICAgICAgICAgcHRzID0gZ3JpZC5mbGF0KCk7CgogICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBncmlkLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBzZWdtZW50czsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnIgPSBpICogc2VnbWVudHMgKyBqOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0ID0gaSAqIHNlZ21lbnRzICsgKGogKyAxKSAlIHNlZ21lbnRzOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBSaW5nIGVkZ2UKICAgICAgICAgICAgICAgICAgICAgICAgZWRnZXMucHVzaCh7IGE6IGN1cnIsIGI6IG5leHQgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBMb25naXR1ZGluYWwgZWRnZQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IGdyaWQubGVuZ3RoIC0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmVsb3cgPSAoaSArIDEpICogc2VnbWVudHMgKyBqOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRnZXMucHVzaCh7IGE6IGN1cnIsIGI6IGJlbG93IH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIFBhcmFtZXRyaWMKICAgICAgICAgICAgICAgIGNvbnN0IGZ4cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwX3gnKS52YWx1ZTsKICAgICAgICAgICAgICAgIGNvbnN0IGZ5cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwX3knKS52YWx1ZTsKICAgICAgICAgICAgICAgIGNvbnN0IGZ4ID0gTWF0aEVuZ2luZS5jKGZ4cyk7CiAgICAgICAgICAgICAgICBjb25zdCBmeSA9IE1hdGhFbmdpbmUuYyhmeXMpOwogICAgICAgICAgICAgICAgY29uc3QgdDEgPSBwYXJzZUZsb2F0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0MScpLnZhbHVlKTsKICAgICAgICAgICAgICAgIGNvbnN0IHQyID0gcGFyc2VGbG9hdChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndDInKS52YWx1ZSk7CgogICAgICAgICAgICAgICAgaWYgKCFmeCB8fCAhZnkpIHJldHVybiBhbGVydCgiSW52YWxpZCBQYXJhbWV0cmljIEZ1bmN0aW9ucyIpOwoKICAgICAgICAgICAgICAgIC8vIEFyZWEKICAgICAgICAgICAgICAgIGNvbnN0IGludGVncmFuZCA9IHQgPT4gewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGR4ID0gZGVyaXZhdGl2ZShmeCwgdCk7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgZHkgPSBkZXJpdmF0aXZlKGZ5LCB0KTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBkcyA9IE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSk7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgeCA9IGZ4KHQpOyAvLyByYWRpdXMgZm9yIHktcm90CiAgICAgICAgICAgICAgICAgICAgY29uc3QgeSA9IGZ5KHQpOyAvLyByYWRpdXMgZm9yIHgtcm90CgogICAgICAgICAgICAgICAgICAgIHJldHVybiAoYXhpcyA9PT0gJ3gnKSA/ICgyICogTWF0aC5QSSAqIE1hdGguYWJzKHkpICogZHMpIDogKDIgKiBNYXRoLlBJICogTWF0aC5hYnMoeCkgKiBkcyk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGNvbnN0IGFyZWEgPSBhZGFwdGl2ZVNpbXBzb25zKGludGVncmFuZCwgdDEsIHQyKTsKICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXNfYXJlYScpLmlubmVyVGV4dCA9IGFyZWEudG9GaXhlZCg0KTsKCiAgICAgICAgICAgICAgICAvLyBNZXNoIChTaW1pbGFyIGxvZ2ljKQogICAgICAgICAgICAgICAgY29uc3QgY3VydmVzID0gNDA7CiAgICAgICAgICAgICAgICBjb25zdCBzZWdtZW50cyA9IDI0OwogICAgICAgICAgICAgICAgbGV0IGdyaWQgPSBbXTsKCiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBjdXJ2ZXM7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSB0MSArICh0MiAtIHQxKSAqIChpIC8gY3VydmVzKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCB4VmFsID0gZngodCk7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgeVZhbCA9IGZ5KHQpOwoKICAgICAgICAgICAgICAgICAgICBsZXQgcmluZyA9IFtdOwogICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgc2VnbWVudHM7IGorKykgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbmcgPSAoaiAvIHNlZ21lbnRzKSAqIE1hdGguUEkgKiAyOwogICAgICAgICAgICAgICAgICAgICAgICBsZXQgcHgsIHB5LCBwejsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF4aXMgPT09ICd4JykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHggPSB4VmFsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHkgPSB5VmFsICogTWF0aC5jb3MoYW5nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB6ID0geVZhbCAqIE1hdGguc2luKGFuZyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBweCA9IHhWYWwgKiBNYXRoLmNvcyhhbmcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHkgPSB5VmFsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHogPSB4VmFsICogTWF0aC5zaW4oYW5nKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByaW5nLnB1c2goeyB4OiBweCwgeTogcHksIHo6IHB6IH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBncmlkLnB1c2gocmluZyk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcHRzID0gZ3JpZC5mbGF0KCk7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdyaWQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHNlZ21lbnRzOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VyciA9IGkgKiBzZWdtZW50cyArIGo7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHQgPSBpICogc2VnbWVudHMgKyAoaiArIDEpICUgc2VnbWVudHM7CiAgICAgICAgICAgICAgICAgICAgICAgIGVkZ2VzLnB1c2goeyBhOiBjdXJyLCBiOiBuZXh0IH0pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IGdyaWQubGVuZ3RoIC0gMSkgZWRnZXMucHVzaCh7IGE6IGN1cnIsIGI6IChpICsgMSkgKiBzZWdtZW50cyArIGogfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBDYW52YXMzRC5zZXRNZXNoKHB0cywgZWRnZXMpOwogICAgICAgIH0KCiAgICAgICAgLy8gSW5pdAogICAgICAgIHdpbmRvdy5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIENhbnZhczNELmluaXQoJ2NhbnZhcycpOwogICAgICAgICAgICBzZXRUaW1lb3V0KGNhbGN1bGF0ZSwgMjAwKTsKICAgICAgICB9OwoKICAgIDwvc2NyaXB0Pgo8L2JvZHk+Cgo8L2h0bWw+”; var htmlContent = “”; try { htmlContent = atob(b64); } catch (e) { console.error(“Base64 decode failed”, e); wrapper.innerHTML = ” Error loading calculator. “; return; } // Create Iframe var iframe = document.createElement(‘iframe’); iframe.style.width = “100%”; iframe.style.border = “none”; iframe.style.overflow = “hidden”; iframe.scrolling = “no”; iframe.style.minHeight = “400px”;…

  • Irregular Area Calculator – Find Area from Coordinates Manually

    Irregular Area Calc XY Coords v 3.0 Manual Entry Bulk Import (Excel) Coordinate System Meters (m)Feet (ft)Millimeters (mm)Inches (in) # X Coord Y Coord + Point Reset ⬇️ CSV Paste Coordinates Paste data from Excel, CSV, or Text. Format: X Y (Tab, Comma, or Space separated). Checking… Apply & Edit 0.00 Area m² 0.00 Perimeter…