{"id":1157,"date":"2026-10-17T20:05:32","date_gmt":"2026-10-17T14:35:32","guid":{"rendered":"https:\/\/codeanddebug.in\/blog\/?p=1157"},"modified":"2026-10-17T21:07:46","modified_gmt":"2026-10-17T15:37:46","slug":"how-to-learn-ai-ml-from-scratch-roadmap","status":"publish","type":"post","link":"https:\/\/codeanddebug.in\/blog\/how-to-learn-ai-ml-from-scratch-roadmap\/","title":{"rendered":"How to Learn AI and ML from Scratch in 2026: An Interactive Roadmap"},"content":{"rendered":"\n<style>.cdai{--cd-brand:#3c3fde;--cd-brand-soft:#eceeff;--cd-ink:#14162b;--cd-muted:#5b5f7a;--cd-line:#dfe1ee;--cd-card:#ffffff;--cd-bg:#f6f7fc;--cd-good:#0f8a5f;--cd-good-soft:#e3f6ee;--cd-bad:#c2410c;--cd-bad-soft:#fdebe1;--cd-warn:#b7791f;--cd-on-brand:#ffffff;\nfont-family:Inter,system-ui,-apple-system,\"Segoe UI\",Roboto,sans-serif;color:var(--cd-ink);background:var(--cd-bg);border:1px solid var(--cd-line);border-radius:14px;padding:22px;margin:28px 0;line-height:1.55;font-size:16px;box-sizing:border-box;max-width:100%;overflow:hidden}\n.s-dark .cdai,.cdai.cd-dark{--cd-brand:#8d90ff;--cd-brand-soft:#23254a;--cd-ink:#e8e9f5;--cd-muted:#a3a6c2;--cd-line:#32354f;--cd-card:#1b1d33;--cd-bg:#14162a;--cd-good:#4ccf98;--cd-good-soft:#163a2c;--cd-bad:#ff9a6b;--cd-bad-soft:#3d2316;--cd-warn:#f2c46b;--cd-on-brand:#0f1030}\n.cdai *,.cdai *::before,.cdai *::after{box-sizing:border-box}\n.cdai h4.cd-h{font-family:Outfit,Inter,sans-serif;font-size:1.25rem;font-weight:700;margin:0 0 4px;color:var(--cd-ink);line-height:1.3}\n.cdai .cd-sub{color:var(--cd-muted);font-size:.95rem;margin:0 0 16px}\n.cdai .cd-tag{display:inline-block;font-size:.72rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--cd-brand);background:var(--cd-brand-soft);padding:3px 9px;border-radius:99px;margin-bottom:10px}\n.cdai button.cd-btn,.cdai .cd-chip{font:inherit;font-size:.92rem;font-weight:600;cursor:pointer;border-radius:10px;border:1.5px solid var(--cd-line);background:var(--cd-card);color:var(--cd-ink);padding:9px 14px;line-height:1.3;transition:transform .15s ease,border-color .15s ease,background .15s ease;text-transform:none;letter-spacing:normal;box-shadow:none;margin:0;min-height:0;height:auto}\n.cdai button.cd-btn:hover,.cdai .cd-chip:hover{border-color:var(--cd-brand);transform:translateY(-1px)}\n.cdai button.cd-btn:focus-visible,.cdai .cd-chip:focus-visible,.cdai input:focus-visible{outline:3px solid var(--cd-brand);outline-offset:2px}\n.cdai .cd-primary,.cdai button.cd-primary{background:var(--cd-brand);border-color:var(--cd-brand);color:var(--cd-on-brand)}\n.cdai .cd-chip[aria-pressed=\"true\"]{background:var(--cd-brand);border-color:var(--cd-brand);color:var(--cd-on-brand)}\n.cdai .cd-row{display:flex;flex-wrap:wrap;gap:10px;align-items:center}\n.cdai .cd-grid2{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,230px),1fr));gap:12px}\n.cdai .cd-card{background:var(--cd-card);border:1px solid var(--cd-line);border-radius:12px;padding:14px}\n.cdai .cd-stat{font-family:Outfit,Inter,sans-serif;font-size:2rem;font-weight:700;color:var(--cd-brand);line-height:1.1;font-variant-numeric:tabular-nums}\n.cdai .cd-small{font-size:.85rem;color:var(--cd-muted)}\n.cdai label.cd-lab{font-weight:600;font-size:.92rem;display:flex;justify-content:space-between;gap:10px;margin:14px 0 6px}\n.cdai input[type=range]{width:100%;accent-color:var(--cd-brand);margin:0;height:28px;background:transparent;border:0;padding:0}\n.cdai canvas{display:block;width:100%;height:auto;border-radius:10px;background:var(--cd-card);border:1px solid var(--cd-line);touch-action:pan-y}\n\/* hero *\/\n.cdai.cd-hero{padding:0;position:relative;background:#101233;border-color:#24275a}\n.cdai.cd-hero canvas{border:0;border-radius:0;background:transparent;height:200px}\n.cdai.cd-hero .cd-hero-txt{position:absolute;left:0;right:0;bottom:0;padding:16px 20px;background:linear-gradient(transparent,rgba(16,18,51,.92) 55%);color:#fff}\n.cdai.cd-hero .cd-hero-txt b{font-family:Outfit,Inter,sans-serif;font-size:1.15rem}\n.cdai.cd-hero .cd-hero-txt span{display:block;color:#c9cbff;font-size:.9rem}\n\/* planner *\/\n.cdai .cd-timeline{display:flex;flex-direction:column;gap:7px;margin-top:6px}\n.cdai .cd-tl-row{display:grid;grid-template-columns:minmax(0,150px) 1fr 62px;gap:10px;align-items:center;font-size:.88rem}\n.cdai .cd-tl-name{font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n.cdai .cd-tl-name a{color:inherit;text-decoration:none}\n.cdai .cd-tl-name a:hover{color:var(--cd-brand)}\n.cdai .cd-tl-track{height:14px;background:var(--cd-brand-soft);border-radius:99px;overflow:hidden}\n.cdai .cd-tl-bar{height:100%;background:var(--cd-brand);border-radius:99px;width:0;transition:width .6s cubic-bezier(.2,.8,.2,1)}\n.cdai .cd-tl-bar.cd-skim{background:repeating-linear-gradient(45deg,var(--cd-brand),var(--cd-brand) 6px,transparent 6px,transparent 10px)}\n.cdai .cd-tl-w{text-align:right;font-variant-numeric:tabular-nums;color:var(--cd-muted)}\n.cdai .cd-prog{height:10px;border-radius:99px;background:var(--cd-brand-soft);overflow:hidden;margin-top:8px}\n.cdai .cd-prog i{display:block;height:100%;background:var(--cd-good);width:0;transition:width .4s ease}\n@media (max-width:520px){.cdai{padding:16px}.cdai .cd-tl-row{grid-template-columns:minmax(0,110px) 1fr 50px;font-size:.8rem}}\n\/* game *\/\n.cdai .cd-game-card{background:var(--cd-card);border:1px solid var(--cd-line);border-radius:12px;padding:18px;min-height:96px;font-size:1.05rem;font-weight:600;display:flex;align-items:center}\n.cdai .cd-feedback{margin-top:12px;padding:12px 14px;border-radius:10px;font-size:.93rem}\n.cdai .cd-feedback.cd-ok{background:var(--cd-good-soft);color:var(--cd-ink);border-left:4px solid var(--cd-good)}\n.cdai .cd-feedback.cd-no{background:var(--cd-bad-soft);color:var(--cd-ink);border-left:4px solid var(--cd-bad)}\n.cdai .cd-venn{position:relative;width:min(100%,300px);aspect-ratio:1\/1;margin:6px auto 0}\n.cdai .cd-venn div{position:absolute;border-radius:50%;border:2px solid var(--cd-brand);display:flex;justify-content:center;font-weight:700;font-size:.8rem;color:var(--cd-ink);padding-top:6px;transition:background .3s ease,transform .3s ease}\n.cdai .cd-venn div.cd-lit{background:var(--cd-brand-soft);transform:scale(1.03)}\n.cdai .cd-v1{inset:0}.cdai .cd-v2{inset:12%}.cdai .cd-v3{inset:26%}.cdai .cd-v4{inset:40%;align-items:center;padding-top:0!important}\n\/* checklist *\/\n.cdai.cd-check{padding:16px 18px;background:var(--cd-card)}\n.cdai.cd-check ul{list-style:none;margin:8px 0 0;padding:0}\n.cdai.cd-check li{margin:0;padding:0}\n.cdai.cd-check label{display:flex;gap:10px;align-items:flex-start;padding:7px 4px;cursor:pointer;font-size:.95rem;border-radius:8px}\n.cdai.cd-check label:hover{background:var(--cd-bg)}\n.cdai.cd-check input{width:18px;height:18px;margin-top:3px;accent-color:var(--cd-good);flex:none}\n.cdai.cd-check .cd-done{color:var(--cd-good);font-weight:700}\n\/* tokens *\/\n.cdai .cd-bars{display:flex;flex-direction:column;gap:6px;margin-top:10px}\n.cdai .cd-bar-row{display:grid;grid-template-columns:110px 1fr 52px;gap:10px;align-items:center;font-size:.9rem}\n.cdai .cd-bar-row b{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-weight:600}\n.cdai .cd-bar-row .cd-tl-bar{transition:width .35s ease}\n.cdai .cd-out{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;background:var(--cd-card);border:1px solid var(--cd-line);border-radius:10px;padding:12px;margin-top:12px;min-height:46px;font-size:.92rem;word-break:break-word}\n.cdai .cd-out mark{background:var(--cd-brand-soft);color:var(--cd-brand);padding:1px 4px;border-radius:4px;animation:cdpop .4s ease}\n@keyframes cdpop{from{transform:scale(1.4);opacity:0}to{transform:none;opacity:1}}\n.cdai .cd-meter{font-family:Outfit,Inter,sans-serif;font-weight:700;font-size:1.6rem;font-variant-numeric:tabular-nums}\n@media (prefers-reduced-motion:reduce){.cdai *{transition:none!important;animation:none!important}}\n<\/style>\n\n\n\n<p class=\"wp-block-paragraph\">Almost every week someone in our live classes asks the same question: where do I actually start with AI? Search for it and you get two kinds of answers. One is a list of 40 courses. The other is a roadmap image so packed it looks like the Mumbai local train map.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This guide gives you one path from zero to building real AI projects, in seven stages, in the order that makes each stage easier than the last. It is also interactive. Tell the planner below where you are starting from and how many hours you can give each week, and it works out how long each stage should take you and roughly when you will finish. You can tick off skills as you go, and the page remembers your progress on this device.<\/p>\n\n\n\n<div class=\"cdai cd-hero\" aria-hidden=\"true\"><canvas><\/canvas><div class=\"cd-hero-txt\"><b>Every AI model you use is layers of tiny maths, trained on data.<\/b><span>By stage 5 of this roadmap you will build one of these yourself.<\/span><\/div><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"cd-planner\">Build your personal AI and ML roadmap<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Pick the option that sounds most like you, then set how many hours a week you can realistically study. Be honest about the hours. Ten steady hours a week beats thirty hours for two weeks followed by nothing.<\/p>\n\n\n\n<div class=\"cdai cd-planner\">\n<span class=\"cd-tag\">Roadmap planner<\/span>\n<h4 class=\"cd-h\">Where are you starting from?<\/h4>\n<p class=\"cd-sub\">Your timeline updates instantly.<\/p>\n<div class=\"cd-row\" role=\"group\" aria-label=\"Your background\">\n<button type=\"button\" class=\"cd-chip\" data-p=\"newcoder\" aria-pressed=\"false\">Never coded before<\/button>\n<button type=\"button\" class=\"cd-chip\" data-p=\"student\" aria-pressed=\"true\">College student, know basic Python<\/button>\n<button type=\"button\" class=\"cd-chip\" data-p=\"developer\" aria-pressed=\"false\">Working software developer<\/button>\n<button type=\"button\" class=\"cd-chip\" data-p=\"nontech\" aria-pressed=\"false\">Non-tech background<\/button>\n<\/div>\n<label class=\"cd-lab\" for=\"cd-hours\"><span>Study time per week<\/span><span id=\"cd-hours-v\">10 hrs\/week<\/span><\/label>\n<input type=\"range\" id=\"cd-hours\" min=\"3\" max=\"30\" step=\"1\" value=\"10\">\n<div class=\"cd-grid2\" style=\"margin-top:16px\">\n<div class=\"cd-card\"><div class=\"cd-small\">Time to finish all 7 stages<\/div><div class=\"cd-stat\" id=\"cd-months\">~9 months<\/div><\/div>\n<div class=\"cd-card\"><div class=\"cd-small\">You could be building projects by<\/div><div class=\"cd-stat\" id=\"cd-finish\" style=\"font-size:1.5rem\">July 2027<\/div><div class=\"cd-small\">Total: <span id=\"cd-total-h\">380 hrs<\/span><\/div><\/div>\n<\/div>\n<p class=\"cd-small\" id=\"cd-note\" style=\"margin:14px 0 4px\"><\/p>\n<div class=\"cd-timeline\"><\/div>\n<p class=\"cd-small\" style=\"margin:12px 0 0\">Striped bars are stages you can skim. Tap a stage name to jump to it.<\/p>\n<div style=\"margin-top:16px\"><div class=\"cd-row\" style=\"justify-content:space-between\"><b style=\"font-size:.92rem\">Your progress<\/b><span class=\"cd-small cd-overall-txt\"><\/span><\/div><div class=\"cd-prog cd-overall\"><i><\/i><\/div><\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">These numbers are estimates for focused study, so treat them as a rough plan. Some topics will click in two days and others will take two weeks, which is normal.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"cd-ai-vs-ml\">AI vs machine learning vs deep learning vs generative AI<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">People use these four terms as if they mean the same thing. They are circles inside circles, and knowing which circle you are in tells you what to learn.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><strong>Artificial intelligence (AI)<\/strong> is the biggest circle: any program that does something we would call smart. A chess engine following hand-written rules counts.<\/li>\n\n\n<li><strong>Machine learning (ML)<\/strong> sits inside AI. Instead of writing the rules, you give the program examples and it learns the rules from data. Spam filters and loan approval models are ML.<\/li>\n\n\n<li><strong>Deep learning (DL)<\/strong> sits inside ML. It uses neural networks with many layers, and it is behind face unlock, speech recognition and translation.<\/li>\n\n\n<li><strong>Generative AI<\/strong> sits inside deep learning. These models create new text, images, audio or code. ChatGPT, Gemini, Claude and image generators all live here.<\/li>\n\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">The fastest way to make this stick is to test yourself. Read each example and pick the smallest circle it belongs to.<\/p>\n\n\n\n<div class=\"cdai cd-game\">\n<span class=\"cd-tag\">Quick game<\/span>\n<h4 class=\"cd-h\">AI, ML, deep learning or generative AI?<\/h4>\n<p class=\"cd-sub cd-score\">Question 1 of 8<\/p>\n<div class=\"cd-grid2\" style=\"align-items:center\">\n<div><div class=\"cd-game-card\">Loading\u2026<\/div>\n<div class=\"cd-row\" style=\"margin-top:12px\">\n<button type=\"button\" class=\"cd-btn cd-opt\" data-a=\"ai\">AI (rules)<\/button>\n<button type=\"button\" class=\"cd-btn cd-opt\" data-a=\"ml\">Machine learning<\/button>\n<button type=\"button\" class=\"cd-btn cd-opt\" data-a=\"dl\">Deep learning<\/button>\n<button type=\"button\" class=\"cd-btn cd-opt\" data-a=\"genai\">Generative AI<\/button>\n<\/div>\n<div class=\"cd-feedback\" hidden><\/div>\n<div style=\"margin-top:12px\"><button type=\"button\" class=\"cd-btn cd-primary cd-next\" hidden>Next question<\/button><\/div><\/div>\n<div class=\"cd-venn\" aria-hidden=\"true\"><div class=\"cd-v1\">AI<\/div><div class=\"cd-v2\">Machine learning<\/div><div class=\"cd-v3\">Deep learning<\/div><div class=\"cd-v4\">GenAI<\/div><\/div>\n<\/div><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"cd-roadmap\">The AI and ML roadmap, stage by stage<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The weeks mentioned below assume about 10 hours of study a week for someone who knows a little Python. Your own numbers are in the planner above. Each stage ends with a checklist. Tick a skill only when you could explain it to a friend without notes.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"cd-stage-1\">Stage 1: Python for AI (about 4 weeks)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Almost every AI library you will touch, from Pandas to PyTorch, is used through Python. You do not need to become a Python expert before moving on, but you should be comfortable enough that the language stops getting in your way.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Variables, data types, loops, conditions and functions<\/li>\n\n\n<li>Lists, tuples, dictionaries and sets, and when to use each<\/li>\n\n\n<li>List comprehensions, reading and writing files, handling errors with try and except<\/li>\n\n\n<li>Basic classes and objects, because most ML libraries are built around them<\/li>\n\n\n<li>Installing packages with pip, virtual environments, and working in Jupyter or Google Colab<\/li>\n\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Write lots of small programs. Classic beginner problems like checking a <a href=\"https:\/\/codeanddebug.in\/blog\/palindrome-number-program-in-python\/\">palindrome number in Python<\/a> or an <a href=\"https:\/\/codeanddebug.in\/blog\/python-program-to-check-armstrong-number\/\">Armstrong number<\/a> look simple, but they train exactly the loop and logic skills you will lean on later.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Milestone project:<\/strong> a script that reads a CSV of student marks, finds the toppers in each subject and writes a short report to a new file.<\/p>\n\n\n\n<div class=\"cdai cd-check\" data-key=\"s1\"><div class=\"cd-row\" style=\"justify-content:space-between\"><span class=\"cd-tag\" style=\"margin:0\">Stage 1 checklist<\/span><span class=\"cd-small cd-check-count\"><\/span><\/div><ul><li><label><input type=\"checkbox\"> <span>I can write functions with loops and conditions without looking up syntax<\/span><\/label><\/li><li><label><input type=\"checkbox\"> <span>I know when to use a list, a dict or a set<\/span><\/label><\/li><li><label><input type=\"checkbox\"> <span>I can read a CSV file and handle errors in my code<\/span><\/label><\/li><li><label><input type=\"checkbox\"> <span>I have run code in Jupyter or Google Colab<\/span><\/label><\/li><\/ul><\/div>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"cd-stage-2\">Stage 2: The math you actually need (about 5 weeks)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">This is the stage people either skip or get stuck in forever. The goal is to look at a model and understand what it is doing to the numbers. Proofs can wait.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><strong>Linear algebra:<\/strong> vectors, matrices, the dot product and matrix multiplication. A neural network layer is basically one big matrix multiplication.<\/li>\n\n\n<li><strong>Probability and statistics:<\/strong> mean, variance, standard deviation, common distributions, conditional probability and Bayes&#8217; theorem. Every model&#8217;s output is a guess with some uncertainty.<\/li>\n\n\n<li><strong>Calculus:<\/strong> what a derivative means, the gradient, and the chain rule. This is how models learn.<\/li>\n\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">That last point is the single most important idea in machine learning, so here it is as something you can play with. A model starts with a bad guess for a weight and keeps stepping downhill on its error curve until it reaches the bottom. The size of each step is called the learning rate.<\/p>\n\n\n\n<div class=\"cdai cd-gd\">\n<span class=\"cd-tag\">Try it<\/span>\n<h4 class=\"cd-h\">Gradient descent: how a model learns<\/h4>\n<p class=\"cd-sub\">Press Run, then try a learning rate above 2 and watch what happens.<\/p>\n<canvas><\/canvas>\n<label class=\"cd-lab\" for=\"cd-lr\"><span>Learning rate<\/span><span id=\"cd-lr-v\">0.10<\/span><\/label>\n<input type=\"range\" id=\"cd-lr\" min=\"0.01\" max=\"2.2\" step=\"0.01\" value=\"0.1\">\n<div class=\"cd-row\" style=\"margin-top:10px\"><button type=\"button\" class=\"cd-btn cd-primary cd-gd-run\">Run<\/button><button type=\"button\" class=\"cd-btn cd-gd-step\">One step<\/button><button type=\"button\" class=\"cd-btn cd-gd-reset\">Reset<\/button><span class=\"cd-small\">Steps: <b class=\"cd-gd-steps\">0<\/b> | Error: <b class=\"cd-gd-loss\">0<\/b><\/span><\/div>\n<p class=\"cd-small cd-gd-msg\" style=\"margin:10px 0 0\"><\/p>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">If the learning rate is too small, training crawls. If it is too large, the model overshoots and the error explodes. Tuning this one number is a routine part of an ML engineer&#8217;s work.<\/p>\n\n\n\n<div class=\"cdai cd-check\" data-key=\"s2\"><div class=\"cd-row\" style=\"justify-content:space-between\"><span class=\"cd-tag\" style=\"margin:0\">Stage 2 checklist<\/span><span class=\"cd-small cd-check-count\"><\/span><\/div><ul><li><label><input type=\"checkbox\"> <span>I can multiply two small matrices by hand<\/span><\/label><\/li><li><label><input type=\"checkbox\"> <span>I can explain mean, variance and a normal distribution<\/span><\/label><\/li><li><label><input type=\"checkbox\"> <span>I understand what a derivative and a gradient tell us<\/span><\/label><\/li><li><label><input type=\"checkbox\"> <span>I can explain gradient descent and the learning rate in my own words<\/span><\/label><\/li><\/ul><\/div>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"cd-stage-3\">Stage 3: Data skills (about 4 weeks)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Real data is messy. Columns are missing, dates are in five formats and someone typed &#8220;N\/A&#8221; into a number field. Data scientists often say most of the job is cleaning and understanding data, and after your first real dataset you will agree.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><strong>NumPy<\/strong> for fast arrays and vectorised maths<\/li>\n\n\n<li><strong>Pandas<\/strong> for loading, filtering, grouping and cleaning tables. Our <a href=\"https:\/\/codeanddebug.in\/blog\/pandas-python-roadmap\/\">Pandas roadmap for beginners<\/a> covers this stage in detail.<\/li>\n\n\n<li><strong>Matplotlib and Seaborn<\/strong> for charts that help you spot patterns<\/li>\n\n\n<li><strong>SQL basics<\/strong>, because company data usually lives in databases, not CSV files<\/li>\n\n\n<li>Exploratory data analysis (EDA): handling missing values, outliers and duplicates<\/li>\n\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Milestone project:<\/strong> pick a public dataset you actually care about, such as IPL match results or Indian city weather, clean it and publish five charts that answer five questions.<\/p>\n\n\n\n<div class=\"cdai cd-check\" data-key=\"s3\"><div class=\"cd-row\" style=\"justify-content:space-between\"><span class=\"cd-tag\" style=\"margin:0\">Stage 3 checklist<\/span><span class=\"cd-small cd-check-count\"><\/span><\/div><ul><li><label><input type=\"checkbox\"> <span>I can load, filter and group data in Pandas<\/span><\/label><\/li><li><label><input type=\"checkbox\"> <span>I can handle missing values and duplicates<\/span><\/label><\/li><li><label><input type=\"checkbox\"> <span>I can make a chart that answers a specific question<\/span><\/label><\/li><li><label><input type=\"checkbox\"> <span>I can write SELECT queries with WHERE, GROUP BY and JOIN<\/span><\/label><\/li><\/ul><\/div>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"cd-stage-4\">Stage 4: Core machine learning (about 7 weeks)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Now the fun starts. Machine learning splits into two big families. In <strong>supervised learning<\/strong> you have the answers for past data, like house prices or whether a loan was repaid, and the model learns to predict them for new data. In <strong>unsupervised learning<\/strong> there are no answers, and the model finds structure on its own, such as groups of similar customers.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Linear and logistic regression, decision trees, random forests and gradient boosting (XGBoost, LightGBM)<\/li>\n\n\n<li>K-nearest neighbours, support vector machines, k-means clustering and PCA<\/li>\n\n\n<li>Train, validation and test splits, cross-validation, overfitting and underfitting<\/li>\n\n\n<li>Metrics: accuracy, precision, recall, F1 score, RMSE, and when each one misleads you<\/li>\n\n\n<li>Feature engineering and building full pipelines with scikit-learn<\/li>\n\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Linear regression is where everyone starts, and it is simpler than it sounds. You draw the straight line that sits as close as possible to all the points. The red lines below are the errors. Training a model means finding the line that makes them smallest.<\/p>\n\n\n\n<div class=\"cdai cd-fit\">\n<span class=\"cd-tag\">Try it<\/span>\n<h4 class=\"cd-h\">Be the model: fit the line<\/h4>\n<p class=\"cd-sub\">Sample flats: size vs price. Move the sliders to shrink the errors, then let the model do it.<\/p>\n<canvas><\/canvas>\n<label class=\"cd-lab\" for=\"cd-m\"><span>Slope (price per sq ft)<\/span><span id=\"cd-m-v\"><\/span><\/label>\n<input type=\"range\" id=\"cd-m\" min=\"0\" max=\"0.12\" step=\"0.001\" value=\"0.02\">\n<label class=\"cd-lab\" for=\"cd-b\"><span>Intercept (starting price)<\/span><span id=\"cd-b-v\"><\/span><\/label>\n<input type=\"range\" id=\"cd-b\" min=\"-40\" max=\"80\" step=\"0.5\" value=\"40\">\n<div class=\"cd-row\" style=\"margin-top:12px;justify-content:space-between\"><div><span class=\"cd-small\">Average squared error<\/span><div class=\"cd-meter cd-fit-err\">0<\/div><\/div><div class=\"cd-row\"><button type=\"button\" class=\"cd-btn cd-primary cd-fit-auto\">Let the model fit it<\/button><button type=\"button\" class=\"cd-btn cd-fit-reset\">Reset<\/button><\/div><\/div>\n<p class=\"cd-small cd-fit-msg\" style=\"margin:10px 0 0\"><\/p>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Under the hood, scikit-learn finds that line with the same gradient descent idea from stage 2. Most of classic machine learning works this way: pick a model, define the error, and minimise it. For the full picture, with formulas, assumptions and Python code, read our <a href=\"https:\/\/codeanddebug.in\/blog\/linear-regression-in-machine-learning\/\">linear regression guide<\/a> and then the <a href=\"https:\/\/codeanddebug.in\/blog\/logistic-regression-in-machine-learning\/\">logistic regression guide<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Milestone project:<\/strong> an end-to-end model that predicts flat prices or loan default from a public dataset, with a proper train and test split and a short write-up of which features mattered.<\/p>\n\n\n\n<div class=\"cdai cd-check\" data-key=\"s4\"><div class=\"cd-row\" style=\"justify-content:space-between\"><span class=\"cd-tag\" style=\"margin:0\">Stage 4 checklist<\/span><span class=\"cd-small cd-check-count\"><\/span><\/div><ul><li><label><input type=\"checkbox\"> <span>I can explain the difference between supervised and unsupervised learning<\/span><\/label><\/li><li><label><input type=\"checkbox\"> <span>I have trained and compared at least three models in scikit-learn<\/span><\/label><\/li><li><label><input type=\"checkbox\"> <span>I can spot overfitting and know two ways to reduce it<\/span><\/label><\/li><li><label><input type=\"checkbox\"> <span>I know when to use precision and recall instead of accuracy<\/span><\/label><\/li><\/ul><\/div>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"cd-stage-5\">Stage 5: Deep learning (about 7 weeks)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Deep learning stacks many simple units, called neurons, into layers. Each neuron multiplies its inputs by weights, adds a bias and passes the result through an activation function. Try it below with a neuron that guesses whether a student will pass an exam.<\/p>\n\n\n\n<div class=\"cdai cd-neuron\">\n<span class=\"cd-tag\">Try it<\/span>\n<h4 class=\"cd-h\">One artificial neuron<\/h4>\n<p class=\"cd-sub\">Change the inputs and weights. Training a network means the computer adjusts these weights for you, millions of times.<\/p>\n<div class=\"cd-grid2\">\n<div><label class=\"cd-lab\" for=\"cd-x1\"><span>Input: hours studied<\/span><span id=\"cd-x1-v\"><\/span><\/label><input type=\"range\" id=\"cd-x1\" min=\"0\" max=\"10\" step=\"1\" value=\"6\">\n<label class=\"cd-lab\" for=\"cd-x2\"><span>Input: hours slept<\/span><span id=\"cd-x2-v\"><\/span><\/label><input type=\"range\" id=\"cd-x2\" min=\"0\" max=\"10\" step=\"1\" value=\"7\"><\/div>\n<div><label class=\"cd-lab\" for=\"cd-w1\"><span>Weight for study<\/span><span id=\"cd-w1-v\"><\/span><\/label><input type=\"range\" id=\"cd-w1\" min=\"-2\" max=\"2\" step=\"0.1\" value=\"0.8\">\n<label class=\"cd-lab\" for=\"cd-w2\"><span>Weight for sleep<\/span><span id=\"cd-w2-v\"><\/span><\/label><input type=\"range\" id=\"cd-w2\" min=\"-2\" max=\"2\" step=\"0.1\" value=\"0.4\">\n<label class=\"cd-lab\" for=\"cd-bias\"><span>Bias<\/span><span id=\"cd-bias-v\"><\/span><\/label><input type=\"range\" id=\"cd-bias\" min=\"-10\" max=\"5\" step=\"0.5\" value=\"-6\"><\/div>\n<\/div>\n<div class=\"cd-card\" style=\"margin-top:14px\"><div class=\"cd-small\">Weighted sum<\/div><div style=\"font-family:ui-monospace,Menlo,Consolas,monospace;font-size:.9rem;margin:4px 0 10px\" class=\"cd-neu-z\"><\/div>\n<div class=\"cd-row\" style=\"justify-content:space-between\"><span class=\"cd-small\">After sigmoid activation: chance of passing<\/span><span class=\"cd-meter cd-neu-p\"><\/span><\/div>\n<div class=\"cd-tl-track\" style=\"margin-top:6px\"><div class=\"cd-tl-bar cd-neu-bar\"><\/div><\/div><\/div>\n<\/div>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Neurons, layers, activation functions, loss functions and backpropagation<\/li>\n\n\n<li>One framework properly. We recommend PyTorch since most current research and tutorials use it, though TensorFlow with Keras is fine too<\/li>\n\n\n<li>Convolutional neural networks (CNNs) for images<\/li>\n\n\n<li>Sequence models and, most importantly, the attention mechanism and transformers, which power every modern LLM<\/li>\n\n\n<li>Training on free GPUs through Google Colab or Kaggle notebooks<\/li>\n\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Milestone project:<\/strong> an image classifier, for example one that tells apart ten kinds of Indian street food, trained with transfer learning on a free GPU.<\/p>\n\n\n\n<div class=\"cdai cd-check\" data-key=\"s5\"><div class=\"cd-row\" style=\"justify-content:space-between\"><span class=\"cd-tag\" style=\"margin:0\">Stage 5 checklist<\/span><span class=\"cd-small cd-check-count\"><\/span><\/div><ul><li><label><input type=\"checkbox\"> <span>I can explain what one neuron and one layer compute<\/span><\/label><\/li><li><label><input type=\"checkbox\"> <span>I have trained a neural network in PyTorch or TensorFlow<\/span><\/label><\/li><li><label><input type=\"checkbox\"> <span>I understand backpropagation at the level of the chain rule<\/span><\/label><\/li><li><label><input type=\"checkbox\"> <span>I can explain what attention does in a transformer<\/span><\/label><\/li><\/ul><\/div>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"cd-stage-6\">Stage 6: Generative AI and LLMs (about 5 weeks)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">This is the stage everyone wants to jump to first. It is far easier to learn now, because you already know what a neural network and a transformer are. A large language model is a transformer trained to do one thing: predict the next token, which is a word or piece of a word, given everything before it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">When a chatbot answers you, it repeats that prediction over and over. A setting called <strong>temperature<\/strong> controls how adventurous each pick is. Try it below. The probabilities here are a simplified toy example, but the mechanism is the real one.<\/p>\n\n\n\n<div class=\"cdai cd-token\">\n<span class=\"cd-tag\">Try it<\/span>\n<h4 class=\"cd-h\">How an LLM picks the next word<\/h4>\n<p class=\"cd-sub\">Choose a prompt, move the temperature and press Generate a few times.<\/p>\n<div class=\"cd-row\" role=\"group\" aria-label=\"Prompt\">\n<button type=\"button\" class=\"cd-chip cd-prompt\" aria-pressed=\"true\">I want to learn machine\u2026<\/button>\n<button type=\"button\" class=\"cd-chip cd-prompt\" aria-pressed=\"false\">Best way to prepare for placements\u2026<\/button>\n<button type=\"button\" class=\"cd-chip cd-prompt\" aria-pressed=\"false\">Chai tastes best with\u2026<\/button>\n<\/div>\n<label class=\"cd-lab\" for=\"cd-temp\"><span>Temperature<\/span><span id=\"cd-temp-v\">1.0<\/span><\/label>\n<input type=\"range\" id=\"cd-temp\" min=\"0.1\" max=\"2.5\" step=\"0.1\" value=\"1\">\n<div class=\"cd-bars\"><\/div>\n<p class=\"cd-small cd-temp-msg\" style=\"margin:10px 0 0\"><\/p>\n<div class=\"cd-row\" style=\"margin-top:10px\"><button type=\"button\" class=\"cd-btn cd-primary cd-sample\">Generate next word<\/button><\/div>\n<div class=\"cd-out\" aria-live=\"polite\"><\/div>\n<\/div>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>How LLMs work: tokens, embeddings, attention, pre-training and fine-tuning<\/li>\n\n\n<li>Prompt engineering: clear instructions, examples, and asking for structured output<\/li>\n\n\n<li>Using model APIs from providers like OpenAI, Google and Anthropic, plus open models from Hugging Face<\/li>\n\n\n<li>Embeddings and vector databases, and RAG (retrieval augmented generation), which lets a model answer from your own documents<\/li>\n\n\n<li>Fine-tuning basics with LoRA, and AI agents that can call tools and APIs to finish multi-step tasks<\/li>\n\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Milestone project:<\/strong> a chatbot that answers questions from your own college notes or a company policy PDF using RAG, with a simple web interface.<\/p>\n\n\n\n<div class=\"cdai cd-check\" data-key=\"s6\"><div class=\"cd-row\" style=\"justify-content:space-between\"><span class=\"cd-tag\" style=\"margin:0\">Stage 6 checklist<\/span><span class=\"cd-small cd-check-count\"><\/span><\/div><ul><li><label><input type=\"checkbox\"> <span>I can explain tokens, next-token prediction and temperature<\/span><\/label><\/li><li><label><input type=\"checkbox\"> <span>I have called an LLM API from Python<\/span><\/label><\/li><li><label><input type=\"checkbox\"> <span>I understand embeddings and can build a basic RAG pipeline<\/span><\/label><\/li><li><label><input type=\"checkbox\"> <span>I know what an AI agent and tool calling are<\/span><\/label><\/li><\/ul><\/div>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"cd-stage-7\">Stage 7: Projects and portfolio (about 6 weeks, then ongoing)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Recruiters look for people who can show working things. Two or three solid projects that solve a real problem will do more for you than ten copies of the Titanic tutorial.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Deploy your models so anyone can use them, with Streamlit, Gradio or FastAPI, and host demos free on Hugging Face Spaces<\/li>\n\n\n<li>Write a clean GitHub README for every project: the problem, the data, the approach, results, and what you would improve<\/li>\n\n\n<li>Join a Kaggle competition, even if you finish in the middle of the leaderboard<\/li>\n\n\n<li>Write about what you built on LinkedIn or a blog. You will explain your work in every interview anyway<\/li>\n\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Many AI and ML interviews in India still include a coding round, so keep your problem solving sharp alongside your projects. Our <a href=\"https:\/\/codeanddebug.in\/blog\/dsa-interview-cheat-sheet\/\">DSA interview cheat sheet<\/a> and the guide on <a href=\"https:\/\/codeanddebug.in\/blog\/time-complexity-and-space-complexity\/\">time and space complexity<\/a> are good places to start.<\/p>\n\n\n\n<div class=\"cdai cd-check\" data-key=\"s7\"><div class=\"cd-row\" style=\"justify-content:space-between\"><span class=\"cd-tag\" style=\"margin:0\">Stage 7 checklist<\/span><span class=\"cd-small cd-check-count\"><\/span><\/div><ul><li><label><input type=\"checkbox\"> <span>I have at least two deployed projects with a public link<\/span><\/label><\/li><li><label><input type=\"checkbox\"> <span>Each project has a clear README with results<\/span><\/label><\/li><li><label><input type=\"checkbox\"> <span>I have taken part in at least one Kaggle competition<\/span><\/label><\/li><li><label><input type=\"checkbox\"> <span>I can walk someone through any of my projects in five minutes<\/span><\/label><\/li><\/ul><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"cd-how-long\">How long does it take to learn AI and ML from scratch?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">For a college student who already knows basic Python and studies about 10 hours a week, the full roadmap takes around 8 to 9 months. Starting from zero coding experience adds roughly two months. A working developer who can give 15 hours a week can often finish in about 6 months.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">What matters more than speed is not stopping. Most people who quit do it between stage 2 and stage 4, when the maths feels abstract and the projects have not started yet. If you hit that wall, jump ahead and build a small model with scikit-learn. Seeing something work is the best motivation to go back and understand why.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"cd-mistakes\">Mistakes that slow most learners down<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><strong>Watching tutorials without building anything.<\/strong> If you finish a video and cannot rebuild the code from a blank notebook, go back and build it before moving on.<\/li>\n\n\n<li><strong>Skipping the maths completely, or trying to learn all of it first.<\/strong> Learn the minimum from stage 2, then come back to topics as they show up in models.<\/li>\n\n\n<li><strong>Jumping straight to LLMs.<\/strong> You can call an API in a day, but you will struggle the moment something breaks if you do not understand the stages underneath.<\/li>\n\n\n<li><strong>Never finishing or deploying a project.<\/strong> A half-done notebook does not count for much. A live demo link does.<\/li>\n\n\n<li><strong>Learning alone with no feedback.<\/strong> Join a study group, a Discord or a live class so someone can tell you when you are stuck on the wrong problem.<\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"cd-start-check\">Not sure where to start? Take the 30-second check<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Answer honestly. The first time you say &#8220;not yet&#8221; is your starting stage.<\/p>\n\n\n\n<div class=\"cdai cd-quiz\">\n<span class=\"cd-tag\">Self check<\/span>\n<h4 class=\"cd-h\">Which stage should you start at?<\/h4>\n<div class=\"cd-quiz-body\"><p class=\"cd-sub\">Six yes or no questions. Nothing is saved or sent anywhere.<\/p><button type=\"button\" class=\"cd-btn cd-primary cd-quiz-start\">Start the check<\/button><\/div>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"cd-faq\">Frequently asked questions<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Can I learn AI and ML without a computer science degree?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Yes. Most of what you need is Python, some school-level maths and a lot of practice. Plenty of people in AI roles came from mechanical, electrical, commerce or science backgrounds. A degree helps with some employers, but projects and skills carry most of the weight.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Do I need to be good at maths to learn machine learning?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">You need to be comfortable with the basics: vectors and matrices, mean and variance, probability, and what a derivative means. You do not need advanced proofs. Libraries do the heavy calculations, and your job is to understand what they are doing.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Which programming language is best for AI?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Python. Almost every major AI library, including NumPy, Pandas, scikit-learn, PyTorch and TensorFlow, is built for Python first. SQL is a useful second skill because real company data lives in databases.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">How long does it take to learn machine learning?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">With about 10 hours a week and basic Python, expect around 8 to 9 months to cover the full path from foundations to deployed projects. Use the planner at the top of this page for an estimate based on your background and schedule.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Can I learn deep learning without a powerful laptop or GPU?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Yes. Google Colab and Kaggle notebooks give you free GPU time in the browser, which is enough for learning and for most portfolio projects. Any laptop that runs a modern browser is enough to start.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Should I learn generative AI first since it is the trend?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">You can play with ChatGPT, Gemini or Claude right away, but to build serious GenAI applications you need the earlier stages. People who understand embeddings, transformers and evaluation build far better LLM apps than people who only know prompts.<\/p>\n\n\n\n<script type=\"application\/ld+json\">{\"@context\": \"https:\/\/schema.org\", \"@type\": \"FAQPage\", \"mainEntity\": [{\"@type\": \"Question\", \"name\": \"Can I learn AI and ML without a computer science degree?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"Yes. Most of what you need is Python, some school-level maths and a lot of practice. Plenty of people in AI roles came from mechanical, electrical, commerce or science backgrounds. A degree helps with some employers, but projects and skills carry most of the weight.\"}}, {\"@type\": \"Question\", \"name\": \"Do I need to be good at maths to learn machine learning?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"You need to be comfortable with the basics: vectors and matrices, mean and variance, probability, and what a derivative means. You do not need advanced proofs. Libraries do the heavy calculations, and your job is to understand what they are doing.\"}}, {\"@type\": \"Question\", \"name\": \"Which programming language is best for AI?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"Python. Almost every major AI library, including NumPy, Pandas, scikit-learn, PyTorch and TensorFlow, is built for Python first. SQL is a useful second skill because real company data lives in databases.\"}}, {\"@type\": \"Question\", \"name\": \"How long does it take to learn machine learning?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"With about 10 hours a week and basic Python, expect around 8 to 9 months to cover the full path from foundations to deployed projects. Use the planner at the top of this page for an estimate based on your background and schedule.\"}}, {\"@type\": \"Question\", \"name\": \"Can I learn deep learning without a powerful laptop or GPU?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"Yes. Google Colab and Kaggle notebooks give you free GPU time in the browser, which is enough for learning and for most portfolio projects. Any laptop that runs a modern browser is enough to start.\"}}, {\"@type\": \"Question\", \"name\": \"Should I learn generative AI first since it is the trend?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"You can play with ChatGPT, Gemini or Claude right away, but to build serious GenAI applications you need the earlier stages. People who understand embeddings, transformers and evaluation build far better LLM apps than people who only know prompts.\"}}]}<\/script>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"cd-next\">Your next step<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Scroll back to the planner, pick your starting point and put the first study block in your calendar for this week. Start with stage 1 even if it feels basic. The checklists will tell you quickly whether you can move on, and every stage after it gets easier because of it.<\/p>\n\n\n\n<script src=\"data:text\/javascript;base64,KGZ1bmN0aW9uKCl7CiJ1c2Ugc3RyaWN0IjsKdmFyIFJNPXdpbmRvdy5tYXRjaE1lZGlhJiZ3aW5kb3cubWF0Y2hNZWRpYSgiKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSkiKS5tYXRjaGVzOwpmdW5jdGlvbiAkKHMscil7cmV0dXJuIChyfHxkb2N1bWVudCkucXVlcnlTZWxlY3RvcihzKX0KZnVuY3Rpb24gJCQocyxyKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoKHJ8fGRvY3VtZW50KS5xdWVyeVNlbGVjdG9yQWxsKHMpKX0KZnVuY3Rpb24gc3RvcmUoayx2KXt0cnl7aWYodj09PXVuZGVmaW5lZCl7cmV0dXJuIEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oImNkYWlfIitrKSl9bG9jYWxTdG9yYWdlLnNldEl0ZW0oImNkYWlfIitrLEpTT04uc3RyaW5naWZ5KHYpKX1jYXRjaChlKXtyZXR1cm4gbnVsbH19CmZ1bmN0aW9uIGNzcyhlbCxuKXtyZXR1cm4gZ2V0Q29tcHV0ZWRTdHlsZShlbCkuZ2V0UHJvcGVydHlWYWx1ZShuKS50cmltKCl9CmZ1bmN0aW9uIHNldHVwQ2FudmFzKGN2LGgpe3ZhciBkcHI9TWF0aC5taW4od2luZG93LmRldmljZVBpeGVsUmF0aW98fDEsMik7dmFyIHc9Y3YuY2xpZW50V2lkdGh8fDYwMDtjdi53aWR0aD13KmRwcjtjdi5oZWlnaHQ9aCpkcHI7Y3Yuc3R5bGUuaGVpZ2h0PWgrInB4Ijt2YXIgYz1jdi5nZXRDb250ZXh0KCIyZCIpO2Muc2V0VHJhbnNmb3JtKGRwciwwLDAsZHByLDAsMCk7cmV0dXJuIHtjOmMsdzp3LGg6aH19CmZ1bmN0aW9uIHZpc2libGUoZWwsY2Ipe2lmKCEoIkludGVyc2VjdGlvbk9ic2VydmVyIiBpbiB3aW5kb3cpKXtjYih0cnVlKTtyZXR1cm59bmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGZ1bmN0aW9uKGVzKXtlcy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2NiKGUuaXNJbnRlcnNlY3RpbmcpfSl9KS5vYnNlcnZlKGVsKX0KCi8qIC0tLS0tLS0tLS0gSEVSTzogYW5pbWF0ZWQgbmV1cmFsIG5ldHdvcmsgLS0tLS0tLS0tLSAqLwp2YXIgaGVybz0kKCIuY2RhaS5jZC1oZXJvIik7CmlmKGhlcm8peyhmdW5jdGlvbigpewogdmFyIGN2PSQoImNhbnZhcyIsaGVybyksUyxub2Rlcz1bXSxsYXllcnM9WzQsNiw2LDNdLHJ1bj10cnVlLHQwPTAscHVsc2VzPVtdOwogZnVuY3Rpb24gYnVpbGQoKXtTPXNldHVwQ2FudmFzKGN2LDIwMCk7bm9kZXM9W107bGF5ZXJzLmZvckVhY2goZnVuY3Rpb24obixsaSl7Zm9yKHZhciBpPTA7aTxuO2krKyl7bm9kZXMucHVzaCh7bDpsaSx4OlMudyooMC4xMitsaSowLjc2LyhsYXllcnMubGVuZ3RoLTEpKSx5OjIwMCooKGkrMSkvKG4rMSkpLTE0LHA6TWF0aC5yYW5kb20oKSo2fSl9fSl9CiBmdW5jdGlvbiBlZGdlcygpe3ZhciBlPVtdO25vZGVzLmZvckVhY2goZnVuY3Rpb24oYSl7bm9kZXMuZm9yRWFjaChmdW5jdGlvbihiKXtpZihiLmw9PT1hLmwrMSllLnB1c2goW2EsYl0pfSl9KTtyZXR1cm4gZX0KIHZhciBFOwogZnVuY3Rpb24gZnJhbWUodCl7aWYoIXJ1bilyZXR1cm47dmFyIGM9Uy5jO2MuY2xlYXJSZWN0KDAsMCxTLncsUy5oKTsKICBjLmxpbmVXaWR0aD0xO0UuZm9yRWFjaChmdW5jdGlvbihlKXtjLnN0cm9rZVN0eWxlPSJyZ2JhKDE0MSwxNDQsMjU1LDAuMTYpIjtjLmJlZ2luUGF0aCgpO2MubW92ZVRvKGVbMF0ueCxlWzBdLnkpO2MubGluZVRvKGVbMV0ueCxlWzFdLnkpO2Muc3Ryb2tlKCl9KTsKICBpZighUk0mJk1hdGgucmFuZG9tKCk8MC4xOCl7dmFyIHM9RVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqRS5sZW5ndGgpXTtpZihzWzBdLmw9PT0wfHxNYXRoLnJhbmRvbSgpPDAuNSlwdWxzZXMucHVzaCh7ZTpzLGs6MH0pfQogIHB1bHNlcz1wdWxzZXMuZmlsdGVyKGZ1bmN0aW9uKHApe3Auays9MC4wMjU7dmFyIGE9cC5lWzBdLGI9cC5lWzFdLHg9YS54KyhiLngtYS54KSpwLmsseT1hLnkrKGIueS1hLnkpKnAuaztjLmZpbGxTdHlsZT0icmdiYSgxODAsMTgyLDI1NSwiKygxLXAuayowLjYpKyIpIjtjLmJlZ2luUGF0aCgpO2MuYXJjKHgseSwyLjQsMCw3KTtjLmZpbGwoKTtpZihwLms+PTEpe2IucD0wO2lmKGIubDxsYXllcnMubGVuZ3RoLTEmJk1hdGgucmFuZG9tKCk8MC43KXtFLmZvckVhY2goZnVuY3Rpb24oZTIpe2lmKGUyWzBdPT09YiYmTWF0aC5yYW5kb20oKTwwLjM1KXB1bHNlcy5wdXNoKHtlOmUyLGs6MH0pfSl9fXJldHVybiBwLms8MX0pOwogIG5vZGVzLmZvckVhY2goZnVuY3Rpb24obil7bi5wKz0wLjA1O3ZhciBnbG93PU1hdGgubWF4KDAsMS1uLnAvMyk7Yy5maWxsU3R5bGU9InJnYmEoNjAsNjMsMjIyLCIrKDAuNTUrZ2xvdyowLjQ1KSsiKSI7Yy5iZWdpblBhdGgoKTtjLmFyYyhuLngsbi55LDYrZ2xvdyozLDAsNyk7Yy5maWxsKCk7Yy5zdHJva2VTdHlsZT0icmdiYSgyMDEsMjAzLDI1NSwiKygwLjUrZ2xvdyowLjUpKyIpIjtjLmxpbmVXaWR0aD0xLjU7Yy5zdHJva2UoKX0pOwogIGlmKCFSTSlyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnJhbWUpfQogYnVpbGQoKTtFPWVkZ2VzKCk7cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZyYW1lKTsKIHZpc2libGUoaGVybyxmdW5jdGlvbih2KXt2YXIgd2FzPXJ1bjtydW49djtpZih2JiYhd2FzJiYhUk0pcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZyYW1lKX0pOwogd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsZnVuY3Rpb24oKXtidWlsZCgpO0U9ZWRnZXMoKTtpZihSTSlmcmFtZSgpfSk7Cn0pKCl9CgovKiAtLS0tLS0tLS0tIFBMQU5ORVIgLS0tLS0tLS0tLSAqLwp2YXIgU1RBR0VTPVsKIHtpZDoiY2Qtc3RhZ2UtMSIsbjoiUHl0aG9uIGZvciBBSSIsdzo0fSwKIHtpZDoiY2Qtc3RhZ2UtMiIsbjoiTWF0aCB5b3UgbmVlZCIsdzo1fSwKIHtpZDoiY2Qtc3RhZ2UtMyIsbjoiRGF0YSBza2lsbHMiLHc6NH0sCiB7aWQ6ImNkLXN0YWdlLTQiLG46IkNvcmUgTUwiLHc6N30sCiB7aWQ6ImNkLXN0YWdlLTUiLG46IkRlZXAgbGVhcm5pbmciLHc6N30sCiB7aWQ6ImNkLXN0YWdlLTYiLG46IkdlbkFJIGFuZCBMTE1zIix3OjV9LAoge2lkOiJjZC1zdGFnZS03IixuOiJQcm9qZWN0cyIsdzo2fV07CnZhciBQUk9GSUxFUz17CiBuZXdjb2Rlcjp7bTpbMS41LDEuMiwxLjEsMSwxLDEsMV0sbm90ZToiWW91IGFyZSBzdGFydGluZyBmcm9tIHplcm8sIHNvIFB5dGhvbiBnZXRzIGV4dHJhIHRpbWUuIFRoYXQgaXMgdGhlIHJpZ2h0IGNhbGw6IGV2ZXJ5dGhpbmcgbGF0ZXIgaXMgd3JpdHRlbiBpbiBpdC4ifSwKIHN0dWRlbnQ6e206WzAuNCwxLDAuOSwxLDEsMSwxXSxub3RlOiJZb3UgYWxyZWFkeSBrbm93IHNvbWUgUHl0aG9uLCBzbyBzdGFnZSAxIGJlY29tZXMgYSBxdWljayByZXZpc2lvbi4gU3BlbmQgdGhlIHNhdmVkIHRpbWUgb24gbWF0aCBhbmQgY29yZSBNTC4ifSwKIGRldmVsb3Blcjp7bTpbMC4yLDEuMSwwLjcsMSwxLDAuOCwwLjddLG5vdGU6IllvdXIgY29kaW5nIHNraWxscyBjYXJyeSBvdmVyLiBNYXRoIGlzIHRoZSBzdGFnZSBtb3N0IGRldmVsb3BlcnMgdW5kZXJlc3RpbWF0ZSwgc28gaXQgZ2V0cyBhIGxpdHRsZSBleHRyYSByb29tLiJ9LAogbm9udGVjaDp7bTpbMS42LDEuMywxLjEsMS4xLDEuMSwxLDFdLG5vdGU6IkNvbWluZyBmcm9tIGEgbm9uLXRlY2ggYmFja2dyb3VuZCBpcyBmaW5lLiBHbyBzbG93ZXIgaW4gdGhlIGZpcnN0IHR3byBzdGFnZXMgYW5kIHRoZSByZXN0IGdldHMgbXVjaCBlYXNpZXIuIn19Owp2YXIgcGxhbm5lcj0kKCIuY2RhaS5jZC1wbGFubmVyIik7CnZhciBwbGFuU3RhdGU9c3RvcmUoInBsYW4iKXx8e3A6InN0dWRlbnQiLGg6MTB9OwppZihwbGFubmVyKXsoZnVuY3Rpb24oKXsKIHZhciBjaGlwcz0kJCgiLmNkLWNoaXAiLHBsYW5uZXIpLGhyPSQoIiNjZC1ob3VycyIscGxhbm5lciksdGw9JCgiLmNkLXRpbWVsaW5lIixwbGFubmVyKTsKIHRsLmlubmVySFRNTD1TVEFHRVMubWFwKGZ1bmN0aW9uKHMsaSl7cmV0dXJuICc8ZGl2IGNsYXNzPSJjZC10bC1yb3ciPjxkaXYgY2xhc3M9ImNkLXRsLW5hbWUiPjxhIGhyZWY9IiMnK3MuaWQrJyI+JysoaSsxKSsiLiAiK3MubisnPC9hPjwvZGl2PjxkaXYgY2xhc3M9ImNkLXRsLXRyYWNrIj48ZGl2IGNsYXNzPSJjZC10bC1iYXIiPjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9ImNkLXRsLXciPjwvZGl2PjwvZGl2Pid9KS5qb2luKCIiKTsKIGZ1bmN0aW9uIHJlbmRlcigpewogIGNoaXBzLmZvckVhY2goZnVuY3Rpb24oYyl7Yy5zZXRBdHRyaWJ1dGUoImFyaWEtcHJlc3NlZCIsYy5kYXRhc2V0LnA9PT1wbGFuU3RhdGUucD8idHJ1ZSI6ImZhbHNlIil9KTsKICBoci52YWx1ZT1wbGFuU3RhdGUuaDskKCIjY2QtaG91cnMtdiIscGxhbm5lcikudGV4dENvbnRlbnQ9cGxhblN0YXRlLmgrIiBocnMvd2VlayI7CiAgdmFyIFA9UFJPRklMRVNbcGxhblN0YXRlLnBdLHdlZWtzPVNUQUdFUy5tYXAoZnVuY3Rpb24ocyxpKXtyZXR1cm4gcy53KlAubVtpXSoxMC9wbGFuU3RhdGUuaH0pLHRvdD13ZWVrcy5yZWR1Y2UoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYStifSwwKSxteD1NYXRoLm1heC5hcHBseShudWxsLHdlZWtzKTsKICAkJCgiLmNkLXRsLXJvdyIsdGwpLmZvckVhY2goZnVuY3Rpb24ocixpKXt2YXIgYj0kKCIuY2QtdGwtYmFyIixyKTtiLnN0eWxlLndpZHRoPU1hdGgubWF4KDQsd2Vla3NbaV0vbXgqMTAwKSsiJSI7Yi5jbGFzc0xpc3QudG9nZ2xlKCJjZC1za2ltIixQLm1baV08PTAuNCk7JCgiLmNkLXRsLXciLHIpLnRleHRDb250ZW50PShQLm1baV08PTAuND8ic2tpbSAiOiIiKStNYXRoLm1heCgxLE1hdGgucm91bmQod2Vla3NbaV0pKSsidyJ9KTsKICB2YXIgbW9udGhzPXRvdC80LjM0NTskKCIjY2QtbW9udGhzIixwbGFubmVyKS50ZXh0Q29udGVudD1tb250aHM8MS41PyJ+MSBtb250aCI6In4iK01hdGgucm91bmQobW9udGhzKSsiIG1vbnRocyI7CiAgdmFyIGQ9bmV3IERhdGUoKTtkLnNldERhdGUoZC5nZXREYXRlKCkrTWF0aC5yb3VuZCh0b3QqNykpOwogICQoIiNjZC1maW5pc2giLHBsYW5uZXIpLnRleHRDb250ZW50PWQudG9Mb2NhbGVEYXRlU3RyaW5nKCJlbi1JTiIse21vbnRoOiJsb25nIix5ZWFyOiJudW1lcmljIn0pOwogICQoIiNjZC10b3RhbC1oIixwbGFubmVyKS50ZXh0Q29udGVudD1NYXRoLnJvdW5kKHRvdCpwbGFuU3RhdGUuaCkrIiBocnMiOwogICQoIiNjZC1ub3RlIixwbGFubmVyKS50ZXh0Q29udGVudD1QLm5vdGU7CiAgc3RvcmUoInBsYW4iLHBsYW5TdGF0ZSk7CiB9CiBjaGlwcy5mb3JFYWNoKGZ1bmN0aW9uKGMpe2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7cGxhblN0YXRlLnA9Yy5kYXRhc2V0LnA7cmVuZGVyKCl9KX0pOwogaHIuYWRkRXZlbnRMaXN0ZW5lcigiaW5wdXQiLGZ1bmN0aW9uKCl7cGxhblN0YXRlLmg9K2hyLnZhbHVlO3JlbmRlcigpfSk7CiByZW5kZXIoKTsKfSkoKX0KCi8qIC0tLS0tLS0tLS0gQ0hFQ0tMSVNUUyArIG92ZXJhbGwgcHJvZ3Jlc3MgLS0tLS0tLS0tLSAqLwp2YXIgY2hlY2tzPXN0b3JlKCJjaGVja3MiKXx8e307CmZ1bmN0aW9uIHVwZGF0ZVByb2dyZXNzKCl7dmFyIGFsbD0kJCgiLmNkYWkuY2QtY2hlY2sgaW5wdXQiKSxkb25lPWFsbC5maWx0ZXIoZnVuY3Rpb24oaSl7cmV0dXJuIGkuY2hlY2tlZH0pLmxlbmd0aDsKICQkKCIuY2Qtb3ZlcmFsbCIpLmZvckVhY2goZnVuY3Rpb24obyl7JCgiaSIsbykuc3R5bGUud2lkdGg9KGFsbC5sZW5ndGg\/ZG9uZS9hbGwubGVuZ3RoKjEwMDowKSsiJSJ9KTsKICQkKCIuY2Qtb3ZlcmFsbC10eHQiKS5mb3JFYWNoKGZ1bmN0aW9uKG8pe28udGV4dENvbnRlbnQ9ZG9uZSsiIG9mICIrYWxsLmxlbmd0aCsiIHNraWxscyB0aWNrZWQifSk7CiAkJCgiLmNkYWkuY2QtY2hlY2siKS5mb3JFYWNoKGZ1bmN0aW9uKGJveCl7dmFyIGlucz0kJCgiaW5wdXQiLGJveCksZD1pbnMuZmlsdGVyKGZ1bmN0aW9uKGkpe3JldHVybiBpLmNoZWNrZWR9KS5sZW5ndGgsdD0kKCIuY2QtY2hlY2stY291bnQiLGJveCk7aWYodCl7dC50ZXh0Q29udGVudD1kPT09aW5zLmxlbmd0aD8iU3RhZ2UgY29tcGxldGUiOmQrIi8iK2lucy5sZW5ndGg7dC5jbGFzc0xpc3QudG9nZ2xlKCJjZC1kb25lIixkPT09aW5zLmxlbmd0aCl9fSl9CiQkKCIuY2RhaS5jZC1jaGVjayBpbnB1dCIpLmZvckVhY2goZnVuY3Rpb24oaW5wLGkpe3ZhciBrPWlucC5jbG9zZXN0KCIuY2QtY2hlY2siKS5kYXRhc2V0LmtleSsiXyIrJCQoImlucHV0IixpbnAuY2xvc2VzdCgiLmNkLWNoZWNrIikpLmluZGV4T2YoaW5wKTtpbnAuY2hlY2tlZD0hIWNoZWNrc1trXTtpbnAuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIixmdW5jdGlvbigpe2NoZWNrc1trXT1pbnAuY2hlY2tlZDtzdG9yZSgiY2hlY2tzIixjaGVja3MpO3VwZGF0ZVByb2dyZXNzKCl9KX0pOwp1cGRhdGVQcm9ncmVzcygpOwoKLyogLS0tLS0tLS0tLSBBSSAvIE1MIC8gREwgLyBHZW5BSSBnYW1lIC0tLS0tLS0tLS0gKi8KdmFyIGdhbWU9JCgiLmNkYWkuY2QtZ2FtZSIpOwppZihnYW1lKXsoZnVuY3Rpb24oKXsKIHZhciBRPVsKICB7dDoiQSBjaGVzcyBwcm9ncmFtIGZyb20gdGhlIDE5OTBzIHRoYXQgZm9sbG93cyBoYW5kLXdyaXR0ZW4gcnVsZXMgYW5kIHNlYXJjaGVzIG1vdmVzLiIsYToiYWkiLHdoeToiSXQgYmVoYXZlcyBpbnRlbGxpZ2VudGx5LCBidXQgbm9ib2R5IHRyYWluZWQgaXQgb24gZGF0YS4gUnVsZXMgd3JpdHRlbiBieSBwZW9wbGUgY291bnQgYXMgQUksIG5vdCBtYWNoaW5lIGxlYXJuaW5nLiJ9LAogIHt0OiJZb3VyIGJhbmsgZmxhZ3MgYSBwYXltZW50IGFzIHBvc3NpYmxlIGZyYXVkIGFmdGVyIGxlYXJuaW5nIGZyb20gbWlsbGlvbnMgb2YgcGFzdCB0cmFuc2FjdGlvbnMuIixhOiJtbCIsd2h5OiJJdCBsZWFybmVkIHBhdHRlcm5zIGZyb20gbGFiZWxsZWQgcGFzdCBkYXRhLiBBIG1vZGVsIGxpa2UgZ3JhZGllbnQgYm9vc3RpbmcgdXN1YWxseSBkb2VzIHRoaXMsIG5vIGRlZXAgbmV1cmFsIG5ldHdvcmsgbmVlZGVkLiJ9LAogIHt0OiJZb3VyIHBob25lIHVubG9ja3MgYnkgcmVjb2duaXNpbmcgeW91ciBmYWNlLiIsYToiZGwiLHdoeToiRmFjZSByZWNvZ25pdGlvbiB1c2VzIGNvbnZvbHV0aW9uYWwgbmV1cmFsIG5ldHdvcmtzIHdpdGggbWFueSBsYXllcnMuIFRoYXQgaXMgZGVlcCBsZWFybmluZy4ifSwKICB7dDoiWW91IHR5cGUgYSBwcm9tcHQgYW5kIGdldCBhIGJyYW5kIG5ldyBpbWFnZSBvZiBhIGNhdCBpbiBhIHNwYWNlc3VpdC4iLGE6ImdlbmFpIix3aHk6Ikl0IGNyZWF0ZXMgbmV3IGNvbnRlbnQgaW5zdGVhZCBvZiBvbmx5IHByZWRpY3RpbmcgYSBsYWJlbC4gSW1hZ2UgZ2VuZXJhdG9ycyBhcmUgZ2VuZXJhdGl2ZSBBSSwgYnVpbHQgb24gZGVlcCBsZWFybmluZy4ifSwKICB7dDoiQSBzcGFtIGZpbHRlciB0aGF0IGxlYXJuZWQgd2hpY2ggd29yZHMgc2hvdyB1cCBpbiBqdW5rIGVtYWlsLiIsYToibWwiLHdoeToiQ2xhc3NpYyBtYWNoaW5lIGxlYXJuaW5nLiBFdmVuIGEgc2ltcGxlIE5haXZlIEJheWVzIG1vZGVsIGxlYXJucyB0aGlzIGZyb20gZXhhbXBsZXMuIn0sCiAge3Q6IkEgY2hhdGJvdCB0aGF0IHdyaXRlcyBhIGNvdmVyIGxldHRlciBmb3IgeW91ciBpbnRlcm5zaGlwIGFwcGxpY2F0aW9uLiIsYToiZ2VuYWkiLHdoeToiTGFyZ2UgbGFuZ3VhZ2UgbW9kZWxzIGdlbmVyYXRlIG5ldyB0ZXh0IG9uZSB0b2tlbiBhdCBhIHRpbWUuIFRoYXQgaXMgZ2VuZXJhdGl2ZSBBSS4ifSwKICB7dDoiQSBtb2RlbCBwcmVkaWN0cyBob3VzZSBwcmljZXMgaW4gUHVuZSBmcm9tIHNpemUsIGxvY2F0aW9uIGFuZCBhZ2Ugb2YgdGhlIGZsYXQuIixhOiJtbCIsd2h5OiJUaGlzIGlzIHJlZ3Jlc3Npb24gb24gdGFidWxhciBkYXRhLCB0aGUgYnJlYWQgYW5kIGJ1dHRlciBvZiBtYWNoaW5lIGxlYXJuaW5nLiJ9LAogIHt0OiJHb29nbGUgVHJhbnNsYXRlIHR1cm5pbmcgYSBIaW5kaSBzZW50ZW5jZSBpbnRvIEVuZ2xpc2guIixhOiJkbCIsd2h5OiJNb2Rlcm4gdHJhbnNsYXRpb24gdXNlcyB0cmFuc2Zvcm1lciBuZXVyYWwgbmV0d29ya3MgdHJhaW5lZCBvbiBodWdlIHRleHQgY29ycG9yYSwgc28gaXQgc2l0cyBpbiBkZWVwIGxlYXJuaW5nLiJ9XTsKIHZhciBMPXthaToiQUkgKHJ1bGVzKSIsbWw6Ik1hY2hpbmUgbGVhcm5pbmciLGRsOiJEZWVwIGxlYXJuaW5nIixnZW5haToiR2VuZXJhdGl2ZSBBSSJ9OwogdmFyIGk9MCxzY29yZT0wLGFuc3dlcmVkPWZhbHNlLGNhcmQ9JCgiLmNkLWdhbWUtY2FyZCIsZ2FtZSksZmI9JCgiLmNkLWZlZWRiYWNrIixnYW1lKSxueD0kKCIuY2QtbmV4dCIsZ2FtZSksc2M9JCgiLmNkLXNjb3JlIixnYW1lKSxvcHRzPSQkKCIuY2Qtb3B0IixnYW1lKSx2ZW5uPSQkKCIuY2QtdmVubiBkaXYiLGdhbWUpOwogZnVuY3Rpb24gc2hvdygpe2Fuc3dlcmVkPWZhbHNlO2ZiLmhpZGRlbj10cnVlO254LmhpZGRlbj10cnVlO2NhcmQudGV4dENvbnRlbnQ9UVtpXS50O3NjLnRleHRDb250ZW50PSJRdWVzdGlvbiAiKyhpKzEpKyIgb2YgIitRLmxlbmd0aCsiIHwgU2NvcmUgIitzY29yZTt2ZW5uLmZvckVhY2goZnVuY3Rpb24odil7di5jbGFzc0xpc3QucmVtb3ZlKCJjZC1saXQiKX0pO29wdHMuZm9yRWFjaChmdW5jdGlvbihvKXtvLmRpc2FibGVkPWZhbHNlfSl9CiBvcHRzLmZvckVhY2goZnVuY3Rpb24obyl7by5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXtpZihhbnN3ZXJlZClyZXR1cm47YW5zd2VyZWQ9dHJ1ZTt2YXIgb2s9by5kYXRhc2V0LmE9PT1RW2ldLmE7aWYob2spc2NvcmUrKzsKICBmYi5oaWRkZW49ZmFsc2U7ZmIuY2xhc3NOYW1lPSJjZC1mZWVkYmFjayAiKyhvaz8iY2Qtb2siOiJjZC1ubyIpO2ZiLmlubmVySFRNTD0iPGI+Iisob2s\/IkNvcnJlY3QuIjoiTm90IHF1aXRlLCBpdCBpcyAiK0xbUVtpXS5hXSsiLiIpKyI8L2I+ICIrUVtpXS53aHk7CiAgdmFyIGx2bD17YWk6MCxtbDoxLGRsOjIsZ2VuYWk6M31bUVtpXS5hXTt2ZW5uLmZvckVhY2goZnVuY3Rpb24odixrKXtpZihrPD1sdmwpdi5jbGFzc0xpc3QuYWRkKCJjZC1saXQiKX0pOwogIHNjLnRleHRDb250ZW50PSJRdWVzdGlvbiAiKyhpKzEpKyIgb2YgIitRLmxlbmd0aCsiIHwgU2NvcmUgIitzY29yZTtueC5oaWRkZW49ZmFsc2U7bngudGV4dENvbnRlbnQ9aTxRLmxlbmd0aC0xPyJOZXh0IHF1ZXN0aW9uIjoiU2VlIG15IHNjb3JlIjtvcHRzLmZvckVhY2goZnVuY3Rpb24oeCl7eC5kaXNhYmxlZD10cnVlfSl9KX0pOwogdmFyIGRvbmU9ZmFsc2U7CiBueC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXsKICBpZihkb25lKXtkb25lPWZhbHNlO2k9MDtzY29yZT0wO3Nob3coKTtyZXR1cm59CiAgaWYoaTxRLmxlbmd0aC0xKXtpKys7c2hvdygpO3JldHVybn0KICBkb25lPXRydWU7Y2FyZC50ZXh0Q29udGVudD0iWW91IHNjb3JlZCAiK3Njb3JlKyIgb3V0IG9mICIrUS5sZW5ndGgrIi4gIisoc2NvcmU+PTc\/IllvdSBjbGVhcmx5IGdldCB0aGUgZGlmZmVyZW5jZS4iOnNjb3JlPj01PyJHb29kIHN0YXJ0LiBUaGUgbGluZSBiZXR3ZWVuIGRlZXAgbGVhcm5pbmcgYW5kIGNsYXNzaWMgTUwgdHJpcHMgdXAgbW9zdCBwZW9wbGUuIjoiTm8gc3RyZXNzLiBSZWFkIHRoZSBzZWN0aW9uIGFib3ZlIG9uY2UgbW9yZSBhbmQgdHJ5IGFnYWluLiIpOwogIGZiLmhpZGRlbj10cnVlO254LnRleHRDb250ZW50PSJQbGF5IGFnYWluIjtvcHRzLmZvckVhY2goZnVuY3Rpb24oeCl7eC5kaXNhYmxlZD10cnVlfSl9KTsKIHNob3coKTsKfSkoKX0KCi8qIC0tLS0tLS0tLS0gR3JhZGllbnQgZGVzY2VudCAtLS0tLS0tLS0tICovCnZhciBnZD0kKCIuY2RhaS5jZC1nZCIpOwppZihnZCl7KGZ1bmN0aW9uKCl7CiB2YXIgY3Y9JCgiY2FudmFzIixnZCksUyx4PS0zLjYsbHI9MC4xLHN0ZXBzPTAsdGltZXI9bnVsbCxoaXN0PVtdOwogZnVuY3Rpb24gZih2KXtyZXR1cm4gMC41Kih2LTEpKih2LTEpKzAuOH1mdW5jdGlvbiBkZih2KXtyZXR1cm4gdi0xfQogdmFyIFgwPS00LjUsWDE9Ni41OwogZnVuY3Rpb24gc3godil7cmV0dXJuIDMwKyh2LVgwKS8oWDEtWDApKihTLnctNTApfWZ1bmN0aW9uIHN5KHYpe3JldHVybiBTLmgtMjYtKHYvMTYpKihTLmgtNDApfQogZnVuY3Rpb24gZHJhdygpe1M9U3x8c2V0dXBDYW52YXMoY3YsMjQwKTt2YXIgYz1TLmMsaW5rPWNzcyhnZCwiLS1jZC1pbmsiKSxtdXQ9Y3NzKGdkLCItLWNkLW11dGVkIiksYnI9Y3NzKGdkLCItLWNkLWJyYW5kIiksYmFkPWNzcyhnZCwiLS1jZC1iYWQiKTtjLmNsZWFyUmVjdCgwLDAsUy53LFMuaCk7CiAgYy5zdHJva2VTdHlsZT1jc3MoZ2QsIi0tY2QtbGluZSIpO2MubGluZVdpZHRoPTE7Yy5iZWdpblBhdGgoKTtjLm1vdmVUbygzMCxTLmgtMjYpO2MubGluZVRvKFMudy0yMCxTLmgtMjYpO2Muc3Ryb2tlKCk7CiAgYy5maWxsU3R5bGU9bXV0O2MuZm9udD0iMTJweCBJbnRlcixzYW5zLXNlcmlmIjtjLmZpbGxUZXh0KCJ3ZWlnaHQgdmFsdWUiLFMudy0xMDAsUy5oLTgpO2Muc2F2ZSgpO2MudHJhbnNsYXRlKDEyLFMuaC8yKzIwKTtjLnJvdGF0ZSgtTWF0aC5QSS8yKTtjLmZpbGxUZXh0KCJsb3NzIChlcnJvcikiLDAsMCk7Yy5yZXN0b3JlKCk7CiAgYy5zdHJva2VTdHlsZT1icjtjLmxpbmVXaWR0aD0yLjU7Yy5iZWdpblBhdGgoKTtmb3IodmFyIHY9WDA7djw9WDE7dis9MC4wNSl7dmFyIHB4PXN4KHYpLHB5PXN5KGYodikpO3Y9PT1YMD9jLm1vdmVUbyhweCxweSk6Yy5saW5lVG8ocHgscHkpfWMuc3Ryb2tlKCk7CiAgYy5zdHJva2VTdHlsZT1tdXQ7Yy5zZXRMaW5lRGFzaChbNCw0XSk7Yy5saW5lV2lkdGg9MTtjLmJlZ2luUGF0aCgpO2hpc3QuZm9yRWFjaChmdW5jdGlvbihoLGspe2s\/Yy5saW5lVG8oc3goaCksc3koZihoKSkpOmMubW92ZVRvKHN4KGgpLHN5KGYoaCkpKX0pO2Muc3Ryb2tlKCk7Yy5zZXRMaW5lRGFzaChbXSk7CiAgdmFyIHB4PXN4KE1hdGgubWF4KFgwLE1hdGgubWluKFgxLHgpKSkscHk9c3koTWF0aC5taW4oMTYsZih4KSkpO2MuZmlsbFN0eWxlPU1hdGguYWJzKHgpPjk\/YmFkOmluaztjLmJlZ2luUGF0aCgpO2MuYXJjKHB4LHB5LTgsOCwwLDcpO2MuZmlsbCgpOwogIGMuZmlsbFN0eWxlPWNzcyhnZCwiLS1jZC1nb29kIik7Yy5iZWdpblBhdGgoKTtjLmFyYyhzeCgxKSxzeShmKDEpKSw0LDAsNyk7Yy5maWxsKCk7CiAgJCgiLmNkLWdkLWxvc3MiLGdkKS50ZXh0Q29udGVudD0oTWF0aC5hYnMoeCk+MWU2PyJleHBsb2RlZCI6Zih4KS50b0ZpeGVkKDMpKTskKCIuY2QtZ2Qtc3RlcHMiLGdkKS50ZXh0Q29udGVudD1zdGVwczsKICB2YXIgbXNnPSQoIi5jZC1nZC1tc2ciLGdkKTsKICBpZihNYXRoLmFicyh4KT45KW1zZy50ZXh0Q29udGVudD0iVGhlIGxlYXJuaW5nIHJhdGUgaXMgdG9vIGhpZ2guIEVhY2ggc3RlcCBvdmVyc2hvb3RzIHRoZSBib3R0b20gYW5kIHRoZSBlcnJvciBncm93cy4gVHJhaW5pbmcgaGFzIGRpdmVyZ2VkLiI7CiAgZWxzZSBpZihNYXRoLmFicyh4LTEpPDAuMDEpbXNnLnRleHRDb250ZW50PSJSZWFjaGVkIHRoZSBib3R0b20gaW4gIitzdGVwcysiIHN0ZXBzLiBUaGUgbW9kZWwgZm91bmQgdGhlIHdlaWdodCB3aXRoIHRoZSBsb3dlc3QgZXJyb3IuIjsKICBlbHNlIGlmKGxyPjEuNiltc2cudGV4dENvbnRlbnQ9IkJpZyBzdGVwczogd2F0Y2ggaXQgYm91bmNlIGZyb20gc2lkZSB0byBzaWRlIGFjcm9zcyB0aGUgdmFsbGV5LiI7CiAgZWxzZSBpZihscjwwLjA1KW1zZy50ZXh0Q29udGVudD0iVGlueSBzdGVwczogaXQgd2lsbCBnZXQgdGhlcmUsIGJ1dCBpdCBuZWVkcyBhIGxvdCBvZiB0aGVtLiI7CiAgZWxzZSBtc2cudGV4dENvbnRlbnQ9IkVhY2ggc3RlcCBtb3ZlcyB0aGUgd2VpZ2h0IGRvd25oaWxsLCBpbiB0aGUgZGlyZWN0aW9uIHRoYXQgbG93ZXJzIHRoZSBlcnJvci4iO30KIGZ1bmN0aW9uIHN0ZXAoKXtpZihNYXRoLmFicyh4KT4xZTYpcmV0dXJuIHN0b3AoKTtoaXN0LnB1c2goeCk7eD14LWxyKmRmKHgpO3N0ZXBzKys7ZHJhdygpO2lmKE1hdGguYWJzKHgtMSk8MC4wMXx8TWF0aC5hYnMoeCk+OSlzdG9wKCl9CiBmdW5jdGlvbiBzdG9wKCl7Y2xlYXJJbnRlcnZhbCh0aW1lcik7dGltZXI9bnVsbDskKCIuY2QtZ2QtcnVuIixnZCkudGV4dENvbnRlbnQ9IlJ1biJ9CiBmdW5jdGlvbiByZXNldCgpe3N0b3AoKTt4PS0zLjY7c3RlcHM9MDtoaXN0PVtdO2RyYXcoKX0KICQoIiNjZC1sciIsZ2QpLmFkZEV2ZW50TGlzdGVuZXIoImlucHV0IixmdW5jdGlvbihlKXtscj0rZS50YXJnZXQudmFsdWU7JCgiI2NkLWxyLXYiLGdkKS50ZXh0Q29udGVudD1sci50b0ZpeGVkKDIpO3Jlc2V0KCl9KTsKICQoIi5jZC1nZC1zdGVwIixnZCkuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHN0ZXApOwogJCgiLmNkLWdkLXJ1biIsZ2QpLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe2lmKHRpbWVyKXJldHVybiBzdG9wKCk7aWYoTWF0aC5hYnMoeC0xKTwwLjAxfHxNYXRoLmFicyh4KT45KXJlc2V0KCk7dGhpcy50ZXh0Q29udGVudD0iUGF1c2UiO3RpbWVyPXNldEludGVydmFsKHN0ZXAsUk0\/NjA6MjYwKX0pOwogJCgiLmNkLWdkLXJlc2V0IixnZCkuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHJlc2V0KTsKIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLGZ1bmN0aW9uKCl7Uz1udWxsO2RyYXcoKX0pO2RyYXcoKTsKfSkoKX0KCi8qIC0tLS0tLS0tLS0gRml0IHRoZSBsaW5lIC0tLS0tLS0tLS0gKi8KdmFyIGZpdD0kKCIuY2RhaS5jZC1maXQiKTsKaWYoZml0KXsoZnVuY3Rpb24oKXsKIHZhciBjdj0kKCJjYW52YXMiLGZpdCksUyxwdHM9W1s1MDAsMzJdLFs2NTAsNDFdLFs3MjAsNDVdLFs4MDAsNTJdLFs5MDAsNTVdLFsxMDAwLDY0XSxbMTEwMCw2OF0sWzEyMDAsNzddLFsxMzUwLDg0XSxbMTUwMCw5NV0sWzE2NTAsMTAxXSxbMTgwMCwxMTJdXTsKIHZhciBtPTAuMDIsYj00MCxhbmltPW51bGw7CiB2YXIgbXg9MCxteT0wO3B0cy5mb3JFYWNoKGZ1bmN0aW9uKHApe214Kz1wWzBdO215Kz1wWzFdfSk7bXgvPXB0cy5sZW5ndGg7bXkvPXB0cy5sZW5ndGg7dmFyIG51bT0wLGRlbj0wO3B0cy5mb3JFYWNoKGZ1bmN0aW9uKHApe251bSs9KHBbMF0tbXgpKihwWzFdLW15KTtkZW4rPShwWzBdLW14KSoocFswXS1teCl9KTt2YXIgTT1udW0vZGVuLEI9bXktTSpteDsKIGZ1bmN0aW9uIG1zZShtbSxiYil7dmFyIHM9MDtwdHMuZm9yRWFjaChmdW5jdGlvbihwKXt2YXIgZT1wWzFdLShtbSpwWzBdK2JiKTtzKz1lKmV9KTtyZXR1cm4gcy9wdHMubGVuZ3RofQogdmFyIGJlc3Q9bXNlKE0sQik7CiBmdW5jdGlvbiBzeCh2KXtyZXR1cm4gNDQrKHYtNDAwKS8xNTAwKihTLnctNjApfWZ1bmN0aW9uIHN5KHYpe3JldHVybiBTLmgtMzAtKHYvMTMwKSooUy5oLTQ0KX0KIGZ1bmN0aW9uIGRyYXcoKXtTPVN8fHNldHVwQ2FudmFzKGN2LDI2MCk7dmFyIGM9Uy5jLG11dD1jc3MoZml0LCItLWNkLW11dGVkIiksYnI9Y3NzKGZpdCwiLS1jZC1icmFuZCIpLGJhZD1jc3MoZml0LCItLWNkLWJhZCIpO2MuY2xlYXJSZWN0KDAsMCxTLncsUy5oKTsKICBjLmZpbGxTdHlsZT1tdXQ7Yy5mb250PSIxMnB4IEludGVyLHNhbnMtc2VyaWYiO2MuZmlsbFRleHQoImZsYXQgc2l6ZSAoc3EgZnQpIOKGkiIsUy53LTExOCxTLmgtMzQpO2MuZmlsbFRleHQoInByaWNlICjigrkgbGFraCkiLDgsMTQpOwogIFs2MDAsMTAwMCwxNDAwLDE4MDBdLmZvckVhY2goZnVuY3Rpb24odil7Yy5maWxsVGV4dCh2LHN4KHYpLTEyLFMuaC0xNCl9KTtbNDAsODAsMTIwXS5mb3JFYWNoKGZ1bmN0aW9uKHYpe2MuZmlsbFRleHQodiw4LHN5KHYpKzQpfSk7CiAgcHRzLmZvckVhY2goZnVuY3Rpb24ocCl7dmFyIHB5PW0qcFswXStiO2Muc3Ryb2tlU3R5bGU9YmFkO2MuZ2xvYmFsQWxwaGE9MC40NTtjLmJlZ2luUGF0aCgpO2MubW92ZVRvKHN4KHBbMF0pLHN5KHBbMV0pKTtjLmxpbmVUbyhzeChwWzBdKSxzeShweSkpO2Muc3Ryb2tlKCk7Yy5nbG9iYWxBbHBoYT0xfSk7CiAgYy5zdHJva2VTdHlsZT1icjtjLmxpbmVXaWR0aD0yLjU7Yy5iZWdpblBhdGgoKTtjLm1vdmVUbyhzeCg0MDApLHN5KG0qNDAwK2IpKTtjLmxpbmVUbyhzeCgxOTAwKSxzeShtKjE5MDArYikpO2Muc3Ryb2tlKCk7Yy5saW5lV2lkdGg9MTsKICBjLmZpbGxTdHlsZT1jc3MoZml0LCItLWNkLWluayIpO3B0cy5mb3JFYWNoKGZ1bmN0aW9uKHApe2MuYmVnaW5QYXRoKCk7Yy5hcmMoc3gocFswXSksc3kocFsxXSksNC41LDAsNyk7Yy5maWxsKCl9KTsKICB2YXIgZT1tc2UobSxiKTskKCIuY2QtZml0LWVyciIsZml0KS50ZXh0Q29udGVudD1lLnRvRml4ZWQoMSk7CiAgdmFyIHE9JCgiLmNkLWZpdC1tc2ciLGZpdCk7cS50ZXh0Q29udGVudD1lPGJlc3QqMS4xNT8iRXhjZWxsZW50IGZpdC4gVGhhdCBpcyBhYm91dCBhcyBsb3cgYXMgdGhlIGVycm9yIGNhbiBnbyBmb3IgYSBzdHJhaWdodCBsaW5lLiI6ZTxiZXN0KjM\/IkdldHRpbmcgY2xvc2UuIE51ZGdlIHRoZSBzbGlkZXJzIHRvIHNocmluayB0aGUgcmVkIGxpbmVzLiI6IlRoZSByZWQgbGluZXMgYXJlIHRoZSBlcnJvcnMuIE1vdmUgdGhlIHNsaWRlcnMgdG8gbWFrZSB0aGVtIGFzIHNob3J0IGFzIHBvc3NpYmxlLiI7CiAgJCgiI2NkLW0iLGZpdCkudmFsdWU9bTskKCIjY2QtYiIsZml0KS52YWx1ZT1iOyQoIiNjZC1tLXYiLGZpdCkudGV4dENvbnRlbnQ9bS50b0ZpeGVkKDMpOyQoIiNjZC1iLXYiLGZpdCkudGV4dENvbnRlbnQ9Yi50b0ZpeGVkKDEpfQogJCgiI2NkLW0iLGZpdCkuYWRkRXZlbnRMaXN0ZW5lcigiaW5wdXQiLGZ1bmN0aW9uKGUpe209K2UudGFyZ2V0LnZhbHVlO2RyYXcoKX0pOwogJCgiI2NkLWIiLGZpdCkuYWRkRXZlbnRMaXN0ZW5lcigiaW5wdXQiLGZ1bmN0aW9uKGUpe2I9K2UudGFyZ2V0LnZhbHVlO2RyYXcoKX0pOwogJCgiLmNkLWZpdC1hdXRvIixmaXQpLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe2NhbmNlbEFuaW1hdGlvbkZyYW1lKGFuaW0pO3ZhciBtMD1tLGIwPWIsdD0wOyhmdW5jdGlvbiBnbygpe3QrPVJNPzE6MC4wMzU7dmFyIGs9MS1NYXRoLnBvdygxLU1hdGgubWluKHQsMSksMyk7bT1tMCsoTS1tMCkqaztiPWIwKyhCLWIwKSprO2RyYXcoKTtpZih0PDEpYW5pbT1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZ28pfSkoKX0pOwogJCgiLmNkLWZpdC1yZXNldCIsZml0KS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXtjYW5jZWxBbmltYXRpb25GcmFtZShhbmltKTttPTAuMDI7Yj00MDtkcmF3KCl9KTsKIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLGZ1bmN0aW9uKCl7Uz1udWxsO2RyYXcoKX0pO2RyYXcoKTsKfSkoKX0KCi8qIC0tLS0tLS0tLS0gTmV1cm9uIC0tLS0tLS0tLS0gKi8KdmFyIG5ldT0kKCIuY2RhaS5jZC1uZXVyb24iKTsKaWYobmV1KXsoZnVuY3Rpb24oKXsKIHZhciBpZHM9WyJjZC14MSIsImNkLXgyIiwiY2QtdzEiLCJjZC13MiIsImNkLWJpYXMiXTsKIGZ1bmN0aW9uIHVwZCgpe3ZhciB2PXt9O2lkcy5mb3JFYWNoKGZ1bmN0aW9uKGlkKXt2YXIgZWw9JCgiIyIraWQsbmV1KTt2W2lkXT0rZWwudmFsdWU7JCgiIyIraWQrIi12IixuZXUpLnRleHRDb250ZW50PSgrZWwudmFsdWUpLnRvRml4ZWQoaWQ9PT0iY2QteDEifHxpZD09PSJjZC14MiI\/MDoxKX0pOwogIHZhciB6PXZbImNkLXgxIl0qdlsiY2QtdzEiXSt2WyJjZC14MiJdKnZbImNkLXcyIl0rdlsiY2QtYmlhcyJdLHA9MS8oMStNYXRoLmV4cCgteikpOwogICQoIi5jZC1uZXUteiIsbmV1KS50ZXh0Q29udGVudD12WyJjZC14MSJdKyIgw5cgIit2WyJjZC13MSJdLnRvRml4ZWQoMSkrIiArICIrdlsiY2QteDIiXSsiIMOXICIrdlsiY2QtdzIiXS50b0ZpeGVkKDEpKyIgKyAoIit2WyJjZC1iaWFzIl0udG9GaXhlZCgxKSsiKSA9ICIrei50b0ZpeGVkKDIpOwogICQoIi5jZC1uZXUtcCIsbmV1KS50ZXh0Q29udGVudD1NYXRoLnJvdW5kKHAqMTAwKSsiJSI7JCgiLmNkLW5ldS1iYXIiLG5ldSkuc3R5bGUud2lkdGg9KHAqMTAwKSsiJSJ9CiBpZHMuZm9yRWFjaChmdW5jdGlvbihpZCl7JCgiIyIraWQsbmV1KS5hZGRFdmVudExpc3RlbmVyKCJpbnB1dCIsdXBkKX0pO3VwZCgpOwp9KSgpfQoKLyogLS0tLS0tLS0tLSBOZXh0IHRva2VuICsgdGVtcGVyYXR1cmUgLS0tLS0tLS0tLSAqLwp2YXIgdG9rPSQoIi5jZGFpLmNkLXRva2VuIik7CmlmKHRvayl7KGZ1bmN0aW9uKCl7CiB2YXIgUD1bCiAge3A6Ikkgd2FudCB0byBsZWFybiBtYWNoaW5lIixjOltbImxlYXJuaW5nIiw0LjJdLFsiY29kaW5nIiwyLjFdLFsiZGVzaWduIiwxLjZdLFsicmVwYWlyIiwxLjJdLFsic2hvcCIsMC40XSxbImd1biIsMC4yXV19LAogIHtwOiJUaGUgYmVzdCB3YXkgdG8gcHJlcGFyZSBmb3IgcGxhY2VtZW50cyBpcyB0byIsYzpbWyJwcmFjdGljZSIsNC40XSxbInNvbHZlIiw0LjBdLFsic3RhcnQiLDMuNl0sWyJidWlsZCIsMy4xXSxbInNsZWVwIiwxLjBdLFsicGFuaWMiLDAuOF1dfSwKICB7cDoiQ2hhaSB0YXN0ZXMgYmVzdCB3aXRoIixjOltbImJpc2N1aXRzIiw0LjZdLFsic2Ftb3NhIiw0LjNdLFsiZnJpZW5kcyIsMy40XSxbInJhaW4iLDIuN10sWyJrZXRjaHVwIiwwLjZdLFsiY29kZSIsMC45XV19XTsKIHZhciBjdXI9MCxUPTEsb3V0PSQoIi5jZC1vdXQiLHRvayk7CiBmdW5jdGlvbiBwcm9icygpe3ZhciBjPVBbY3VyXS5jLGU9Yy5tYXAoZnVuY3Rpb24oeCl7cmV0dXJuIE1hdGguZXhwKHhbMV0vTWF0aC5tYXgoVCwwLjA1KSl9KSxzPWUucmVkdWNlKGZ1bmN0aW9uKGEsYil7cmV0dXJuIGErYn0sMCk7cmV0dXJuIGMubWFwKGZ1bmN0aW9uKHgsaSl7cmV0dXJuIFt4WzBdLGVbaV0vc119KX0KIGZ1bmN0aW9uIHJlbmRlcigpe3ZhciBwcj1wcm9icygpOyQoIi5jZC1iYXJzIix0b2spLmlubmVySFRNTD1wci5tYXAoZnVuY3Rpb24oeCl7cmV0dXJuICc8ZGl2IGNsYXNzPSJjZC1iYXItcm93Ij48Yj4nK3hbMF0rJzwvYj48ZGl2IGNsYXNzPSJjZC10bC10cmFjayI+PGRpdiBjbGFzcz0iY2QtdGwtYmFyIiBzdHlsZT0id2lkdGg6JysoeFsxXSoxMDApLnRvRml4ZWQoMSkrJyUiPjwvZGl2PjwvZGl2PjxzcGFuIGNsYXNzPSJjZC10bC13Ij4nKyh4WzFdKjEwMCkudG9GaXhlZCgxKSsnJTwvc3Bhbj48L2Rpdj4nfSkuam9pbigiIik7CiAgJCgiI2NkLXRlbXAtdiIsdG9rKS50ZXh0Q29udGVudD1ULnRvRml4ZWQoMSk7CiAgJCgiLmNkLXRlbXAtbXNnIix0b2spLnRleHRDb250ZW50PVQ8MC41PyJMb3cgdGVtcGVyYXR1cmU6IHRoZSBtb2RlbCBhbG1vc3QgYWx3YXlzIHBpY2tzIHRoZSB0b3Agd29yZC4gU2FmZSwgcHJlZGljdGFibGUsIGEgYml0IGJvcmluZy4iOlQ+MS42PyJIaWdoIHRlbXBlcmF0dXJlOiB1bmxpa2VseSB3b3JkcyBnZXQgYSByZWFsIGNoYW5jZS4gTW9yZSBjcmVhdGl2ZSwgYW5kIG1vcmUgbm9uc2Vuc2UuIjoiTWVkaXVtIHRlbXBlcmF0dXJlOiBtb3N0bHkgc2Vuc2libGUgcGlja3Mgd2l0aCBhIGxpdHRsZSB2YXJpZXR5LiBNb3N0IGNoYXQgYXBwcyBzaXQgYXJvdW5kIGhlcmUuIn0KICQkKCIuY2QtcHJvbXB0Iix0b2spLmZvckVhY2goZnVuY3Rpb24oYixpKXtiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe2N1cj1pOyQkKCIuY2QtcHJvbXB0Iix0b2spLmZvckVhY2goZnVuY3Rpb24oeCxrKXt4LnNldEF0dHJpYnV0ZSgiYXJpYS1wcmVzc2VkIixrPT09aT8idHJ1ZSI6ImZhbHNlIil9KTtvdXQuaW5uZXJIVE1MPSIiO291dC50ZXh0Q29udGVudD1QW2N1cl0ucCsiIOKApiI7cmVuZGVyKCl9KX0pOwogJCgiI2NkLXRlbXAiLHRvaykuYWRkRXZlbnRMaXN0ZW5lcigiaW5wdXQiLGZ1bmN0aW9uKGUpe1Q9K2UudGFyZ2V0LnZhbHVlO3JlbmRlcigpfSk7CiAkKCIuY2Qtc2FtcGxlIix0b2spLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3ZhciBwcj1wcm9icygpLHI9TWF0aC5yYW5kb20oKSxhY2M9MCxwaWNrPXByW3ByLmxlbmd0aC0xXVswXTtmb3IodmFyIGk9MDtpPHByLmxlbmd0aDtpKyspe2FjYys9cHJbaV1bMV07aWYocjw9YWNjKXtwaWNrPXByW2ldWzBdO2JyZWFrfX1vdXQuaW5uZXJIVE1MPSIiO291dC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShQW2N1cl0ucCsiICIpKTt2YXIgbWs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibWFyayIpO21rLnRleHRDb250ZW50PXBpY2s7b3V0LmFwcGVuZENoaWxkKG1rKX0pOwogb3V0LnRleHRDb250ZW50PVBbMF0ucCsiIOKApiI7cmVuZGVyKCk7Cn0pKCl9CgovKiAtLS0tLS0tLS0tIFdoZXJlIHNob3VsZCB5b3Ugc3RhcnQgcXVpeiAtLS0tLS0tLS0tICovCnZhciBxej0kKCIuY2RhaS5jZC1xdWl6Iik7CmlmKHF6KXsoZnVuY3Rpb24oKXsKIHZhciBRPVsKICB7cToiQ2FuIHlvdSB3cml0ZSBhIFB5dGhvbiBmdW5jdGlvbiB3aXRoIGEgbG9vcCBhbmQgYW4gaWYgY29uZGl0aW9uIHdpdGhvdXQgbG9va2luZyBhbnl0aGluZyB1cD8iLHN0YWdlOjF9LAogIHtxOiJEbyB5b3Uga25vdyB3aGF0IG1lYW4sIHN0YW5kYXJkIGRldmlhdGlvbiBhbmQgYSBwcm9iYWJpbGl0eSBkaXN0cmlidXRpb24gYXJlPyIsc3RhZ2U6Mn0sCiAge3E6IkhhdmUgeW91IGxvYWRlZCBhIENTViBpbnRvIFBhbmRhcyBhbmQgY2xlYW5lZCBtaXNzaW5nIHZhbHVlcz8iLHN0YWdlOjN9LAogIHtxOiJIYXZlIHlvdSB0cmFpbmVkIGEgbW9kZWwgd2l0aCBzY2lraXQtbGVhcm4gYW5kIGNoZWNrZWQgaXRzIGFjY3VyYWN5IG9uIHRlc3QgZGF0YT8iLHN0YWdlOjR9LAogIHtxOiJIYXZlIHlvdSBidWlsdCBhbmQgdHJhaW5lZCBhIG5ldXJhbCBuZXR3b3JrIGluIFB5VG9yY2ggb3IgVGVuc29yRmxvdz8iLHN0YWdlOjV9LAogIHtxOiJIYXZlIHlvdSBjYWxsZWQgYW4gTExNIEFQSSBhbmQgYnVpbHQgc29tZXRoaW5nIHdpdGggaXQsIGxpa2UgYSBjaGF0Ym90IG92ZXIgeW91ciBvd24gbm90ZXM\/IixzdGFnZTo2fV07CiB2YXIgaT0wLGJveD0kKCIuY2QtcXVpei1ib2R5Iixxeik7CiBmdW5jdGlvbiBhc2soKXtib3guaW5uZXJIVE1MPSc8cCBjbGFzcz0iY2Qtc21hbGwiPlF1ZXN0aW9uICcrKGkrMSkrJyBvZiAnK1EubGVuZ3RoKyc8L3A+PGRpdiBjbGFzcz0iY2QtZ2FtZS1jYXJkIiBzdHlsZT0ibWluLWhlaWdodDo3MHB4Ij4nK1FbaV0ucSsnPC9kaXY+PGRpdiBjbGFzcz0iY2Qtcm93IiBzdHlsZT0ibWFyZ2luLXRvcDoxMnB4Ij48YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNkLWJ0biBjZC1wcmltYXJ5IiBkYXRhLXY9IjEiPlllczwvYnV0dG9uPjxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iY2QtYnRuIiBkYXRhLXY9IjAiPk5vdCB5ZXQ8L2J1dHRvbj48L2Rpdj48ZGl2IGNsYXNzPSJjZC1wcm9nIj48aSBzdHlsZT0id2lkdGg6JysoaS9RLmxlbmd0aCoxMDApKyclIj48L2k+PC9kaXY+JzsKICAkJCgiYnV0dG9uIixib3gpLmZvckVhY2goZnVuY3Rpb24oYil7Yi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXtpZihiLmRhdGFzZXQudj09PSIxIil7aSsrO2k8US5sZW5ndGg\/YXNrKCk6cmVzdWx0KDcpfWVsc2UgcmVzdWx0KFFbaV0uc3RhZ2UpfSl9KX0KIGZ1bmN0aW9uIHJlc3VsdChzKXt2YXIgbmFtZXM9WyIiLCJQeXRob24gZm9yIEFJIiwiVGhlIG1hdGggeW91IGFjdHVhbGx5IG5lZWQiLCJEYXRhIHNraWxscyIsIkNvcmUgbWFjaGluZSBsZWFybmluZyIsIkRlZXAgbGVhcm5pbmciLCJHZW5lcmF0aXZlIEFJIGFuZCBMTE1zIiwiUHJvamVjdHMgYW5kIHBvcnRmb2xpbyJdOwogIGJveC5pbm5lckhUTUw9JzxkaXYgY2xhc3M9ImNkLWZlZWRiYWNrIGNkLW9rIj48Yj5TdGFydCBhdCBzdGFnZSAnK3MrJzogJytuYW1lc1tzXSsnLjwvYj4gJysocz09PTE\/IkV2ZXJ5b25lIHN0YXJ0cyBoZXJlIGF0IHNvbWUgcG9pbnQsIGFuZCBpdCBpcyB0aGUgc3RhZ2UgdGhhdCBwYXlzIG9mZiB0aGUgbW9zdC4iOnM9PT03PyJZb3UgaGF2ZSB0aGUgc2tpbGxzLiBOb3cgYnVpbGQgdHdvIG9yIHRocmVlIHByb2plY3RzIHRoYXQgcHJvdmUgaXQuIjoiWW91IGNhbiBza2ltIHRoZSBzdGFnZXMgYmVmb3JlIGl0IGFzIHJldmlzaW9uLiIpKyc8L2Rpdj48ZGl2IGNsYXNzPSJjZC1yb3ciIHN0eWxlPSJtYXJnaW4tdG9wOjEycHgiPjxhIGNsYXNzPSJjZC1idG4gY2QtcHJpbWFyeSIgc3R5bGU9InRleHQtZGVjb3JhdGlvbjpub25lO2Rpc3BsYXk6aW5saW5lLWJsb2NrIiBocmVmPSIjY2Qtc3RhZ2UtJytzKyciPkp1bXAgdG8gc3RhZ2UgJytzKyc8L2E+PGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJjZC1idG4gY2QtYWdhaW4iPlRha2UgaXQgYWdhaW48L2J1dHRvbj48L2Rpdj4nOwogICQoIi5jZC1hZ2FpbiIsYm94KS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXtpPTA7YXNrKCl9KX0KICQoIi5jZC1xdWl6LXN0YXJ0IixxeikuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGFzayk7Cn0pKCl9Cn0pKCk7Cg==\"><\/script>\n","protected":false},"excerpt":{"rendered":"<p>A 7-stage roadmap to learn AI and machine learning from scratch, with an interactive planner that builds your timeline and hands-on demos of how models learn.<\/p>\n","protected":false},"author":1,"featured_media":1156,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[47],"tags":[],"class_list":["post-1157","post","type-post","status-publish","format-standard","has-post-thumbnail","category-ai-machine-learning"],"featured_image_src":"https:\/\/codeanddebug.in\/blog\/wp-content\/uploads\/2026\/10\/how-to-learn-ai-ml-from-scratch-roadmap.jpg","author_info":{"display_name":"codeanddebug","author_link":"https:\/\/codeanddebug.in\/blog\/author\/codeanddebug\/"},"_links":{"self":[{"href":"https:\/\/codeanddebug.in\/blog\/wp-json\/wp\/v2\/posts\/1157","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/codeanddebug.in\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/codeanddebug.in\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/codeanddebug.in\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/codeanddebug.in\/blog\/wp-json\/wp\/v2\/comments?post=1157"}],"version-history":[{"count":3,"href":"https:\/\/codeanddebug.in\/blog\/wp-json\/wp\/v2\/posts\/1157\/revisions"}],"predecessor-version":[{"id":1171,"href":"https:\/\/codeanddebug.in\/blog\/wp-json\/wp\/v2\/posts\/1157\/revisions\/1171"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/codeanddebug.in\/blog\/wp-json\/wp\/v2\/media\/1156"}],"wp:attachment":[{"href":"https:\/\/codeanddebug.in\/blog\/wp-json\/wp\/v2\/media?parent=1157"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/codeanddebug.in\/blog\/wp-json\/wp\/v2\/categories?post=1157"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/codeanddebug.in\/blog\/wp-json\/wp\/v2\/tags?post=1157"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}