Area Model Calculator for Decimals – Multiply Decimals the Easy Way

Area Model Calculator (Decimals)

Visualize and multiply decimals using the area model method.

Area Model Breakdown
0
0
0
0
Total Product
0

Multiplying decimals can feel confusing for many students. The numbers are small, the decimal points move, and it is easy to make mistakes. That is why teachers often use the area model to explain decimal multiplication in a simple and visual way.

The area model helps students see how numbers break into parts and how those parts combine to form the final answer.

An Area Model Calculator for Decimals makes this process even easier. Instead of drawing boxes and doing long calculations, you just enter two decimal numbers.

The calculator shows how the numbers are split, how partial products are formed, and what the final product is. This tool is perfect for students, teachers, and parents who want a clear and simple way to understand decimal multiplication.

What the Area Model for Decimals Is

Understanding the Area Model

The area model is a visual method for multiplication. It uses a rectangle to represent the product of two numbers. One number is written along the length of the rectangle, and the other is written along the width. The rectangle is then divided into smaller parts based on the place values of the numbers.

For example, if you multiply 2.3 × 1.4, you can split 2.3 into 2 and 0.3, and split 1.4 into 1 and 0.4. The rectangle is divided into four smaller rectangles, and each one represents a partial product.

Why It Works Well for Decimals

Decimals can be hard to picture, but the area model shows them as parts of a whole. This helps students understand place value, partial products, and how small decimal parts still matter in multiplication.

How the Area Model Calculator Works

Inputs Required

The calculator usually asks for:

  • First decimal number
  • Second decimal number

These numbers can include whole numbers and decimal parts.

Output Provided

After entering the values, the calculator shows:

  • The partial products
  • The final product
  • Sometimes a visual area model

Why the Calculator Is Helpful

Instead of drawing the model by hand, the calculator does everything instantly. It saves time and helps students focus on understanding the math concept instead of worrying about mistakes.

Key Formulas Used in the Area Model

Splitting Decimal Numbers

a.b = a + 0.b

This shows how a decimal is broken into a whole part and a decimal part.

Area Model Expansion

(a + 0.b)(c + 0.d) = ac + a(0.d) + (0.b)c + (0.b)(0.d)

Each term represents the area of a small rectangle in the model.

Final Product

Product = ac + a d + b c + b d

This is the sum of all partial products.

Step-by-Step Example

Example 1: Multiply 2.3 × 1.4

Split the numbers:

2.3 = 2 + 0.3 1.4 = 1 + 0.4

Now multiply each part:

2  = 2.0 2  = 0.8 0.3  = 0.3 0.3  = 0.12

Add all results:

2.0 + 0.8 + 0.3 + 0.12 = 3.22

So, the final answer is 3.22.

Example 2: Multiply 1.5 × 0.6

Split the numbers:

1.5 = 1 + 0.5 0.6 = 0.6

Multiply:

1  = 0.6 0.5  = 0.30

Add:

0.6 + 0.30 = 0.90

The answer is 0.9.

Features of an Area Model Calculator for Decimals

Visual Learning Support

The calculator shows how numbers are split and multiplied.

Step-by-Step Results

Students can see each partial product clearly.

Fast and Accurate

No manual errors or long calculations.

Easy to Use

Just enter two numbers and get the result.

Uses and Applications

Area model calculators are widely used in classrooms to teach decimal multiplication. Teachers use them to explain how numbers break into parts and how each part contributes to the final answer. This helps students understand place value and reduces confusion with decimal points.

Parents also use these tools to help children with homework. Instead of simply giving the answer, the calculator shows the process, making learning more effective. Students gain confidence because they can see how the solution is built step by step.

Area model calculators are also useful in online learning and tutoring. They support visual learners who understand concepts better through diagrams and structured steps. This makes decimal multiplication easier for many students.

Tips for Using the Area Model

Always Split Correctly

Break decimals into whole and decimal parts.

Multiply Each Part Carefully

Every small section matters.

Add All Partial Products

Do not forget any value.

Watch the Decimal Places

Place the decimal correctly in the final answer.

Common Mistakes to Avoid

Ignoring Small Decimal Parts

Even 0.1 makes a difference.

Misplacing the Decimal Point

Check place value carefully.

Skipping Partial Products

Every box in the area model counts.

Rushing the Process

Take time to understand each step.

Frequently Asked Questions

What is an area model?

It is a visual way to multiply numbers using rectangles.

Why use it for decimals?

It helps explain place value clearly.

Is it better than the standard method?

It is better for learning, not speed.

Can I use it for large decimals?

Yes, it works for any decimals.

Is this good for students?

Yes, it improves understanding.

Final Words

The Area Model Calculator for Decimals is a powerful learning tool for students who want to understand decimal multiplication in a simple and visual way. It breaks numbers into parts, shows partial products, and combines them to give the final answer clearly.

By using this calculator, students can build strong math foundations, avoid common mistakes, and gain confidence in working with decimals. Whether in the classroom, at home, or online, this tool makes learning decimal multiplication easier and more enjoyable.

Similar Posts

  • Area Between Two Curves Calculator – Calculate Bounded Region Fast

    // Base64 Content var b64 = “PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KCjxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAiPgogICAgPHRpdGxlPkFyZWEgQmV0d2VlbiBUd28gQ3VydmVzIENhbGN1bGF0b3I8L3RpdGxlPgogICAgPHN0eWxlPgogICAgICAgIDpyb290IHsKICAgICAgICAgICAgLS1wcmltYXJ5LWNvbG9yOiAjMWE3M2U4OwogICAgICAgICAgICAtLXByaW1hcnktaG92ZXI6ICMxNTU3YjA7CiAgICAgICAgICAgIC0tYWNjZW50LTE6ICM0Mjg1ZjQ7CiAgICAgICAgICAgIC8qIEJsdWUgZm9yIGYoeCkgKi8KICAgICAgICAgICAgLS1hY2NlbnQtMjogI2VhNDMzNTsKICAgICAgICAgICAgLyogUmVkIGZvciBnKHgpICovCiAgICAgICAgICAgIC0tYXJlYS1maWxsOiByZ2JhKDE1NCwgMTAzLCAyMzQsIDAuMyk7CiAgICAgICAgICAgIC8qIFB1cnBsZSBmb3IgYXJlYSAqLwogICAgICAgICAgICAtLWJnLWNvbG9yOiAjZjhmOWZhOwogICAgICAgICAgICAtLWNhcmQtYmc6ICNmZmZmZmY7CiAgICAgICAgICAgIC0tYm9yZGVyLWNvbG9yOiAjZGFkY2UwOwogICAgICAgICAgICAtLXNoYWRvdzogMCA0cHggNnB4IHJnYmEoMCwgMCwgMCwgMC4xKTsKICAgICAgICB9CgogICAgICAgICogewogICAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgICAgICBmb250LWZhbWlseTogJ1NlZ29lIFVJJywgUm9ib3RvLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOwogICAgICAgIH0KCiAgICAgICAgYm9keSB7CiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJnLWNvbG9yKTsKICAgICAgICAgICAgbWFyZ2luOiAwOwogICAgICAgICAgICBwYWRkaW5nOiAyMHB4OwogICAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICAgICAgbWluLWhlaWdodDogMTAwdmg7CiAgICAgICAgfQoKICAgICAgICAuY2FsYy1jb250YWluZXIgewogICAgICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsKICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMTZweDsKICAgICAgICAgICAgYm94LXNoYWRvdzogdmFyKC0tc2hhZG93KTsKICAgICAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgICAgIG1heC13aWR0aDogOTAwcHg7CiAgICAgICAgICAgIHBhZGRpbmc6IDMwcHg7CiAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgICAgIGdhcDogMjVweDsKICAgICAgICB9CgogICAgICAgIC5jYWxjLWhlYWRlciB7CiAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNmMWYzZjQ7CiAgICAgICAgICAgIHBhZGRpbmctYm90dG9tOiAyMHB4OwogICAgICAgIH0KCiAgICAgICAgLmNhbGMtaGVhZGVyIGgyIHsKICAgICAgICAgICAgbWFyZ2luOiAwIDAgOHB4IDA7CiAgICAgICAgICAgIGNvbG9yOiAjMjAyMTI0OwogICAgICAgIH0KCiAgICAgICAgLmNhbGMtaGVhZGVyIHAgewogICAgICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgICAgIGNvbG9yOiAjNWY2MzY4OwogICAgICAgICAgICBmb250LXNpemU6IDAuOTVyZW07CiAgICAgICAgfQoKICAgICAgICAvKiBNb2RlIFN3aXRjaCBmb3IgZHgvZHkgKi8KICAgICAgICAubW9kZS1zd2l0Y2ggewogICAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICAgICAgZ2FwOiAyMHB4OwogICAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4OwogICAgICAgIH0KCiAgICAgICAgLnJhZGlvLWxhYmVsIHsKICAgICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgICAgICBjb2xvcjogIzVmNjM2ODsKICAgICAgICAgICAgcGFkZGluZzogOHB4IDE2cHg7CiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDIwcHg7CiAgICAgICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4yczsKICAgICAgICB9CgogICAgICAgIC5yYWRpby1sYWJlbDpob3ZlciB7CiAgICAgICAgICAgIGJhY2tncm91bmQ6ICNmMWYzZjQ7CiAgICAgICAgfQoKICAgICAgICAucmFkaW8tbGFiZWwgaW5wdXQgewogICAgICAgICAgICBtYXJnaW4tcmlnaHQ6IDhweDsKICAgICAgICB9CgogICAgICAgIC8qIElucHV0cyAqLwogICAgICAgIC5pbnB1dC1ncmlkIHsKICAgICAgICAgICAgZGlzcGxheTogZ3JpZDsKICAgICAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyOwogICAgICAgICAgICBnYXA6IDIwcHg7CiAgICAgICAgfQoKICAgICAgICAuZnVsbC13aWR0aCB7CiAgICAgICAgICAgIGdyaWQtY29sdW1uOiBzcGFuIDI7CiAgICAgICAgfQoKICAgICAgICAuaW5wdXQtZ3JvdXAgewogICAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgfQoKICAgICAgICAuaW5wdXQtZ3JvdXAgbGFiZWwgewogICAgICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICAgICAgbWFyZ2luLWJvdHRvbTogOHB4OwogICAgICAgICAgICBmb250LXNpemU6IDAuOXJlbTsKICAgICAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICAgICAgY29sb3I6ICMzYzQwNDM7CiAgICAgICAgfQoKICAgICAgICAuaW5wdXQtd3JhcHBlciB7CiAgICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICB9CgogICAgICAgIC5pbnB1dC1wcmVmaXggewogICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICAgIGxlZnQ6IDEycHg7CiAgICAgICAgICAgIGNvbG9yOiAjODA4NjhiOwogICAgICAgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogICAgICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgICB9CgogICAgICAgIGlucHV0W3R5cGU9InRleHQiXSwKICAgICAgICBpbnB1dFt0eXBlPSJudW1iZXIiXSB7CiAgICAgICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgICAgICBwYWRkaW5nOiAxMnB4IDEycHggMTJweCA2MHB4OwogICAgICAgICAgICAvKiBTcGFjZSBmb3IgcHJlZml4ICovCiAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlci1jb2xvcik7CiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgICAgICAgICAgZm9udC1zaXplOiAxcmVtOwogICAgICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4yczsKICAgICAgICB9CgogICAgICAgIC5zaW1wbGUtaW5wdXQgLmlucHV0LXdyYXBwZXIgaW5wdXQgewogICAgICAgICAgICBwYWRkaW5nLWxlZnQ6IDEycHg7CiAgICAgICAgfQoKICAgICAgICBpbnB1dDpmb2N1cyB7CiAgICAgICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcHJpbWFyeS1jb2xvcik7CiAgICAgICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDNweCByZ2JhKDI2LCAxMTUsIDIzMiwgMC4yKTsKICAgICAgICB9CgogICAgICAgIC5jb2xvci1kb3QgewogICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICAgIHJpZ2h0OiAxMnB4OwogICAgICAgICAgICB3aWR0aDogMTBweDsKICAgICAgICAgICAgaGVpZ2h0OiAxMHB4OwogICAgICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgfQoKICAgICAgICAvKiBJbmZvL1Rvb2xzICovCiAgICAgICAgLnRvb2xzLXJvdyB7CiAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgICAgZm9udC1zaXplOiAwLjg1cmVtOwogICAgICAgICAgICBjb2xvcjogIzVmNjM2ODsKICAgICAgICB9CgogICAgICAgIC5maW5kLWJ0biB7CiAgICAgICAgICAgIGJhY2tncm91bmQ6ICNlOGYwZmU7CiAgICAgICAgICAgIGNvbG9yOiB2YXIoLS1wcmltYXJ5LWNvbG9yKTsKICAgICAgICAgICAgYm9yZGVyOiBub25lOwogICAgICAgICAgICBwYWRkaW5nOiA2cHggMTJweDsKICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgICAgIGZvbnQtc2l6ZTogMC44NXJlbTsKICAgICAgICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjJzOwogICAgICAgIH0KCiAgICAgICAgLmZpbmQtYnRuOmhvdmVyIHsKICAgICAgICAgICAgYmFja2dyb3VuZDogI2QyZTNmYzsKICAgICAgICB9CgogICAgICAgIC8qIE1haW4gQnV0dG9ucyAqLwogICAgICAgIC5idG4tY29udGFpbmVyIHsKICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIH0KCiAgICAgICAgLmNhbGMtYnRuIHsKICAgICAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tcHJpbWFyeS1jb2xvcik7CiAgICAgICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgICAgICAgYm9yZGVyOiBub25lOwogICAgICAgICAgICBwYWRkaW5nOiAxNHB4IDQwcHg7CiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDMwcHg7CiAgICAgICAgICAgIGZvbnQtc2l6ZTogMS4xcmVtOwogICAgICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgICAgIGJveC1zaGFkb3c6IDAgMnB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMik7CiAgICAgICAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjFzLCBib3gtc2hhZG93IDAuMnM7CiAgICAgICAgfQoKICAgICAgICAuY2FsYy1idG46aG92ZXIgewogICAgICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wcmltYXJ5LWhvdmVyKTsKICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xcHgpOwogICAgICAgICAgICBib3gtc2hhZG93OiAwIDRweCA4cHggcmdiYSgwLCAwLCAwLCAwLjI1KTsKICAgICAgICB9CgogICAgICAgIC8qIEdyYXBoICovCiAgICAgICAgLmdyYXBoLXdyYXBwZXIgewogICAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlci1jb2xvcik7CiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgICAgICAgICAgYmFja2dyb3VuZDogI2ZmZjsKICAgICAgICAgICAgaGVpZ2h0OiA0MDBweDsKICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB9CgogICAgICAgIGNhbnZhcyB7CiAgICAgICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIH0KCiAgICAgICAgLmxlZ2VuZCB7CiAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgICAgICBnYXA6IDE1cHg7CiAgICAgICAgICAgIG1hcmdpbi10b3A6IDVweDsKICAgICAgICAgICAgZm9udC1zaXplOiAwLjg1cmVtOwogICAgICAgICAgICBjb2xvcjogIzVmNjM2ODsKICAgICAgICB9CgogICAgICAgIC5sZWdlbmQgc3BhbiB7CiAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgICAgIGdhcDogNHB4OwogICAgICAgIH0KCiAgICAgICAgLmJveCB7CiAgICAgICAgICAgIHdpZHRoOiAxMnB4OwogICAgICAgICAgICBoZWlnaHQ6IDEycHg7CiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDJweDsKICAgICAgICB9CgogICAgICAgIC5iLWJsdWUgewogICAgICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQtMSk7CiAgICAgICAgfQoKICAgICAgICAuYi1yZWQgewogICAgICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQtMik7CiAgICAgICAgfQoKICAgICAgICAuYi1hcmVhIHsKICAgICAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tYXJlYS1maWxsKTsKICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgIzlhNjdlYTsKICAgICAgICB9CgogICAgICAgIC8qIFJlc3VsdHMgKi8KICAgICAgICAucmVzdWx0LWJveCB7CiAgICAgICAgICAgIGJhY2tncm91bmQ6ICNmMWYzZjQ7CiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgICAgICAgICAgcGFkZGluZzogMjBweDsKICAgICAgICAgICAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCB2YXIoLS1wcmltYXJ5LWNvbG9yKTsKICAgICAgICAgICAgYW5pbWF0aW9uOiBzbGlkZVVwIDAuM3MgZWFzZS1vdXQ7CiAgICAgICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgfQoKICAgICAgICAucmVzdWx0LWJveC52aXNpYmxlIHsKICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgfQoKICAgICAgICAucmVzdWx0LXRpdGxlIHsKICAgICAgICAgICAgZm9udC1zaXplOiAwLjlyZW07CiAgICAgICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICAgICAgICAgIGxldHRlci1zcGFjaW5nOiAwLjVweDsKICAgICAgICAgICAgY29sb3I6ICM1ZjYzNjg7CiAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDVweDsKICAgICAgICB9CgogICAgICAgIC5yZXN1bHQtdmFsdWUgewogICAgICAgICAgICBmb250LXNpemU6IDIuMnJlbTsKICAgICAgICAgICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgICAgICAgICAgY29sb3I6ICMyMDIxMjQ7CiAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDE1cHg7CiAgICAgICAgfQoKICAgICAgICAuYnJlYWtkb3duIHsKICAgICAgICAgICAgYmFja2dyb3VuZDogI2ZmZjsKICAgICAgICAgICAgcGFkZGluZzogMTVweDsKICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogICAgICAgICAgICBmb250LXNpemU6IDAuOTVyZW07CiAgICAgICAgICAgIGNvbG9yOiAjNDQ0OwogICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZTBlMGUwOwogICAgICAgIH0KCiAgICAgICAgLmJyZWFrZG93bi1pdGVtIHsKICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgICAgICAgICAgcGFkZGluZy1ib3R0b206IDhweDsKICAgICAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IGRhc2hlZCAjZWVlOwogICAgICAgIH0KCiAgICAgICAgLmJyZWFrZG93bi1pdGVtOmxhc3QtY2hpbGQgewogICAgICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgICAgIG1hcmdpbjogMDsKICAgICAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB9CgogICAgICAgIEBrZXlmcmFtZXMgc2xpZGVVcCB7CiAgICAgICAgICAgIGZyb20gewogICAgICAgICAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgxMHB4KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdG8gewogICAgICAgICAgICAgICAgb3BhY2l0eTogMTsKICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgQG1lZGlhIChtYXgtd2lkdGg6IDY1MHB4KSB7CiAgICAgICAgICAgIC5pbnB1dC1ncmlkIHsKICAgICAgICAgICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgICAgICAgICB9CgogICAgICAgICAgICAuZnVsbC13aWR0aCB7CiAgICAgICAgICAgICAgICBncmlkLWNvbHVtbjogc3BhbiAxOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAuZXJyb3ItbXNnIHsKICAgICAgICAgICAgY29sb3I6ICNkOTMwMjU7CiAgICAgICAgICAgIGZvbnQtc2l6ZTogMC44NXJlbTsKICAgICAgICAgICAgbWFyZ2luLXRvcDogNHB4OwogICAgICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIH0KICAgIDwvc3R5bGU+CjwvaGVhZD4KCjxib2R5PgoKICAgIDxkaXYgY2xhc3M9ImNhbGMtY29udGFpbmVyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJjYWxjLWhlYWRlciI+CiAgICAgICAgICAgIDxoMj5BcmVhIEJldHdlZW4gVHdvIEN1cnZlcyBDYWxjdWxhdG9yPC9oMj4KICAgICAgICAgICAgPHA+Q2FsY3VsYXRlIHRoZSBhcmVhIG9mIHRoZSByZWdpb24gYm91bmRlZCBieSB0d28gZnVuY3Rpb25zICgkZiQgYW5kICRnJCkuPC9wPgogICAgICAgIDwvZGl2PgoKICAgICAgICA8IS0tIE1vZGUgU2VsZWN0aW9uIC0tPgogICAgICAgIDxkaXYgY2xhc3M9Im1vZGUtc3dpdGNoIj4KICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJyYWRpby1sYWJlbCI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9ImludGVnX21vZGUiIHZhbHVlPSJkeCIgY2hlY2tlZCBvbmNoYW5nZT0idXBkYXRlTGFiZWxzKCkiPgogICAgICAgICAgICAgICAgSW50ZWdyYXRlIHdydCB4IChkeCkKICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgPCEtLSBkeSBpbnRlZ3JhdGlvbjogZnVuY3Rpb25hbGx5IHN3YXBzIGF4ZXMgbG9naWMgLS0+CiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0icmFkaW8tbGFiZWwiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJpbnRlZ19tb2RlIiB2YWx1ZT0iZHkiIG9uY2hhbmdlPSJ1cGRhdGVMYWJlbHMoKSI+CiAgICAgICAgICAgICAgICBJbnRlZ3JhdGUgd3J0IHkgKGR5KQogICAgICAgICAgICA8L2xhYmVsPgogICAgICAgIDwvZGl2PgoKICAgICAgICA8IS0tIElucHV0cyAtLT4KICAgICAgICA8ZGl2IGNsYXNzPSJpbnB1dC1ncmlkIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZnVsbC13aWR0aCBpbnB1dC1ncm91cCI+CiAgICAgICAgICAgICAgICA8bGFiZWwgaWQ9ImxibF9mMSI+VXBwZXIgQ3VydmUgKG9yIEZpcnN0IEZ1bmN0aW9uKTo8L2xhYmVsPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtd3JhcHBlciI+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImlucHV0LXByZWZpeCIgaWQ9InBmeF9mMSI+eSA9PC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iZnVuY18xIiB2YWx1ZT0ieCIgcGxhY2Vob2xkZXI9ImUuZy4geCI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItZG90IiBzdHlsZT0iYmFja2dyb3VuZDp2YXIoLS1hY2NlbnQtMSkiPjwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJlcnJvci1tc2ciIGlkPSJlcnJfZjEiPkludmFsaWQgc3ludGF4PC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0iZnVsbC13aWR0aCBpbnB1dC1ncm91cCI+CiAgICAgICAgICAgICAgICA8bGFiZWwgaWQ9ImxibF9mMiI+TG93ZXIgQ3VydmUgKG9yIFNlY29uZCBGdW5jdGlvbik6PC9sYWJlbD4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LXdyYXBwZXIiPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpbnB1dC1wcmVmaXgiIGlkPSJwZnhfZjIiPnkgPTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9ImZ1bmNfMiIgdmFsdWU9InheMiAtIDIiIHBsYWNlaG9sZGVyPSJlLmcuIHheMiAtIDIiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLWRvdCIgc3R5bGU9ImJhY2tncm91bmQ6dmFyKC0tYWNjZW50LTIpIj48L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idG9vbHMtcm93IiBzdHlsZT0ibWFyZ2luLXRvcDogNXB4OyI+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4+U3VwcG9ydGVkOiArLCAtLCAqLCAvLCBeLCBzaW4sIGNvcywgbG4sIHNxcnQuLi48L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZmluZC1idG4iIG9uY2xpY2s9ImZpbmRJbnRlcnNlY3Rpb25zKCkiPkZpbmQgSW50ZXJzZWN0aW9uczwvYnV0dG9uPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtZ3JvdXAgc2ltcGxlLWlucHV0Ij4KICAgICAgICAgICAgICAgIDxsYWJlbCBpZD0ibGJsX2EiPlN0YXJ0IExpbWl0IChhKTo8L2xhYmVsPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtd3JhcHBlciI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9Im51bWJlciIgaWQ9InZhbF9hIiB2YWx1ZT0iLTEiIHN0ZXA9ImFueSI+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbnB1dC1ncm91cCBzaW1wbGUtaW5wdXQiPgogICAgICAgICAgICAgICAgPGxhYmVsIGlkPSJsYmxfYiI+RW5kIExpbWl0IChiKTo8L2xhYmVsPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtd3JhcHBlciI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9Im51bWJlciIgaWQ9InZhbF9iIiB2YWx1ZT0iMiIgc3RlcD0iYW55Ij4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0iYnRuLWNvbnRhaW5lciI+CiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImNhbGMtYnRuIiBvbmNsaWNrPSJjYWxjdWxhdGUoKSI+Q2FsY3VsYXRlIEFyZWE8L2J1dHRvbj4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPCEtLSBHcmFwaCAtLT4KICAgICAgICA8ZGl2IGNsYXNzPSJncmFwaC13cmFwcGVyIj4KICAgICAgICAgICAgPGNhbnZhcyBpZD0icGxvdENhbnZhcyI+PC9jYW52YXM+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibGVnZW5kIj4KICAgICAgICAgICAgPHNwYW4+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJib3ggYi1ibHVlIj48L2Rpdj5DdXJ2ZSAxCiAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgPHNwYW4+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJib3ggYi1yZWQiPjwvZGl2PkN1cnZlIDIKICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICA8c3Bhbj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJveCBiLWFyZWEiPjwvZGl2PkFyZWEKICAgICAgICAgICAgPC9zcGFuPgogICAgICAgIDwvZGl2PgoKICAgICAgICA8IS0tIFJlc3VsdHMgLS0+CiAgICAgICAgPGRpdiBpZD0icmVzdWx0cyIgY2xhc3M9InJlc3VsdC1ib3giPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJyZXN1bHQtdGl0bGUiPlRvdGFsIEFyZWEgQmV0d2VlbiBDdXJ2ZXM8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0icmVzdWx0LXZhbHVlIiBpZD0iZmluYWxfYXJlYSI+LS08L2Rpdj4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJyZWFrZG93biI+CiAgICAgICAgICAgICAgICA8c3Ryb25nPlN0ZXAtYnktU3RlcCBCcmVha2Rvd246PC9zdHJvbmc+PGJyPjxicj4KICAgICAgICAgICAgICAgIDxkaXYgaWQ9ImJyZWFrZG93bl9jb250ZW50Ij48L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8c2NyaXB0PgogICAgICAgIC8qIC0tLSBNYXRoIEVuZ2luZSAtLS0gKi8KICAgICAgICBjb25zdCBNYXRoUGFyc2VyID0gKCgpID0+IHsKICAgICAgICAgICAgLy8gU2ltcGxpZmllZCBUb2tlbml6ZXIgJiBQYXJzZXIgZm9yIGV4cHJlc3Npb25zIGxpa2UgInheMiArIHNpbih4KSIgb3IgInleMiIKICAgICAgICAgICAgY29uc3QgVG9rZW4gPSB7IE51bWJlcjogMSwgVmFyOiAyLCBPcDogMywgRnVuYzogNCwgTFBhcmVuOiA1LCBSUGFyZW46IDYgfTsKCiAgICAgICAgICAgIGZ1bmN0aW9uIHRva2VuaXplKHN0cikgewogICAgICAgICAgICAgICAgY29uc3QgdG9rZW5zID0gW107CiAgICAgICAgICAgICAgICBsZXQgaSA9IDA7CiAgICAgICAgICAgICAgICB3aGlsZSAoaSA8IHN0ci5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyID0gc3RyW2ldOwogICAgICAgICAgICAgICAgICAgIGlmICgvXHMvLnRlc3QoY2hhcikpIHsgaSsrOyBjb250aW51ZTsgfQogICAgICAgICAgICAgICAgICAgIGlmICgvWzAtOS5dLy50ZXN0KGNoYXIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBudW0gPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGkgPCBzdHIubGVuZ3RoICYmIC9bMC05Ll0vLnRlc3Qoc3RyW2ldKSkgbnVtICs9IHN0cltpKytdOwogICAgICAgICAgICAgICAgICAgICAgICB0b2tlbnMucHVzaCh7IHR5cGU6IFRva2VuLk51bWJlciwgdmFsdWU6IHBhcnNlRmxvYXQobnVtKSB9KTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKC9bYS16QS1aXS8udGVzdChjaGFyKSkgewogICAgICAgICAgICAgICAgICAgICAgICBsZXQgaWQgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGkgPCBzdHIubGVuZ3RoICYmIC9bYS16QS1aMC05XS8udGVzdChzdHJbaV0pKSBpZCArPSBzdHJbaSsrXTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdmFyaWFibGUgb3IgZnVuY3Rpb24gdXNpbmcgbGlzdCBvZiBrbm93biBmdW5jcwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoWydzaW4nLCAnY29zJywgJ3RhbicsICdhc2luJywgJ2Fjb3MnLCAnYXRhbicsICdzcXJ0JywgJ2xvZycsICdsbicsICdhYnMnLCAnZXhwJ10uaW5jbHVkZXMoaWQudG9Mb3dlckNhc2UoKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoKHsgdHlwZTogVG9rZW4uRnVuYywgdmFsdWU6IGlkLnRvTG93ZXJDYXNlKCkgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaWQudG9Mb3dlckNhc2UoKSA9PT0gJ3BpJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5zLnB1c2goeyB0eXBlOiBUb2tlbi5OdW1iZXIsIHZhbHVlOiBNYXRoLlBJIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlkLnRvTG93ZXJDYXNlKCkgPT09ICdlJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5zLnB1c2goeyB0eXBlOiBUb2tlbi5OdW1iZXIsIHZhbHVlOiBNYXRoLkUgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbnMucHVzaCh7IHR5cGU6IFRva2VuLlZhciwgdmFsdWU6ICd2YXInIH0pOyAvLyBBbnkgbm9uLWZ1bmMgc3RyaW5nIGlzIHRoZSB2YXJpYWJsZQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgnKy0qL14nLmluY2x1ZGVzKGNoYXIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoKHsgdHlwZTogVG9rZW4uT3AsIHZhbHVlOiBjaGFyIH0pOyBpKys7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGFyID09PSAnKCcpIHsgdG9rZW5zLnB1c2goeyB0eXBlOiBUb2tlbi5MUGFyZW4gfSk7IGkrKzsgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoYXIgPT09ICcpJykgeyB0b2tlbnMucHVzaCh7IHR5cGU6IFRva2VuLlJQYXJlbiB9KTsgaSsrOyB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5zOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBSZWN1cnNpdmUgRGVzY2VudCBQYXJzZXIKICAgICAgICAgICAgZnVuY3Rpb24gcGFyc2UodG9rZW5zKSB7CiAgICAgICAgICAgICAgICBsZXQgcG9zID0gMDsKICAgICAgICAgICAgICAgIGNvbnN0IHBlZWsgPSAoKSA9PiB0b2tlbnNbcG9zXTsKICAgICAgICAgICAgICAgIGNvbnN0IGNvbnN1bWUgPSAoKSA9PiB0b2tlbnNbcG9zKytdOwoKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHBhcnNlRXhwcmVzc2lvbigpIHsKICAgICAgICAgICAgICAgICAgICBsZXQgbGVmdCA9IHBhcnNlVGVybSgpOwogICAgICAgICAgICAgICAgICAgIHdoaWxlIChwZWVrKCkgJiYgcGVlaygpLnR5cGUgPT09IFRva2VuLk9wICYmIFsnKycsICctJ10uaW5jbHVkZXMocGVlaygpLnZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvcCA9IGNvbnN1bWUoKS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCA9IHsgdHlwZTogJ0JpbmFyeScsIG9wLCBsZWZ0LCByaWdodDogcGFyc2VUZXJtKCkgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlZnQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZnVuY3Rpb24gcGFyc2VUZXJtKCkgewogICAgICAgICAgICAgICAgICAgIGxldCBsZWZ0ID0gcGFyc2VGYWN0b3IoKTsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAocGVlaygpICYmIHBlZWsoKS50eXBlID09PSBUb2tlbi5PcCAmJiBbJyonLCAnLyddLmluY2x1ZGVzKHBlZWsoKS52YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3AgPSBjb25zdW1lKCkudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgPSB7IHR5cGU6ICdCaW5hcnknLCBvcCwgbGVmdCwgcmlnaHQ6IHBhcnNlRmFjdG9yKCkgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlZnQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZnVuY3Rpb24gcGFyc2VGYWN0b3IoKSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IGxlZnQgPSBwYXJzZUJhc2UoKTsKICAgICAgICAgICAgICAgICAgICBpZiAocGVlaygpICYmIHBlZWsoKS50eXBlID09PSBUb2tlbi5PcCAmJiBwZWVrKCkudmFsdWUgPT09ICdeJykgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgPSB7IHR5cGU6ICdCaW5hcnknLCBvcDogJ14nLCBsZWZ0LCByaWdodDogcGFyc2VGYWN0b3IoKSB9OyAvLyBSaWdodCBhc3NvYwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGVmdDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBmdW5jdGlvbiBwYXJzZUJhc2UoKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IHBlZWsoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXQpIHJldHVybiB7IHR5cGU6ICdDb25zdCcsIHZhbHVlOiAwIH07CiAgICAgICAgICAgICAgICAgICAgaWYgKHQudHlwZSA9PT0gVG9rZW4uTnVtYmVyKSByZXR1cm4geyB0eXBlOiAnQ29uc3QnLCB2YWx1ZTogY29uc3VtZSgpLnZhbHVlIH07CiAgICAgICAgICAgICAgICAgICAgaWYgKHQudHlwZSA9PT0gVG9rZW4uVmFyKSB7IGNvbnN1bWUoKTsgcmV0dXJuIHsgdHlwZTogJ1ZhcicgfTsgfQogICAgICAgICAgICAgICAgICAgIGlmICh0LnR5cGUgPT09IFRva2VuLkZ1bmMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZnVuYyA9IGNvbnN1bWUoKS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZSgpOyAvLyAoCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFyZyA9IHBhcnNlRXhwcmVzc2lvbigpOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lKCk7IC8vICkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgdHlwZTogJ0NhbGwnLCBmdW5jLCBhcmcgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHQudHlwZSA9PT0gVG9rZW4uTFBhcmVuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhwciA9IHBhcnNlRXhwcmVzc2lvbigpOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBleHByOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodC50eXBlID09PSBUb2tlbi5PcCAmJiB0LnZhbHVlID09PSAnLScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZSgpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB0eXBlOiAnVW5hcnknLCBvcDogJy0nLCBhcmc6IHBhcnNlQmFzZSgpIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNvbnN1bWUoKTsgcmV0dXJuIHsgdHlwZTogJ0NvbnN0JywgdmFsdWU6IDAgfTsgLy8gRXJyb3IvRmFsbGJhY2sKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VFeHByZXNzaW9uKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZ1bmN0aW9uIGV2YWx1YXRlKG5vZGUsIHZhbCkgewogICAgICAgICAgICAgICAgaWYgKCFub2RlKSByZXR1cm4gMDsKICAgICAgICAgICAgICAgIGlmIChub2RlLnR5cGUgPT09ICdDb25zdCcpIHJldHVybiBub2RlLnZhbHVlOwogICAgICAgICAgICAgICAgaWYgKG5vZGUudHlwZSA9PT0gJ1ZhcicpIHJldHVybiB2YWw7CiAgICAgICAgICAgICAgICBpZiAobm9kZS50eXBlID09PSAnQmluYXJ5JykgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGwgPSBldmFsdWF0ZShub2RlLmxlZnQsIHZhbCk7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgciA9IGV2YWx1YXRlKG5vZGUucmlnaHQsIHZhbCk7CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChub2RlLm9wKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJysnOiByZXR1cm4gbCArIHI7IGNhc2UgJy0nOiByZXR1cm4gbCAtIHI7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJyonOiByZXR1cm4gbCAqIHI7IGNhc2UgJy8nOiByZXR1cm4gbCAvIHI7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ14nOiByZXR1cm4gTWF0aC5wb3cobCwgcik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG5vZGUudHlwZSA9PT0gJ1VuYXJ5JykgcmV0dXJuIC1ldmFsdWF0ZShub2RlLmFyZywgdmFsKTsKICAgICAgICAgICAgICAgIGlmIChub2RlLnR5cGUgPT09ICdDYWxsJykgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGFyZyA9IGV2YWx1YXRlKG5vZGUuYXJnLCB2YWwpOwogICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobm9kZS5mdW5jKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3Npbic6IHJldHVybiBNYXRoLnNpbihhcmcpOyBjYXNlICdjb3MnOiByZXR1cm4gTWF0aC5jb3MoYXJnKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAndGFuJzogcmV0dXJuIE1hdGgudGFuKGFyZyk7IGNhc2UgJ3NxcnQnOiByZXR1cm4gTWF0aC5zcXJ0KGFyZyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2xuJzogcmV0dXJuIE1hdGgubG9nKGFyZyk7IGNhc2UgJ2xvZyc6IHJldHVybiBNYXRoLmxvZzEwKGFyZyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Ficyc6IHJldHVybiBNYXRoLmFicyhhcmcpOyBjYXNlICdleHAnOiByZXR1cm4gTWF0aC5leHAoYXJnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGNvbXBpbGU6IChzdHIpID0+IHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhc3QgPSBwYXJzZSh0b2tlbml6ZShzdHIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh2YWwpID0+IGV2YWx1YXRlKGFzdCwgdmFsKTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7IHJldHVybiBudWxsOyB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgfSkoKTsKCiAgICAgICAgLyogLS0tIEFwcCBMb2dpYyAtLS0gKi8KICAgICAgICBsZXQgZjEsIGYyOyAvLyBGdW5jdGlvbiBvYmplY3RzCiAgICAgICAgbGV0IG1vZGUgPSAnZHgnOwoKICAgICAgICBmdW5jdGlvbiB1cGRhdGVMYWJlbHMoKSB7CiAgICAgICAgICAgIG1vZGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dFtuYW1lPSJpbnRlZ19tb2RlIl06Y2hlY2tlZCcpLnZhbHVlOwogICAgICAgICAgICBjb25zdCB4X3ZhciA9IG1vZGUgPT09ICdkeCcgPyAneCcgOiAneSc7CiAgICAgICAgICAgIGNvbnN0IHlfdmFyID0gbW9kZSA9PT0gJ2R4JyA/ICd5JyA6ICd4JzsKCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwZnhfZjEnKS5pbm5lclRleHQgPSBgJHt5X3Zhcn0gPWA7CiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwZnhfZjInKS5pbm5lclRleHQgPSBgJHt5X3Zhcn0gPWA7CiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYmxfZjEnKS5pbm5lclRleHQgPSBtb2RlID09PSAnZHgnID8gIkN1cnZlIDEgKEZ1bmN0aW9uIG9mIHgpOiIgOiAiQ3VydmUgMSAoRnVuY3Rpb24gb2YgeSk6IjsKICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xibF9mMicpLmlubmVyVGV4dCA9IG1vZGUgPT09ICdkeCcgPyAiQ3VydmUgMiAoRnVuY3Rpb24gb2YgeCk6IiA6ICJDdXJ2ZSAyIChGdW5jdGlvbiBvZiB5KToiOwogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZnVuY18xJykucGxhY2Vob2xkZXIgPSBgZS5nLiAke3hfdmFyfV4yYDsKICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Z1bmNfMicpLnBsYWNlaG9sZGVyID0gYGUuZy4gJHt4X3Zhcn0gKyAyYDsKCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYmxfYScpLmlubmVyVGV4dCA9IGBTdGFydCBMaW1pdCAoJHttb2RlID09PSAnZHgnID8gJ2EnIDogJ2MnfSk6YDsKICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xibF9iJykuaW5uZXJUZXh0ID0gYEVuZCBMaW1pdCAoJHttb2RlID09PSAnZHgnID8gJ2InIDogJ2QnfSk6YDsKCiAgICAgICAgICAgIC8vIFVwZGF0ZSBkZWZhdWx0IHZhbHVlcyB0byBtYWtlIHNlbnNlIGZvciBkeQogICAgICAgICAgICBpZiAobW9kZSA9PT0gJ2R5JyAmJiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZnVuY18xJykudmFsdWUuaW5jbHVkZXMoJ3gnKSkgewogICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Z1bmNfMScpLnZhbHVlID0gJ3leMic7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZnVuY18yJykudmFsdWUgPSAneSsyJzsKICAgICAgICAgICAgfSBlbHNlIGlmIChtb2RlID09PSAnZHgnICYmIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmdW5jXzEnKS52YWx1ZS5pbmNsdWRlcygneScpKSB7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZnVuY18xJykudmFsdWUgPSAneF4yJzsKICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmdW5jXzInKS52YWx1ZSA9ICd4KzInOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRyYXcoKTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGdldEZ1bmN0aW9ucygpIHsKICAgICAgICAgICAgY29uc3QgczEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZnVuY18xJykudmFsdWU7CiAgICAgICAgICAgIGNvbnN0IHMyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Z1bmNfMicpLnZhbHVlOwogICAgICAgICAgICBmMSA9IE1hdGhQYXJzZXIuY29tcGlsZShzMSk7CiAgICAgICAgICAgIGYyID0gTWF0aFBhcnNlci5jb21waWxlKHMyKTsKICAgICAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IGYxICYmIGYyLCBzMSwgczIgfTsKICAgICAgICB9CgogICAgICAgIC8vIFJvb3QgZmluZGluZyAoYnJ1dGUgZm9yY2Ugc3dlZXAgKyBzZWNhbnQgcmVmaW5lbWVudCkKICAgICAgICBmdW5jdGlvbiBmaW5kUm9vdHMoc3RhcnQsIGVuZCkgewogICAgICAgICAgICBjb25zdCB7IHZhbGlkIH0gPSBnZXRGdW5jdGlvbnMoKTsKICAgICAgICAgICAgaWYgKCF2YWxpZCkgcmV0dXJuIFtdOwoKICAgICAgICAgICAgY29uc3Qgcm9vdHMgPSBbXTsKICAgICAgICAgICAgY29uc3QgZGlmZiA9ICh2KSA9PiBmMSh2KSAtIGYyKHYpOwogICAgICAgICAgICBjb25zdCBzdGVwID0gKGVuZCAtIHN0YXJ0KSAvIDIwMDsKCiAgICAgICAgICAgIGZvciAobGV0IHggPSBzdGFydDsgeCA8IGVuZDsgeCArPSBzdGVwKSB7CiAgICAgICAgICAgICAgICBjb25zdCB5MSA9IGRpZmYoeCk7CiAgICAgICAgICAgICAgICBjb25zdCB5MiA9IGRpZmYoeCArIHN0ZXApOwogICAgICAgICAgICAgICAgaWYgKE1hdGguc2lnbih5MSkgIT09IE1hdGguc2lnbih5MikpIHsKICAgICAgICAgICAgICAgICAgICAvLyBSb290IGlzIGJldHdlZW4geCBhbmQgeCtzdGVwCiAgICAgICAgICAgICAgICAgICAgLy8gU2VjYW50IG1ldGhvZCByZWZpbmVtZW50CiAgICAgICAgICAgICAgICAgICAgbGV0IHIxID0geCwgcjIgPSB4ICsgc3RlcDsKICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEwOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZDEgPSBkaWZmKHIxKTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZDIgPSBkaWZmKHIyKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE1hdGguYWJzKGQyIC0gZDEpIDwgMWUtOSkgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHIzID0gcjIgLSBkMiAqIChyMiAtIHIxKSAvIChkMiAtIGQxKTsKICAgICAgICAgICAgICAgICAgICAgICAgcjEgPSByMjsgcjIgPSByMzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgZHVwbGljYXRlCiAgICAgICAgICAgICAgICAgICAgaWYgKHJvb3RzLmxlbmd0aCA9PT0gMCB8fCBNYXRoLmFicyhyb290c1tyb290cy5sZW5ndGggLSAxXSAtIHIyKSA+IDAuMSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAocjIgPj0gc3RhcnQgJiYgcjIgPD0gZW5kKSByb290cy5wdXNoKHIyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJvb3RzOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gZmluZEludGVyc2VjdGlvbnMoKSB7CiAgICAgICAgICAgIC8vIFNlYXJjaCBpbiBhIHJlYXNvbmFibGUgcmFuZ2UsIGUuZy4sIC0xMCB0byAxMC4gQ291bGQgbGV2ZXJhZ2UgY3VycmVudCB2aWV3LgogICAgICAgICAgICBnZXRGdW5jdGlvbnMoKTsKICAgICAgICAgICAgY29uc3Qgcm9vdHMgPSBmaW5kUm9vdHMoLTEwLCAxMCk7CiAgICAgICAgICAgIGlmIChyb290cy5sZW5ndGggPj0gMikgewogICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ZhbF9hJykudmFsdWUgPSByb290c1swXS50b0ZpeGVkKDMpOwogICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ZhbF9iJykudmFsdWUgPSByb290c1tyb290cy5sZW5ndGggLSAxXS50b0ZpeGVkKDMpOwogICAgICAgICAgICAgICAgY2FsY3VsYXRlKCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAocm9vdHMubGVuZ3RoID09PSAxKSB7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndmFsX2EnKS52YWx1ZSA9IHJvb3RzWzBdLnRvRml4ZWQoMyk7CiAgICAgICAgICAgICAgICBhbGVydCgiT25seSBvbmUgaW50ZXJzZWN0aW9uIGZvdW5kIGluIHN0YW5kYXJkIHJhbmdlICgtMTAgdG8gMTApLiBTZXQgJ2InIG1hbnVhbGx5LiIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgYWxlcnQoIk5vIGludGVyc2VjdGlvbnMgZm91bmQgaW4gcmFuZ2UgLTEwIHRvIDEwLiIpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKiAtLS0gSW50ZWdyYXRpb24gQ29yZSAtLS0gKi8KICAgICAgICBmdW5jdGlvbiBhZGFwdGl2ZVNpbXBzb24oZiwgYSwgYiwgZXBzID0gMWUtNikgewogICAgICAgICAgICBjb25zdCBtaWQgPSAoYSArIGIpIC8gMjsKICAgICAgICAgICAgY29uc3QgaCA9IChiIC0gYSkgLyAyOwogICAgICAgICAgICBjb25zdCBmYSA9IGYoYSksIGZiID0gZihiKSwgZm1pZCA9IGYobWlkKTsKICAgICAgICAgICAgY29uc3QgUyA9IChoIC8gMykgKiAoZmEgKyA0ICogZm1pZCArIGZiKTsKCiAgICAgICAgICAgIGZ1bmN0aW9uIHJlY3Vyc2l2ZShsLCByLCBlcHMsIHdob2xlLCBkZXB0aCkgewogICAgICAgICAgICAgICAgaWYgKGRlcHRoID4gMTUpIHJldHVybiB3aG9sZTsgLy8gQXZvaWQgZnJlZXplCiAgICAgICAgICAgICAgICBjb25zdCBtID0gKGwgKyByKSAvIDI7CiAgICAgICAgICAgICAgICBjb25zdCBoID0gKHIgLSBsKSAvIDI7CiAgICAgICAgICAgICAgICBjb25zdCBmbCA9IGYobCksIGZyID0gZihyKSwgZm0gPSBmKG0pOwogICAgICAgICAgICAgICAgY29uc3QgbGVmdFMgPSAoaCAvIDYpICogKGZsICsgNCAqIGYoKGwgKyBtKSAvIDIpICsgZm0pOwogICAgICAgICAgICAgICAgY29uc3QgcmlnaHRTID0gKGggLyA2KSAqIChmbSArIDQgKiBmKChtICsgcikgLyAyKSArIGZyKTsKCiAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnMobGVmdFMgKyByaWdodFMgLSB3aG9sZSkgPD0gMTUgKiBlcHMpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGVmdFMgKyByaWdodFMgKyAobGVmdFMgKyByaWdodFMgLSB3aG9sZSkgLyAxNTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiByZWN1cnNpdmUobCwgbSwgZXBzIC8gMiwgbGVmdFMsIGRlcHRoICsgMSkgKyByZWN1cnNpdmUobSwgciwgZXBzIC8gMiwgcmlnaHRTLCBkZXB0aCArIDEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZWN1cnNpdmUoYSwgYiwgZXBzLCBTLCAwKTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGNhbGN1bGF0ZSgpIHsKICAgICAgICAgICAgY29uc3QgeyB2YWxpZCB9ID0gZ2V0RnVuY3Rpb25zKCk7CiAgICAgICAgICAgIGlmICghdmFsaWQpIHJldHVybjsKCiAgICAgICAgICAgIGNvbnN0IGFfdmFsID0gcGFyc2VGbG9hdChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndmFsX2EnKS52YWx1ZSk7CiAgICAgICAgICAgIGNvbnN0IGJfdmFsID0gcGFyc2VGbG9hdChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndmFsX2InKS52YWx1ZSk7CiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gTWF0aC5taW4oYV92YWwsIGJfdmFsKTsKICAgICAgICAgICAgY29uc3QgZW5kID0gTWF0aC5tYXgoYV92YWwsIGJfdmFsKTsKCiAgICAgICAgICAgIC8vIDEuIElkZW50aWZ5IGNyaXRpY2FsIHBvaW50cyAoY3Jvc3NpbmdzKSB3aXRoaW4gW2EsIGJdCiAgICAgICAgICAgIGNvbnN0IHJvb3RzID0gZmluZFJvb3RzKHN0YXJ0LCBlbmQpLmZpbHRlcihyID0+IHIgPiBzdGFydCArIDFlLTUgJiYgciA8IGVuZCAtIDFlLTUpOwogICAgICAgICAgICBjb25zdCBwb2ludHMgPSBbc3RhcnQsIC4uLnJvb3RzLCBlbmRdOwoKICAgICAgICAgICAgbGV0IHRvdGFsQXJlYSA9IDA7CiAgICAgICAgICAgIGxldCBicmVha2Rvd25IVE1MID0gIiI7CiAgICAgICAgICAgIGNvbnN0IGF4aXNWYXIgPSBtb2RlID09PSAnZHgnID8gJ3gnIDogJ3knOwoKICAgICAgICAgICAgLy8gMi4gSW50ZWdyYXRlIHBpZWNld2lzZQogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGggLSAxOyBpKyspIHsKICAgICAgICAgICAgICAgIGNvbnN0IHAxID0gcG9pbnRzW2ldOwogICAgICAgICAgICAgICAgY29uc3QgcDIgPSBwb2ludHNbaSArIDFdOwogICAgICAgICAgICAgICAgY29uc3QgbWlkID0gKHAxICsgcDIpIC8gMjsKCiAgICAgICAgICAgICAgICAvLyBEZXRlcm1pbmUgd2hpY2ggaXMgdXBwZXIKICAgICAgICAgICAgICAgIGNvbnN0IHYxID0gZjEobWlkKTsKICAgICAgICAgICAgICAgIGNvbnN0IHYyID0gZjIobWlkKTsKICAgICAgICAgICAgICAgIGNvbnN0IGlzRjFVcHBlciA9IHYxID49IHYyOwogICAgICAgICAgICAgICAgY29uc3QgdXBwZXJOYW1lID0gaXNGMVVwcGVyID8gIkN1cnZlIDEiIDogIkN1cnZlIDIiOwogICAgICAgICAgICAgICAgY29uc3QgbG93ZXJOYW1lID0gaXNGMVVwcGVyID8gIkN1cnZlIDIiIDogIkN1cnZlIDEiOwoKICAgICAgICAgICAgICAgIC8vIEludGVncmF0ZSAoVXBwZXIgLSBMb3dlcikKICAgICAgICAgICAgICAgIGNvbnN0IGludGVncmFuZCA9ICh2KSA9PiBpc0YxVXBwZXIgPyAoZjEodikgLSBmMih2KSkgOiAoZjIodikgLSBmMSh2KSk7CiAgICAgICAgICAgICAgICBjb25zdCBzZWdtZW50QXJlYSA9IGFkYXB0aXZlU2ltcHNvbihpbnRlZ3JhbmQsIHAxLCBwMik7CiAgICAgICAgICAgICAgICB0b3RhbEFyZWEgKz0gc2VnbWVudEFyZWE7CgogICAgICAgICAgICAgICAgYnJlYWtkb3duSFRNTCArPSBgCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJyZWFrZG93bi1pdGVtIj4KICAgICAgICAgICAgICAgIDxzcGFuPkludGVydmFsIFske3AxLnRvRml4ZWQoMyl9LCAke3AyLnRvRml4ZWQoMyl9XTogJHt1cHBlck5hbWV9IGlzICR7bW9kZSA9PT0gJ2R4JyA/ICdhYm92ZScgOiAncmlnaHQgb2YnfSAke2xvd2VyTmFtZX0uPC9zcGFuPjxicj4KICAgICAgICAgICAgICAgIDxzcGFuPuKIqyAoJHtpc0YxVXBwZXIgPyAnZjEnIDogJ2YyJ30gLSAke2lzRjFVcHBlciA/ICdmMicgOiAnZjEnfSkgZCR7YXhpc1Zhcn0gPSA8c3Ryb25nPiR7c2VnbWVudEFyZWEudG9GaXhlZCg0KX08L3N0cm9uZz48L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PmA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaW5hbF9hcmVhJykuaW5uZXJUZXh0ID0gdG90YWxBcmVhLnRvRml4ZWQoNSk7CiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdicmVha2Rvd25fY29udGVudCcpLmlubmVySFRNTCA9IGJyZWFrZG93bkhUTUw7CiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXN1bHRzJykuY2xhc3NMaXN0LmFkZCgndmlzaWJsZScpOwoKICAgICAgICAgICAgZHJhdygpOwogICAgICAgIH0KCiAgICAgICAgLyogLS0tIFZpc3VhbGl6ZXIgLS0tICovCiAgICAgICAgZnVuY3Rpb24gZHJhdygpIHsKICAgICAgICAgICAgY29uc3QgY3ZzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Bsb3RDYW52YXMnKTsKICAgICAgICAgICAgY29uc3QgY3R4ID0gY3ZzLmdldENvbnRleHQoJzJkJyk7CiAgICAgICAgICAgIGNvbnN0IHcgPSBjdnMucGFyZW50RWxlbWVudC5jbGllbnRXaWR0aDsKICAgICAgICAgICAgY29uc3QgaCA9IGN2cy5wYXJlbnRFbGVtZW50LmNsaWVudEhlaWdodDsKICAgICAgICAgICAgY3ZzLndpZHRoID0gdzsgY3ZzLmhlaWdodCA9IGg7CgogICAgICAgICAgICBjb25zdCB7IHZhbGlkIH0gPSBnZXRGdW5jdGlvbnMoKTsKICAgICAgICAgICAgaWYgKCF2YWxpZCkgcmV0dXJuOwoKICAgICAgICAgICAgbGV0IGEgPSBwYXJzZUZsb2F0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2YWxfYScpLnZhbHVlKSB8fCAtNTsKICAgICAgICAgICAgbGV0IGIgPSBwYXJzZUZsb2F0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2YWxfYicpLnZhbHVlKSB8fCA1OwoKICAgICAgICAgICAgLy8gVmlld3BvcnQgcGFkZGluZyBsb2dpYwogICAgICAgICAgICBjb25zdCBtYXJnaW4gPSAoTWF0aC5hYnMoYiAtIGEpIHx8IDEwKSAqIDAuMjsKICAgICAgICAgICAgY29uc3Qgdmlld01pblggPSBNYXRoLm1pbihhLCBiKSAtIG1hcmdpbjsKICAgICAgICAgICAgY29uc3Qgdmlld01heFggPSBNYXRoLm1heChhLCBiKSArIG1hcmdpbjsKCiAgICAgICAgICAgIC8vIERldGVybWluZSBZIHJhbmdlIChvciBYIHJhbmdlIGlmIGR5IG1vZGUpCiAgICAgICAgICAgIC8vIE5vdGU6IEZvciBkeSBtb2RlLCB0aGUgaW50ZXJuYWwgbG9naWMgdHJlYXRzICd4JyBhcyBpbnB1dCB2YXJpYWJsZSBmb3IgYGZgCiAgICAgICAgICAgIC8vIEJ1dCB2aXN1YWxseSwgaWYgZHkgbW9kZSwgJ3gnIGF4aXMgb2YgdGhpcyBpbnRlcm5hbCBsb2dpYyBpcyB0aGUgdmVydGljYWwgc2NyZWVuIGF4aXM/CiAgICAgICAgICAgIC8vIE5PLiBUbyBrZWVwIGl0IHNpbXBsZTogc2ltcGxlciB0byByb3RhdGUgdGhlIHN0YW5kYXJkIGNhcnRlc2lhbiBpZiBkeT8KICAgICAgICAgICAgLy8gT3IgZWFzaWVyOiBKdXN0IG1hcCB0aGUgbWF0aCB2YXJpYWJsZXMgdG8gc2NyZWVuIFgvWSBwcm9wZXJseS4KCiAgICAgICAgICAgIC8vIExldCdzIHN0YW5kYXJkaXNlOiAKICAgICAgICAgICAgLy8gTG9naWMgVmFyaWFibGUgJ3YnIChpbnB1dCB0byBmMSwgZjIpLgogICAgICAgICAgICAvLyBJZiBtb2RlPWR4LCB2IGlzIFNjcmVlbiBYLiBmKHYpIGlzIFNjcmVlbiBZLgogICAgICAgICAgICAvLyBJZiBtb2RlPWR5LCB2IGlzIFNjcmVlbiBZLiBmKHYpIGlzIFNjcmVlbiBYLgoKICAgICAgICAgICAgY29uc3Qgc2FtcGxlcyA9IDEwMDsKICAgICAgICAgICAgbGV0IG1pblZhbCA9IEluZmluaXR5LCBtYXhWYWwgPSAtSW5maW5pdHk7CiAgICAgICAgICAgIGNvbnN0IHN0ZXAgPSAodmlld01heFggLSB2aWV3TWluWCkgLyBzYW1wbGVzOwogICAgICAgICAgICBmb3IgKGxldCB2ID0gdmlld01pblg7IHYgPD0gdmlld01heFg7IHYgKz0gc3RlcCkgewogICAgICAgICAgICAgICAgY29uc3QgdmFsMSA9IGYxKHYpOwogICAgICAgICAgICAgICAgY29uc3QgdmFsMiA9IGYyKHYpOwogICAgICAgICAgICAgICAgbWluVmFsID0gTWF0aC5taW4obWluVmFsLCB2YWwxLCB2YWwyKTsKICAgICAgICAgICAgICAgIG1heFZhbCA9IE1hdGgubWF4KG1heFZhbCwgdmFsMSwgdmFsMik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNvbnN0IHZhbE1hcmdpbiA9IChtYXhWYWwgLSBtaW5WYWwgfHwgMTApICogMC4yOwogICAgICAgICAgICBjb25zdCB2aWV3TWluVmFsID0gbWluVmFsIC0gdmFsTWFyZ2luOwogICAgICAgICAgICBjb25zdCB2aWV3TWF4VmFsID0gbWF4VmFsICsgdmFsTWFyZ2luOwoKICAgICAgICAgICAgLy8gQ29vcmRpbmF0ZSB0cmFuc2Zvcm1zCiAgICAgICAgICAgIGNvbnN0IHRvU2NyZWVuID0gKHZfaW4sIHZhbF9vdXQpID0+IHsKICAgICAgICAgICAgICAgIC8vIHZfaW4gaXMgdGhlIGluZGVwZW5kZW50IHZhcmlhYmxlICh4IGlmIGR4LCB5IGlmIGR5KQogICAgICAgICAgICAgICAgLy8gdmFsX291dCBpcyB0aGUgZGVwZW5kZW50IHZhcmlhYmxlICh5IGlmIGR4LCB4IGlmIGR5KQogICAgICAgICAgICAgICAgbGV0IHN4LCBzeTsKICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSAnZHgnKSB7CiAgICAgICAgICAgICAgICAgICAgc3ggPSAodl9pbiAtIHZpZXdNaW5YKSAvICh2aWV3TWF4WCAtIHZpZXdNaW5YKSAqIHc7CiAgICAgICAgICAgICAgICAgICAgc3kgPSBoIC0gKHZhbF9vdXQgLSB2aWV3TWluVmFsKSAvICh2aWV3TWF4VmFsIC0gdmlld01pblZhbCkgKiBoOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvLyBkeSBtb2RlOiB2X2luIGlzIFkgKHZlcnRpY2FsKSwgdmFsX291dCBpcyBYIChob3Jpem9udGFsKQogICAgICAgICAgICAgICAgICAgIHN4ID0gKHZhbF9vdXQgLSB2aWV3TWluVmFsKSAvICh2aWV3TWF4VmFsIC0gdmlld01pblZhbCkgKiB3OwogICAgICAgICAgICAgICAgICAgIHN5ID0gaCAtICh2X2luIC0gdmlld01pblgpIC8gKHZpZXdNYXhYIC0gdmlld01pblgpICogaDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBbc3gsIHN5XTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIERyYXcgQXhlcwogICAgICAgICAgICBjdHguYmVnaW5QYXRoKCk7IGN0eC5zdHJva2VTdHlsZSA9ICcjZGRkJzsKICAgICAgICAgICAgY29uc3Qgb3JpZ2luID0gdG9TY3JlZW4oMCwgMCk7CiAgICAgICAgICAgIC8vIEF4aXMgbGluZXMKICAgICAgICAgICAgaWYgKG9yaWdpblswXSA+PSAwICYmIG9yaWdpblswXSA8PSB3KSB7IGN0eC5tb3ZlVG8ob3JpZ2luWzBdLCAwKTsgY3R4LmxpbmVUbyhvcmlnaW5bMF0sIGgpOyB9IC8vIFZlcnRpY2FsIEF4aXMKICAgICAgICAgICAgaWYgKG9yaWdpblsxXSA+PSAwICYmIG9yaWdpblsxXSA8PSBoKSB7IGN0eC5tb3ZlVG8oMCwgb3JpZ2luWzFdKTsgY3R4LmxpbmVUbyh3LCBvcmlnaW5bMV0pOyB9IC8vIEhvcml6b250YWwgQXhpcwogICAgICAgICAgICBjdHguc3Ryb2tlKCk7CgogICAgICAgICAgICAvLyBIZWxwZXIgdG8gdHJhY2UgbGluZXMKICAgICAgICAgICAgY29uc3QgdHJhY2UgPSAoZnVuYywgY29sb3IpID0+IHsKICAgICAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKTsKICAgICAgICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IGNvbG9yOwogICAgICAgICAgICAgICAgY3R4LmxpbmVXaWR0aCA9IDI7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSB3OyBpICs9IDIpIHsKICAgICAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIG1hcCBzY3JlZW4gcGl4ZWwgaSAoeC1heGlzKSBiYWNrIHRvIGxvZ2ljYWwgY29vcmRzCiAgICAgICAgICAgICAgICAgICAgLy8gV2FpdCwgZWFzaWVyIHRvIGl0ZXJhdGUgbG9naWNhbCB2YXJpYWJsZSAndicKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIEl0ZXJhdGUgbG9naWNhbCB2YXJpYWJsZSB2CiAgICAgICAgICAgICAgICBjb25zdCB2U3RlcCA9ICh2aWV3TWF4WCAtIHZpZXdNaW5YKSAvIDQwMDsKICAgICAgICAgICAgICAgIGZvciAobGV0IHYgPSB2aWV3TWluWDsgdiA8PSB2aWV3TWF4WDsgdiArPSB2U3RlcCkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IGZ1bmModik7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgW3N4LCBzeV0gPSB0b1NjcmVlbih2LCB2YWwpOwogICAgICAgICAgICAgICAgICAgIGlmICh2ID09PSB2aWV3TWluWCkgY3R4Lm1vdmVUbyhzeCwgc3kpOwogICAgICAgICAgICAgICAgICAgIGVsc2UgY3R4LmxpbmVUbyhzeCwgc3kpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY3R4LnN0cm9rZSgpOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gRHJhdyBBcmVhIChDbGlwIHJlZ2lvbikKICAgICAgICAgICAgY29uc3QgdlN0YXJ0ID0gTWF0aC5taW4oYSwgYik7CiAgICAgICAgICAgIGNvbnN0IHZFbmQgPSBNYXRoLm1heChhLCBiKTsKCiAgICAgICAgICAgIC8vIFdlIGRyYXcgdGhlIGNvbXBsZXggcG9seWdvbiBmb3JtZWQgYnkgZjEgYW5kIGYyIGJldHdlZW4gdlN0YXJ0IGFuZCB2RW5kCiAgICAgICAgICAgIC8vIFNpbmNlIHRoZXkgbWlnaHQgY3Jvc3MsIHdlIGNhbid0IGp1c3QgZmlsbCBvbmUgc2ltcGxlIGxvb3AuCiAgICAgICAgICAgIC8vIFdlIGZpbGwgc3RyaXBzIG9yIGNvbnN0cnVjdGluZyBhIHBhdGggdGhhdCBmb2xsb3dzIGYxIHRoZW4gcmV2ZXJzZXMgZjIKICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpOwogICAgICAgICAgICBjb25zdCBmaWxsU3RlcCA9ICh2RW5kIC0gdlN0YXJ0KSAvIDIwMDsKCiAgICAgICAgICAgIC8vIE1vdmUgdG8gc3RhcnQgb2YgZjEKICAgICAgICAgICAgY29uc3QgW3N0YXJ0U3gsIHN0YXJ0U3ldID0gdG9TY3JlZW4odlN0YXJ0LCBmMSh2U3RhcnQpKTsKICAgICAgICAgICAgY3R4Lm1vdmVUbyhzdGFydFN4LCBzdGFydFN5KTsKCiAgICAgICAgICAgIC8vIFRyYWNlIGYxIGZvcndhcmQKICAgICAgICAgICAgZm9yIChsZXQgdiA9IHZTdGFydDsgdiA8PSB2RW5kOyB2ICs9IGZpbGxTdGVwKSB7CiAgICAgICAgICAgICAgICBjb25zdCBbc3gsIHN5XSA9IHRvU2NyZWVuKHYsIGYxKHYpKTsKICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oc3gsIHN5KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gVHJhY2UgZjIgYmFja3dhcmQKICAgICAgICAgICAgZm9yIChsZXQgdiA9IHZFbmQ7IHYgPj0gdlN0YXJ0OyB2IC09IGZpbGxTdGVwKSB7CiAgICAgICAgICAgICAgICBjb25zdCBbc3gsIHN5XSA9IHRvU2NyZWVuKHYsIGYyKHYpKTsKICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oc3gsIHN5KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY3R4LmNsb3NlUGF0aCgpOwogICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gJ3JnYmEoMTU0LCAxMDMsIDIzNCwgMC4zKSc7CiAgICAgICAgICAgIGN0eC5maWxsKCk7CiAgICAgICAgICAgIC8vIFNpbmNlIHdlIGJsaW5kbHkgY29ubmVjdGVkIGYxIGFuZCBmMiwgdGhlIHdpbmRpbmcgcnVsZSAnbm9uemVybycgdXN1YWxseSBoYW5kbGVzIHRoZSAiaG9sZXMiIChleWUgc2hhcGVzKSBjb3JyZWN0bHkgaWYgdGhleSBjcm9zcyEKICAgICAgICAgICAgLy8gQWN0dWFsbHkgZm9yIGNhbnZhcyBmaWxsLCBzZWxmLWludGVyc2VjdGluZyBwYXRocyBkZXBlbmQgb24gd2luZGluZyBydWxlLgogICAgICAgICAgICAvLyBTdGFuZGFyZCBub24temVybyB3aW5kaW5nIHJ1bGUgZmlsbHMgYm90aCBwYXJ0cyBpZiB3ZSB0cmFjZSB0aGVtIGluIHNwZWNpZmljIGRpcmVjdGlvbnMuCiAgICAgICAgICAgIC8vIFRoaXMgc2ltcGxlIHBhdGggKGYxIGZvcndhcmQsIGYyIGJhY2t3YXJkKSBmb3JtcyBhIGZpZ3VyZS04IGlmIHRoZXkgY3Jvc3MuIEZpZ3VyZS04cyBmaWxsIGJvdGggbG9vcHMuIENvcnJlY3QuCgogICAgICAgICAgICAvLyBEcmF3IEN1cnZlcwogICAgICAgICAgICB0cmFjZShmMSwgJyM0Mjg1ZjQnKTsKICAgICAgICAgICAgdHJhY2UoZjIsICcjZWE0MzM1Jyk7CgogICAgICAgICAgICAvLyBEcmF3IExpbWl0cwogICAgICAgICAgICBjb25zdCBbYXgsIGF5XSA9IHRvU2NyZWVuKGEsIGYxKGEpKTsgLy8gSnVzdCBuZWVkICd2JyBjb29yZCByZWFsbHkKICAgICAgICAgICAgY29uc3QgW2J4LCBieV0gPSB0b1NjcmVlbihiLCBmMShiKSk7CgogICAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSAnIzY2Nic7CiAgICAgICAgICAgIGN0eC5zZXRMaW5lRGFzaChbNCwgNF0pOwogICAgICAgICAgICBjdHguYmVnaW5QYXRoKCk7CiAgICAgICAgICAgIGlmIChtb2RlID09PSAnZHgnKSB7CiAgICAgICAgICAgICAgICBjdHgubW92ZVRvKGF4LCAwKTsgY3R4LmxpbmVUbyhheCwgaCk7CiAgICAgICAgICAgICAgICBjdHgubW92ZVRvKGJ4LCAwKTsgY3R4LmxpbmVUbyhieCwgaCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBjdHgubW92ZVRvKDAsIGF5KTsgY3R4LmxpbmVUbyh3LCBheSk7CiAgICAgICAgICAgICAgICBjdHgubW92ZVRvKDAsIGJ5KTsgY3R4LmxpbmVUbyh3LCBieSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY3R4LnN0cm9rZSgpOwogICAgICAgICAgICBjdHguc2V0TGluZURhc2goW10pOwogICAgICAgIH0KCiAgICAgICAgLy8gSW5pdAogICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgKCkgPT4gewogICAgICAgICAgICB1cGRhdGVMYWJlbHMoKTsKICAgICAgICAgICAgc2V0VGltZW91dChmaW5kSW50ZXJzZWN0aW9ucywgNTAwKTsgLy8gQXV0by1maW5kIG9uIGxvYWQgZm9yIGRlbW8KICAgICAgICB9KTsKICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgZHJhdyk7CgogICAgPC9zY3JpcHQ+Cgo8L2JvZHk+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”;…

  • Area Using Cross Product Calculator – Triangle & Parallelogram Area

    Area Using Cross Product Calculator Find the area of a triangle or parallelogram using vector cross product. TriangleParallelogram Vector u x y z Vector v x y z CALCULATE Cross Product (u × v): Area: var vx = +document.getElementById(“vx”).value || 0; var vy = +document.getElementById(“vy”).value || 0; var vz = +document.getElementById(“vz”).value || 0; var cx…

  • Accurate Land Area Calculator for 4-Sided Plots — Square Feet, Acres & More

    Land Area Calculator (4 Sides) Land Area Calculator Accurate 4-Sided Plot Measurement Unit: Feet Meters Yards Mode: Exact (Diagonal) Approximate 1. Enter Dimensions Side A (Length) ft Side B (Width) ft Side C (Length) ft Side D (Width) ft Diagonal Length ft *Connects Corner A-B to C-D (splits plot into 2 triangles) Approximation Mode: Calculating…

  • Hollow Cylinder Calculator — Find Surface Area & Volume

    Pipe Area Calculator Calculate Surface Area, Coating, Fluid Vol & Weight. Dimension Input OD & ID OD & Thick Outer Diameter (OD) inftmmcm Pipe Length (L) ftinm 🏗️ Material & Applications Material (for Weight) Steel (7850 kg/m³)Copper (8940 kg/m³)PVC (1380 kg/m³)Aluminum (2700 kg/m³)— None — Coating Thickness (optional) mm Exterior Surface — sq ft Interior…

  • Aperture Area Calculator – Calculate Lens & Optical Opening Area

    Aperture Area Calculator Calculate lens opening size or telescope light gathering power. Photography Telescope Focal Length (mm) f-stop (Aperture) Aperture Diameter (mm) Calculate Aperture Area: 0.00 sq mm Diameter: 0.00 mm Light Factor: 0 function calculateAperture(){ var area=0,diam=0,light=0; if(mode===’photo’){ var f=+focal.value||0; var n=+fstop.value||0; if(f