ICNpbmNsdWRlICZsdDtzdGRpby5oJmd0OwojaW5jbHVkZSAmbHQ7c3RkbGliLmgmZ3Q7CiNpbmNsdWRlICZsdDtzdHJpbmcuaCZndDsKI2luY2x1ZGUgJmx0O3N0ZGJvb2wuaCZndDsKCiNkZWZpbmUgTUFYX1ZPTFMgICAgICAxMDAKI2RlZmluZSBNQVhfUkVTQSAgICAgIDUwMAojZGVmaW5lIE1BWF9DSU5fTEVOICAgIDEwCiNkZWZpbmUgTUFYX0NJVFlfTEVOICAgNTAKI2RlZmluZSBEQVRFX0xFTiAgICAgICAxMSAgIC8vICZxdW90O2pqL21tL2FhYWEmcXVvdDsKI2RlZmluZSBUSU1FX0xFTiAgICAgICAgNiAgIC8vICZxdW90O2hoOm1tJnF1b3Q7CgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIFNUUlVDVFVSRVMgJmFtcDsgVFlQRVMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KdHlwZWRlZiBzdHJ1Y3QgewogICAgaW50ICBudW1lcm9Wb2w7CiAgICBjaGFyIHZpbGxlRGVwYXJ0W01BWF9DSVRZX0xFTl07CiAgICBjaGFyIHZpbGxlQXJyaXZlZVtNQVhfQ0lUWV9MRU5dOwogICAgY2hhciBkYXRlRGVwYXJ0W0RBVEVfTEVOXTsKICAgIGNoYXIgaGV1cmVEZXBhcnRbVElNRV9MRU5dOwogICAgaW50ICBkdXJlZU1pbnV0ZXM7CiAgICBpbnQgIG5iUGxhY2VzVG90YWw7CiAgICBpbnQgIG5iUGxhY2VzRGlzcG87CiAgICBib29sIGFjdGlmOwp9IFZvbDsKCnR5cGVkZWYgZW51bSB7CiAgICBSRVNBX0NPTkZJUk1FRSwKICAgIFJFU0FfQU5OVUxFRQp9IFN0YXR1dFJlc2E7Cgp0eXBlZGVmIHN0cnVjdCB7CiAgICBjaGFyIGNpbltNQVhfQ0lOX0xFTl07CiAgICBjaGFyIG5vbVszMF07CiAgICBjaGFyIHByZW5vbVszMF07Cn0gUGFzc2FnZXI7Cgp0eXBlZGVmIHN0cnVjdCB7CiAgICBpbnQgICAgICAgIG51bWVyb1Jlc2E7CiAgICBpbnQgICAgICAgIG51bWVyb1ZvbDsKICAgIGNoYXIgICAgICAgZGF0ZVZvbFtEQVRFX0xFTl07CiAgICBjaGFyICAgICAgIGRlc3RpbmF0aW9uW01BWF9DSVRZX0xFTl07CiAgICBpbnQgICAgICAgIG51bWVyb1NpZWdlOwogICAgU3RhdHV0UmVzYSBzdGF0dXQ7CiAgICBQYXNzYWdlciAgIHBhc3NhZ2VyOwp9IFJlc2VydmF0aW9uOwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBWQVJJQUJMRVMgR0xPQkFMRVMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVm9sIHZvbHNbTUFYX1ZPTFNdOwppbnQgbmJWb2xzID0gMDsKClJlc2VydmF0aW9uIHJlc2VydmF0aW9uc1tNQVhfUkVTQV07CmludCBuYlJlc2VydmF0aW9ucyA9IDA7CmludCBjb21wdGV1clJlc2EgPSAxOwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBQUk9UT1RZUEVTIERFIEZPTkNUSU9OUwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwovKiBNZW51cyAqLwp2b2lkIGFmZmljaGVyTWVudVByaW5jaXBhbCh2b2lkKTsKdm9pZCBhZmZpY2hlck1lbnVWb2xzKHZvaWQpOwp2b2lkIGFmZmljaGVyTWVudVJlc2VydmF0aW9ucyh2b2lkKTsKdm9pZCBhZmZpY2hlck1lbnVTdGF0aXN0aXF1ZXModm9pZCk7CgovKiBWb2xzICovCnZvaWQgYWZmaWNoZXJMaXN0ZVZvbHModm9pZCk7CnZvaWQgYWZmaWNoZXJVblZvbChjb25zdCBWb2wgKnYpOwp2b2lkIGFqb3V0ZXJWb2wodm9pZCk7CnZvaWQgbW9kaWZpZXJWb2wodm9pZCk7CnZvaWQgc3VwcHJpbWVyVm9sKHZvaWQpOwp2b2lkIHJlY2hlcmNoZXJWb2wodm9pZCk7CgovKiBSJmVhY3V0ZTtzZXJ2YXRpb25zICovCnZvaWQgcmVzZXJ2ZXJCaWxsZXQodm9pZCk7CnZvaWQgYWZmaWNoZXJSZXNlcnZhdGlvbnNQYXJDSU4odm9pZCk7CnZvaWQgYW5udWxlclJlc2VydmF0aW9uKHZvaWQpOwoKLyogU3RhdGlzdGlxdWVzICovCnZvaWQgYWZmaWNoZXJTdGF0aXN0aXF1ZXNHbG9iYWxlcyh2b2lkKTsKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgSU1QTEVNRU5UQVRJT05TCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCnZvaWQgYWZmaWNoZXJNZW51UHJpbmNpcGFsKCkgewogICAgcHJpbnRmKCZxdW90O1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiZxdW90Oyk7CiAgICBwcmludGYoJnF1b3Q7ICAgQmllbnZlbnVlIGRhbnMgbm90cmUgZXNwYWNlIEEmZWFjdXRlO3JpZW5cbiZxdW90Oyk7CiAgICBwcmludGYoJnF1b3Q7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiZxdW90Oyk7CiAgICBwcmludGYoJnF1b3Q7MSAtIEdlc3Rpb24gZGVzIHZvbHNcbiZxdW90Oyk7CiAgICBwcmludGYoJnF1b3Q7MiAtIEdlc3Rpb24gZGVzIHImZWFjdXRlO3NlcnZhdGlvbnNcbiZxdW90Oyk7CiAgICBwcmludGYoJnF1b3Q7MyAtIFN0YXRpc3RpcXVlcyBnbG9iYWxlc1xuJnF1b3Q7KTsKICAgIHByaW50ZigmcXVvdDswIC0gUXVpdHRlclxuJnF1b3Q7KTsKICAgIHByaW50ZigmcXVvdDs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuJnF1b3Q7KTsKICAgIHByaW50ZigmcXVvdDtWb3RyZSBjaG9peCA6ICZxdW90Oyk7Cn0KCnZvaWQgYWZmaWNoZXJNZW51Vm9scygpIHsKICAgIHByaW50ZigmcXVvdDtcbi0tLSBHZXN0aW9uIGRlcyB2b2xzIC0tLVxuJnF1b3Q7KTsKICAgIHByaW50ZigmcXVvdDsxIC0gQWZmaWNoZXIgbGEgbGlzdGUgZGVzIHZvbHNcbiZxdW90Oyk7CiAgICBwcmludGYoJnF1b3Q7MiAtIEFqb3V0ZXIgdW4gbm91dmVhdSB2b2xcbiZxdW90Oyk7CiAgICBwcmludGYoJnF1b3Q7MyAtIE1vZGlmaWVyIHVuIHZvbCBleGlzdGFudFxuJnF1b3Q7KTsKICAgIHByaW50ZigmcXVvdDs0IC0gU3VwcHJpbWVyIHVuIHZvbFxuJnF1b3Q7KTsKICAgIHByaW50ZigmcXVvdDs1IC0gUmVjaGVyY2hlciB1biB2b2xcbiZxdW90Oyk7CiAgICBwcmludGYoJnF1b3Q7MCAtIFJldG91clxuJnF1b3Q7KTsKICAgIHByaW50ZigmcXVvdDtDaG9peCA6ICZxdW90Oyk7Cn0KCnZvaWQgYWZmaWNoZXJNZW51UmVzZXJ2YXRpb25zKCkgewogICAgcHJpbnRmKCZxdW90O1xuLS0tIEdlc3Rpb24gZGVzIHImZWFjdXRlO3NlcnZhdGlvbnMgLS0tXG4mcXVvdDspOwogICAgcHJpbnRmKCZxdW90OzEgLSBSJmVhY3V0ZTtzZXJ2ZXIgdW4gYmlsbGV0XG4mcXVvdDspOwogICAgcHJpbnRmKCZxdW90OzIgLSBBZmZpY2hlciByJmVhY3V0ZTtzZXJ2YXRpb25zIGQndW4gcGFzc2FnZXJcbiZxdW90Oyk7CiAgICBwcmludGYoJnF1b3Q7MyAtIEFubnVsZXIgdW5lIHImZWFjdXRlO3NlcnZhdGlvblxuJnF1b3Q7KTsKICAgIHByaW50ZigmcXVvdDswIC0gUmV0b3VyXG4mcXVvdDspOwogICAgcHJpbnRmKCZxdW90O0Nob2l4IDogJnF1b3Q7KTsKfQoKdm9pZCBhZmZpY2hlck1lbnVTdGF0aXN0aXF1ZXMoKSB7CiAgICBwcmludGYoJnF1b3Q7XG4tLS0gU3RhdGlzdGlxdWVzIGdsb2JhbGVzIC0tLVxuJnF1b3Q7KTsKICAgIHByaW50ZigmcXVvdDsxIC0gQWZmaWNoZXIgc3RhdGlzdGlxdWVzXG4mcXVvdDspOwogICAgcHJpbnRmKCZxdW90OzAgLSBSZXRvdXJcbiZxdW90Oyk7CiAgICBwcmludGYoJnF1b3Q7Q2hvaXggOiAmcXVvdDspOwp9Cgp2b2lkIGFmZmljaGVyVW5Wb2woY29uc3QgVm9sICp2KSB7CiAgICBwcmludGYoJnF1b3Q7XG5Wb2wgTiZkZWc7JWRcbiZxdW90Oywgdi0mZ3Q7bnVtZXJvVm9sKTsKICAgIHByaW50ZigmcXVvdDtEJmVhY3V0ZTtwYXJ0ICAgIDogJXNcbiZxdW90Oywgdi0mZ3Q7dmlsbGVEZXBhcnQpOwogICAgcHJpbnRmKCZxdW90O0Fycml2JmVhY3V0ZTtlICAgOiAlc1xuJnF1b3Q7LCB2LSZndDt2aWxsZUFycml2ZWUpOwogICAgcHJpbnRmKCZxdW90O0RhdGUvSGV1cmU6ICVzICVzXG4mcXVvdDssIHYtJmd0O2RhdGVEZXBhcnQsIHYtJmd0O2hldXJlRGVwYXJ0KTsKICAgIHByaW50ZigmcXVvdDtEdXImZWFjdXRlO2UgICAgIDogJWQgbWluXG4mcXVvdDssIHYtJmd0O2R1cmVlTWludXRlcyk7CiAgICBwcmludGYoJnF1b3Q7UGxhY2VzICAgIDogdG90YWwgJWQgLyBkaXNwbyAlZFxuJnF1b3Q7LCB2LSZndDtuYlBsYWNlc1RvdGFsLCB2LSZndDtuYlBsYWNlc0Rpc3BvKTsKICAgIHByaW50ZigmcXVvdDtTdGF0dXQgICAgOiAlc1xuJnF1b3Q7LCB2LSZndDthY3RpZiA/ICZxdW90O0FjdGlmJnF1b3Q7IDogJnF1b3Q7QW5udWwmZWFjdXRlOyZxdW90Oyk7Cn0KCnZvaWQgYWZmaWNoZXJMaXN0ZVZvbHMoKSB7CiAgICBpZiAobmJWb2xzID09IDApIHsKICAgICAgICBwcmludGYoJnF1b3Q7QXVjdW4gdm9sIGVucmVnaXN0ciZlYWN1dGU7LlxuJnF1b3Q7KTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBmb3IgKGludCBpID0gMDsgaSAmbHQ7IG5iVm9sczsgaSsrKSB7CiAgICAgICAgaWYgKHZvbHNbaV0uYWN0aWYpCiAgICAgICAgICAgIGFmZmljaGVyVW5Wb2woJmFtcDt2b2xzW2ldKTsKICAgIH0KfQoKdm9pZCBham91dGVyVm9sKCkgewogICAgaWYgKG5iVm9scyAmZ3Q7PSBNQVhfVk9MUykgewogICAgICAgIHByaW50ZigmcXVvdDtDYXBhY2l0JmVhY3V0ZTsgbWF4aW1hbGUgZGUgdm9scyBhdHRlaW50ZS5cbiZxdW90Oyk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgVm9sIHY7CiAgICBwcmludGYoJnF1b3Q7TnVtJmVhY3V0ZTtybyBkdSB2b2wgOiAmcXVvdDspOwogICAgc2NhbmYoJnF1b3Q7JWQmcXVvdDssICZhbXA7di5udW1lcm9Wb2wpOwogICAgLy8gdW5pY2l0JmVhY3V0ZTsKICAgIGZvciAoaW50IGkgPSAwOyBpICZsdDsgbmJWb2xzOyBpKyspCiAgICAgICAgaWYgKHZvbHNbaV0ubnVtZXJvVm9sID09IHYubnVtZXJvVm9sKSB7CiAgICAgICAgICAgIHByaW50ZigmcXVvdDtDZSBudW0mZWFjdXRlO3JvIGV4aXN0ZSBkJmVhY3V0ZTtqJmFncmF2ZTsuXG4mcXVvdDspOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgcHJpbnRmKCZxdW90O1ZpbGxlIGRlIGQmZWFjdXRlO3BhcnQgOiAmcXVvdDspOwogICAgc2NhbmYoJnF1b3Q7JXMmcXVvdDssIHYudmlsbGVEZXBhcnQpOwogICAgcHJpbnRmKCZxdW90O1ZpbGxlIGQmcnNxdW87YXJyaXYmZWFjdXRlO2UgOiAmcXVvdDspOwogICAgc2NhbmYoJnF1b3Q7JXMmcXVvdDssIHYudmlsbGVBcnJpdmVlKTsKICAgIHByaW50ZigmcXVvdDtEYXRlIGQmZWFjdXRlO3BhcnQgKGpqL21tL2FhYWEpIDogJnF1b3Q7KTsKICAgIHNjYW5mKCZxdW90OyVzJnF1b3Q7LCB2LmRhdGVEZXBhcnQpOwogICAgcHJpbnRmKCZxdW90O0hldXJlIGQmZWFjdXRlO3BhcnQgKGhoOm1tKSAgICAgOiAmcXVvdDspOwogICAgc2NhbmYoJnF1b3Q7JXMmcXVvdDssIHYuaGV1cmVEZXBhcnQpOwogICAgcHJpbnRmKCZxdW90O0R1ciZlYWN1dGU7ZSAobWludXRlcykgICAgICAgICA6ICZxdW90Oyk7CiAgICBzY2FuZigmcXVvdDslZCZxdW90OywgJmFtcDt2LmR1cmVlTWludXRlcyk7CiAgICBwcmludGYoJnF1b3Q7Tm9tYnJlIHRvdGFsIGRlIHBsYWNlcyAgOiAmcXVvdDspOwogICAgc2NhbmYoJnF1b3Q7JWQmcXVvdDssICZhbXA7di5uYlBsYWNlc1RvdGFsKTsKICAgIHYubmJQbGFjZXNEaXNwbyA9IHYubmJQbGFjZXNUb3RhbDsKICAgIHYuYWN0aWYgPSB0cnVlOwoKICAgIHZvbHNbbmJWb2xzKytdID0gdjsKICAgIHByaW50ZigmcXVvdDtWb2wgYWpvdXQmZWFjdXRlOy5cbiZxdW90Oyk7Cn0KCnZvaWQgbW9kaWZpZXJWb2woKSB7CiAgICBpbnQgbnVtLCBpZHggPSAtMTsKICAgIHByaW50ZigmcXVvdDtOdW0mZWFjdXRlO3JvIGR1IHZvbCAmYWdyYXZlOyBtb2RpZmllciA6ICZxdW90Oyk7CiAgICBzY2FuZigmcXVvdDslZCZxdW90OywgJmFtcDtudW0pOwogICAgZm9yIChpbnQgaSA9IDA7IGkgJmx0OyBuYlZvbHM7IGkrKykKICAgICAgICBpZiAodm9sc1tpXS5udW1lcm9Wb2wgPT0gbnVtKSB7IGlkeCA9IGk7IGJyZWFrOyB9CiAgICBpZiAoaWR4ICZsdDsgMCkgewogICAgICAgIHByaW50ZigmcXVvdDtWb2wgbm9uIHRyb3V2JmVhY3V0ZTsuXG4mcXVvdDspOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIC8vIGNvbXB0ZXIgciZlYWN1dGU7c2VydmF0aW9ucwogICAgaW50IHJlc2FDb3VudCA9IDA7CiAgICBmb3IgKGludCBpID0gMDsgaSAmbHQ7IG5iUmVzZXJ2YXRpb25zOyBpKyspCiAgICAgICAgaWYgKHJlc2VydmF0aW9uc1tpXS5udW1lcm9Wb2wgPT0gbnVtICZhbXA7JmFtcDsKICAgICAgICAgICAgcmVzZXJ2YXRpb25zW2ldLnN0YXR1dCA9PSBSRVNBX0NPTkZJUk1FRSkKICAgICAgICAgICAgcmVzYUNvdW50Kys7CgogICAgcHJpbnRmKCZxdW90OzEtRGVzdGluYXRpb24gMi1EYXRlL0hldXJlIDMtRHVyJmVhY3V0ZTtlXG4mcXVvdDsKICAgICAgICAgICAmcXVvdDs0LVBsYWNlcyB0b3RhbGVzIDUtU3RhdHV0IDAtQW5udWxlclxuQ2hvaXggOiAmcXVvdDspOwogICAgaW50IGM7IHNjYW5mKCZxdW90OyVkJnF1b3Q7LCAmYW1wO2MpOwogICAgc3dpdGNoIChjKSB7CiAgICAgICAgY2FzZSAxOgogICAgICAgICAgICBwcmludGYoJnF1b3Q7Tm91dmVsbGUgZGVzdGluYXRpb24gOiAmcXVvdDspOwogICAgICAgICAgICBzY2FuZigmcXVvdDslcyZxdW90Oywgdm9sc1tpZHhdLnZpbGxlQXJyaXZlZSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgcHJpbnRmKCZxdW90O05vdXZlbGxlIGRhdGUgOiAmcXVvdDspOwogICAgICAgICAgICBzY2FuZigmcXVvdDslcyZxdW90Oywgdm9sc1tpZHhdLmRhdGVEZXBhcnQpOwogICAgICAgICAgICBwcmludGYoJnF1b3Q7Tm91dmVsbGUgaGV1cmU6ICZxdW90Oyk7CiAgICAgICAgICAgIHNjYW5mKCZxdW90OyVzJnF1b3Q7LCB2b2xzW2lkeF0uaGV1cmVEZXBhcnQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgIHByaW50ZigmcXVvdDtOb3V2ZWxsZSBkdXImZWFjdXRlO2UgOiAmcXVvdDspOwogICAgICAgICAgICBzY2FuZigmcXVvdDslZCZxdW90OywgJmFtcDt2b2xzW2lkeF0uZHVyZWVNaW51dGVzKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA0OiB7CiAgICAgICAgICAgIGludCBudDsKICAgICAgICAgICAgcHJpbnRmKCZxdW90O05vdXYuIHBsYWNlcyB0b3RhbGVzIDogJnF1b3Q7KTsKICAgICAgICAgICAgc2NhbmYoJnF1b3Q7JWQmcXVvdDssICZhbXA7bnQpOwogICAgICAgICAgICBpZiAobnQgJmx0OyByZXNhQ291bnQpIHsKICAgICAgICAgICAgICAgIHByaW50ZigmcXVvdDslZCBwbGFjZXMgZCZlYWN1dGU7aiZhZ3JhdmU7IHImZWFjdXRlO3NlcnYmZWFjdXRlO2VzLlxuJnF1b3Q7LCByZXNhQ291bnQpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdm9sc1tpZHhdLm5iUGxhY2VzRGlzcG8gKz0gKG50IC0gdm9sc1tpZHhdLm5iUGxhY2VzVG90YWwpOwogICAgICAgICAgICAgICAgdm9sc1tpZHhdLm5iUGxhY2VzVG90YWwgPSBudDsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgY2FzZSA1OiB7CiAgICAgICAgICAgIGludCBzOwogICAgICAgICAgICBwcmludGYoJnF1b3Q7U3RhdHV0ICgxPWFjdGlmLDA9YW5udWwmZWFjdXRlOykgOiAmcXVvdDspOwogICAgICAgICAgICBzY2FuZigmcXVvdDslZCZxdW90OywgJmFtcDtzKTsKICAgICAgICAgICAgdm9sc1tpZHhdLmFjdGlmID0gKHM9PTEpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgcHJpbnRmKCZxdW90O0FubnVsYXRpb24vbW9kaWYgaW52YWxpZGUuXG4mcXVvdDspOwogICAgfQp9Cgp2b2lkIHN1cHByaW1lclZvbCgpIHsKICAgIGludCBudW0sIGlkeCA9IC0xOwogICAgcHJpbnRmKCZxdW90O051bSZlYWN1dGU7cm8gZHUgdm9sICZhZ3JhdmU7IHN1cHByaW1lciA6ICZxdW90Oyk7CiAgICBzY2FuZigmcXVvdDslZCZxdW90OywgJmFtcDtudW0pOwogICAgZm9yIChpbnQgaSA9IDA7IGkgJmx0OyBuYlZvbHM7IGkrKykKICAgICAgICBpZiAodm9sc1tpXS5udW1lcm9Wb2wgPT0gbnVtKSB7IGlkeCA9IGk7IGJyZWFrOyB9CiAgICBpZiAoaWR4ICZsdDsgMCkgewogICAgICAgIHByaW50ZigmcXVvdDtWb2wgbm9uIHRyb3V2JmVhY3V0ZTsuXG4mcXVvdDspOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGludCByZXNhQ291bnQgPSAwOwogICAgZm9yIChpbnQgaSA9IDA7IGkgJmx0OyBuYlJlc2VydmF0aW9uczsgaSsrKQogICAgICAgIGlmIChyZXNlcnZhdGlvbnNbaV0ubnVtZXJvVm9sID09IG51bSAmYW1wOyZhbXA7CiAgICAgICAgICAgIHJlc2VydmF0aW9uc1tpXS5zdGF0dXQgPT0gUkVTQV9DT05GSVJNRUUpCiAgICAgICAgICAgIHJlc2FDb3VudCsrOwogICAgaWYgKHJlc2FDb3VudCkgewogICAgICAgIHByaW50ZigmcXVvdDslZCByJmVhY3V0ZTtzZXJ2YXRpb24ocykgZXhpc3RhbnRlcy4gQ29uZmlybWV6IHN1cHByZXNzaW9uPyAoby9uKTogJnF1b3Q7LCByZXNhQ291bnQpOwogICAgICAgIGNoYXIgYzsgZ2V0Y2hhcigpOyBjPWdldGNoYXIoKTsKICAgICAgICBpZiAoYyE9J28nICZhbXA7JmFtcDsgYyE9J08nKSB7CiAgICAgICAgICAgIHByaW50ZigmcXVvdDtTdXBwcmVzc2lvbiBhbm51bCZlYWN1dGU7ZS5cbiZxdW90Oyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBmb3IgKGludCBpID0gaWR4OyBpICZsdDsgbmJWb2xzLTE7IGkrKykKICAgICAgICB2b2xzW2ldID0gdm9sc1tpKzFdOwogICAgbmJWb2xzLS07CiAgICBwcmludGYoJnF1b3Q7Vm9sIHN1cHByaW0mZWFjdXRlOy5cbiZxdW90Oyk7Cn0KCnZvaWQgcmVjaGVyY2hlclZvbCgpIHsKICAgIHByaW50ZigmcXVvdDsxPU51bSZlYWN1dGU7cm8gMj1EZXN0aW5hdGlvbiA6ICZxdW90Oyk7CiAgICBpbnQgbTsgc2NhbmYoJnF1b3Q7JWQmcXVvdDssICZhbXA7bSk7CiAgICBpZiAobT09MSkgewogICAgICAgIGludCBudW07IHByaW50ZigmcXVvdDtOdW0mZWFjdXRlO3JvIDogJnF1b3Q7KTsgc2NhbmYoJnF1b3Q7JWQmcXVvdDssICZhbXA7bnVtKTsKICAgICAgICBmb3IgKGludCBpPTA7aSZsdDtuYlZvbHM7aSsrKQogICAgICAgICAgICBpZiAodm9sc1tpXS5udW1lcm9Wb2w9PW51bSkKICAgICAgICAgICAgICAgIGFmZmljaGVyVW5Wb2woJmFtcDt2b2xzW2ldKTsKICAgIH0gZWxzZSBpZiAobT09MikgewogICAgICAgIGNoYXIgZGVzdFtNQVhfQ0lUWV9MRU5dOwogICAgICAgIHByaW50ZigmcXVvdDtEZXN0aW5hdGlvbiA6ICZxdW90Oyk7IHNjYW5mKCZxdW90OyVzJnF1b3Q7LCBkZXN0KTsKICAgICAgICBmb3IgKGludCBpPTA7aSZsdDtuYlZvbHM7aSsrKQogICAgICAgICAgICBpZiAoc3RyY21wKHZvbHNbaV0udmlsbGVBcnJpdmVlLGRlc3QpPT0wKQogICAgICAgICAgICAgICAgYWZmaWNoZXJVblZvbCgmYW1wO3ZvbHNbaV0pOwogICAgfQp9Cgp2b2lkIHJlc2VydmVyQmlsbGV0KCkgewogICAgaW50IG51bTsKICAgIHByaW50ZigmcXVvdDtOdW0mZWFjdXRlO3JvIGR1IHZvbCA6ICZxdW90Oyk7CiAgICBzY2FuZigmcXVvdDslZCZxdW90OywgJmFtcDtudW0pOwogICAgaW50IGlkeD0tMTsKICAgIGZvcihpbnQgaT0wO2kmbHQ7bmJWb2xzO2krKykKICAgICAgICBpZih2b2xzW2ldLm51bWVyb1ZvbD09bnVtICZhbXA7JmFtcDsgdm9sc1tpXS5hY3RpZikKICAgICAgICAgICAgaWR4PWk7CiAgICBpZihpZHgmbHQ7MCB8fCB2b2xzW2lkeF0ubmJQbGFjZXNEaXNwbz09MCkgewogICAgICAgIHByaW50ZigmcXVvdDtWb2wgbm9uIGRpc3BvLlxuJnF1b3Q7KTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBSZXNlcnZhdGlvbiByOwogICAgci5udW1lcm9SZXNhID0gY29tcHRldXJSZXNhKys7CiAgICByLm51bWVyb1ZvbCAgPSBudW07CiAgICBzdHJjcHkoci5kYXRlVm9sLCB2b2xzW2lkeF0uZGF0ZURlcGFydCk7CiAgICBzdHJjcHkoci5kZXN0aW5hdGlvbiwgdm9sc1tpZHhdLnZpbGxlQXJyaXZlZSk7CiAgICByLm51bWVyb1NpZWdlID0gdm9sc1tpZHhdLm5iUGxhY2VzVG90YWwgLSB2b2xzW2lkeF0ubmJQbGFjZXNEaXNwbyArIDE7CiAgICByLnN0YXR1dCAgICAgPSBSRVNBX0NPTkZJUk1FRTsKCiAgICBwcmludGYoJnF1b3Q7Q0lOICAgOiAmcXVvdDspOyBzY2FuZigmcXVvdDslcyZxdW90Oywgci5wYXNzYWdlci5jaW4pOwogICAgcHJpbnRmKCZxdW90O05vbSAgIDogJnF1b3Q7KTsgc2NhbmYoJnF1b3Q7JXMmcXVvdDssIHIucGFzc2FnZXIubm9tKTsKICAgIHByaW50ZigmcXVvdDtQciZlYWN1dGU7bm9tOiAmcXVvdDspOyBzY2FuZigmcXVvdDslcyZxdW90Oywgci5wYXNzYWdlci5wcmVub20pOwoKICAgIHJlc2VydmF0aW9uc1tuYlJlc2VydmF0aW9ucysrXSA9IHI7CiAgICB2b2xzW2lkeF0ubmJQbGFjZXNEaXNwby0tOwogICAgcHJpbnRmKCZxdW90O1ImZWFjdXRlO3NlcnZhdGlvbiAjJWQgY29uZmlybSZlYWN1dGU7ZSwgc2kmZWdyYXZlO2dlICVkLlxuJnF1b3Q7LAogICAgICAgICAgIHIubnVtZXJvUmVzYSwgci5udW1lcm9TaWVnZSk7Cn0KCnZvaWQgYWZmaWNoZXJSZXNlcnZhdGlvbnNQYXJDSU4oKSB7CiAgICBjaGFyIGNpbltNQVhfQ0lOX0xFTl07CiAgICBwcmludGYoJnF1b3Q7Q0lOIHBhc3NhZ2VyIDogJnF1b3Q7KTsKICAgIHNjYW5mKCZxdW90OyVzJnF1b3Q7LCBjaW4pOwogICAgZm9yKGludCBpPTA7aSZsdDtuYlJlc2VydmF0aW9ucztpKyspewogICAgICAgIGlmKHN0cmNtcChyZXNlcnZhdGlvbnNbaV0ucGFzc2FnZXIuY2luLGNpbik9PTApewogICAgICAgICAgICBwcmludGYoJnF1b3Q7XG5SJmVhY3V0ZTtzZXJ2YXRpb24gTiZkZWc7JWRcbiZxdW90OywgcmVzZXJ2YXRpb25zW2ldLm51bWVyb1Jlc2EpOwogICAgICAgICAgICBwcmludGYoJnF1b3Q7Vm9sICAgICA6ICVkXG4mcXVvdDssIHJlc2VydmF0aW9uc1tpXS5udW1lcm9Wb2wpOwogICAgICAgICAgICBwcmludGYoJnF1b3Q7RGF0ZSAgICA6ICVzXG4mcXVvdDssIHJlc2VydmF0aW9uc1tpXS5kYXRlVm9sKTsKICAgICAgICAgICAgcHJpbnRmKCZxdW90O0Rlc3QuICAgOiAlc1xuJnF1b3Q7LCByZXNlcnZhdGlvbnNbaV0uZGVzdGluYXRpb24pOwogICAgICAgICAgICBwcmludGYoJnF1b3Q7U2kmZWdyYXZlO2dlICAgOiAlZFxuJnF1b3Q7LCByZXNlcnZhdGlvbnNbaV0ubnVtZXJvU2llZ2UpOwogICAgICAgICAgICBwcmludGYoJnF1b3Q7U3RhdHV0ICA6ICVzXG4mcXVvdDssCiAgICAgICAgICAgICAgICAgICByZXNlcnZhdGlvbnNbaV0uc3RhdHV0PT1SRVNBX0NPTkZJUk1FRSA/ICZxdW90O0NvbmZpcm0mZWFjdXRlO2UmcXVvdDsgOiAmcXVvdDtBbm51bCZlYWN1dGU7ZSZxdW90Oyk7CiAgICAgICAgfQogICAgfQp9Cgp2b2lkIGFubnVsZXJSZXNlcnZhdGlvbigpIHsKICAgIHByaW50ZigmcXVvdDtBbm51bGVyIHBhciAxPU51bVJlc2EgMj1DSU4rVm9sIDogJnF1b3Q7KTsKICAgIGludCBtOyBzY2FuZigmcXVvdDslZCZxdW90OywmYW1wO20pOwogICAgaW50IGZvdW5kPTA7CiAgICBpZihtPT0xKXsKICAgICAgICBpbnQgbnI7IHByaW50ZigmcXVvdDtOJmRlZzsgciZlYWN1dGU7c2VydmF0aW9uIDogJnF1b3Q7KTsgc2NhbmYoJnF1b3Q7JWQmcXVvdDssJmFtcDtucik7CiAgICAgICAgZm9yKGludCBpPTA7aSZsdDtuYlJlc2VydmF0aW9ucztpKyspewogICAgICAgICAgICBpZihyZXNlcnZhdGlvbnNbaV0ubnVtZXJvUmVzYT09bnIgJmFtcDsmYW1wOwogICAgICAgICAgICAgICByZXNlcnZhdGlvbnNbaV0uc3RhdHV0PT1SRVNBX0NPTkZJUk1FRSl7CiAgICAgICAgICAgICAgICByZXNlcnZhdGlvbnNbaV0uc3RhdHV0PVJFU0FfQU5OVUxFRTsKICAgICAgICAgICAgICAgIC8vIHJlc3RpdHVlciBwbGFjZQogICAgICAgICAgICAgICAgZm9yKGludCBqPTA7aiZsdDtuYlZvbHM7aisrKXsKICAgICAgICAgICAgICAgICAgICBpZih2b2xzW2pdLm51bWVyb1ZvbD09cmVzZXJ2YXRpb25zW2ldLm51bWVyb1ZvbCl7CiAgICAgICAgICAgICAgICAgICAgICAgIHZvbHNbal0ubmJQbGFjZXNEaXNwbysrOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwcmludGYoJnF1b3Q7QW5udWxhdGlvbiBPSy5cbiZxdW90Oyk7CiAgICAgICAgICAgICAgICBmb3VuZD0xOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSBlbHNlIGlmKG09PTIpewogICAgICAgIGNoYXIgY2luW01BWF9DSU5fTEVOXTsgaW50IG51bTsKICAgICAgICBwcmludGYoJnF1b3Q7Q0lOICAgOiAmcXVvdDspOyBzY2FuZigmcXVvdDslcyZxdW90OyxjaW4pOwogICAgICAgIHByaW50ZigmcXVvdDtWb2wgIyA6ICZxdW90Oyk7IHNjYW5mKCZxdW90OyVkJnF1b3Q7LCZhbXA7bnVtKTsKICAgICAgICBmb3IoaW50IGk9MDtpJmx0O25iUmVzZXJ2YXRpb25zO2krKyl7CiAgICAgICAgICAgIGlmKHN0cmNtcChyZXNlcnZhdGlvbnNbaV0ucGFzc2FnZXIuY2luLGNpbik9PTAgJmFtcDsmYW1wOwogICAgICAgICAgICAgICByZXNlcnZhdGlvbnNbaV0ubnVtZXJvVm9sPT1udW0gJmFtcDsmYW1wOwogICAgICAgICAgICAgICByZXNlcnZhdGlvbnNbaV0uc3RhdHV0PT1SRVNBX0NPTkZJUk1FRSl7CiAgICAgICAgICAgICAgICByZXNlcnZhdGlvbnNbaV0uc3RhdHV0PVJFU0FfQU5OVUxFRTsKICAgICAgICAgICAgICAgIGZvcihpbnQgaj0wO2ombHQ7bmJWb2xzO2orKyl7CiAgICAgICAgICAgICAgICAgICAgaWYodm9sc1tqXS5udW1lcm9Wb2w9PW51bSl7CiAgICAgICAgICAgICAgICAgICAgICAgIHZvbHNbal0ubmJQbGFjZXNEaXNwbysrOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwcmludGYoJnF1b3Q7QW5udWxhdGlvbiBPSy5cbiZxdW90Oyk7CiAgICAgICAgICAgICAgICBmb3VuZD0xOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgaWYoIWZvdW5kKSBwcmludGYoJnF1b3Q7UiZlYWN1dGU7c2VydmF0aW9uIG5vbiB0cm91diZlYWN1dGU7ZS5cbiZxdW90Oyk7Cn0KCnZvaWQgYWZmaWNoZXJTdGF0aXN0aXF1ZXNHbG9iYWxlcygpIHsKICAgIGludCBhY3RpZnM9MCwgYW5udWxlcz0wOwogICAgaW50IHRvdGFsUmVzYT1uYlJlc2VydmF0aW9ucywgcmVzYUFubj0wOwogICAgaW50IHRvdGFsUGxhY2VzUmVzdD0wOwoKICAgIGZvcihpbnQgaT0wO2kmbHQ7bmJWb2xzO2krKyl7CiAgICAgICAgaWYodm9sc1tpXS5hY3RpZikgYWN0aWZzKys7CiAgICAgICAgZWxzZSBhbm51bGVzKys7CiAgICAgICAgdG90YWxQbGFjZXNSZXN0ICs9IHZvbHNbaV0ubmJQbGFjZXNEaXNwbzsKICAgIH0KICAgIGZvcihpbnQgaT0wO2kmbHQ7bmJSZXNlcnZhdGlvbnM7aSsrKQogICAgICAgIGlmKHJlc2VydmF0aW9uc1tpXS5zdGF0dXQ9PVJFU0FfQU5OVUxFRSkKICAgICAgICAgICAgcmVzYUFubisrOwoKICAgIC8vIHBhc3NhZ2VycyB1bmlxdWVzCiAgICBjaGFyIHNlZW5bTUFYX1JFU0FdW01BWF9DSU5fTEVOXTsKICAgIGludCB1bmlxdWVQPTA7CiAgICBmb3IoaW50IGk9MDtpJmx0O25iUmVzZXJ2YXRpb25zO2krKyl7CiAgICAgICAgYm9vbCBkdXA9ZmFsc2U7CiAgICAgICAgZm9yKGludCBqPTA7aiZsdDt1bmlxdWVQO2orKykKICAgICAgICAgICAgaWYoc3RyY21wKHNlZW5bal0sIHJlc2VydmF0aW9uc1tpXS5wYXNzYWdlci5jaW4pPT0wKQogICAgICAgICAgICAgICAgZHVwPXRydWU7CiAgICAgICAgaWYoIWR1cCl7CiAgICAgICAgICAgIHN0cmNweShzZWVuW3VuaXF1ZVArK10sIHJlc2VydmF0aW9uc1tpXS5wYXNzYWdlci5jaW4pOwogICAgICAgIH0KICAgIH0KICAgIC8vIHZvbCBsZSBwbHVzIHImZWFjdXRlO3NlcnYmZWFjdXRlOwogICAgaW50IG1heFI9MCwgdm9sTWF4PTA7CiAgICBmb3IoaW50IHY9MDt2Jmx0O25iVm9sczt2KyspewogICAgICAgIGludCBjbnQ9MDsKICAgICAgICBmb3IoaW50IHI9MDtyJmx0O25iUmVzZXJ2YXRpb25zO3IrKykKICAgICAgICAgICAgaWYocmVzZXJ2YXRpb25zW3JdLm51bWVyb1ZvbD09dm9sc1t2XS5udW1lcm9Wb2wgJmFtcDsmYW1wOwogICAgICAgICAgICAgICByZXNlcnZhdGlvbnNbcl0uc3RhdHV0PT1SRVNBX0NPTkZJUk1FRSkKICAgICAgICAgICAgICAgIGNudCsrOwogICAgICAgIGlmKGNudCZndDttYXhSKXsgbWF4Uj1jbnQ7IHZvbE1heD12b2xzW3ZdLm51bWVyb1ZvbDsgfQogICAgfQogICAgcHJpbnRmKCZxdW90O1xuLS0tIFN0YXRpc3RpcXVlcyAtLS1cbiZxdW90Oyk7CiAgICBwcmludGYoJnF1b3Q7Vm9scyB0b3RhdXggICAgICAgOiAlZFxuJnF1b3Q7LCBuYlZvbHMpOwogICAgcHJpbnRmKCZxdW90O1ZvbHMgYWN0aWZzICAgICAgIDogJWRcbiZxdW90OywgYWN0aWZzKTsKICAgIHByaW50ZigmcXVvdDtWb2xzIGFubnVsJmVhY3V0ZTtzICAgICAgOiAlZFxuJnF1b3Q7LCBhbm51bGVzKTsKICAgIHByaW50ZigmcXVvdDtSJmVhY3V0ZTtzZXJ2YXRpb25zIHRvdC4gOiAlZFxuJnF1b3Q7LCB0b3RhbFJlc2EpOwogICAgcHJpbnRmKCZxdW90O1ImZWFjdXRlO3NlcnZhdGlvbnMgYW5uLiA6ICVkXG4mcXVvdDssIHJlc2FBbm4pOwogICAgcHJpbnRmKCZxdW90O1Bhc3NhZ2VycyB1bmlxdWVzIDogJWRcbiZxdW90OywgdW5pcXVlUCk7CiAgICBwcmludGYoJnF1b3Q7Vm9sIGxlICsgciZlYWN1dGU7c2VydiZlYWN1dGU7ICA6ICMlZCAoJWQgcmVzZXJ2YXRpb25zKVxuJnF1b3Q7LCB2b2xNYXgsIG1heFIpOwogICAgaWYobmJWb2xzKQogICAgICAgIHByaW50ZigmcXVvdDtNb3llbm5lIHBsYWNlcyByZXN0LjogJS4yZlxuJnF1b3Q7LAogICAgICAgICAgICAgICAoZmxvYXQpdG90YWxQbGFjZXNSZXN0L25iVm9scyk7Cn0KCmludCBtYWluKHZvaWQpIHsKICAgIGludCBjaG9peCwgc2M7CiAgICBkbyB7CiAgICAgICAgYWZmaWNoZXJNZW51UHJpbmNpcGFsKCk7CiAgICAgICAgc2NhbmYoJnF1b3Q7JWQmcXVvdDssICZhbXA7Y2hvaXgpOwogICAgICAgIHN3aXRjaCAoY2hvaXgpIHsKICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgICAgIGFmZmljaGVyTWVudVZvbHMoKTsKICAgICAgICAgICAgICAgICAgICBzY2FuZigmcXVvdDslZCZxdW90OywmYW1wO3NjKTsKICAgICAgICAgICAgICAgICAgICBzd2l0Y2goc2MpewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IGFmZmljaGVyTGlzdGVWb2xzKCk7ICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6IGFqb3V0ZXJWb2woKTsgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6IG1vZGlmaWVyVm9sKCk7ICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6IHN1cHByaW1lclZvbCgpOyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6IHJlY2hlcmNoZXJWb2woKTsgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gd2hpbGUoc2MhPTApOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgICBhZmZpY2hlck1lbnVSZXNlcnZhdGlvbnMoKTsKICAgICAgICAgICAgICAgICAgICBzY2FuZigmcXVvdDslZCZxdW90OywmYW1wO3NjKTsKICAgICAgICAgICAgICAgICAgICBzd2l0Y2goc2MpewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IHJlc2VydmVyQmlsbGV0KCk7ICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiBhZmZpY2hlclJlc2VydmF0aW9uc1BhckNJTigpOyBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOiBhbm51bGVyUmVzZXJ2YXRpb24oKTsgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gd2hpbGUoc2MhPTApOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgICBhZmZpY2hlck1lbnVTdGF0aXN0aXF1ZXMoKTsKICAgICAgICAgICAgICAgICAgICBzY2FuZigmcXVvdDslZCZxdW90OywmYW1wO3NjKTsKICAgICAgICAgICAgICAgICAgICBpZihzYz09MSkgYWZmaWNoZXJTdGF0aXN0aXF1ZXNHbG9iYWxlcygpOwogICAgICAgICAgICAgICAgfSB3aGlsZShzYyE9MCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgcHJpbnRmKCZxdW90O0F1IHJldm9pciAhXG4mcXVvdDspOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBwcmludGYoJnF1b3Q7Q2hvaXggaW52YWxpZGUuXG4mcXVvdDspOwogICAgICAgIH0KICAgIH0gd2hpbGUoY2hvaXghPTApOwogICAgcmV0dXJuIDA7Cn0K
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#define MAX_VOLS 100
#define MAX_RESA 500
#define MAX_CIN_LEN 10
#define MAX_CITY_LEN 50
#define DATE_LEN 11 // "jj/mm/aaaa"
#define TIME_LEN 6 // "hh:mm"
/*==========================================
STRUCTURES & TYPES
==========================================*/
typedef struct {
int numeroVol;
char villeDepart[MAX_CITY_LEN];
char villeArrivee[MAX_CITY_LEN];
char dateDepart[DATE_LEN];
char heureDepart[TIME_LEN];
int dureeMinutes;
int nbPlacesTotal;
int nbPlacesDispo;
bool actif;
} Vol;
typedef enum {
RESA_CONFIRMEE,
RESA_ANNULEE
} StatutResa;
typedef struct {
char cin[MAX_CIN_LEN];
char nom[30];
char prenom[30];
} Passager;
typedef struct {
int numeroResa;
int numeroVol;
char dateVol[DATE_LEN];
char destination[MAX_CITY_LEN];
int numeroSiege;
StatutResa statut;
Passager passager;
} Reservation;
/*==========================================
VARIABLES GLOBALES
==========================================*/
Vol vols[MAX_VOLS];
int nbVols = 0;
Reservation reservations[MAX_RESA];
int nbReservations = 0;
int compteurResa = 1;
/*==========================================
PROTOTYPES DE FONCTIONS
==========================================*/
/* Menus */
void afficherMenuPrincipal(void);
void afficherMenuVols(void);
void afficherMenuReservations(void);
void afficherMenuStatistiques(void);
/* Vols */
void afficherListeVols(void);
void afficherUnVol(const Vol *v);
void ajouterVol(void);
void modifierVol(void);
void supprimerVol(void);
void rechercherVol(void);
/* Réservations */
void reserverBillet(void);
void afficherReservationsParCIN(void);
void annulerReservation(void);
/* Statistiques */
void afficherStatistiquesGlobales(void);
/*==========================================
IMPLEMENTATIONS
==========================================*/
void afficherMenuPrincipal() {
printf("\n=========================================\n");
printf(" Bienvenue dans notre espace Aérien\n");
printf("=========================================\n");
printf("1 - Gestion des vols\n");
printf("2 - Gestion des réservations\n");
printf("3 - Statistiques globales\n");
printf("0 - Quitter\n");
printf("=========================================\n");
printf("Votre choix : ");
}
void afficherMenuVols() {
printf("\n--- Gestion des vols ---\n");
printf("1 - Afficher la liste des vols\n");
printf("2 - Ajouter un nouveau vol\n");
printf("3 - Modifier un vol existant\n");
printf("4 - Supprimer un vol\n");
printf("5 - Rechercher un vol\n");
printf("0 - Retour\n");
printf("Choix : ");
}
void afficherMenuReservations() {
printf("\n--- Gestion des réservations ---\n");
printf("1 - Réserver un billet\n");
printf("2 - Afficher réservations d'un passager\n");
printf("3 - Annuler une réservation\n");
printf("0 - Retour\n");
printf("Choix : ");
}
void afficherMenuStatistiques() {
printf("\n--- Statistiques globales ---\n");
printf("1 - Afficher statistiques\n");
printf("0 - Retour\n");
printf("Choix : ");
}
void afficherUnVol(const Vol *v) {
printf("\nVol N°%d\n", v->numeroVol);
printf("Départ : %s\n", v->villeDepart);
printf("Arrivée : %s\n", v->villeArrivee);
printf("Date/Heure: %s %s\n", v->dateDepart, v->heureDepart);
printf("Durée : %d min\n", v->dureeMinutes);
printf("Places : total %d / dispo %d\n", v->nbPlacesTotal, v->nbPlacesDispo);
printf("Statut : %s\n", v->actif ? "Actif" : "Annulé");
}
void afficherListeVols() {
if (nbVols == 0) {
printf("Aucun vol enregistré.\n");
return;
}
for (int i = 0; i < nbVols; i++) {
if (vols[i].actif)
afficherUnVol(&vols[i]);
}
}
void ajouterVol() {
if (nbVols >= MAX_VOLS) {
printf("Capacité maximale de vols atteinte.\n");
return;
}
Vol v;
printf("Numéro du vol : ");
scanf("%d", &v.numeroVol);
// unicité
for (int i = 0; i < nbVols; i++)
if (vols[i].numeroVol == v.numeroVol) {
printf("Ce numéro existe déjà.\n");
return;
}
printf("Ville de départ : ");
scanf("%s", v.villeDepart);
printf("Ville d’arrivée : ");
scanf("%s", v.villeArrivee);
printf("Date départ (jj/mm/aaaa) : ");
scanf("%s", v.dateDepart);
printf("Heure départ (hh:mm) : ");
scanf("%s", v.heureDepart);
printf("Durée (minutes) : ");
scanf("%d", &v.dureeMinutes);
printf("Nombre total de places : ");
scanf("%d", &v.nbPlacesTotal);
v.nbPlacesDispo = v.nbPlacesTotal;
v.actif = true;
vols[nbVols++] = v;
printf("Vol ajouté.\n");
}
void modifierVol() {
int num, idx = -1;
printf("Numéro du vol à modifier : ");
scanf("%d", &num);
for (int i = 0; i < nbVols; i++)
if (vols[i].numeroVol == num) { idx = i; break; }
if (idx < 0) {
printf("Vol non trouvé.\n");
return;
}
// compter réservations
int resaCount = 0;
for (int i = 0; i < nbReservations; i++)
if (reservations[i].numeroVol == num &&
reservations[i].statut == RESA_CONFIRMEE)
resaCount++;
printf("1-Destination 2-Date/Heure 3-Durée\n"
"4-Places totales 5-Statut 0-Annuler\nChoix : ");
int c; scanf("%d", &c);
switch (c) {
case 1:
printf("Nouvelle destination : ");
scanf("%s", vols[idx].villeArrivee);
break;
case 2:
printf("Nouvelle date : ");
scanf("%s", vols[idx].dateDepart);
printf("Nouvelle heure: ");
scanf("%s", vols[idx].heureDepart);
break;
case 3:
printf("Nouvelle durée : ");
scanf("%d", &vols[idx].dureeMinutes);
break;
case 4: {
int nt;
printf("Nouv. places totales : ");
scanf("%d", &nt);
if (nt < resaCount) {
printf("%d places déjà réservées.\n", resaCount);
} else {
vols[idx].nbPlacesDispo += (nt - vols[idx].nbPlacesTotal);
vols[idx].nbPlacesTotal = nt;
}
break;
}
case 5: {
int s;
printf("Statut (1=actif,0=annulé) : ");
scanf("%d", &s);
vols[idx].actif = (s==1);
break;
}
default:
printf("Annulation/modif invalide.\n");
}
}
void supprimerVol() {
int num, idx = -1;
printf("Numéro du vol à supprimer : ");
scanf("%d", &num);
for (int i = 0; i < nbVols; i++)
if (vols[i].numeroVol == num) { idx = i; break; }
if (idx < 0) {
printf("Vol non trouvé.\n");
return;
}
int resaCount = 0;
for (int i = 0; i < nbReservations; i++)
if (reservations[i].numeroVol == num &&
reservations[i].statut == RESA_CONFIRMEE)
resaCount++;
if (resaCount) {
printf("%d réservation(s) existantes. Confirmez suppression? (o/n): ", resaCount);
char c; getchar(); c=getchar();
if (c!='o' && c!='O') {
printf("Suppression annulée.\n");
return;
}
}
for (int i = idx; i < nbVols-1; i++)
vols[i] = vols[i+1];
nbVols--;
printf("Vol supprimé.\n");
}
void rechercherVol() {
printf("1=Numéro 2=Destination : ");
int m; scanf("%d", &m);
if (m==1) {
int num; printf("Numéro : "); scanf("%d", &num);
for (int i=0;i<nbVols;i++)
if (vols[i].numeroVol==num)
afficherUnVol(&vols[i]);
} else if (m==2) {
char dest[MAX_CITY_LEN];
printf("Destination : "); scanf("%s", dest);
for (int i=0;i<nbVols;i++)
if (strcmp(vols[i].villeArrivee,dest)==0)
afficherUnVol(&vols[i]);
}
}
void reserverBillet() {
int num;
printf("Numéro du vol : ");
scanf("%d", &num);
int idx=-1;
for(int i=0;i<nbVols;i++)
if(vols[i].numeroVol==num && vols[i].actif)
idx=i;
if(idx<0 || vols[idx].nbPlacesDispo==0) {
printf("Vol non dispo.\n");
return;
}
Reservation r;
r.numeroResa = compteurResa++;
r.numeroVol = num;
strcpy(r.dateVol, vols[idx].dateDepart);
strcpy(r.destination, vols[idx].villeArrivee);
r.numeroSiege = vols[idx].nbPlacesTotal - vols[idx].nbPlacesDispo + 1;
r.statut = RESA_CONFIRMEE;
printf("CIN : "); scanf("%s", r.passager.cin);
printf("Nom : "); scanf("%s", r.passager.nom);
printf("Prénom: "); scanf("%s", r.passager.prenom);
reservations[nbReservations++] = r;
vols[idx].nbPlacesDispo--;
printf("Réservation #%d confirmée, siège %d.\n",
r.numeroResa, r.numeroSiege);
}
void afficherReservationsParCIN() {
char cin[MAX_CIN_LEN];
printf("CIN passager : ");
scanf("%s", cin);
for(int i=0;i<nbReservations;i++){
if(strcmp(reservations[i].passager.cin,cin)==0){
printf("\nRéservation N°%d\n", reservations[i].numeroResa);
printf("Vol : %d\n", reservations[i].numeroVol);
printf("Date : %s\n", reservations[i].dateVol);
printf("Dest. : %s\n", reservations[i].destination);
printf("Siège : %d\n", reservations[i].numeroSiege);
printf("Statut : %s\n",
reservations[i].statut==RESA_CONFIRMEE ? "Confirmée" : "Annulée");
}
}
}
void annulerReservation() {
printf("Annuler par 1=NumResa 2=CIN+Vol : ");
int m; scanf("%d",&m);
int found=0;
if(m==1){
int nr; printf("N° réservation : "); scanf("%d",&nr);
for(int i=0;i<nbReservations;i++){
if(reservations[i].numeroResa==nr &&
reservations[i].statut==RESA_CONFIRMEE){
reservations[i].statut=RESA_ANNULEE;
// restituer place
for(int j=0;j<nbVols;j++){
if(vols[j].numeroVol==reservations[i].numeroVol){
vols[j].nbPlacesDispo++;
break;
}
}
printf("Annulation OK.\n");
found=1;
}
}
} else if(m==2){
char cin[MAX_CIN_LEN]; int num;
printf("CIN : "); scanf("%s",cin);
printf("Vol # : "); scanf("%d",&num);
for(int i=0;i<nbReservations;i++){
if(strcmp(reservations[i].passager.cin,cin)==0 &&
reservations[i].numeroVol==num &&
reservations[i].statut==RESA_CONFIRMEE){
reservations[i].statut=RESA_ANNULEE;
for(int j=0;j<nbVols;j++){
if(vols[j].numeroVol==num){
vols[j].nbPlacesDispo++;
break;
}
}
printf("Annulation OK.\n");
found=1;
}
}
}
if(!found) printf("Réservation non trouvée.\n");
}
void afficherStatistiquesGlobales() {
int actifs=0, annules=0;
int totalResa=nbReservations, resaAnn=0;
int totalPlacesRest=0;
for(int i=0;i<nbVols;i++){
if(vols[i].actif) actifs++;
else annules++;
totalPlacesRest += vols[i].nbPlacesDispo;
}
for(int i=0;i<nbReservations;i++)
if(reservations[i].statut==RESA_ANNULEE)
resaAnn++;
// passagers uniques
char seen[MAX_RESA][MAX_CIN_LEN];
int uniqueP=0;
for(int i=0;i<nbReservations;i++){
bool dup=false;
for(int j=0;j<uniqueP;j++)
if(strcmp(seen[j], reservations[i].passager.cin)==0)
dup=true;
if(!dup){
strcpy(seen[uniqueP++], reservations[i].passager.cin);
}
}
// vol le plus réservé
int maxR=0, volMax=0;
for(int v=0;v<nbVols;v++){
int cnt=0;
for(int r=0;r<nbReservations;r++)
if(reservations[r].numeroVol==vols[v].numeroVol &&
reservations[r].statut==RESA_CONFIRMEE)
cnt++;
if(cnt>maxR){ maxR=cnt; volMax=vols[v].numeroVol; }
}
printf("\n--- Statistiques ---\n");
printf("Vols totaux : %d\n", nbVols);
printf("Vols actifs : %d\n", actifs);
printf("Vols annulés : %d\n", annules);
printf("Réservations tot. : %d\n", totalResa);
printf("Réservations ann. : %d\n", resaAnn);
printf("Passagers uniques : %d\n", uniqueP);
printf("Vol le + réservé : #%d (%d reservations)\n", volMax, maxR);
if(nbVols)
printf("Moyenne places rest.: %.2f\n",
(float)totalPlacesRest/nbVols);
}
int main(void) {
int choix, sc;
do {
afficherMenuPrincipal();
scanf("%d", &choix);
switch (choix) {
case 1:
do {
afficherMenuVols();
scanf("%d",&sc);
switch(sc){
case 1: afficherListeVols(); break;
case 2: ajouterVol(); break;
case 3: modifierVol(); break;
case 4: supprimerVol(); break;
case 5: rechercherVol(); break;
}
} while(sc!=0);
break;
case 2:
do {
afficherMenuReservations();
scanf("%d",&sc);
switch(sc){
case 1: reserverBillet(); break;
case 2: afficherReservationsParCIN(); break;
case 3: annulerReservation(); break;
}
} while(sc!=0);
break;
case 3:
do {
afficherMenuStatistiques();
scanf("%d",&sc);
if(sc==1) afficherStatistiquesGlobales();
} while(sc!=0);
break;
case 0:
printf("Au revoir !\n");
break;
default:
printf("Choix invalide.\n");
}
} while(choix!=0);
return 0;
}